BPE、WordPiece、ULM:3つのアルゴリズムのNLPサブワード原理

 

サブワードアルゴリズムは今NLPモデルの性能を強化するための重要な方法となっています。2018年以来BERTが生まれているなどの主要なチャートNLPのコミュニティ、様々な事前訓練を受けた言語モデル、スイープが判明標準となっているサブワードアルゴリズムをそして、伝統的なスペースから分離トークン化技術のコントラストが大きな利点を持っている~~

例えばモデルは、「古い」、および「最古」は「スマート」、「賢く」に一般化することができず、「賢い」との関係を「古い」を学びました。

  • 伝統的な方法は、珍しいまたは未知の語彙の治療のために良い言葉にはできません(OOV問題)

  • ワードトークン化法の間の伝統的な関係前モデル接辞を学習を助長されていません

  • 粒子サイズに溶液として埋め込み文字が小さすぎOOVあります

  • 言葉と文字の間サブワードサイズ、より良いOOV問題のバランスをとることができます

彼は現在を見て多くの、そして小さな夜の話をしなかったの最も熱い最も熱い3つのサブワードアルゴリズムペア O(*¯▽¯*)BU

バイトペアエンコーディング

BPE(バイト)コードが存在しないバイトデータで置き換えられているデータ圧縮の符号化又は二塩基性単純型、データの連続したバイトの対の中で最も一般的です。後で使用するには、元のデータを再作成するためにしながら、交換用のテーブルが必要です。この方法でOpenAI GPT-2 Facebookのロベルタはサブワードベクターを構築しています。

  • 利点

    • 語彙を効果的サイズおよび数(トークン文章を符号化するのに必要な数)工程のバランスをとることができます。

  • 短所

    • あるいはシンボルに基づいて決定され、貪欲、結果は、スライス確率を複数設けることができません。

アルゴリズム

  1. 十分に大きなトレーニングコーパスを準備します

  2. 所望のサブワード語彙のサイズを決定します

  3. 統計的な単語の頻度、最後には「</ w>が」文字の単語と接尾辞のシーケンスを分割します。この段階のサブワードサイズは文字です。例えば、5の「低」周波数が、私たちは「</ワット>低い」として、それを書き換える:5

  4. 新しいにサブワードを選択することにより、最高周波数の発生頻度の各連続バイトの統計

  5. サブワードステップ語彙サイズの第二のセットまたは1バイトの出現頻度の次の最高周波数まで繰り返しステップ4

「</ワット>」ストップキャラクタは、サブワード意義が単語の接尾辞であることを示しています。例えば:単語なしの「ST」は「</ w>が」「番目のAR」などの最初の単語に表示されることがあり、加えて接尾辞「</ w>が」そのような「広いST </ Wとして、単語が配置されている修飾示します>」、2つの非常に異なる意味。

各単語の後に起こる変化の三種類をマージすることができます。

  • +1、(二つの連続する用語は全く同じ時間ではない)2つのサブワードで原稿を保持しながら、新しい単語が、合併後に添加したことを示します

  • +0、予約済みの元の二つのサブワードは、消化されながら、合併後にその新しい用語を追加する(別の単語の出現と完全に単語と表示され、続いて)

  • 元の2つのサブワードが(同時に2つの連続した用語)を消化しながら-1、合併後の新しい単語を加えることを示しています

実際には、合併の数の増加に伴って、語彙サイズは、通常は最初に増加し、次いで減少します。

入力:

{'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w e s t </w>': 6, 'w i d e s t </w>': 3}

1 ITER、最高連続バイトの周波数 "E" 及び "S" = 3 + 6が "ES" に合わせ、9回登場しました。出力:

{'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w es t </w>': 6, 'w i d es t </w>': 3}

ITER 2、連続バイト "ES" と "T" の最高周波数は、6 + 3 =は "EST" に合わせ、9回登場しました。出力:

{'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w est </w>': 6, 'w i d est </w>': 3}
Iter 3, 以此类推,最高频连续字节对为"est"和"</w>" 输出:
{'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w est</w>': 6, 'w i d est</w>': 3}
Iter n, 继续迭代直到达到预设的subword词表大小或下一个最高频的字节对出现频率为1。

BPE実現

import re, collections


def get_stats(vocab):
    pairs = collections.defaultdict(int)
    for word, freq in vocab.items():
        symbols = word.split()
        for i in range(len(symbols)-1):
            pairs[symbols[i],symbols[i+1]] += freq
    return pairs


def merge_vocab(pair, v_in):
    v_out = {}
    bigram = re.escape(' '.join(pair))
    p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
    for word in v_in:
        w_out = p.sub(''.join(pair), word)
        v_out[w_out] = v_in[word]
    return v_out


