現在BERTを勉強中です。
ほんの少しだけ。
BERT=トランスフォーマーからの双方向エンコーダー表現
著者は Google のチームです
主なハイライトは、トランスフォーマーと事前トレーニング + ラベルなしデータを使用して、一般的な言語モデルをトレーニングすることです。
0: 背景
ImageNet の存在により、視覚的なアルゴリズムは移行の学習や微調整に非常に便利ですが、当時は NLP は利用できませんでした。
この場合、BERT が登場しました。
1: 技術的枠組み
a:マスクされた言語モデル
BERT では、Masked LM (Masked Language Model) が言語モデルを構築します。簡単に言うと、文内の任意の単語をランダムにカバーまたは置換し、コンテキストを通じてカバーまたは置換された部分をモデルに予測させます。損失は、カバーされた部分の損失のみを計算します。これは非常にわかりやすい作業です。実際の操作は次のとおりです。
-
文内のトークン (単語またはフレーズ) の 15% を次のものにランダムに置き換えます。
- これらのトークンは 80% の確率で に置き換えられます
[MASK]
。たとえば、私の犬は毛深い→私の犬は [MASK] - 10% の確率で他のトークンに置き換えられます。たとえば、私の犬は毛深い→私の犬はリンゴです
- 変化しない可能性は 10% あります。例: 私の犬は毛深い → 私の犬は毛深い
- これらのトークンは 80% の確率で に置き換えられます
- 次に、モデルにカバーまたは交換された部品を予測して復元させます。損失を計算するとき、最初のステップでランダムにカバーまたは交換された部品のみが計算され、残りは失われません。残りの部分は関係ありません。出力はです。
なぜこれをしたいのですか?
主な目的は、モデルがコンテキストを考慮できるように、トランスフォーマーを使用してグローバル セマンティック情報を提供することです。これにより、各機能間のつながりが強化されます。
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 カードで実行しています。
結果から言うと使えるとしか言いようがありません。