ChatGPTの仕組みから学ぶG検定対策講座②

文章はどのように数値へ変換されるのか?Transformerの入力埋め込み

こんにちは。ゆうせいです。

前回は、ChatGPTなどの文章生成AIが、次に続くトークンを一つずつ予測して文章を作っていることを説明しました。

しかし、コンピュータは「データ」「猫」「便利」といった文字を、そのまま計算することはできません。

Transformerで文章を処理するには、最初に文字を数値へ変換する必要があります。この処理を担当するのが、Embedding(埋め込み)です。

今回は、Transformer Explainerの「Embedding」を操作しながら、文章が数値ベクトルへ変換される流れを確認します。

Transformer Explainerでは、Embeddingを次の4段階に分けて表示しています。

  1. Tokenization
  2. Token Embedding
  3. Positional Encoding
  4. Final Embedding

Transformer ExplainerのEmbeddingを開く

Transformer Explainerを開き、画面を「Embedding」までスクロールしてください。

「Embedding」と書かれた部分をクリックすると、入力された文章が数値へ変換される過程が展開されます。

初期状態では、次の英文が入力されています。

Data visualization empowers users to

日本語にすると、次のような意味です。

データの可視化は、利用者が~することを可能にする

この文章が、Transformerで計算できる形式へ変換されます。

ステップ1:文章をトークンに分割する

最初に行われるのが、Tokenization(トークン化)です。

トークン化とは、入力された文章を、モデルが処理できる小さな単位に分割することです。

Transformer Explainerの「Tokenization」を開くと、入力された英文が複数のトークンに分割されていることを確認できます。

ここで重要なのは、トークンと単語は必ずしも一致しないという点です。

例えば、次の英文には5つの単語があります。

Data visualization empowers users to

しかし、「empowers」は内部で複数のトークンに分割されるため、Transformer Explainer上では文章全体が6つのトークンとして扱われます。

イメージとしては、次のような分割です。

単語トークン数
Data1
visualization1
empowers2
users1
to1

英単語だけでなく、日本語も文字、単語の一部、記号などの単位に分割されます。

例えば、次の文章を考えてみましょう。

生成AIは便利です。

説明を単純化すると、次のような単位に分割されるイメージです。

「生成」/「AI」/「は」/「便利」/「です」/「。」

実際の分割結果は、使用するモデルやトークナイザーによって異なります。

【G検定対策コラム①:サブワード分割とトークン化アルゴリズム】

第2回では「empowers」が複数トークンに分割されました。このように単語をさらに小さな単位へ分割する方式をサブワード分割(Subword Tokenization)と呼びます。G検定では、代表的なアルゴリズムとしてBPE(Byte Pair Encoding)、WordPiece、SentencePieceが問われます。GPT系はBPE、BERTはWordPieceを使う点も対比で覚えておきましょう。サブワード分割の利点は、未知語(学習時になかった新語・固有名詞)を既知トークンの組み合わせで表現でき、かつ語彙数を一定範囲に抑えられることです。本文の「なぜ単語をそのまま使わないのか」がまさにこの利点の説明にあたります。

なぜ単語をそのまま使わないのか

すべての単語を一つずつ登録する方法では、未知の単語や新しい固有名詞に対応しにくくなります。

例えば、次のような言葉は新しく作られる可能性があります。

  • 新しい製品名
  • 人名や地名
  • 専門用語
  • 略語
  • 複合語

単語をより小さな単位に分割できれば、学習時に存在しなかった単語でも、既知のトークンの組み合わせとして扱えます。

トークン化には、語彙数を一定の範囲に抑えながら、さまざまな文章を表現できるという利点があります。

トークンには固有のIDが付けられる

トークン化された各トークンには、固有の番号が割り当てられています。

この番号をトークンIDと呼びます。

トークントークンIDのイメージ
Data6060
visualization19783
users2985

表の番号は説明用のイメージですが、実際のモデルでも、各トークンと整数のIDが対応しています。

Transformer Explainerで使われているGPT-2 smallには、50,257種類のトークンが登録されています。

トークンIDは、トークンの意味そのものを表しているわけではありません。

IDが近いからといって、意味も近いとは限りません。

例えば、トークンIDが100番と101番であっても、その二つが似た意味を持つとは限らないということです。

トークンIDは、埋め込みベクトルを取り出すための識別番号として使用されます。

ステップ2:トークンを768個の数値に変換する

次に、「Token Embedding」を開いてください。

トークンIDを使って、それぞれのトークンに対応する数値ベクトルを取り出します。

Transformer Explainerで使用されているGPT-2 smallでは、一つのトークンを768次元のベクトルで表現します。

768次元のベクトルとは、768個の数値が並んだものです。

[0.12, -0.37, 0.84, 0.05, …… , -0.21]

実際には、このような数値が768個並んでいます。

文字を数値の集まりとして表現する処理が、Token Embedding(トークン埋め込み)です。

【G検定対策コラム②:埋め込み(Embedding)と分散表現】

