大型モデル時代のBERTを詳しく解説

現在BERTを勉強中です。

ほんの少しだけ。

BERT=トランスフォーマーからの双方向エンコーダー表現

著者は Google のチームです

主なハイライトは、トランスフォーマーと事前トレーニング + ラベルなしデータを使用して、一般的な言語モデルをトレーニングすることです。

0: 背景

ImageNet の存在により、視覚的なアルゴリズムは移行の学習や微調整に非常に便利ですが、当時は NLP は利用できませんでした。

この場合、BERT が登場しました。

1: 技術的枠組み

a:マスクされた言語モデル

BERT では、Masked LM (Masked Language Model) が言語モデルを構築します。簡単に言うと、文内の任意の単語をランダムにカバーまたは置換し、コンテキストを通じてカバーまたは置換された部分をモデルに予測させます。損失は​​、カバーされた部分の損失のみを計算します。これは非常にわかりやすい作業です。実際の操作は次のとおりです。

  1. 文内のトークン (単語またはフレーズ) の 15% を次のものにランダムに置き換えます。

    1. これらのトークンは 80% の確率で に置き換えられます [MASK]。たとえば、私の犬は毛深い→私の犬は [MASK]
    2. 10% の確率で他のトークンに置き換えられます。たとえば、私の犬は毛深い→私の犬はリンゴです
    3. 変化しない可能性は 10% あります。例: 私の犬は毛深い → 私の犬は毛深い
  2. 次に、モデルにカバーまたは交換された部品を予測して復元させます。損失を計算するとき、最初のステップでランダムにカバーまたは交換された部品のみが計算され、残りは失われません。残りの部分は関係ありません。出力はです。

なぜこれをしたいのですか?

主な目的は、モデルがコンテキストを考慮できるように、トランスフォーマーを使用してグローバル セマンティック情報を提供することです。これにより、各機能間のつながりが強化されます。

b:次文予測

まず、コンテキストに属する文のペア、つまり 2 つの文を取得します。次に、これらの 2 つの文に特別なトークンを追加する必要があります[CLS]上一句话[SEP]下一句话[SEP]つまり、具体的には次の図に示すように、文の先頭 [CLS]、2 つの文の間、および文の末尾に 1 つを追加します。[SEP]

上の図の 2 つの文は明らかに連続していることがわかります。今このような文があった場合 [CLS]我的狗很可爱[SEP]企鹅不擅长飞行[SEP]、この 2 つの文は連続していないことがわかります。実際のトレーニングでは、これら 2 つの状況の数を 1:1 にします (この比率はサンプルの不均衡に適応するためです)。

Token Embedding 通常の単語ベクトル、つまり PyTorch の場合 nn.Embedding()

Segment Embedding の機能は、埋め込み情報を利用して、モデルに上下の文を分離させ、上の文のトークンをすべて0、次の文のトークンをすべて1にして、モデルが開始と終了を判断できるようにします。上の文と下の文の位置など

[CLS]我的狗很可爱[SEP]企鹅不擅长飞行[SEP]
 0   0 0 0 0 0 0 0  1 1 1 1 1 1 1 1

Position Embedding Transformer とは異なり、三角関数ではありませんが、学習されます。

マルチタスク学習

BERT の事前トレーニング段階では、実際には上記の 2 つのタスクを組み合わせて同時に進行し、すべての損失を追加します。

2: トレーニング

BERT の Fine-Tuning は 4 種類に分かれています。

ここでの主な参考人は国立台湾大学の李宏儀先生です。

 分類タスクの始まりは cls で、この位置の出力を線形分類器にスローして、クラスを予測させます。プロセス全体で、線形分類器のパラメーターを最初から学習する必要がありますが、BERT でパラメーターを微調整するだけで十分です。

 現在のタスクが スロット充填の場合、文内の各単語に対応する出力は、単語のラベルを予測するために別の Linear に送信されます。実際、これは本質的に分類問題ですが、単語ごとにカテゴリを予測する必要があります。

 現在のタスクが NLI (自然言語推論)の場合。つまり、前提が与えられ、次に仮説が与えられ、モデルはその仮説が正しいか、間違っているか、未知であるかを判断する必要があります。これは本質的に 3 つのカテゴリの問題で、ケース 1 と同様に、 [CLS] 次の出力を予測するだけです。

例えば現在のタスクがQA(質問応答)の場合、上図のように記事と質問(今回の例は比較的単純なので、回答は必ず記事内に表示されます)をモデルに送信し、モデルは 2 つの数字 s と e を出力します。これら 2 つの数字は、この質問に対する答えが記事の s 番目の単語から e 番目の単語に含まれることを示します。具体的なプロセスは次の図で見ることができます 

まず、質問と記事が [SEP] 分離されて BERT に送信され、上の図の黄色の出力が得られます。この時点で、2 つのベクトル (上図のオレンジ色と黄色のベクトル) をトレーニングする必要もあります。最初にオレンジ色とすべての黄色のベクトルをドット積し、次にソフトマックスを使用して、どれが最大の出力値を持つかを確認します。たとえば、上図の d2 に対応する出力確率が最大である場合、s=2 と考えられます。 

同様に、青色のベクトルとすべての黄色のベクトルを内積に使用し、最終的に d3 の確率が最も高いため、e=3 であると予測します。最終的に、答えは s=2,e=3 になります。

3: コードの実装

A100 カードで実行しています。

 結果から言うと使えるとしか言いようがありません。

おすすめ

転載: blog.csdn.net/qq_33083551/article/details/130827307