抱きしめる顔でBERTを理解する
自分で実装する前に、私たちは本当に何かを理解していません。 したがって、この投稿では、BERTとHugging FaceLibraryを使用して質問応答ニューラルネットワークを実装します。
BERTとHuggingFaceを使用して質問回答モデルを作成する
最近の投稿で ベルト、BERTトランスフォーマーとそれらが基本的なレベルでどのように機能するかについて説明しました。 この記事では、BERTアーキテクチャ、トレーニングデータ、トレーニングタスクについて説明します。
しかし、自分たちで実装する前に、私たちは何かを本当に理解していません。 したがって、この投稿では、BERTとHugging FaceLibraryを使用して質問応答ニューラルネットワークを実装します。
質問応答タスクとは何ですか?
このタスクでは、質問とその答えが私たちにある段落が与えられます BERTアーキテクチャ 目的は、段落内の回答の開始スパンと終了スパンを決定することです。
質問と回答のタスクのためのBERT微調整の画像
前の投稿で説明したように、上記の例では、BERTアーキテクチャにXNUMXつの入力を提供します。 段落と質問は、 トークン。 紫色のレイヤーはBERTエンコーダーの出力です。
ここで、両方とも形状(1×768)を持つXNUMXつのベクトルSとE(微調整中に学習されます)を定義します。 次に、これらのベクトルとBERTからのXNUMX番目の文の出力ベクトルの内積を取り、いくつかのスコアを取得します。 次に、これらのスコアにSoftmaxを適用して、確率を取得します。 トレーニングの目的は、正しい開始位置と終了位置の対数尤度の合計です。 数学的には、開始位置の確率ベクトルの場合:
ここで、T_iは私たちが焦点を当てている単語です。 同様の式は終了位置用です。
スパンを予測するために、すべてのスコア(STとET)を取得し、最大スコアを持つスパン、つまりすべてのj≥iの中でmax(S.T_i + E.T_j)として最適なスパンを取得します。
ハグフェイスを使用してこれを行うにはどうすればよいですか?
ハグ顔 これを行うための非常に簡単な方法を提供します。
出力は次のとおりです。
質問:トランスフォーマーでは、事前にトレーニングされたモデルがいくつありますか? 回答:32以上+質問:トランスフォーマーは何を提供しますか? 回答:汎用アーキテクチャ質問:トランスフォーマーは、どのフレームワーク間で相互運用性を提供しますか? 回答:TensorFlow 2とPyTorch
したがって、ここでは、事前にトレーニングされたトークナイザーとモデルを使用しました SQuADデータセット これを行うためにHuggingFaceによって提供されます。
tokenizer = AutoTokenizer.from_pretrained(“ bert-large-uncased-whole-word-masking-finetuned-squad”)model = AutoModelForQuestionAnswering.from_pretrained(“ bert-large-uncased-whole-word-masking-finetuned-squad”)
モデルを取得したら、開始確率スコアと終了確率スコアを取得し、開始スコアが最大のトークンと終了スコアが最大のトークンの間にあるスパンを予測します。
たとえば、段落の開始スコアが次の場合:
...トランスフォーマー-0.1は-0.2 一般-0.5 目的-0.1アーキテクチャ-0.01(BERT-0.001..。
そして、最終スコアは次のとおりです。
...トランスフォーマー-0.01は-0.02一般-0.05目的-0.01アーキテクチャ-0.01 (BERT-0.8 ...
出力はinput_ids [answer_start:answer_end]として取得されます。ここで、answer_startは単語general(最大開始スコアを持つもの)のインデックスであり、answer_endは(BERT(最大終了スコアを持つもの)のインデックスです。答えは「汎用」になります。アーキテクチャ」。
質問応答データセットを使用した独自のモデルの微調整
ほとんどの場合、独自のデータセットで独自のQAモデルをトレーニングする必要があります。 この状況では、SQuADデータセットとHugging FaceライブラリのベースBERTモデルから始めて、微調整します。
微調整を開始する前に、SQuADデータセットがどのように見えるかを見てみましょう。
コンテキスト:コンピューターシステム内で、特権の分離を強制できる多くのセキュリティモデルのうちの553つは、アクセス制御リスト(ACL)と機能ベースのセキュリティです。 ACLを使用してプログラムを制限することは、ホストコンピューターがだまされてファイルアクセスを間接的に許可する場合など、多くの状況で安全でないことが証明されています。これは、混乱した副問題として知られる問題です。 また、オブジェクトへのアクセスを27人だけに許可するというACLの約束は、実際には保証されないことも示されています。 これらの問題は両方とも機能によって解決されます。 これは、すべてのACLベースのシステムに実際的な欠陥が存在することを意味するのではなく、特定のユーティリティの設計者が欠陥を導入しないように責任を負う必要があることだけを意味します。 [要出典]質問:混乱した副問題と、27人だけがアクセスできることを保証しないという問題は、何によって解決されますか? 回答:['capabilities']回答テキストで開始:[132] ----------------------------------- ---------------------------------コンテキスト:近年、ウェストXNUMXthストリートのナイトクラブは激しい競争に屈しましたマンハッタンのミートパッキング地区から南に約XNUMXブロック、マンハッタンのダウンタウンにある他の場所から。 質問:マンハッタンのミートパッキング地区は、XNUMX番街の南に何ブロックありますか? 回答:['XNUMXブロック']回答テキストで開始:[XNUMX] ---------------------------------- ----------------------------------
AnswerのContext、Answer、およびStartトークンを含む各例を見ることができます。 上記の形式のデータを取得したら、以下のスクリプトを使用して、データを必要な形式に前処理できます。 スクリプトは多くのことを処理しますが、その中で最も重要なのは、回答がmax_lengthの周りにあり、回答と開始トークンインデックスを使用してスパンを計算する場合です。
必要な形式のデータを取得したら、そこからBERTベースモデルを微調整できます。
model_checkpoint = "bert-base-uncased"
model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint)
tokenizer = AutoTokenizer.from_pretrained(model_checkpoint)tokenized_datasets = datasets.map(prepare_train_features, batched=True, remove_columns=datasets["train"].column_names)args = TrainingArguments( f"test-squad", evaluation_strategy = "epoch", learning_rate=2e-5, per_device_train_batch_size=16, per_device_eval_batch_size=16, num_train_epochs=3, weight_decay=0.01,
)data_collator = default_data_collator
trainer = Trainer( model, args, train_dataset=tokenized_datasets["train"], eval_dataset=tokenized_datasets["validation"], data_collator=data_collator, tokenizer=tokenizer,
)trainer.train()
trainer.save_model(trainer.save_model("test-squad-trained"))
微調整BERTベースモデルからの出力
モデルをトレーニングしたら、次のように使用できます。
この場合も、最大開始スコアと最大終了スコアのインデックスを取得し、その中間の回答として予測します。 BERTペーパーで提供されているとおりの正確な実装を取得したい場合は、上記のコードを少し調整して、最大化するインデックスを見つけることができます(start_score + end_score)
モデルトレーニングからのコード出力
参考文献
- 注意はあなたが必要とするすべてです:トランスフォーマーを紹介した論文。
- BERTペーパー:この論文を読んでください。
- ハグ顔
この投稿では、BERTを使用して質問応答モデルを最初から作成する方法について説明しました。 BERTとHuggingFaceライブラリの両方を理解するのに役立つことを願っています。
このシリーズの他の投稿を見たい場合は、以下をチェックしてください。
今後もこのようなトピックを書く予定ですので、ご感想をお聞かせください。 非常に技術的なトピックについて書くべきですか、それとも初心者レベルをもっと目指すべきですか? コメントセクションはあなたの友達です。 これを使って。
元の。 許可を得て転載。
関連する
過去30日間の人気記事
|
|
PlatoAi。 Web3の再考。 増幅されたデータインテリジェンス。
アクセスするには、ここをクリックしてください。
出典:https://www.kdnuggets.com/2021/07/understanding-bert-hugging-face.html