発展:トークナイゼーション(サブワード分割とBPE)
テキストの数値化のレッスンの続きとして、大規模言語モデルが文章をどんな単位に区切ってから読むのかを掘り下げます。単語ごとや文字ごとに区切る素朴なやり方の困りごと、その間をとるサブワード分割、よく現れる並びを併合して語彙を作るバイト対符号化(BPE)、WordPiece や SentencePiece、そして分かち書きのない日本語の扱いまでを実装のコードは扱わず、なぜその区切り方にするのかに絞って説明します。
ねらい
このレッスンは、テキストの数値化のレッスンの続きにあたる発展(はってん)の記事です。大規模言語モデル(だいきぼげんごモデル、Large Language Models)が文章を読むとき、最初に必ず通るのが、文章をどんな単位に区切るか、という処理です。この区切りをトークナイゼーション(tokenization)と呼び、区切って得た単位をトークン(token)と呼びます。Transformer の機構のレッスンで、入力はトークン埋め込みから始まると述べました。その一歩手前にあたるのが、この記事です。
この記事は、ある程度の知識のある人に向けた深掘りです。テキストの数値化のレッスンで、ワンホットや n-gram、形態素解析といった、文章を機械で扱う下ごしらえに触れていることを前提にします。実装のコードは扱いません。なぜ、単語でも文字でもなく、その中間で区切るのか、という考え方に絞ります。
1. 両はしの困りごと:単語ごとと文字ごと
区切り方には、大きく両はしがあります。単語ごとに区切るやり方と、文字ごとに区切るやり方です。それぞれの困りごとをはっきりさせておきます。
単語ごとに区切るやり方の困りごとは、2つあります。1つは、語彙が大きくなりすぎることです。扱う単語の種類だけ番号が要るので、番号の総数、つまり語彙が数十万にもふくれます。もう1つは、知らない単語に弱いことです。学習のときに見なかった単語が来ると、番号を割りあてられず、未知の語として、ひとくくりに扱うしかありません。新しい言葉や、活用で形の変わった単語に、そのつどつまずきます。
文字ごとに区切るやり方は、語彙の困りごとを一気に解きます。文字の種類は限られるので、語彙は小さくてすみ、知らない単語も文字の組み合わせで必ず表せます。しかし、別の困りごとが出ます。1つの語を表すのに、文字の数だけ単位が要るので、列がとても長くなることです。Transformer の機構のレッスンで見たように、自己注意の計算は、列が長くなるほど重くなります。文字ごとは、この重さをまともに受けます。
つまり、単語ごとは語彙の大きさと未知語で困り、文字ごとは列の長さで困る。両はしとも、それぞれの弱点を抱えています。
理解の確認
単語ごとに区切ると、語彙が数十万にふくれ、学習で見なかった未知の単語に弱くなります。文字ごとに区切ると、語彙は小さく未知語にも強い代わりに、1語を表す単位が増えて列がとても長くなり、計算が重くなります。両はしとも弱点を抱えています。
2. 間をとる:サブワード分割
両はしの困りごとをやわらげるのが、サブワード分割(subword tokenization)です。サブワードとは、単語より細かく、文字よりは大きい単位のことです。
考え方は、こうです。よく現れる単語や、よく現れる語のかたまりは、1つのトークンとしてまとめる。めったに現れない単語は、より細かいかたまりに分けて表す。たとえば、よく使う「学習」は1つのトークンにし、めずらしい専門語は、いくつかの短いかたまりに分けて表す、という具合です。
こうすると、両はしの弱点が、ほどよくやわらぎます。よく使う語をまとめるので、列は文字ごとほど長くなりません。めずらしい語は細かく分けて表せるので、語彙は単語ごとほど大きくなりません。しかも、知らない単語が来ても、より細かいかたまりに分けて表せるので、未知の語として捨てずにすみます。単語ごとの「未知語に弱い」弱点も、ここでやわらぎます。
要点は、よく現れるものは大きく、めずらしいものは小さく区切る、という使い分けです。この使い分けをどうやって自動で決めるのか。その代表的なやり方を次に見ます。
ポイント
サブワード分割は、単語より細かく文字より大きい単位で区切ります。よく現れる語は大きく、めずらしい語は細かく分けることで、語彙の大きさと列の長さ、未知語への弱さをまとめてやわらげます。
理解の確認
サブワード分割は、単語と文字の間の単位で区切ります。よく現れる語は1つのトークンにまとめ、めずらしい語は細かいかたまりに分けます。この区切り方で、列の長さ・語彙の大きさ・未知語への弱さをまとめてやわらげられます。
3. よく現れる並びを併合する:バイト対符号化(BPE)
サブワードの区切りを自動で決める、代表的なやり方が、バイト対符号化(バイトついふごうか、Byte Pair Encoding、通称 BPE)です。もともとは、文章を縮める古い方法を区切りに応用したものです。
考え方は、併合をくり返すことです。手順は、次のように進みます。はじめは、文章をすべて文字の単位までばらします。次に、となり合って最もよく現れる文字の組を探し、その組を1つの単位に併合します。たとえば「e」と「r」がよく続けて現れるなら、「er」を新しい1つの単位にします。併合してできた単位も含めて、また最もよく現れるとなりの組を探し、併合する。これをあらかじめ決めた回数だけくり返します。
くり返すうちに、よく現れる並びほど、早く大きな単位にまとまっていきます。ありふれた語は1つの単位にまで育ち、めずらしい語は、途中までの小さな単位のままで残ります。こうしてでき上がった単位の一覧が、語彙になります。ちょうど、頻度の高いものから優先して、区切りの部品を組み立てていく作業です。
BPE の良いところは、語彙の大きさを併合の回数で調節できることです。回数を多くすれば、大きな単位が増えて列は短くなり、語彙は大きくなります。少なくすれば、その逆です。目的に合わせて、このつり合いを選べます。文字から出発して組み立てるので、知らない単語も、必ず小さな単位の並びで表せます。
理解の確認
バイト対符号化(BPE)は、文章を文字までばらし、となり合って最もよく現れる組を1つの単位に併合する、をくり返して語彙を作ります。よく現れる並びほど早く大きな単位に育ちます。併合の回数で語彙の大きさを調節でき、文字から組み立てるため未知の単語も小さな単位の並びで表せます。
4. 似た仲間:WordPiece と SentencePiece
BPE のほかにも、サブワードの区切りを作るやり方があります。代表的な2つを違いに絞って挙げます。
1つは、WordPiece(ワードピース)です。BPE が「最もよく現れるとなりの組」を併合するのに対し、WordPiece は「併合すると、文章全体の表しやすさが最も上がる組」を選んで併合します。どの組をまとめるかの選び方が、少し違います。BERT などで使われました。細かな選び方は違いますが、よく現れるものを大きな単位にまとめていく、という骨組みは BPE と同じです。
もう1つは、SentencePiece(センテンスピース)です。これは、区切り方そのものというより、下ごしらえのやり方に特徴があります。多くの区切り方は、まず空白で単語に分けてから、さらに細かく区切ります。しかし、この「まず空白で分ける」という前提が、言語によっては通じません。次の節で見る日本語が、その例です。SentencePiece は、空白で分ける前提を置かず、文章を文字の並びとしてそのまま受け取り、そこから区切りを学びます。空白のあるなしに関わらず、同じやり方で扱える点が利点です。
これらは、細かな作り方こそ違いますが、目的は同じです。よく現れるものは大きく、めずらしいものは小さく、という使い分けをデータから自動で決めることです。
理解の確認
WordPiece は、BPE と骨組みは同じですが、「併合すると表しやすさが最も上がる組」を選ぶ点が異なります。SentencePiece は、空白で単語に分ける前提を置かず、文章を文字の並びとして受け取って区切りを学ぶため、空白のあるなしに関わらず同じやり方で扱えます。
5. 分かち書きのない日本語の扱い
区切りの話で、日本語には固有の事情があります。英語は、単語が空白で区切られています。しかし日本語は、単語の間に空白を置きません。この、空白で語を区切らない書き方を分かち書きをしない、と言います。
そのため、日本語では、まずどこが語の切れ目かを見つける下ごしらえが要ります。テキストの数値化のレッスンで学んだ形態素解析が、これにあたります。形態素解析は、辞書や規則を使って、文章を意味のある最小の単位に区切ります。かつては、この形態素解析でいったん語に分けてから、サブワードに区切る、という二段構えがよく使われました。
一方、前の節で見た SentencePiece のように、空白の前提を置かず、文字の並びからじかに区切りを学ぶやり方も広く使われます。この場合、形態素解析による語分けを前もって行わなくても、日本語をそのまま区切れます。どちらのやり方にも良し悪しがあり、目的や、あとに続くモデルに合わせて選ばれます。ここでは、日本語は分かち書きをしないため、区切りに固有の下ごしらえや工夫が要る、と押さえてください。
理解の確認
日本語は単語の間に空白を置かない(分かち書きをしない)ため、区切りに固有の下ごしらえが要ります。形態素解析でいったん語に分けてからサブワードに区切るやり方と、SentencePiece のように文字の並びからじかに区切りを学ぶやり方があり、目的に合わせて選ばれます。
6. トークンの区切りが、モデルに与える影響
最後に、区切り方がモデルにどう効くかをいくつか挙げておきます。トークナイゼーションは地味な下ごしらえに見えて、モデルの性能や使い勝手に、思いのほか響きます。
まず、語彙の大きさは、つり合いの問題です。語彙を大きくすると、1つの語を少ないトークンで表せて列は短くなりますが、そのぶん、扱う単位の種類が増えます。小さくすると、その逆です。列の長さは、Transformer の計算の重さに直に効くので、この選び方は無視できません。
次に、区切り方は、言語による得手不得手を生みます。英語を中心に語彙を作ると、日本語や、あまり学習されていない言語では、1文字ずつに近い細かい区切りになりがちです。すると、同じ内容でも、言語によって列の長さが変わり、扱いやすさに差が出ます。
さらに、桁の数字や、めずらしい記号の区切り方は、計算や細かい処理の正確さにも関わります。数を思わぬところで区切ると、けた合わせが乱れる、といったことも起こります。
こうした影響は、モデルの中身を変えなくても、区切り方だけで変わります。だからこそ、トークナイゼーションは、モデルを支える大切な土台の1つなのです。
理解度の確認
説明できる項目にチェックを入れましょう。すべて確認できたら、完了ボタンで記録します。
分からなかった点・気になった点
読み込み中です。