トークンを768次元のベクトルへ変換するのがToken Embeddingです。このように単語やトークンを数値ベクトルで表す考え方を分散表現(Distributed Representation)と呼び、G検定頻出テーマです。「似た使われ方をするトークンは埋め込み空間でも近くに配置される」という本文の説明は、分散表現の核心です。Transformer登場以前の代表的な分散表現手法として、Word2Vec(CBOW・Skip-gram)やGloVeも必ず押さえましょう。ただしWord2Vecは1単語1ベクトルで固定されるのに対し、Transformerは後段のSelf-Attentionで文脈に応じて表現が変化する「文脈依存の表現(Contextualized Embedding)」を獲得する点が大きな違いです。

768個の数値は何を表しているのか

768個の各数値に、「動物らしさ」「食べ物らしさ」「明るさ」といった分かりやすい名前が付いているわけではありません。

モデルは学習を通じて、次のトークンを正しく予測するために役立つ数値表現を自動的に獲得します。

その結果、文章の中で似た使われ方をするトークンは、埋め込み空間でも比較的近い位置に配置されます。

例えば、次のような言葉は、似た文脈に登場します。

  • 犬と猫
  • 東京と大阪
  • 走ると歩く
  • 赤と青

そのため、それぞれの埋め込みベクトルにも一定の類似性が生まれます。

ただし、埋め込みベクトルは人間が意味を直接入力したものではありません。大量の文章を使った学習の結果として形成された数値表現です。

埋め込み行列からベクトルを取り出す

GPT-2 smallでは、50,257種類のトークンそれぞれに、768次元のベクトルが用意されています。

そのため、埋め込みを保存する行列の大きさは、次のようになります。

50,257 × 768

この行列には、約3,900万個の学習可能なパラメータが含まれています。

処理の流れは次のとおりです。

  1. 文章をトークンに分割する
  2. 各トークンのIDを調べる
  3. IDに対応する行を埋め込み行列から取り出す
  4. 768次元のベクトルとして使用する

例えば、あるトークンのIDが3145だった場合、埋め込み行列の3145番目に対応するベクトルを取り出します。

トークンID自体が768次元のベクトルになるのではありません。

トークンIDを索引として使い、対応する埋め込みベクトルを取得するという関係です。

【G検定対策コラム③:パラメータ(Parameter)とモデル規模】

本文では、埋め込み行列(50,257 × 768)だけで約3,900万個の学習可能なパラメータがあると説明されました。パラメータとは、学習によって値が調整される重みのことです。G検定では、モデル規模をパラメータ数で表す点(例:GPT-3は約1,750億パラメータ)や、パラメータ数・データ量・計算量を増やすほど性能が向上する「スケール則(Scaling Laws)」が問われます。埋め込み行列は全パラメータの一部にすぎず、後段のAttentionやMLPにも膨大なパラメータが存在することも意識しておくとよいでしょう。

文章全体は行列で表される

入力された文章が6個のトークンに分割され、それぞれが768次元のベクトルになった場合、文章全体は次の大きさの行列になります。

6 × 768
内容
1行目1番目のトークンを表す768個の数値
2行目2番目のトークンを表す768個の数値
3行目3番目のトークンを表す768個の数値
…………
6行目6番目のトークンを表す768個の数値

Transformerは、この数値行列を使って、その後のAttentionなどの計算を行います。

ステップ3:トークンの位置を数値で表す

次に、「Positional Encoding」を開いてください。

Token Embeddingだけでは、トークンの意味に関する情報は表現できますが、文章中の順番を十分に区別できません。

次の二つの文章を比べてみましょう。

すべての犬は動物です。

すべての動物は犬です。

使われている言葉はほぼ同じですが、順番が変わることで意味も変わっています。

文章を理解するには、トークンそのものだけでなく、次のような位置情報も必要です。

  • 何番目に登場したトークンか
  • どのトークンより前にあるか
  • どのトークンより後ろにあるか

この位置情報を数値で表現したものが、Positional Encodingです。

【G検定対策コラム④:位置エンコーディング(Positional Encoding)】

Transformerは全トークンを並列に処理するため、そのままでは語順の情報が失われます。本文の「すべての犬は動物です/すべての動物は犬です」の例が示すとおり、順番は意味を左右します。そこで各トークンに位置情報を数値で加えるのが位置エンコーディング(Positional Encoding)で、G検定の重要用語です。元論文「Attention Is All You Need」ではsin・cos関数を使う固定的な方式が提案されましたが、本文のGPT-2のように位置ベクトル自体を学習で獲得する「学習型位置埋め込み」もあります。RNNと違い逐次処理をしないTransformerだからこそ位置情報の付与が必須になる、という因果関係で理解しておきましょう。

GPT-2は位置ベクトルも学習する

位置情報の表現方法は、Transformerモデルによって異なります。

GPT-2では、各位置に対応するベクトルを学習によって獲得します。Transformer Explainerでは、トークンの埋め込みと同じ768次元の位置ベクトルとして表示されます。

例えば、文章中の位置ごとに次のようなベクトルが用意されているイメージです。

位置位置ベクトル
0番目位置0を表す768個の数値
1番目位置1を表す768個の数値
2番目位置2を表す768個の数値

