Slide 1

Slide 1 text

トークナイザー入門!
 トークンから始めるLLM基本解説
 
 
 早野康太


Slide 2

Slide 2 text

自己紹介
 ● 名前
 ○ 早野 康太
 ● 前期アニメ
 ○ 小市民シリーズ
 ■ 終わってかなしい
 ○ 逃げ上手の若君
 ○ 負けヒロインが多すぎる!
 ○ ロシデレ
 ○ しかのこ
 ● 趣味
 ○ 最近ギター始めました


Slide 3

Slide 3 text

トークナイザーとは
 
 
 ● 自然言語処理で文章を最小単位のユニットに分割することを
 トークナイズといいます
 ● Chat-GPTなどの自然言語モデルでは
 トークナイズされた文章を入力として受け取っています
 ● 文章をトークンに分解してくれるものをトークナイザーといいます
 
 
 吾輩は猫である
 吾輩
 は
 猫
 で
 ある


Slide 4

Slide 4 text

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


Slide 5

Slide 5 text

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


Slide 6

Slide 6 text

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


Slide 7

Slide 7 text

トークナイザーとは(まとめ)
 
 ● トークナイザーは
 文章を最小単位のユニット(=トークン)に分割します
 ● LLMは固有のボキャブラリーを持っていて
 トークナイザーで分割されたトークンは必ずボキャブラリーに含まれます
 ● トークンには固有のIDが割り当てられていて
 IDに対応したベクトルがLLMの中で抜き出されます
 


Slide 8

Slide 8 text

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


Slide 9

Slide 9 text

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


Slide 10

Slide 10 text

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


Slide 11

Slide 11 text

トークナイズ手法
 
 ● Mecabでは動的計画法を利用しています
 ● 分割をノードとエッジで表現(ラティス)
 ● ノード同士の結合コストが最小になるパスをトークナイズ結果とします
 
 すもも
 もも
 す
 も
 もも
 も
 も
 も
 も
 もも
 もも
 の
 うち
 も
 もも
 も
 もも
 も
 も
 もも
 も
 も


Slide 12

Slide 12 text

トークナイズ手法
 
 ● Mecabでは動的計画法を利用しています
 ● 分割をノードとエッジで表現(ラティス)
 ● ノード同士の結合コストが最小になるパスをトークナイズ結果とします
 
 すもも
 もも
 す
 も
 もも
 も
 も
 も
 も
 もも
 もも
 の
 うち
 も
 もも
 も
 もも
 も
 も
 もも
 も
 も


Slide 13

Slide 13 text

トークナイズ手法(まとめ)
 
 ● トークナイザー特有のボキャブラリーを参照して
 トークナイズが行われます
 ● トークナイズの手法
 ○ 最長一致法
 ■ ボキャブラリー内の単語に一致する最長の文字列を
 トークンとして切り出していきます
 ○ 日本語ではMecabなど固有のアルゴリズムが
 使われることがあります
 


Slide 14

Slide 14 text

ボキャブラリーの作成
 ● トークナイズを行うためには
 ボキャブラリーの作成が前提となります
 ● ボキャブラリーが貧弱では
 適切にトークナイズを行うことはできません
 
 下北沢在住
 下
 北
 沢
 在住
 “下北沢”(地名)がボキャブラリーにない
 下北沢在住
 下北沢
 在住


Slide 15

Slide 15 text

文字単位のトークナイゼーション
 Hello World
 H
 このようなメリットがあります
 ● 必要なボキャブラリーサイズが最もコンパクトに済む
 ● どのような単語にも対応できる
 
 しかしながらデメリットの方が大きいです
 ● テキストあたりのトークン数の増加
 ● 単語の意味情報を学習するのが難しくなる
 ● 学習効率が極めて悪い
 
 e
 l
 l
 o
 W
 o
 r
 l
 d


Slide 16

Slide 16 text

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


Slide 17

Slide 17 text

単語単位のトークナイゼーション
 Hello World
 Hello
 World
 このようにすることで単語単位の意味をLLMが学習しやすくなるメリットがあります
 が、いくつか問題があります
 ● ボキャブラリーのサイズが膨大になる
 = 必要とされるモデルのパラメータ数がヤバい
 ○ 英語: 60万語 (オックスフォード英語辞典)
 ○ 日本語: 25万語 (広辞苑)
 ● 後述しますがChat GPT-4oでも語彙数は20万程度です
 


Slide 18

Slide 18 text

単語単位のトークナイゼーション
 Hello World
 Hello
 World
 このようにすることで単語単位の意味をLLMが学習しやすくなるメリットがあります
 が、いくつか問題があります
 ● 未知の単語や造語に対応できない
 ○ ボキャブラリーに存在しない単語(OOV)に遭遇した場合に
 モデルが適切に処理を行うことができない
 ■ OOVにはなどの特別なトークンを割り当てることになる


Slide 19

Slide 19 text

