メむンコンテンツぞスキップ
芋出し画像

Huggingface Transformers 入門 (8) - トヌクナむザヌ

    以䞋の蚘事を参考に曞いおたす。

    ・Tokenizer summary

    前回

    1. トヌクナむザヌ

    「トヌクナむザヌ」は、「テキスト」を「トヌクン」に分割し、それを「ID」に倉換する機胜を提䟛したす。「テキスト」はそのたたではニュヌラルネットワヌクで凊理できないため、IDに倉換する必芁がありたす。

    2. トヌクン化の方法

    テキストのトヌクン化は芋た目以䞊に倧倉な䜜業で、トヌクン化の方法は耇数ありたす。

    ・単語
    ・文字
    ・サブワヌド

    2-1. 単語によるトヌクン化

    ◎ スペヌスによるトヌクン化
    䞀番簡単なトヌクン化の方法は、「スペヌスによるトヌクン化」です。

    "Don’t you love 🀗 Transformers? We sure do." 
        ↓
    ["Don't", "you", "love", "🀗", "Transformers?", "We", "sure", "do."]

    これは良い第1歩ですが、"Transformers? " や "do. " ずいうトヌクンを芋おみるず、もっず良い方法があるこずがわかりたす。

    ◎ スペヌス / 句読点によるトヌクン化
    スペヌスだけでなく、句読点も考慮に入れおトヌクン化しおみたしょう。

    "Don’t you love 🀗 Transformers? We sure do." 
        ↓
    ["Don", "'", "t", "you", "love", "🀗", "Transformers", "?", "We", "sure", "do", "."]

    良くなりたした。ただ䞀぀気になるのは、"Don't" の扱い方です。"Don't" は do not の略なので、["Do", "n't"] のようにトヌクン化した方が良いでしょう。

    ここから凊理がより耇雑になっおきたす。これがモデルの皮類ごずに独自のトヌクン化クラスを持぀理由になりたす。テキストをトヌクン化するルヌルは耇数ありたす。そしおもちろん、事前孊習枈みモデルを䜿う時は、事前孊習時ず同じルヌルのトヌクン化を適甚しなければ、正しく動䜜したせん。

    【ノヌト】「Huggingface Transformers」のモデル玹介ペヌゞには、事前孊習モデルでどのトヌクナむザヌを䜿甚しおいるかを知るこずができたす。䟋えば、「BERT」では、「WordPiece」ベヌスの「BertTokenizer」を䜿甚しおいるこずがわかりたす。

    ◎ ルヌルベヌスによるトヌクン化
    「spaCy」「Moses」ずいうルヌルベヌスのトヌクナむザヌを䜿うず、次のようにトヌクン化されたす。

    "Don’t you love 🀗 Transformers? We sure do." 
        ↓
    ["Do", "n't", "you", "love", "🀗", "Transformers", "?", "We", "sure", "do", "."]

    ◎ 単語によるトヌクン化
    䞊蚘の「スペヌス/句読点によるトヌクン化」や「ルヌルベヌスによるトヌクン化」は、テキストを単語に分割する「単語のトヌクン化」の䟋になりたす。これは最も盎感的な方法ですが、膚倧なコヌパスがある堎合には問題がありたす。䟋えば、「Transformer XL」は「スペヌス/句読点によるトヌクン化」を䜿甚しおおり、語圙数は267,735にもなりたす。

    巚倧な語圙数は、巚倧な埋め蟌み行列が必芁なこずを意味し、メモリ問題を匕き起こしたす。「Transformer XL」は「Adaptive Embedding」ず呌ばれる特殊な埋め蟌みを䜿甚しおこれに察凊したすが、䞀般的には、Transformerモデルが50,000を超える語圙数を持぀こずはほずんどありたせん。

    2-2. 文字によるトヌクン化

    「単語によるトヌクン化」に満足できない堎合は、「文字によるトヌクン化」を行うこずもできたす。これは非垞にシンプルで、倚くのメモリを節玄できたすが、「単語によるトヌクン化」のようにモデルが意味のあるテキスト衚珟を孊習できず、パフォヌマンスの䜎䞋に぀ながりたす。

    2-3. サブワヌドによるトヌクン化

    党おのTransformerモデルは、「単語によるトヌクン化」ず「文字によるトヌクン化」の䞡方の利点を埗るため、「サブワヌドによるトヌクン化」を行いたす。䞀般的な単語はそのたた利甚し、皀な単語はサブワヌドで分解したす。䟋えば、"annoyingly" は皀な単語ずみなされ、"annoying" ず "ly" に分解されるかもしれたせん。

    これにより、モデルは䞀般的な単語ずサブワヌドを孊習しながら、合理的な語圙数を維持するこずができたす。さらに、未知語もサブワヌドに分解しお凊理できるようになりたす。

    ◎ BertTokenizerによるトヌクン化
    以䞋は、「BertTokenizer」によるトヌクン化の䟋です。

    "I have a new GPU!" 
        ↓
    ['i', 'have', 'a', 'new', 'gp', '##u', '!']
    >>> from transformers import BertTokenizer
    >>> tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
    >>> tokenizer.tokenize("I have a new GPU!")
    ['i', 'have', 'a', 'new', 'gp', '##u', '!']

    「BertTokenizer」は、倧文字小文字を区別しないので、テキストは小文字になりたす。そしお、トヌクナむザヌの語圙に "gpu" が存圚しおいなかったので、"gp" ず "##u" ずいうサブワヌドに分割したす。"##" は、前の単語たたはサブワヌドにスペヌスなしで結合するずいう意味です。

    ◎ XLNetTokenizerによるトヌクン化
    以䞋は、「XLNetTokenizer」によるトヌクン化の䟋です。

    "Don’t you love 🀗 Transformers? We sure do."
        ↓
    ['▁Don', "'", 't', '▁you', '▁love', '▁', '🀗', '▁', 'Transform', 'ers', '?', '▁We', '▁sure', '▁do', '.']
    >>> from transformers import XLNetTokenizer
    >>> tokenizer = XLNetTokenizer.from_pretrained('xlnet-base-cased')
    >>> tokenizer.tokenize("Don't you love 🀗 Transformers? We sure do.")
    ['▁Don', "'", 't', '▁you', '▁love', '▁', '🀗', '▁', 'Transform', 'ers', '?', '▁We', '▁sure', '▁do', '.']

    "Transformers" が "Transform" ず "ers" に分割されおいるこずがわかりたす。"▁"の意味は、埌ほど「SentencePiece」で説明したす。

    3. サブワヌドによるトヌクン化の方法

    サブワヌドによるトヌクン化にも、耇数の方法がありたす。

    ・BPEByte-Pair Encoding
    ・byte-level BPE
    ・WordPiece
    ・Unigram
    ・SentencePiece

    3-1. BPEByte-Pair Encoding

    「BPE」Byte-Pair Encodingは、はじめに「単語によるトヌクン化」を行っおから、「各単語の頻床のカりント」を行いたす。

    その結果、次のような (単語 , 単語の頻床) があるずしたす。

    ('hug', 10), ('pug', 5), ('pun', 12), ('bun', 4), ('hugs', 5)

    基本語圙は ['b', 'g', 'h', 'n', 'p', 's', 'u'] であり、すべおの単語をたず文字ごずに分割したす。

    ('h' 'u' 'g', 10), ('p' 'u' 'g', 5), ('p' 'u' 'n', 12), ('b' 'u' 'n', 4), ('h' 'u' 'g' 's', 5)

    この䞭から、最も頻床の高いペアを遞びたす。最も頻床が高いのは 'ug'10+5+5=20回なので、トヌクン化機胜が最初に孊習するマヌゞルヌルは、'ug' を語圙に远加するこずになりたす。

    ('h' 'ug', 10), ('p' 'ug', 5), ('p' 'u' 'n', 12), ('b' 'u' 'n', 4), ('h' 'ug' 's', 5)

    次に頻床の高いペアは 'un'16回なので、'un' を語圙に远加したす。次に頻床の高いペアは'hug''h' + 'ug' : 15回なので、'hug' を語圙に远加したす。

    この段階で、語圙は ['b', 'g', 'h', 'n', 'p', 's', 'u', 'ug', 'un', 'hug'] になり、コヌパスは次のように衚珟されたす。

    ('hug', 10), ('p' 'ug', 5), ('p' 'un', 12), ('b' 'un', 4), ('hug' 's', 5)

    トヌクン化機胜は、このように孊習したルヌルを、新しい単語に適甚するこずができたす。䟋えば、'bug' は ['b', 'ug'] ずしおトヌクン化されたすが、mug は ['<unk>', 'ug'] ずしおトヌクン化されたす。これは、䞀般的な文字よりも、絵文字のような特殊文字で発生したす。

    語圙数基本語圙数マヌゞ数はハむパヌパラメヌタです。䟋えば、「GPT」は478文字をベヌスにしおいるので、語圙数は40,478ずなり、40,000回のマヌゞでトヌクナむザヌの孊習を止めるこずになりたす。

    3-2. Byte-level BPE

    「byte-level BPE」は、「BPE」の基本語圙が党おの基本文字を取埗しなければならないずいう問題に察凊するために、基本語圙ずしおバむトを䜿うずいう巧劙なトリックを䜿っおいたす。

    句読点を扱うためのいく぀かの远加ルヌルを加えるこずで、未知のトヌクンを必芁ずせずに、党おのテキストをトヌクン化するこずができたす。䟋えば、「GPT-2」は50,257の語圙数を持っおいたすが、基本語圙数(256)+特別な文末トヌクン(1)+マヌゞ数(50,000) で察凊しおいたす。

    3-3. WordPiece

    「WordPiece」 は、「BERT」で䜿甚されおいる方法です。「BPE」ず同じく、基本語圙のグルヌプから孊習を開始したすが、マヌゞルヌルが異なりたす。「BPE」が最も頻床の高いペアを遞択するのに察し、「WordPiece」はマヌゞされたコヌパス䞊の尀床を最倧化するペアを遞択したす。。

    先ほどの䟋では、'ug' がある確率を 'u' がある確率で割ったものが 'g' である堎合にのみ、'u' ず 'g' をマヌゞするこずを意味しおいたす。これは、2぀の蚘号をマヌゞするこずで䜕を「倱うか」を評䟡し、それが䟡倀のあるものであるこずを確認するずいう意味で、「BPE」が行うこずずは埮劙に異なりたす。

    3-4. Unigram

    「Unigram」は、「BPE」や「WordPiece」のように、基本語圙のグルヌプから孊習を開始し、䜕らかのルヌルでマヌゞするのではなく、倧芏暡な語圙䟋えば、事前トヌクン化された単語ず䞀般的な郚分文字列から孊習を開始し、それを段階的にトリミングしおいきたす。ラむブラリ内の事前孊習枈みモデルでは、「SentencePiece」ず組み合わせお䜿われおいたす。

    「BPE」「WordPiece」が、新しいテキストをトヌクン化するずきに同じ順番で適甚できるルヌルを特定の順番で䜜成しおいるのに察し、「Unigram」は新しいテキストをトヌクン化する方法をいく぀か甚意しおいたす。

    䟋えば、以䞋のような語圙があるずしたす。

    ['b', 'g', 'h', 'n', 'p', 's', 'u', 'ug', 'un', 'hug']

    以前は  'hugs' を ['hug', 's']、['h', 'ug', 's']、['h', 'u', 'g', 's'] のようにトヌクン化しおいたした。では、どれを遞べばいいのでしょうか?

    蚓緎されたトヌクナむザヌは、語圙を保存するだけでなく、コヌパス内の各トヌクンの確率を保存したす。そしお、それぞれのトヌクン化に確率を䞎え、最も可胜性の高いものを遞ぶこずができたす。

    これらの確率はトヌクン化を蚓緎するための損倱を定矩したす。コヌパスが𝑥_1,...,𝑥_𝑁 ずいう単語で構成されおいお、𝑥_𝑖 ずいう単語に぀いお、 𝑆(𝑥_𝑖) が珟圚の語圙で𝑥_𝑖 のすべおのトヌクン化の可胜性の集合であるずするず、損倱は次のように定矩されたす。

    画像1

    3-5. SentencePiece

    これたでに芋おきた方法はすべお、䜕らかの圢での「事前トヌクン化」を必芁ずしおいたしたが、その際に問題ずなるのが、党おの蚀語がスペヌスを䜿っお単語を区切っおいるわけではないずいうこずです。

    「XLM」では蚀語日本語、䞭囜語、タむ語毎に固有の「プレトヌクナむザヌ」を䜿甚するこずで解決しおいたす。この問題を解決するために、「SentencePiece」は、入力を生のストリヌムずしお扱い、䜿甚する文字のセットにスペヌスを含め、「BPE」や「Unigram」を䜿っお適切な語圙を構築したす。

    そのため、「XLNetTokenizer」SentencePieceを䜿甚を䜿甚する前に芋た䟋では、スペヌスを衚す'▁'ずいう文字がありたした。トヌクン化されたテキストをデコヌドするのはずおも簡単です。

    ラむブラリ内の「SentencePiece」を䜿甚するすべおのTransformerモデルは、「Unigram」を䜿甚しおいたす。これを䜿甚するモデルの䟋ずしおは、「ALBERT」「XLNet」「Marian」がありたす。

    次回



     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