ゼファーネットのロゴ

Hugging Face Transformers Package –それは何ですか?それを使用する方法

日付:

Hugging Face Transformers Package –それは何ですか?それを使用する方法

トランスフォーマーの急速な発展は、自然言語処理に強力なツールの新しい波をもたらしました。 これらのモデルは大きく、トレーニングに非常に費用がかかるため、事前にトレーニングされたバージョンは、研究者や実務家によって共有され、活用されます。 Hugging Faceは、オープンソースライブラリとしてさまざまな事前トレーニング済みトランスフォーマーを提供しており、これらをXNUMX行のコードで組み込むことができます。


クレジット

トランスフォーマー

NLPのTransformerは、長距離の依存関係を簡単に処理しながら、シーケンス間のタスクを解決することを目的とした新しいアーキテクチャです。 トランスフォーマーは論文で提案されました 注意はあなたが必要とするすべてです。 NLPに興味のある人は読むことをお勧めします。

NLPに焦点を当てたスタートアップHuggingFaceは最近、人気のある「PyTorch Transformers」ライブラリのメジャーアップデートをリリースしました。これにより、PyTorchとTensorFlow 2.0の間の互換性が確立され、ユーザーはトレーニングや評価の目的でモデルの存続期間中にXNUMXつのフレームワークから別のフレームワークに簡単に移動できます。 。

Transformersパッケージには、30を超える事前トレーニング済みモデルと100の言語に加えて、自然言語理解(NLU)と自然言語生成(NLG)のためのXNUMXつの主要なアーキテクチャが含まれています。

Transformersライブラリは、モデルをロードするためにPyTorchを必要とせず、わずか10行のコードでSOTAモデルをトレーニングでき、XNUMX行未満のコードでデータセットを前処理できます。 トレーニング済みモデルを共有すると、計算コストと二酸化炭素排出量も削減されます。

あなたはトランスフォーマーとその注意メカニズムを知っていると思います。 この記事の主な目的は、HuggingFaceのトランスフォーマーライブラリをTF2.0で使用する方法を示すことです。

インストール(明示的にPyTorchは必要ありません)

!pipインストールトランスフォーマー 

パイプラインを使用したタスクの開始

特定のタスクで事前トレーニング済みモデルを使用する最も簡単な方法は、を使用することです。 パイプライン()。 🤗トランスフォーマーは、箱から出して次のタスクを提供します:

  • 感情分析: テキストはポジティブですか、それともネガティブですか?
  • テキスト生成(英語): プロンプトを提供すると、モデルは次の内容を生成します。
  • 固有表現抽出(NER): 入力文で、各単語にそれが表すエンティティ(人、場所など)のラベルを付けます。
  • 質問応答: モデルにコンテキストと質問を提供し、コンテキストから回答を抽出します。
  • マスクされたテキストの入力: マスクされた単語(たとえば、[MASK]に置き換えられた)を含むテキストが与えられた場合は、空白を埋めます。
  • 要約: 長いテキストの要約を生成します。
  • 言語翻訳: テキストを別の言語に翻訳します。
  • 特徴抽出: テキストのテンソル表現を返します。

パイプラインは、すべてのNLPプロセスのプロセス全体をカプセル化します。

  1. トークン化:初期入力を…プロパティ(つまり、トークン)を持つ複数のサブエンティティに分割します。
  2. 推論:すべてのトークンをより意味のある表現にマップします。
  3. デコード:上記の表現を使用して、基になるタスクの最終出力を生成および/または抽出します。

API全体は、次の構造を持つpipeline()メソッドを介してエンドユーザーに公開されます。

GPT-2

GPT-2は大きいです トランス1.5万のWebページのデータセットでトレーニングされた8億のパラメータを持つベースの言語モデル。 GPT-2は、単純な目的でトレーニングされています。テキスト内の前の単語をすべて指定して、次の単語を予測します。

GPT-2の目的は予測を行うことであるため、デコーダーメカニズムのみが使用されます。 したがって、GPT-2は、互いに積み重ねられた単なるトランスデコーダです。

GPT-2は、前例のない品質の条件付き合成テキストサンプルを生成する機能など、幅広い機能セットを表示します。この場合、モデルは大きな入力に対応し、長い出力を生成できます。

テキスト生成

トランスフォーマーからインポートパイプライン、set_seedジェネレーター=パイプライン( 'テキスト生成'、モデル= 'gpt2')ジェネレーター( "こんにちは、クリケットをプレイするのが好きです"、max_length = 60、num_return_sequences = 7)

出力:

[{'generated_text': "こんにちは、私はクリケットをするのが好きですが、サッカーをしたいのです!そこで、XboxOneで新しいゲームTheSuperBombersを作成することにしました。nnそして報酬としてあなたはこのゲームの公式発表を聞いてください!nnここにあなたが期待できるものがあります "}、{'generated_text': 'こんにちは、私はクリケットをするのが好きです、しかし時々それは悪いスポーツマンであるようです」と彼は言います。クリケットはもっと難しいですが、時々私はとても幸せで、いつもクリケットを楽しんでいます。 "nnミドルセックスにいる間、ハウテックは '}、{' generated_text ':'に触発されました。こんにちは、私はクリケットをするのが好きですが、できません。 「良い」と「悪い」が何であるかを本当に理解しています。「良い」と「悪い」の定義はありますか?nnはい、そう思います。つまり、よく訓練された人はおそらくその問題を抱えていません '} 、{'generated_text': 'こんにちは、私はクリケットをするのが好きです、私はクリケットのゲームをします。 " 翌日、彼は友達と一緒に家族旅行に参加しました。 彼がとても関わったのは彼らにとって短い休憩だったかもしれません。 数日後、彼らは彼のクリケットトレーニングセンターで会いました。そこでは、ペア '}、{' generated_text ': "こんにちは、私はクリケットをするのが好きなので、英語のクリケットをしたかったのです...それで私はの友人に電話しました私の場合、覚えていますが、実際には英語ではありませんでしたが、実際には多くの良い点があります。nnnDUPY:特にあなたにとっては非常に興味深いです "}、{'generated_text': 'こんにちは、クリケットをするのが好きです、しかし、私は観光客でいっぱいのスタジアムでクリケットをするのは本当に好きではありません。 プレイする意味はありません。 私たちはほぼXNUMX年前にcricket.nnでそのゲームをプレイしました。「ここにいるのが好きだったのは去年のイギリスでした。それは '}、{' generated_text ':'こんにちは、私もクリケットをプレイするのが好きです。市は常に良い試合をします。つまり、クリケットチームはいつもとても若いです。 "'}]
ジェネレーター(「インド人はaとして働いた」、max_length = 10、num_return_sequences = 5)

出力:

[{'generated_text': 'インド人はデリーでウェイターとして働いていた。'}、{'generated_text': 'インド人は'}の警備員として働いていた。約XNUMX人のウェイター '}、{' generated_text ':'インド人は日曜日にウェイターとして働いた '}、{' generated_text ':'インド人は '}

感情分析

#感情分析のパイプラインを割り当てますclassifier = pipe( 'sentiment-analysis')classifier( '先に進む秘訣は始めています。')

出力:

[{'label': 'POSITIVE'、 'score':0.9970657229423523}]

質問応答

#質問応答用のパイプラインを割り当てますquestion_answerer = pipe( 'question-answering')question_answerer({'question': 'ニュートンの第XNUMX運動法則とは何ですか?'、 'context': 'ニュートンの第XNUMX運動法則は次のように述べています。すべての行動に対して、等しく反対の反応があります "'})

出力:

{'スコア':0.6062518954277039、 '開始':42、 '終了':96、 '回答': '"すべてのアクションに対して等しく反対の反応があります"'}
nlp = pipe( "question-answering")context = r "" "Microsoftは、1975年にBillGatesとPaulAllenによって設立されました。プライム(またはプライムではない)であるという特性は、プライマリティと呼ばれます。プライマリティを検証する簡単ですが遅い方法です。与えられた数のnは試行除算として知られています。これは、nが2とそれ自体の間の任意の整数の倍数であるかどうかをテストすることで構成されます。試行除算よりもはるかに効率的なアルゴリズムが、多数の主要性をテストするために考案されました。 -高速であるがエラーの可能性が低いRabinprimality test、およびAKS primality testは、常に多項式時間で正解を生成しますが、遅すぎて実用的ではありません。特に高速な方法は、多くの特殊な形式で利用できます。メルセンヌ番号など。2016年22,338,618月の時点で、既知の最大プライム番号は1進数で1桁です。 "" "#Question 2 result = nlp(question ="プライマリティを検証する簡単な方法は何ですか? "、context = context)print( f "回答2: '{結果['回答 '] } '")#Question XNUMX result = nlp(question =" Bill gatesがMicrosoftを設立したのはいつですか? "、context = context)print(f" Answer XNUMX:' {result ['answer']} '")

出力:

回答1:「試行割り法」。 回答2:「1975」。

ベルト

BERT(Transformersからの双方向エンコーダー表現)は、テキスト内の単語間のコンテキスト関係を学習するTransformerを利用します。 バニラ形式のTransformerには、テキスト入力を読み取るエンコーダーとタスクの予測を生成するデコーダーのXNUMXつの別個のメカニズムが含まれています。 BERTの目標は言語モデルを生成することであるため、エンコーダーメカニズムのみが使用されます。 したがって、BERTは、互いに積み重ねられた単なるトランスエンコーダです。

テキスト予測

unmasker = pipeline( 'fill-mask'、model = 'bert-base-cased')unmasker( "こんにちは、私の名前は[MASK]です。")

出力:

[{'シーケンス': '[CLS]こんにちは、私の名前はデビッドです。 [SEP] '、'スコア ':0.007879073731601238、'トークン ':1681、'トークン_str ':'デビッド '}、{'シーケンス ':' [CLS]こんにちは、私の名前はケイトです。 [SEP] '、'スコア ':0.007307342253625393、'トークン ':5036、'トークン_str ':'ケイト '}、{'シーケンス ':' [CLS]こんにちは、私の名前はサムです。 [SEP] '、'スコア ':0.007054011803120375、'トークン ':2687、'トークン_str ':'サム '}、{'シーケンス ':' [CLS]こんにちは、私の名前はジェームズです。 [SEP] '、'スコア ':0.006197025533765554、'トークン ':1600、'トークン_str ':'ジェームズ '}、{'シーケンス ':' [CLS]こんにちは、私の名前はチャーリーです。 [SEP] '、'スコア ':0.006146721541881561、'トークン ':4117、' token_str ':'チャーリー '}]

テキストの要約

#Summarizationは現在、BartとT5でサポートされています。 要約者= pipeline( "summarization")記事= "" "プロジェクトアポロとしても知られるアポロ計画は、米国航空宇宙局(NASA)が実施した1969番目の米国有人宇宙飛行計画であり、最初の人間の着陸を達成しました。 1972年から1960年まで月面で。最初のアメリカ人を宇宙に投入した25人のプロジェクトマーキュリーに続く1961人の宇宙船として、ドワイトD.アイゼンハワーの政権の間に最初に考案されたアポロは、後にジョンF.ケネディ大統領の国家目標に捧げられました。 1962年代の終わりまでに「人を月に着陸させて安全に地球に戻す」ことについて、66年1968月1961日に議会に宛てて提案しました。プロジェクトマーキュリーの後には1972人のプロジェクトジェミニ(1962年)が続きました。 -1966)アポロの最初の有人飛行は1973年でした。アポロは74年から1975年まで実行され、130年から30年まで同時に実行された0人のジェミニプログラムによってサポートされました。ジェミニミッションはいくつかの宇宙旅行技術を開発しましたそれはアポロ計画の成功に必要でした。 アポロはサターンファミリーロケットをロケットとして使用しました。 アポロ/土星車両は、XNUMX-XNUMX年にXNUMXつの有人ミッションをサポートした宇宙ステーションであるスカイラブとXNUMX年にソビエト連邦との共同地球軌道ミッションであるアポロ-ソユーズテストプロジェクトで構成されるアポロ応用計画にも使用されました。 。 "" "summary = summary(ARTICLE、max_length = XNUMX、min_length = XNUMX、do_sample = False)[XNUMX] print(summary ['summary_text'])

出力:

アポロの最初の有人飛行は1961年から1972年まで実行されました。 アポロ計画の後には、XNUMX人のProjectGeminiが続きました。 月面着陸はXNUMX回目のミッションでした。

英語からドイツ語への翻訳

#英語からドイツ語translator_ger = pipe( "translation_en_to_de")print( "German:"、translator_ger( "Joe Bidenが米国の第46代大統領になりました"、max_length = 40)[0] ['translation_text'])#英語からフランス語translator_fr = pipeline( 'translation_en_to_fr')print( "French:"、translator_fr( "Joe Bidenが米国の第46代大統領になりました"、max_length = 40)[0] ['translation_text'])

出力:

ドイツ語:Joe Bidenwurdeder46。PräsidentderUSA。 フランス語:Joe Biden est devenule46eprésidentdesÉtats-Unis

会話

fromトランスフォーマーimportAutoModelForCausalLM、AutoTokenizer import torch tokenizer = AutoTokenizer.from_pretrained( "microsoft / DialoGPT-medium")model = AutoModelForCausalLM.from_pretrained( "microsoft / DialoGPT-medium")#範囲(5)のステップで5行チャットしましょう: #新しいユーザー入力をエンコードし、eos_tokenを追加して、Pytorchでテンソルを返しますnew_user_input_ids = tokenizer.encode(input( ">> User:")+ tokenizer.eos_token、return_tensors = 'pt')#新しいユーザー入力トークンをに追加しますチャット履歴bot_input_ids = torch.cat([chat_history_ids、new_user_input_ids]、dim = -1)if step> 0 else new_user_input_ids#合計チャット履歴を1000トークンに制限しながら応答を生成、chat_history_ids = model.generate(bot_input_ids、max_length = 1000、pad_token_id = tokenizer.eos_token_id)#ボットからの最後の出力トークンをきれいに出力print( "DialoGPT:{}"。format(tokenizer.decode(chat_history_ids [:、bot_input_ids.shape [-1]:] [0]、skip_special_tokens = True)))

出力:

>>ユーザー:こんにちはDialoGPT:こんにちは! :D >>ユーザー:お元気ですか? DialoGPT:順調です! お元気ですか? >>ユーザー:私はそれほど良くありません。 DialoGPT:ごめんなさい。 >>ユーザー:ありがとうDialoGPT:問題ありません。 よろしくお願いします。 >>ユーザー:さようならDialoGPT:さようなら! :D

名前付きエンティティの認識

トランスフォーマーインポートパイプラインから、set_seed nlp_token_class = pipe( 'ner')nlp_token_class( 'ロナウドは1985年に生まれ、ユベントスとポルトガルでプレーしています。')

出力:

[{'word': 'Ronald'、 'score':0.9978647828102112、 'entity': 'I-PER'、 'index':1}、{'word': '## o'、 'score':0.99903804063797、 'entity': 'I-PER'、 'index':2}、{'word': 'Juventus'、 'score':0.9977495670318604、 'entity': 'I-ORG'、 'index':11}、{ '単語': 'ポルトガル'、 'スコア':0.9991246461868286、 'エンティティ': 'I-LOC'、 'インデックス':13}]

特徴抽出

import numpy as np nlp_features = pipe( 'feature-extraction')output = nlp_features( 'output = nlp_features('深層学習は機械学習のブランチです '))np.array(output).shape#(サンプル、トークン、ベクトルサイズ)

出力:

(1、10、768)

ゼロショット学習

ゼロショット学習は、トレーニング段階でそのタスクの例を受け取らずにタスクを解決することを目的としています。 トレーニングフェーズ中にそのオブジェクトのサンプル画像がなかった特定の画像からオブジェクトを認識するタスクは、ゼロショット学習タスクの例と見なすことができます。

classifier_zsl = pipeline( "zero-shot-classification")sequence_to_classify = "ビルゲイツは1975年にマイクロソフトという会社を設立しました" candidate_labels = ["Europe"、 "Sports"、 'Leadership'、 'business'、 "politics"、 "startup"] classifier_zsl(sequence_to_classify、candidate_labels)

出力:

{'シーケンス': 'ビルゲイツは1975年にマイクロソフトと呼ばれる会社を設立しました'、 'ラベル':['ビジネス'、 'スタートアップ'、 'リーダーシップ'、 'ヨーロッパ'、 'スポーツ'、 '政治']、 'スコア ':[0.6144810318946838、0.1874515861272812、0.18227894604206085、0.006684561725705862、0.0063185556791722775、0.0027852619532495737]}

ウィジェットでのトランスフォーマーの使用

ipywidgetsをウィジェットとしてインポートnlp_qaA = pipe( 'question-answering')context = widgets.Textarea(value = 'アインシュタインは相対性の一般理論で有名です'、placeholder = '何かを入力してください'、description = 'コンテキスト:'、disabled = False)query = widgets.Text(value = 'アインシュタインが有名な理由'、placeholder = '何かを入力'、description = '質問:'、disabled = False)def forward(_):if len(context.value) > 0およびlen(query.value)> 0:output = nlp_qaA(question = query.value、context = context.value)print(output)query.on_submit(forward)display(context、query)

より軽いモデルが必要ですか?

「蒸留が登場する」

クレジット

Transformerベースのモデルを使用する際の主な懸念事項のXNUMXつは、必要な計算能力です。 この記事全体で、一般的なマシンで実行できるBERTモデルを使用していますが、すべてのモデルに当てはまるわけではありません。

たとえば、Googleは数か月前にリリースしました T5 トランスフォーマーに基づくエンコーダー/デコーダーアーキテクチャで、パラメーターが11億以下のトランスフォーマーで利用できます。 マイクロソフトも最近ゲームに参加しました チューリング-NLG 17億のパラメータを使用します。 この種のモデルでは、重みを格納するために数十ギガバイトが必要であり、そのようなモデルを実行するには膨大なコンピューティングインフラストラクチャが必要であるため、一般の人には実用的ではありません。

TransformerベースのNLPを誰もが利用できるようにすることを目標に、 ハグ顔 と呼ばれるトレーニングプロセスを利用する開発されたモデル 蒸留、 これにより、パフォーマンスの低下をほぼゼロにして、このようなモデルを実行するために必要なリソースを大幅に削減できます。

DistilBERTとTensorflowを使用したテキストの分類

DistilBERTとTensorflowを使用したテキストの分類は私の Kaggleノートブック.

また見つけることができます Hugging Facepythonノートブック さまざまなユースケースを解決するためのトランスフォーマーの使用について。

関連する

出典:https://www.kdnuggets.com/2021/02/hugging-face-transformer-basics.html

スポット画像

最新のインテリジェンス

スポット画像

私たちとチャット

やあ! どんな御用でしょうか?