単語単位のトークナイゼーション
 Hello World
 Hello
 World
 このようにすることで単語単位の意味をLLMが学習しやすくなるメリットがあります
 が、いくつか問題があります
 ● 日本語や中国語などの言語では明確な単語の境界がない
 ○ 言語固有の形態素解析を挟む必要性がある
 しかのこのこのここしたんたん
 ?


Slide 20

Slide 20 text

トークン粒度によるトークナイゼーションの違い
 こ
 ん
 に
 ち
 は
 世
 界
 こんにちは
 世界
 トークン多
 トークン少
 ボキャブラリー少
 ボキャブラリー多


Slide 21

Slide 21 text

トークン粒度によるトークナイゼーションの違い
 こ
 ん
 に
 ち
 は
 世
 界
 こんにちは
 世界
 トークン多
 トークン少
 ボキャブラリー少
 ボキャブラリー多
 ちょうどいい塩梅でトークナイズ
 できるボキャブラリーを構成したい


Slide 22

Slide 22 text

サブワード単位のトークナイゼーション
 ● ボキャブラリーサイズが膨大になる
 ● 未知の単語や造語に対応できない
 ● 日本語や中国語などの言語では明確な単語の境界がない
 
 こういった問題があるため
 単語よりも小さな単位 (=サブワード) に分割する手法が多くの言語モデルで
 採用されています
 
 ● Byte-Pair Encoding (BPE)
 ● WordPiece
 ● Unigram
 ● SentencePiece


Slide 23

Slide 23 text

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
 ● 単語をさらに文字単位まで分割し
 出現する文字系列の出現頻度にしたがってマージしていく
 ● ボキャブラリーのサイズが規定値に達するまで何回も繰り返す
 
 


Slide 24

Slide 24 text

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回出現
 ● 単語をさらに文字単位まで分割し
 出現する文字系列の出現頻度にしたがってマージしていく
 ● ボキャブラリーのサイズが規定値に達するまで何回も繰り返す
 
 


Slide 25

Slide 25 text

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”をボキャブラリーに追加
 ● 単語をさらに文字単位まで分割し
 出現する文字系列の出現頻度にしたがってマージしていく
 ● ボキャブラリーのサイズが規定値に達するまで何回も繰り返す
 
 


Slide 26

Slide 26 text

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
 同じ処理の繰り返し


Slide 27

Slide 27 text

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 


Slide 28

Slide 28 text

BPEを利用しているLLM
 ● ChatGPTのトークナイザーではBPEが使用されていて
 各モデルでのボキャブラリー数はこのようになっています
 ○ GPT-3.5, GPT-4: cl100k_base 
 ■ vocabulary: 100k
 ○ GPT-4o: o200k_base
 ■ vocabulary: 200k
 
 
 


Slide 29

Slide 29 text

BPEを利用しているLLM
 ● ChatGPTのトークナイザーではBPEが使用されていて
 各モデルでのボキャブラリー数はこのようになっています
 ○ GPT-3.5, GPT-4: cl100k_base 
 ■ vocabulary: 100k
 ○ GPT-4o: o200k_base
 ■ vocabulary: 200k
 
 
 
 こんにちは世界
 こんにちは
 �
 �
 界
 cl100k_baseによるトークナイズ
 ● Chat GPTでは最小単位がバイト文字になっているためOOVの問題はありません
 ● ボキャブラリーが不十分だと漢字などがバイト文字(�)トークンに分解されて
 トークナイズされてしまいます


Slide 30

Slide 30 text

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と比べて性能が向上


Slide 31

Slide 31 text

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”の頻度が少ないためスコアが高い 


Slide 32

Slide 32 text

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”をボキャブラリーに追加


Slide 33

Slide 33 text

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でトークナイズする場合は
 可能な分割の中で最も確率の高い分割が採択されます
 


Slide 34

Slide 34 text

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


Slide 35

Slide 35 text

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


Slide 36

Slide 36 text

ボキャブラリー作成 (まとめ)
 
 ● 単語の出現頻度から統計的にボキャブラリーを構成します
 ● 代表的な手法
 ○ Byte Pair Encoding (BPE)
 ○ WordPiece
 ○ Unigram


Slide 37

Slide 37 text

● これまでの手法では単語集計のために事前トークン化が必要でした
 ● 英語などスペース区切りの言語では単語集計が容易ですが
 日本語や中国語などの言語では言語に依存した処理が必要になります
 
 SentencePiece
 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 
 コーパス
 単語


Slide 38

Slide 38 text

● これまでの手法では単語集計のために事前トークン化が必要でした
 ● 英語などスペース区切りの言語では単語集計が容易ですが
 日本語や中国語などの言語では言語に依存した処理が必要になります
 
 吾輩は猫である
 どこで生れたかとんと見当がつかぬ
 何でも薄暗いじめじめした所でニャーニャー
 泣いていた事だけは記憶している
 コーパス
 単語
 SentencePiece
 吾輩はここで始めて人間というものを見た
 ?


Slide 39

Slide 39 text

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
 こんにちは世界
 こんにちは
 世
 界


Slide 40

Slide 40 text

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λ サブワード分割スコア


Slide 41

Slide 41 text

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