vocab = {'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w e s t </w>': 6, 'w i d e s t </w>': 3}
num_merges = 1000
for i in range(num_merges):
    pairs = get_stats(vocab)
    if not pairs:
        break
    best = max(pairs, key=pairs.get)
    vocab = merge_vocab(best, vocab)
    print(best)


# print output
# ('e', 's')
# ('es', 't')
# ('est', '</w>')
# ('l', 'o')
# ('lo', 'w')
# ('n', 'e')
# ('ne', 'w')
# ('new', 'est</w>')
# ('low', '</w>')
# ('w', 'i')
# ('wi', 'd')
# ('wid', 'est</w>')
# ('low', 'e')
# ('lowe', 'r')
# ('lower', '</w>')

コーディング

以前のアルゴリズムでは、我々は、語彙のサブワード長降順に従って、語彙サブワードを持っています。コーディングする場合がある場合は、各単語のために、現在の単語のトークンのサブストリングがあるかどうかを見つけるためにソートされた語彙を横断、その後、トークンは1つのワードトークンです。

私たちは、それぞれの単語のトークンであるに部分文字列を置換するための最短トークン、試みに最長からトークンの繰り返し。最後に、我々はすべてのトークンを反復処理、およびすべてのサブ文字列トークンを置き換えます。あなたはまだ交換しますが、すべての繰り返しが完了しているトークンのサブストリングされていない場合は、残りのサブ単語は、<UNK>として、特別なトークンに置き換えられています。例としては、次のとおりです〜

# 给定单词序列
[“the</w>”, “highest</w>”, “mountain</w>”]


# 假设已有排好序的subword词表
[“errrr</w>”, “tain</w>”, “moun”, “est</w>”, “high”, “the</w>”, “a</w>”]


# 迭代结果
"the</w>" -> ["the</w>"]
"highest</w>" -> ["high", "est</w>"]
"mountain</w>" -> ["moun", "tain</w>"]

コーディング計算集約。実際には、我々はすべての単語を事前にトークン化、および辞書で単語トークン化の道保存することができます。我々が表示された場合、未知の単語の辞書には存在しません。私たちは、この方法は、上述のトークン化したコーディング単語を使用して、辞書のトークン化スペアに新しい単語を追加します。

デコーディング

すべては、例えば、一緒に作品をトークン:

# 编码序列
[“the</w>”, “high”, “est</w>”, “moun”, “tain</w>”]


# 解码序列
“the</w> highest</w> mountain</w>”

WordPiece

WordPieceアルゴリズムは、BPEの変形として見ることができます。相違点は、WordPieceはむしろ最高周波数のペアの次の新しいバイトを生成するよりも、確率に基づいてサブワード。

アルゴリズム

  1. 十分に大きなトレーニングコーパスを準備します

  2. 所望のサブワード語彙のサイズを決定します

  3. 文字のシーケンスに単語分割

  4. 語学研修モデルに基づいて、ステップ3のデータ

  5. 新しいユニットとして追加言語モデルユニットを最大化するために、トレーニングデータの確率を高めることができ、すべての可能なサブワード単位から選択

  6. ステップ5を繰り返し、ステップ2においてサブワード増分の語彙サイズ又は確率をある閾値未満に設定されるまで

ユニグラム言語モデル

ULMは、それが出力する確率区間を有するサブ複数の単語が可能であり、別のサブワードパーティションアルゴリズムです。これは、仮説を紹介:発生は、すべてのサブワードとは独立して、かつサブワードシーケンスの確率の積は、サブワードの生成によって起こります。WordPieceとULMはサブワード使用語彙言語モデルを構築しています。

 

アルゴリズム

  1. 十分に大きなトレーニングコーパスを準備します

  2. 所望のサブワード語彙のサイズを決定します

  3. 言葉の所定の配列の確率を最適化するために単語が表示されます

  4. 各サブワードの損失の計算

  5. サブワードソートの損失に基づいて、元のX%を保持します。OOVを回避するためには、文字レベルのユニットを保持することを提案しました

  6. 語彙サイズの結果サブワードステップ5またはステップ2まで5を繰り返しステップ3は、設定を変更しません

概要

  1. サブワードはバランスをとると、未知の語彙のカバーすることができます。極端な状況下で、我々は、すべての英語の単語を表現するために26トークン(すなわち文字)を使用することができます。一般的には、Facebookのロベルタも、ビルド語彙の50Kまで、良い結果を達成するために16Kまたは32Kのサブワード十分に使用することをお勧めします。

  2. 中国を含むアジアの多くの言語では、単語はスペースで分離することはできません。このように、初期の語彙は、英語よりもはるかに大きくする必要があります。

 

公開された33元の記事 ウォンの賞賛0 ビュー3278

おすすめ

転載: blog.csdn.net/xixiaoyaoww/article/details/104548745