- API ドキュメント
- CLI
- 連携ガイド
- ブログ
- 機械が単語を理解する方法:NLPに埋め込むためのガイド
- トランスフォーマーによるプロンプトベースの学習
- 効率的な変圧器II:知識蒸留と微調整
- 効率的な変圧器I:注意メカニズム
- 階層的な教師なしインテントモデリング:トレーニングデータなしで価値を得る
- Communications Mining による注釈バイアスの修正
- アクティブ ラーニング: より優れた ML モデルを短時間で実現
- それはすべて数字にあります-メトリックを使用してモデルのパフォーマンスを評価します
- モデルの検証が重要な理由
- 会話型データ インテリジェンスのための Communications Mining と Google AutoML の比較
Communications Mining 開発者ガイド
効率的な変圧器II:知識蒸留と微調整
この2部構成の投稿では、一般的でありながら計算量の多い Transformerベースの言語モデリング手法の変更を検討することにより、最先端のNLPをより効率的にする方法について説明します。
前の投稿:
- Transformerの自己注意メカニズムの計算ワークロードが高い理由を説明しました。
- パフォーマンスを大幅に損なうことなく実行するのにより効率的な代替アテンションメカニズムを提示しました。
この投稿では、次のことを行います。
- 小さなモデルをトレーニングして大きなモデルの出力を再現する方法を探ります。
- 言語モデルを効率的に微調整する方法を説明する。
- さまざまな効率的な Transformer アプローチを使用するシナリオに関する推奨事項を提供します。
前回の投稿では、 NLPにおける意味表現学習の簡単な歴史と、 Transformerの自己注意メカニズムがどのように機能するかの概要を説明しました。 なじみのない読者のために、最初にこれらのセクションを読むことをお勧めします。 この投稿では、前回の投稿で紹介した表記法の一部も共有しています。
知識蒸留 は、大型モデル(教師)の出力を再現するように促すことによって、小型モデル(学生)を訓練する、より効率的なトランスフォーマーの研究分野です。 これは、コンピュータビジョンの分類タスクで最初に人気を博した手法ですが、NLPを含むいくつかのドメインでうまく適用されています。 一般的なワークフローは次のとおりです。
- 一般的な注釈付きデータを使用して大規模なモデルをトレーニングします。
- タスク固有の注釈なしデータ (および使用可能な場合はタスク固有の注釈付きデータ) を使用して、小さなモデルをトレーニングして大きなモデルを模倣します。
このプロセスには依然として大規模なモデルのトレーニングが含まれますが、これは 1 回限りのコストです。 予測を行うより頻繁なタスクは、実行効率が大幅に向上した小さなモデルによって実行されます。 その結果、知識蒸留は、モバイルデバイスなど、ハードウェアに制約のある環境で機械学習を実行するための特に一般的な手法です。
ドキュメント x とクラスラベル yがあり、クラスラベルが C カテゴリのいずれかに属しているとします(つまり、 y∈{1,2,...,C})。 大きなモデル f がドキュメント x のクラス ラベル y=c を p(c;f(x))。 この確率は通常、次の形式の関数を使用して計算されます。
ここで I(c;y)=1 y=c の場合は 0 です。
目的関数の例は次のとおりです。
- 最尤スタイルの目標:
- これは、 p(c;f) および p(c;g)。
- ロジット間の負の平均二乗誤差(MSE):
タスク固有の蒸留
biLSTM-SOFTモデルは、分類タスクですでに微調整されたBERTモデルの予測を再現しようとすることにより、タスク固有の蒸留を実行します。学生モデルでは、単層の双方向 LSTMを使用します。 これはリカレントモデルですが、レイヤーが 1 つしかないため、実行速度は速くなります。
蒸留の目的は、生徒と教師のロジットの間の負のMSEです。 抽出元のBERTモデルよりも実行速度が400倍以上高速ですが、パフォーマンスは4〜7 精度/ F1ポイント低下します(タスクによって異なります)。
事前トレーニング中の蒸留
これまでのところ、この投稿では、教師あり学習のコンテキストでの知識蒸留を紹介してきました。 ただし、 DistilBERT は、言語モデルの事前トレーニングと微調整の両方の段階で知識抽出を実行します。
前の投稿 の背景セクションで説明した ように、BERTはマスクされた言語モデリングを使用して事前にトレーニングされています。DistilBERT は、欠落している単語をクラス ラベルとして扱い、最尤スタイルの蒸留目的関数を使用します。 欠落している単語に対するBERTの予測確率分布を蒸留目的のソフトターゲットとして使用します。 著者らはまた、コサイン埋め込み目標を追加し、小さなモデルが埋め込みの方向をBERTによって生成された方向と一致させることを奨励します。
DistilBERT は BERT と同じ基本アーキテクチャを採用していますが、レイヤーの数は半分で、実行速度が約 38% 高速です。 事前トレーニング中にのみ蒸留すると、BERTのパフォーマンスの97%が保持されます。 また、その結果、微調整中にタスク固有の蒸留(同じタスクで微調整されたBERTモデルを使用)を実行すると、パフォーマンスがさらに向上することも明らかになった。
Transformer アーキテクチャの活用
TinyBERT は、言語モデルの事前トレーニング段階と微調整段階の両方で知識抽出を実行するという点で、DistilBERT に似たアプローチです。 ただし、TinyBERTは、トランスフォーマーアーキテクチャの機能を具体的に利用することにより、BERTの中間表現(最終出力だけでなく)から直接知識を取得します。
DistilBERT と同様に、TinyBERT は BERT と同じアーキテクチャを採用していますが、レイヤーは少なくなっています。 まず、学生モデルの各層から教師モデルの層へのマッピングが定義され、つまり、各学生層が1つの教師層に関連付けられます。 次に、学生層に応じて、3つの蒸留目的関数のいずれかを使用します。
- 埋め込みレイヤー
- 学生と教師の埋め込み行列の間の MSE を最小化します。
- アテンション レイヤー
- 学生と教師の注意行列の間のMSE(前の 投稿 の式(4)の A )と、自己注意操作に続くフィードフォワード層の学生と教師の出力の間のMSEを最小化します。
- 最終 (予測) レイヤー
- 最尤スタイルの蒸留目標を使用して、学生と教師の予測確率を一致させようとします。 これは DistilBERT と同じです。
TinyBERTは、蒸留されたBERTモデルと比較して、実行が2倍から9倍高速です(レイヤーの数と非表示状態のサイズによって異なります)。 幅広いタスクでDistilBERTを一貫して上回っており、各層の蒸留目的が最終層のみと比較して有用であることを示しています。
前回の投稿の 「背景」 セクションで説明したように、大規模な言語モデルをトレーニングする最後のステップは、通常、関心のあるタスクでモデルを微調整することです。 この段階は比較的迅速に実行できますが、それでも通常、モデルのすべてのパラメーターの更新が必要です。 つまり、ハードウェア要件はトレーニング前の段階と同じです。 微調整ステップは通常、タスクごとに個別に実行されることを考えると、これは依然としてトレーニングプロセスの高価な段階です。 したがって、別の研究ラインは、微調整中に更新されるパラメーターの数を減らすことを目指しています。
重みのサブセットの微調整
モデルのすべてのパラメーターを更新する必要がないようにする 1 つの方法は、一部のレイヤーをフリーズすることです。 リーら このアプローチの有効性に関する実証的研究を実行します。 その結果、12 層の BERT モデルを使用して、最初の 9 層をフリーズし、最後の 3 層のみを微調整すると、ほとんどのタスクで完全な微調整のパフォーマンスの少なくとも 90% に達することがわかりました。 ただし、言語モデル全体をフリーズし、最終的な予測レイヤーをトレーニングするだけでは、すべてのタスクでパフォーマンスが大幅に低下します。
バイアス項のみの更新
ほとんどのニューラルネットワークアーキテクチャのほとんどの操作では、入力に行列を乗算してからバイアス項を追加します。 これらの操作を構成する方法は、アーキテクチャを定義するものです。
トランスフォーマーでは、バイアス項( たとえば、前の投稿 の式(1)〜(3)の b 項)は、全パラメータの0.1%未満を表します。したがって、 BitFit は、微調整中にのみこれらを更新し、残りのパラメーターをフリーズすることを提案しています。 注釈付きトレーニングデータが限られているため、BitFitはモデル全体の微調整に対して競争力のあるパフォーマンスを発揮します(場合によってはそれよりも優れています)。 大規模なトレーニングデータセットでは、完全な微調整よりもパフォーマンスがわずかに低下します。
小規模なトレーニング可能なネットワークをトランスフォーマーに挿入する
パラメーター効率の高い別の微調整メソッドのセットは、事前トレーニング済みの言語モデル全体をフリーズしますが、目的のタスク用にトレーニングされた追加のパラメーターの小さなセットを導入します。 アダプターは 、各 Transformer レイヤー内に 2 つの 2 層フィードフォワード・ネットワークを挿入することによってこれを行います。 これらは、自己注意メカニズムに従う既存のフィードフォワードネットワークの直前と直後に挿入されます。 2 つのレイヤーは、次の操作を実行します。
- 最初のレイヤーは、Transformer の非表示状態を低次元ベクトルにダウンスペクションし、非線形性を適用します。
- 2 番目のレイヤーは、低次元ベクトルを Transformer の非表示状態サイズにアッププロジェクションします。
この背後にある考え方は、(最終的な予測レイヤーをトレーニングするだけでなく)Transformerアーキテクチャ全体に学習可能なパラメーターを挿入することで、モデルは微調整と同じ方法で、しかしはるかに効率的な方法で内部表現を調整できるということです。 アダプタのチューニングは、フルファインチューニングよりもわずか~0.4%悪く、トレーニングされたパラメータの数はわずか3.6%です。
これらの2つの投稿では、いくつかの異なる効率的なTransformerメソッドについて説明しました。 いつそれらを使用するのが適切でしょうか?
- 特に長いドキュメントを扱う場合は、 前の投稿で説明したような効率的なアテンションメカニズムを使用することをお勧めします。 これにより、事前トレーニング時間と推論時間の両方が短縮されます。 パフォーマンスは、本格的な注意を払うよりも優れている場合があります。
- ボトルネックがメモリである場合(つまり、短いドキュメントのバッチでもメモリ不足エラーが発生する場合)、蒸留モデルを使用してみてください(例: TinyBERT)。 レイヤーが少なく、表現の次元が低いため、モデルのメモリ使用量が削減されると同時に、トレーニングも高速になります。
- ただし、蒸留されたモデルは、学習するために事前にトレーニングされたフルサイズモデルが必要であり、通常、事前トレーニングと微調整の両方で蒸留するとより適切に機能することに注意してください。
- 微調整段階で注釈付きデータが限られている場合は、言語モデルパラメータのほとんどまたはすべてをフリーズする微調整方法を使用します(例: アダプター) は、オーバーフィットのリスクを軽減し、通常、モデル全体を微調整するよりも優れたパフォーマンスを発揮します。
- 教師ありの下流タスクが多数ある場合は、効率的な微調整方法を使用することをお勧めします。 これにより、各タスクでトレーニングおよび保存する必要があるパラメーターの数が減ります。
- 効率的な微調整方法は、完全な微調整よりもトレーニングが速い場合がありますが、通常、推論速度は向上しません (つまり、 トレーニング済みのモデルから予測を取得する)。 実際、それらのいくつかは、追加のレイヤーが挿入されるため、推論がわずかに遅くなる可能性があります。
この2部構成のシリーズでは、一般的でありながら計算量の多いTransformerベースの言語モデリング手法の効率的な代替手段を探ることにより、最先端の自然言語処理(NLP)を広く利用できるようにする方法について説明します。
前の投稿:
- Transformerの自己注意メカニズムの計算ワークロードが高い理由を説明しました。
- パフォーマンスを大幅に損なうことなく実行するのにより効率的な代替アテンションメカニズムを提示しました。
この投稿:
- より大きなモデルの出力を再現するように促すことによって、小さくて効率的なモデルを訓練する知識蒸留技術について説明しました。
- 更新されるパラメーターの数を減らすことで言語モデルを微調整する効率的な方法を検討しました。
- さまざまな効率的な Transformer アプローチを使用するシナリオに関する推奨事項を提供しました。
Communications Mining を会社で試してみたい場合は、 試用版 に登録するか 、デモをご覧ください。