多くのプログラミング言語と同様に、位置は0から数えます。

最初のトークンは0番目、次のトークンは1番目となります。

ステップ4:トークンと位置のベクトルを足す

最後に、「Final Embedding」を開いてください。

最終的な入力ベクトルは、次の二つを要素ごとに足し合わせて作ります。

  • Token Embedding
  • Positional Encoding
最終埋め込み
= トークン埋め込み
+ 位置エンコーディング

どちらも768次元なので、同じ位置にある数値同士を加算できます。

簡単な3次元の例で考えてみましょう。

種類ベクトル
トークン埋め込み[0.2, 0.5, -0.1]
位置エンコーディング[0.1, -0.2, 0.4]
最終埋め込み[0.3, 0.3, 0.3]

実際のGPT-2 smallでは、この計算を768個の成分について行います。

こうして作られた最終埋め込みには、次の二つの情報が含まれます。

  • そのトークンが何であるか
  • そのトークンが文章のどこにあるか

Transformer Explainerでは、Token EmbeddingとPositional Encodingが加算され、Final Embeddingになる様子を視覚的に確認できます。

【G検定対策コラム⑤:ベクトルと行列(線形代数の基礎)】

本文では、文章全体が「トークン数 × 768」の行列で表され、ベクトル同士を要素ごとに加算していました。G検定の数理・統計分野では、ベクトル・行列といった線形代数の基礎知識が前提となります。特にTransformerの計算では行列積(内積)が多用され、Self-AttentionのQuery・Key・Valueの計算も行列演算で行われます。「同じ次元のベクトルは要素ごとに足せる」「トークンIDは索引であり、意味を表す数値ではない」といった本文のポイントは、ニューラルネットワーク全体を理解する土台になります。

名札と座席番号で考える

入力埋め込みは、「名札」と「座席番号」に例えると理解しやすくなります。

Token Embeddingは、トークンの名札です。

私は「犬」というトークンです。

Positional Encodingは、文章中の座席番号です。

私は文章の3番目にいます。

最終埋め込みには、この二つの情報がまとめて含まれます。

私は「犬」というトークンで、文章の3番目にいます。

同じ「犬」というトークンでも、文章中の位置が違えば、最終埋め込みの値も変わります。

埋め込みだけで文脈を理解できるのか

Embeddingは、Transformerに入力するための出発点です。

この段階では、各トークンについて、基本的な意味と位置の情報が用意された状態です。

しかし、文章中のほかのトークンとの関係は、まだ十分に反映されていません。

例えば、次の二つの文では「高い」の意味が異なります。

この山は高い。

この商品は高い。

一つ目の「高い」は高さを表し、二つ目の「高い」は価格を表します。

どちらの意味なのかを判断するには、「山」や「商品」との関係を調べる必要があります。

このトークン同士の関係を処理するのが、次に登場するSelf-Attentionです。

【G検定対策コラム⑥:文脈依存の意味理解とSelf-Attention】

本文末尾の「この山は高い/この商品は高い」で示されたように、同じトークンでも文脈によって意味が変わります。Embedding段階ではまだ他トークンとの関係が反映されておらず、これを解決するのが次回のSelf-Attention(自己注意)です。G検定では、Word2Vecのような固定的分散表現の限界(多義語を1つのベクトルでしか表せない)と、Attentionによる文脈依存表現の獲得を対比で問うことがあります。「高い」の意味を「山」「商品」との関係から判断する、という本文の例は、まさにAttentionの必要性を示す典型例として押さえておきましょう。

Transformer Explainerで確認するポイント

Transformer ExplainerのEmbeddingを操作し、次の点を確認してください。

  1. 入力文が単語数と同じトークン数になるとは限らない
  2. 各トークンには固有のトークンIDがある
  3. トークンIDから768次元の埋め込みベクトルを取得する
  4. 各位置にも768次元の位置ベクトルがある
  5. 二つのベクトルを足してFinal Embeddingを作る
  6. 入力した文章を変更すると数値も更新される

Transformer Explainerでは、数値が入力内容に応じてブラウザ上で更新されます。画面に表示される小さな四角や数値へマウスポインターを合わせながら、各トークンの変換を確認してみてください。

今回のまとめ

  • コンピュータは文章をそのまま計算できないため、最初に数値へ変換する
  • 文章を小さな単位に分割する処理をTokenizationと呼ぶ
  • トークンと単語は必ずしも一致しない
  • 各トークンには固有のトークンIDがある
  • トークンIDを使って埋め込み行列からベクトルを取り出す
  • GPT-2 smallでは、一つのトークンを768次元のベクトルで表現する
  • 位置エンコーディングによって、文章中の順番を表現する
  • トークン埋め込みと位置エンコーディングを足して、最終埋め込みを作る
  • 文章全体は「トークン数 × 768」の数値行列として表現される

次回は、Transformerの中心的な仕組みであるMulti-Head Self-Attentionを取り上げます。

Transformer Explainerを操作しながら、Query、Key、Valueがどのような役割を持ち、トークン同士の関係をどのように計算するのかを解説します。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。