Upgrade to Pro — share decks privately, control downloads, hide ads and more …

トークナイザー入門

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for payanotty payanotty
October 03, 2024

 トークナイザー入門

Avatar for payanotty

payanotty

October 03, 2024
Tweet

More Decks by payanotty

Other Decks in Technology

Transcript

  1. 自己紹介
 • 名前
 ◦ 早野 康太
 • 前期アニメ
 ◦ 小市民シリーズ


    ▪ 終わってかなしい
 ◦ 逃げ上手の若君
 ◦ 負けヒロインが多すぎる!
 ◦ ロシデレ
 ◦ しかのこ
 • 趣味
 ◦ 最近ギター始めました

  2. LLMで文章を処理するまでの流れ
 
 
 吾輩は猫である
 吾輩
 は
 猫
 で
 ある
 345


    4
 6789
 52
 240
 LLM
 • 文章を入力したあと
 トークンIDを出すところまでが
 トークナイザーの仕事です
 
 • トークンIDはトークナイザー固有の辞書と
 対応しています
 • トークン分割は基本的にこの辞書に基づいて
 行われます

  3. トークナイザーとLLM
 
 Embedding層
 吾輩
 は
 猫
 で
 ある
 LLM
 Attention


    • Embedding層にはトークンに対応するベクトルの値が内包されています
 • LLMごとに処理できるトークンは前もって決まっています
 ◦ このトークンはトークナイザーの辞書と一対一に対応していて
 一般にボキャブラリーと呼ばれています

  4. トークナイザーとLLM
 
 Embedding層
 吾輩
 は
 猫
 で
 ある
 トークンID
 345


    4
 6789
 52
 240
 ベクトルの次元
 ボキャブラリーサイズ
 • トークンに固有のIDが
 割り当てられています
 
 • Embedding層の中から
 IDに対応するベクトルの値
 だけを使います
 
 • Embedding層は
 LLMごとに固有となっています

  5. トークナイズ手法
 
 すもももももももものうち
 す
 も
 もも
 すもも
 の
 う
 ち


    うち
 ボキャブラリー
 • トークナイザーはボキャブラリーに基づいてトークナイズを行います
 • 例えばBERTのトークナイザーでは
 最長一致法が使われています
 

  6. トークナイズ手法
 
 すもももももももものうち
 す
 も
 もも
 すもも
 の
 う
 ち


    うち
 ボキャブラリー
 もももももものうち
 すもも
 ボキャブラリーに一致する最長の文字列を
 トークンとして切り出します
 • トークナイザーはボキャブラリーに基づいてトークナイズを行います
 • 例えばBERTのトークナイザーでは
 最長一致法が使われています
 
 

  7. トークナイズ手法
 
 • トークナイザーはボキャブラリーに基づいてトークナイズを行います
 • 例えばBERTのトークナイザーでは
 最長一致法が使われています
 
 
 すもももももももものうち


    す
 も
 もも
 すもも
 の
 う
 ち
 うち
 ボキャブラリー
 もももももものうち
 すもも
 すもも
 もも
 もも
 もも
 の
 うち

  8. トークナイズ手法(まとめ)
 
 • トークナイザー特有のボキャブラリーを参照して
 トークナイズが行われます
 • トークナイズの手法
 ◦ 最長一致法
 ▪

    ボキャブラリー内の単語に一致する最長の文字列を
 トークンとして切り出していきます
 ◦ 日本語ではMecabなど固有のアルゴリズムが
 使われることがあります
 

  9. 文字単位のトークナイゼーション
 Hello World
 H
 このようなメリットがあります
 • 必要なボキャブラリーサイズが最もコンパクトに済む
 • どのような単語にも対応できる
 


    しかしながらデメリットの方が大きいです
 • テキストあたりのトークン数の増加
 • 単語の意味情報を学習するのが難しくなる
 • 学習効率が極めて悪い
 
 e
 l
 l
 o
 W
 o
 r
 l
 d

  10. 単語単位のトークナイゼーション
 Hello World
 Hello
 World
 このようにすることで単語単位の意味をLLMが学習しやすくなるメリットがあります
 が、いくつか問題があります
 • ボキャブラリーのサイズが膨大になる
 =

    必要とされるモデルのパラメータ数がヤバい
 ◦ 英語: 60万語 (オックスフォード英語辞典)
 ◦ 日本語: 25万語 (広辞苑)
 • 後述しますがChat GPT-4oでも語彙数は20万程度です
 

  11. 単語単位のトークナイゼーション
 Hello World
 Hello
 World
 このようにすることで単語単位の意味をLLMが学習しやすくなるメリットがあります
 が、いくつか問題があります
 • 未知の単語や造語に対応できない
 ◦

    ボキャブラリーに存在しない単語(OOV)に遭遇した場合に
 モデルが適切に処理を行うことができない
 ▪ OOVには<unk>などの特別なトークンを割り当てることになる

  12. トークン粒度によるトークナイゼーションの違い
 こ
 ん
 に
 ち
 は
 世
 界
 こんにちは
 世界


    トークン多
 トークン少
 ボキャブラリー少
 ボキャブラリー多
 ちょうどいい塩梅でトークナイズ
 できるボキャブラリーを構成したい

  13. Byte-Pair Encoding (BPE)
 hug
 pug
 pun
 bun
 hugs
 単語
 頻度


    10
 5
 12
 4
 5
 h
 u
 g
 p
 u
 g
 p
 u
 n
 b
 u
 n
 h
 u
 g
 s
 • 単語をさらに文字単位まで分割し
 出現する文字系列の出現頻度にしたがってマージしていく
 • ボキャブラリーのサイズが規定値に達するまで何回も繰り返す
 
 

  14. Byte-Pair Encoding (BPE)
 hug
 pug
 pun
 bun
 hugs
 単語
 頻度


    10
 5
 12
 4
 5
 h
 u
 g
 p
 u
 g
 p
 u
 n
 b
 u
 n
 h
 u
 g
 s
 “ug”が合計20回出現
 • 単語をさらに文字単位まで分割し
 出現する文字系列の出現頻度にしたがってマージしていく
 • ボキャブラリーのサイズが規定値に達するまで何回も繰り返す
 
 

  15. Byte-Pair Encoding (BPE)
 hug
 pug
 pun
 bun
 hugs
 単語
 頻度


    10
 5
 12
 4
 5
 h
 u
 g
 p
 u
 g
 p
 u
 n
 b
 u
 n
 h
 u
 g
 s
 h
 ug
 p
 p
 u
 n
 b
 u
 n
 h
 s
 ug
 ug
 “ug”をボキャブラリーに追加
 • 単語をさらに文字単位まで分割し
 出現する文字系列の出現頻度にしたがってマージしていく
 • ボキャブラリーのサイズが規定値に達するまで何回も繰り返す
 
 

  16. Byte-Pair Encoding (BPE)
 • 単語をさらに文字単位まで分割し
 出現する文字系列の出現頻度にしたがってマージしていく
 • ボキャブラリーのサイズが規定値に達するまで何回も繰り返す
 
 


    hug
 pug
 pun
 bun
 hugs
 単語
 頻度
 10
 5
 12
 4
 5
 h
 u
 g
 p
 u
 g
 p
 u
 n
 b
 u
 n
 h
 u
 g
 s
 h
 ug
 p
 p
 u
 n
 b
 u
 n
 h
 s
 ug
 ug
 h
 ug
 p
 p
 b
 h
 s
 ug
 ug
 un
 un
 同じ処理の繰り返し

  17. Byte-Pair Encoding (BPE)
 ある程度大きなコーパスを用意した上で
 そのコーパス上で文字分割→マージの手順でボキャブラリーを作成していきます
 
 
 
 Down, down,

    down
 Would the fall NEVER come to an end!
 I wonder how many miles I've fallen by this time?
 she said aloud
 コーパス
 単語
 Down
 Would
 the 
 fall 

  18. BPEを利用しているLLM
 • ChatGPTのトークナイザーではBPEが使用されていて
 各モデルでのボキャブラリー数はこのようになっています
 ◦ GPT-3.5, GPT-4: cl100k_base 
 ▪

    vocabulary: 100k
 ◦ GPT-4o: o200k_base
 ▪ vocabulary: 200k
 
 
 
 こんにちは世界
 こんにちは
 �
 �
 界
 cl100k_baseによるトークナイズ
 • Chat GPTでは最小単位がバイト文字になっているためOOVの問題はありません
 • ボキャブラリーが不十分だと漢字などがバイト文字(�)トークンに分解されて
 トークナイズされてしまいます

  19. BPEを利用しているLLM
 • ChatGPTのトークナイザーではBPEが使用されていて
 各モデルでのボキャブラリー数はこのようになっています
 ◦ GPT-3.5, GPT-4: cl100k_base 
 ▪

    vocabulary: 100k
 ◦ GPT-4o: o200k_base
 ▪ vocabulary: 200k
 
 
 
 こんにちは世界
 こんにちは
 �
 �
 界
 cl100k_baseによるトークナイズ
 こんにちは世界
 こんにちは
 世界
 o200k_baseによるトークナイズ
 “世界”が1単語としてトークナイズ
 cl100k_baseと比べて性能が向上

  20. WordPiece
 • BPEと同様に単語を文字単位に分割してマージしていきます
 • マージの際に指標とするスコアがBPEと異なります
 スコア = (サブワードペアの頻度)/(第一要素の頻度×第二要素の頻度)
 
 


    
 
 hug
 pug
 pun
 bun
 hugs
 単語
 頻度
 10
 5
 12
 4
 5
 h
 u
 g
 p
 u
 g
 p
 u
 n
 b
 u
 n
 h
 u
 g
 s
 u
 g
 =
 20/(36×20)
 =
 1/36
 ”u”と”g”が共に頻度が高いため 
 スコアが低めになっている 
 g
 s
 =
 5/(20×5)
 =
 1/20
 ”s”の頻度が少ないためスコアが高い 

  21. WordPiece
 • BPEと同様に単語を文字単位に分割してマージしていきます
 • マージの際に指標とするスコアがBPEと異なります
 スコア = (サブワードペアの頻度)/(第一要素の頻度×第二要素の頻度)
 
 


    
 
 hug
 pug
 pun
 bun
 hugs
 単語
 頻度
 10
 5
 12
 4
 5
 h
 u
 g
 p
 u
 g
 p
 u
 n
 b
 u
 n
 h
 u
 g
 s
 h
 u
 g
 p
 u
 g
 p
 u
 n
 b
 u
 n
 h
 u
 gs
 “gs”をボキャブラリーに追加

  22. Unigram
 • 大きなボキャブラリーから始めて指定のサイズになるまで
 ボキャブラリーを削っていきます
 • 単語を削った際の損失を求めて損失が少なくなるように削っていきます
 
 
 
 


    hug
 hugs
 単語
 頻度
 10
 5
 ボキャブラリー (可能なすべての部分文字列)
 ["h", "u", "g", "hu", "ug", "s", "hug", "gs", "ugs"]
 
 h
 u
 g
 =
 h
 u
 g
 ×
 ×
 =
 15/95×15/95×15/95
 hu
 g
 =
 hu
 g
 ×
 =
 15/95×15/95
 可能な分割について確率を計算
 分割の確率=トークン出現確率の掛け算
 Unigramでトークナイズする場合は
 可能な分割の中で最も確率の高い分割が採択されます
 

  23. Unigram
 • 大きなボキャブラリーから始めて指定のサイズになるまで
 ボキャブラリーを削っていきます
 • 単語を削った際の損失を求めて損失が少なくなるように削っていきます
 
 
 
 


    hug
 hugs
 単語
 頻度
 10
 5
 ボキャブラリー (可能なすべての部分文字列)
 ["h", "u", "g", "hu", "ug", "s", "hug", "gs", "ugs"]
 
 hug
 s
 このようにトークナイズした場合に
 各分割の尤度を掛け算して全体の損失を計算します
 • loss = 10(-log(P(“hug”)) + 5(-log(P(“hug”,”s”))) 
 ここで”hug”をボキャブラリーから削除した場合は
 • loss = 10(-log(P(“hu”, “g”)) + 5(-log(P(“hu”,”gs”))) 
 hug

  24. Unigram
 • 大きなボキャブラリーから始めて指定のサイズになるまで
 ボキャブラリーを削っていきます
 • 単語を削った際の損失を求めて損失が少なくなるように削っていきます
 
 
 
 


    hug
 hugs
 単語
 頻度
 10
 5
 ボキャブラリー (可能なすべての部分文字列)
 ["h", "u", "g", "hu", "ug", "s", "hug", "gs", "ugs"]
 
 hug
 s
 各トークンを削除した場合の損失を計算し
 全体の損失が最も少なくなるようにトークンを削ります
 
 この場合一番最初に削除されるのは”ugs”になります
 
 hug

  25. SentencePiece
 • SentencePiece: A simple and language independent subword tokenizer

    and detokenizer for Neural Text Processing (Kudo et al., 2018)
 ◦ SentencePieceは事前トークン化を必要とせずトークナイザーを学習します
 ▪ BPEとUnigramをサポート
 ◦ スペース(“ ”)で単語を区切らず
 文字列全体からサブワード分割することで言語依存の処理をなくしています
 
 
 
 Hello▁World
 Hello
 ▁Wor
 ld
 こんにちは世界
 こんにちは
 世
 界

  26. SentencePiece
 Hello
 ▁Wor
 ld
 Hell
 ▁World
 o
 He
 ▁World
 llo


    • SentencePieceではサブワードの確率分布をモデルとして学習し
 それに基づいてトークナイズ結果を出力します
 • いくつかある分割の候補から確率的にサンプリングを行って
 トークナイズ結果として出力します
 
 P([“Hello”, “▁Wor”, “ld”])/3λ Hello
 ▁World
 P([“Hell”, “o”, “▁World”])/3λ P([“He”, “llo”, “▁World”])/3λ P([“Hello”, “▁World”])/2λ サブワード分割スコア

  27. SentencePiece (まとめ)
 • SentencePiece: A simple and language independent subword

    tokenizer and detokenizer for Neural Text Processing (Kudo et al., 2018)
 • 言語に依存する処理をなくし
 完全にコーパスのみからトークナイザーを学習することができます
 • BPEとUnigramの2手法に対応しています
 • サブワードの分布を確率分布として学習したモデルを使って
 サブワード分割を確率的にサンプリングします