自作トークナイザーを作ってみた。
前回から時間が空いてしまいましたが、今回も作ってみました。今回はトークナイザーです。トークナイザーのコアであるBPEについて勉強してみました。
前回から時間が空いてしまいましたが、今回も作ってみました。今回はトークナイザーです。トークナイザーのコアであるBPEについて強化してみました。
BPE (Byte Pair Encoding) とは?
BPE (Byte Pair Encoding) 是?
Byte Pair Encoding (BPE) は、文字列(データ)中で頻繁に出現するバイトペアを新しいトークン(サブワード)として再帰的に置き換えるアルゴリズムです。もともとは文字列の圧縮手法として提案されましたが、現在では NLP の トークナイザーとして広く活用されています。特に GPT 系モデルや多くの大規模言語モデル(LLM)で採用されるトークナイザーとして有名です。
Byte Pair Encoding (BPE) 是在字符序列(数据)中频繁出现的字对进行新建的 token(缩写)并重新进行替换的算法。虽然是字符序列的聚合手法,但目前在 NLP 的 tokenizer 中广泛应用。特别是在 GPT 系列模型和众多的大规模语言模型(LLM)中被采用的 tokenizer 是有名的。
- 単語レベルよりも細かく、文字レベルよりも大きい “ちょうどいい” 分割単位が得られる
- 单词频率相比之下更细致,字符频率相比之下更大,“较好的”分割单位会得到。
- 未知語(辞書に存在しない単語)を細かく分割して表現できる
- 未知ら語(辞書に存在しない単語)を細かく分割して表現できる
以下、具体的なサンプルと実装例を見ながら、その流れを解説します。
以下,具体的样本和实例来看,那个流来解释。
1. BPE の動作原理(簡単な例)
1. BPE 的动机原理(简单的例子)
下記は、BPE がどのように文字列を置き換えるかを示すシンプルな例です。
下面是一个示例,说明 BPE 如何将字符序列进行替换。
aaabdaaabac
この文字列は全部で 11 トークン(文字)です。最も頻繁に出現するペアは "aa" なので、例えば "Z" のような未使用バイトを使って置き換えます。
这个文本是全部由 11 个 tokens(文字)构成。最常出现的对是 "aa",举例来说 "Z" 的样未使用绑定会被替换掉。
ZabdZabac
Z=aa
次は "ab" が最頻出となるため、それを "Y" に置換します。
接下来是 "ab" 作为最基本的,因此将其替换为 "Y"。
ZYdZYac
Y=ab
Z=aa
これでさらに置き換えを続けると、以下のように "ZY" を "X" に置き換えることも可能です。
这样的话,可以继续进行替换,例如将 "ZY" 替换为 "X" 也是可能的。
XdXac
X=ZY
Y=ab
Z=aa
最終的には 5 トークンとなりました。ここで、さらに頻出ペアがなければ BPE による圧縮は終了です。逆に デコード する際は、これらの置き換え規則を逆順に適用すれば元の文字列を復元できます。
最终的确是 5 token となりました。ここで、さりげに出力パラメータがなければ BPE による圧縮は終了です。逆に デコード する場合は、これらの置き換え規則を逆順に適用すれば元の文字列を復元できます。
2. Byte-level BPE について
2. Byte-level BPE について
BPE は「Byte」という単語が入っていますが、実装上は Unicode のコードポイント単位で処理されることが多いです。
ところが、OpenAI の研究 [^1]では “byte-level BPE” が提案され、以下のような議論がされています(ざっくり日本語要約):
BPE 是“Byte”这样的单词的引入,但实际上是 Unicode 的代码点单位进行处理的事是多的。
也就是说,在 OpenAI 的研究 [^1] 中,“byte-level BPE”被推荐,以下的ような讨论がされています(むしろ日本語要約):
- Unicode のあらゆる文字を扱おうとすると、ベースの語彙(初期トークン集合)が 13万語以上にもなる
- 使用 Unicode 的任何字符时,基于语言的语种(初期特征集合)也会超过 13 万语种以上。
- BPE をバイト列に直接適用するなら、ベースの語彙数は 256 個に収まる
- 如果直接使用BPE作为基础,则词汇的语言分割数为256个。
- しかし BPE が “貪欲 (greedy)” に頻度をもとにペアをマージするため、共通単語が微妙に違う形(例:
dog,dog.,dog?,dog!)で出現すると、トークンを無駄に使ってしまう- 只要 BPE 以 “贪婪 (greedy)” 的方式进行合并,公共单词会以微妙的形式(例如:
dog,dog.,dog?,dog!)出...