最近、主に BERT ベースのモデルを使用して機械翻訳コンテストをプレイしていました。その中で、ちょっとした知識点が私の好奇心をそそりました。それは、英語のトレーニング コーパスを BERT モデルに入力する前に、「BPE」 (バイト ペア エンコーディング) 操作を実行する必要があるということです。資格のあるアルゴリズム エンジニアになることに専念しているプログラマーとして、もちろん原理を理解する必要があります。この記事では、BPE ワード セグメンテーション アルゴリズムをすぐに理解することができます。
この記事は主に 2 つの部分に分かれており、内容は 1500 ワードで、読むのに約 8 分かかります。
- BPE 単語分割アルゴリズムの起源
- BPE 単語分割アルゴリズムのプロセス
- 語彙構築
- コーパスのエンコーディング
- コーパスのデコード
BPE 単語分割アルゴリズムの起源
BPE アルゴリズム [1]。その目的は「いくつかのサブワードを使用してデータをエンコードする」ことです。この方法は、BERT などのモデルの標準的なデータ前処理方法となっています。
機械翻訳の分野では、モデルのトレーニング前の非常に重要なステップは「語彙を構築する」ことです。英語コーパスの場合、トレーニング コーパスに出現した「すべての英単語」を使用して語彙を構築するのが自然な考え方ですが、この方法には次の 2 つの問題があります。
- 学習用コーパスに出現する単語の数は多く、このような構築方法では語彙が多くなり、学習速度が低下することになる。
- モデルのテストでは、まれな単語やトレーニング中に出現しなかった単語に対処することが困難です (OOV 問題)。
もう 1 つの方法は、個々の「文字」を使用して語彙を構築することです。英語の文字数は限られており、文字ベースの方法は過剰な語彙と OOV の問題を効果的に軽減できますが、粒度が細かすぎるため、単語自体の多くの意味情報が失われます。
上記問題を解決するために、BPEアルゴリズムに代表されるSubword(サブワード)に基づくアルゴリズムが提案され、「BPEアルゴリズムの単語分割の粒度は単語レベルと文字レベルの間である」 。例えば、「looked」と「looking」という単語を「look」「ed」「ing」に分割することで、語彙量を減らしながら単語の意味情報を学習することができます。
BPE 単語分割アルゴリズムのプロセス
BPE アルゴリズムの中核は主に 3 つの部分に分かれています。
- 語彙構築
- コーパスのエンコーディング
- コーパスのデコード
語彙構築
語彙構築は BPE アルゴリズムの中核であり、「トレーニング コーパスに従って」 BPE アルゴリズムの語彙を構築します。アルゴリズムの全体的な手順は次のとおりです。
- モデルのトレーニング コーパスを準備する
- 「必要な語彙数」を決定する
- トレーニング コーパス内のすべての単語を文字シーケンスに分割し、これらの文字シーケンスを使用して初期語彙を構築します
- トレーニング コーパス内の連続する各バイト ペアの頻度をカウントし、「頻度が最も高いバイト ペアを選択して新しいサブワードにマージし、語彙を更新します」
- 語彙サイズが設定した期待値に達するか、残りのバイト ペアの頻度が 1 以下になるまで、ステップ 4 を繰り返します。
BPE 語彙を構築するプロセスを理解するために例を使用してみましょう。現在のトレーニング コーパスに出現した単語が次のとおりであると仮定して、初期語彙を構築します。
<\w>
単語の終わりを示すために各単語の後に新しい文字を追加することに注意してください。初期の語彙サイズは 7 で、これはトレーニング コーパスに出現したすべての文字です。
その後、lo
このバイト ペアがトレーニング コーパス内で最も頻繁に 3 回出現したことがわかりました。語彙を更新し、lo
新しいサブワードとして語彙に追加し、現在のトレーニング コーパスに単独で出現しない文字l
と を削除しますo
。
次に、low
このバイト ペアがトレーニング コーパス内で最も頻繁に出現し、3 回であることがわかりました。結合を続け、low
語彙を追加し、削除しますlo
。文字はw
単語内にnewer
まだ存在するため、削除されないことに注意してください。
次にループを継続し、語彙にer
文字を追加したり削除したりします。r
語彙サイズが設定した期待値に達するか、残りのバイト ペアの頻度が 1 以下になるまで、このプロセスを繰り返します。
最終的に、トレーニング サンプルに基づいて語彙が構築されました。
コーパスのエンコーディング
語彙を構築した後、トレーニング コーパス内の単語をエンコードする必要があります。エンコード方法は以下のとおりです。
- まず「語彙内のすべてのサブワードを長さの降順に並べ替えます」
- 与えられた単語ごとに、ソートされた語彙を繰り返し処理し、その単語の部分文字列である語彙内のサブワードを探します。「一致」した場合は、現在のサブワードを出力し、単語の残りの部分との一致を継続します。
- 語彙を調べた後でも単語内に一致しない部分文字列が存在する場合は、それを特別なサブワード (例: ) に置き換えます
<unk>
。
例として、今構築した語彙が次のようになっているとします。
(“errrr</w>”,
“tain</w>”,
“moun”,
“est</w>”,
“high”,
“the</w>”,
“a</w>”)
特定の単語mountain</w>
の単語分割結果は次のようになります: [ moun
, tain</w>
]
コーパスのデコード
コーパスのデコードでは、出力されたすべてのサブワードが最後に到達するまでまとめられます<\w>
。例として、モデルの出力が次のようになっているとします。
["moun", "tain</w>", "high", "the</w>"]
次に、デコードされた結果は次のようになります
["mountain</w>", "highthe</w>"]
要約する
この記事では、機械翻訳の分野で標準的な前処理方法となっている、「サブワードを使用してデータをエンコードする」という BPE の単語分割アルゴリズムについて学習しました。
参考文献
[1]ゼンリッチ、リコ、バリー・ハドウ、アレクサンドラ・バーチ。「サブワード単位での珍しい単語のニューラル機械翻訳」ACL2016。
[2] NLP の 3 つの主要なサブワード モデル: BPE、WordPiece、ULM の詳細な説明
[3] NLP サブワード アルゴリズムの深い理解: BPE、WordPiece、ULM bzdww
[4] https://www.cnblogs.com/huangyc/p/1