第4部 LLMのしくみを理解する
第12章言葉を数値にする
LLMは文章を扱いますが、その内部で実際に動いているのは、ひたすらの数値計算です。文字のままでは、 コンピュータは意味を扱えません。そこでLLMは、言葉を二段階で数値に変換します。まず文章を小さな単位に 区切り(トークン化)、次にそれぞれを意味を反映した数値の並びに置き換えます(埋め込み)。この章で見る トークンと埋め込みは、以降の章で登場するアテンションや次の単語の予測が動くための、いわば土台です。 ここをていねいに押さえておくと、後の章の理解が一気に楽になります。
12.1コンピュータは文字をそのまま理解しない
コンピュータは文字を意味のある記号としては扱えません。言葉を計算の対象にするには、意味を反映した数値へ変換する必要があります。しかも、単語に番号を一つ振るだけでは意味を表せません。
私たちは「猫」という文字を見れば、すぐに動物の猫を思い浮かべます。しかしコンピュータにとって、文字は 内部的には単なる符号(文字コード)にすぎず、そこに意味は結びついていません。ニューラルネットワークが 行うのは数値の計算ですから、言葉を扱うには、まず言葉を数値へ変換しなければなりません。
ここで素朴に考えると、「単語ごとに番号を一つ割り当てればよいのではないか」と思えます。たとえば 「犬」を501、「猫」を502、といった具合です。しかし、この方法には二つの問題があります。一つは、 番号の大小に意味が生まれてしまうことです。502が501より「大きい」からといって、猫が犬より何かが 大きいわけではありません。番号は本来、順序や量とは無関係のはずなのに、数値にした途端、計算の中で 大小として扱われてしまいます。もう一つは、番号一つでは、その言葉が持つ多面的な意味を表せないことです。 「猫」には、動物である、ペットになる、小さい、といったさまざまな側面がありますが、502という一つの 数値には、そうした情報を込められません。
そこでLLMは、言葉を二段階で数値に変換します。第一段階が、文章を扱いやすい単位に区切るトークン化です。 第二段階が、区切った各単位を、意味を反映した数値の並び(ベクトル)に置き換える埋め込みです。番号を 一つ振るのではなく、たくさんの数値の組で表すことで、先ほどの二つの問題を乗り越えます。順に見ていきます。
12.2トークン化:文章を小さな単位に分ける
トークン化とは、文章を「トークン」と呼ばれる小さな単位に区切る処理です。トークンは単語とは限らず、単語の一部や複数文字のまとまりになります。LLMは、このトークンを単位として文章を数え、扱います。
トークン化は、文章を扱いやすい小さな単位に区切る処理で、この単位をトークンと呼びます。ここで多くの人が 意外に感じるのが、トークンは必ずしも単語と一致しない、という点です。実際のLLMでは、単語よりも細かい 「部分単語」を単位とする方式が広く使われています。よく使われる言葉は一つのトークンに、あまり使われない 言葉は複数のトークンに分割される、といった具合です。
単語をそのまま単位にしない理由は、言葉の種類が事実上いくらでも増えるからです。新語、 固有名詞、専門用語、打ち間違い、複数の言語がまざった文章まで、すべての単語をあらかじめ登録しておくのは 現実的ではありません。かといって、一文字ずつを単位にすると、今度は細かすぎて、一つのまとまりから 得られる手がかりが乏しくなり、扱う単位の数も増えて効率が落ちます。部分単語は、この両極端の中間をとった ちょうどよい落としどころです。よく出る言葉はまとめて一つに、珍しい言葉は既知の部品に分解して表せるため、 未知の言葉にも柔軟に対応できます。
具体例:文章をトークンに区切る
「今日はいい天気です」という文章は、たとえば次のように区切られます。区切り方は方式によって異なるため、 これはイメージです。
1.区切る:今日 / は / いい / 天気 / です(この例では5トークン)
2.番号にする:1024 / 57 / 889 / 2310 / 76(各トークンに対応するID)
一方、「量子コンピュータ」のような、あまり一般的でない言葉は、量子 / コンピュータや、
さらに細かい部品に分かれることがあります。よく使われる言葉ほど少ないトークンで、珍しい言葉ほど多くの
トークンで表される、という傾向があります。
この番号(ID)は、あくまで「どのトークンか」を見分けるための見出しにすぎません。番号の大小に意味は なく、次の埋め込みの段階で、初めて意味を持った数値へと置き換えられます。
実務メモ:トークンは料金と文脈の「単位」
トークンは、単なる内部の話ではなく、開発で費用や制約に直結する単位です。クラウドのLLMでは、多くの場合 料金がトークン数で計算され、一度に扱える入力の上限(コンテキストウィンドウ、第23章)もトークン数で 決まります。ここで見落としやすいのが、日本語は英語に比べてトークン数が多くなりやすい傾向があることです。 同じ内容でも、言語によって消費するトークンが変わるため、費用や文脈の消費も変わってきます。実際の開発では、 利用するサービスが提供するトークン数の計測ツールで、あらかじめ見積もっておくと安全です。
12.3埋め込み:意味を持ったベクトルにする
埋め込みとは、各トークンを、たくさんの数値を並べたベクトルに変換することです。この数値は学習によって決まり、似た使われ方をする言葉ほど、似たベクトルになります。ここで初めて、言葉に「意味」が数値として宿ります。
トークンに番号を振っただけでは、まだ意味は表せません。そこで行われるのが埋め込みです。埋め込みでは、 各トークンを、たくさんの数値を並べたベクトルに変換します。「たくさん」というのは、数十から数千という 規模で、この一つ一つの数値が、そのトークンの意味の何らかの側面を担っています。番号一つでは表せなかった 多面的な意味を、多数の数値の組で表そう、というわけです。
重要なのは、この数値が人手で決められたものではなく、事前学習(第17章)を通じて自動的に決まる、という 点です。膨大な文章を学ぶ過程で、似た文脈で使われる言葉どうしが似たベクトルになるように、数値が調整されて いきます。その結果、「犬」と「猫」は、どちらも動物として似た使われ方をするため、ベクトルも近くなります。 一方「犬」と「自動車」は使われ方が大きく異なるため、ベクトルも離れます。こうして、言葉の意味の近さが、 数値の近さとして表されるようになります。
深掘り:なぜ数値をたくさん並べるのか(読み飛ばし可)
数値を一つではなく多数並べるのは、言葉が持つ多くの側面を、同時に少しずつ表すためです。ベクトルの それぞれの数値に「これは動物らしさ」「これは大きさ」といった人間向けの名前がついているわけではなく、 多数の数値が全体として意味を表します。次元が多いほど、細やかな意味の違いを表す余地が広がります。 なお、意味の関係が、ベクトルの「向き」の違いとして現れることもあります。たとえば、ある語から別の語へ 向かう方向が、性別や単数複数といった関係に対応する、といった規則性が見られる場合があります。ただし、 これはいつでもきれいに成り立つわけではなく、あくまで傾向として捉えておくのがよいでしょう。
12.4ベクトル空間で意味の近さを表す
ベクトルを空間上の点と見なすと、意味の近い言葉は近くに、遠い言葉は離れて配置されます。この「意味を位置として表す」考え方が、LLMの内部処理と、後の章で見る検索の両方を支えます。
たくさんの数値の並びであるベクトルは、これを空間上の位置(座標)と見なすと、一気にイメージしやすく なります。二つの数値の組なら平面上の点、三つなら立体空間の点として置けます。実際のLLMが扱うベクトルは、 もっと多くの数値からなり、人が直接思い描くことはできませんが、考え方は同じです。意味の近い言葉は空間上 でも近くに集まり、意味の遠い言葉は離れて配置されます。
二つのベクトルがどれくらい近いかを測る方法として、よく使われるのは、二つのベクトルの 向きの近さを見る方法です。向きがそろっているほど似ている、と判断します。図12-2で、犬と猫のベクトルは 数値がよく似ていました。こうしたベクトルは向きもそろうため、近いと判断されます。この「向きの近さで 似ているを測る」考え方は、コサイン類似度と呼ばれ、第30章で数値を使って詳しく扱います。ここでは、 「言葉の意味の近さを、ベクトルの近さとして計算できる」という点を押さえておけば十分です。
この「意味を位置として表す」という発想は、この先くり返し登場します。次章以降のTransformerやアテンションは、 ここで作ったベクトルを入力として動きます。また、第8部で扱うRAGのベクトル検索も、まさにこのベクトルの 近さを使って、関連する文章を探し出すしくみです。トークンと埋め込みは、LLMの理解と応用の、共通の 出発点なのです。
12.5トークンと埋め込みが実務で意味すること
トークンと埋め込みは、開発の現場でも具体的な意味を持ちます。トークン数は費用と文脈の制約に、埋め込みは検索や分類のしくみに直結します。仕組みを知っておくと、実装上の判断がしやすくなります。
ここまで見てきたトークンと埋め込みは、抽象的な話にとどまりません。実際にLLMを使ったものを作るときに、 具体的な形で効いてきます。二つの観点で整理しておきます。
一つ目は、トークン数がもたらす制約です。前に触れたとおり、費用も、一度に扱える入力の上限も、トークン数で 決まります。長い文書をそのまま渡そうとすると、上限を超えてしまうことがあります。そこで、長い文書を 適当な長さに分割して扱う、という工夫が必要になります。この分割は、第30章で見るRAGでも、資料をベクトルに 変換して蓄えるための前段として登場します。トークンという単位を意識することが、こうした設計の出発点に なります。
二つ目は、埋め込みそのものが道具として使えることです。埋め込みは、LLMの内部だけのものではなく、単独でも 利用できます。文章を埋め込みでベクトルにしておけば、意味の近い文章どうしを探したり、似た内容をまとめて 分類したりできます。第8部で扱うベクトル検索は、この埋め込みの応用にほかなりません。トークン化と埋め込みを 理解しておくことは、LLMそのものだけでなく、その周辺のしくみを理解するうえでも役立ちます。
実務メモ:仕組みを知っていると避けられること
- 長い入力で上限を超える前に、文書を分割したり要点を絞ったりする、という発想が持てます。
- 日本語はトークンが多くなりやすいと知っていれば、費用や文脈の見積もりを誤りにくくなります。
- 「似た文章を探す」機能は、埋め込みを使えば実現できる、と当たりをつけられます。
この章の要点
- コンピュータは文字を意味として扱えず、単語に番号を一つ振るだけでは意味を表せません。そこで二段階で数値化します。
- トークン化は文章をトークンに区切る処理で、トークンは単語より細かい部分単語のことが多く、珍しい言葉ほど多くのトークンになります。
- 埋め込みは、各トークンを多数の数値からなるベクトルに変換し、似た使われ方の言葉を似たベクトルにします。数値は学習で決まります。
- ベクトルを空間上の点と見なすと、意味の近さが位置の近さとして表され、計算で扱えます。近さの測り方は第30章で扱います。
- トークン数は費用と文脈の制約に、埋め込みは検索や分類に直結し、いずれも実務での判断に関わります。