👽

生成AIの分野におけるエンベディング(埋め込み)とは何なのか?

2024/08/09に公開

はじめに

こんにちは。社会人2年生のwinnieです 🍯

前々からこのテーマで記事を書きたいと思いつつ今まではなかなか気分が乗らなかったのですが、今日になってようやく書く気力が湧いてきたので筆をとっていこうと思います。

この記事では生成AIやLLMの分野でよく目にするエンベディング(embedding / 埋め込み / ベクトル化)について、エンジニアの方に限らず幅広い読者を対象として分かりやすく解説していきます。

LLM(大規模言語モデル)とは?

LLM(大規模言語モデル)の基本的な原理

エンベディングについて解説する前に、まずは前提となるLLMから説明していきます。

LLM(Large Language Models, 大規模言語モデル) とは、とても雑に説明すると「それっぽい文を出力するモデル」のことです。もう少しだけ正確に表現すると、「入力された文の続きを予測するモデル」とも言えます。例を見てみましょう。

我輩は  # 猫である。

この例では「我輩は」という文の入力を受けて、続きの「猫である。」という文を出力(予測)しています。さらに例を見てみましょう。

我輩は猫である。名前はまだ  # ない。

先ほど出力した文章を再度LLMに入力してみました。そうすることで、続きの文が次々と出力されていきます。LLMは、このように「それっぽい文」を繰り返し出力していくことで、「それっぽい文章」を作り上げています。

基本的な文章だけではありません。プログラミングのコードや数式とその計算結果も、所詮はただの文字列です。LLMは文の種類を問わず、与えられた文に対してただ「それっぽい文」を出力します。

print(  # "Hello World!")
1 + 2 =  # 3

コラム:LLM(大規模言語モデル)の原理を少しだけ深堀りする ☕

LLMが「それっぽい文」を出力する仕組みについて、少しだけ深堀りしてみましょう。LLMが出力する文の「それっぽさ」は、実は確率で表現されています。

我輩は猫である。名前はまだ
# 50%: ない。
# 20%: ある。
# 15%: にゃい。
# 10%: がすかる。
# ...

LLMは世界中のすべての単語の中から、「それっぽい」確率が高い単語を出力として選んでいるのです 🇲🇬

ちなみに、必ずしも確率の最も高い単語が選ばれるわけではありません。そのように設定することもできますが、表現の幅を持たせるため確率が高めの単語を中心に、あえていろいろな単語が選ばれるように設定されています。ChatGPTの返事が毎回変わるのはこのためです。

それでは、LLMはこの確率をどのように計算しているのでしょうか?

答えは「経験則」です。もう少し正確に表現すると、「学習」です。LLMは世界中の文章を学習し、経験則的に(統計的に)「それっぽい文」を出力します。最新のコンピューターを使って「それっぽさ」を極めていったらモデルの精度がめちゃくちゃ高くなったよ、というところから起きているのが昨今の生成AIブームになります。

イメージとしては、人間を完璧に擬態した宇宙人と似ているかもしれません。そんな宇宙人が地球上に紛れ込んでいたとして、我々人類は果たしてそれに気付けるのでしょうか?人間の文章を高精度で模倣した生成AIの文章は、もはや人間のものとは判別がつかないような領域にまで発展しています 👽

エンベディング(埋め込み)とは?

エンベディング(埋め込み)の基本的な原理

前置きが長くなりましたが、いよいよ本題のエンベディング(埋め込み)について説明していきます。

エンベディング(embedding / 埋め込み / ベクトル化) とは、コンピューターが扱いやすいよう単語を数値に変換する技術です。LLMは、文の入力を受けて文を出力するモデルです。コンピューターで動くモデルですから、文は数値に変換しなければいけません。ここでも例を見てみましょう。

我輩  # ID: 3032# ID: 12# ID: 405# ID: 87
ある  # ID: 138# ID: 2

文をコンピューターに理解してもらうため、単語に数値(ID)を割り当てました。こうすることで、LLMが文章を数値として受け取ることができるようになります。単語を繋げて文にしてみましょう。

我輩は猫である。  # [3032, 12, 405, 87, 138, 2]

コンピューターらしくなってきましたね!

ところで、このIDはどのように割り当てられるのでしょうか?

IDの割り当ても「学習」されます。具体的には、似ている単語同士のIDが近くなるように学習されます(そのように設計されています)。似た単語が使われているということは、文の意味がほとんど変わらないということです。つまり、LLMが予測する続きの「それっぽい文」はそう大きく変わりません。

LLMは似ている単語同士の計算結果(予測結果)があまり変わらないよう、似た単語の数値(ID)を近い値にしなければいけません。もう1つ例を見てみましょう。

我輩は猫である。  # [3032, 12, 405, 87, 138, 2]
拙者は猫でござる。  # [3025, 12, 405, 87, 138, 16]

これら2つの文章は似ていますね。文章内で使われている単語が似たような意味を持つからです。このように似ている単語同士の数値は近くなるよう、LLMによって学習されます。

エンベディング(埋め込み)の原理を少しだけ深堀りする

単語を数値に変換するエンベディングの仕組みは理解できたと思います。

ここでエンベディングのIDについて、もう少し詳しくみてみましょう。コンピューターは、すべての情報を 01 (2進数)として扱います。ということは、IDの数値すら 01 に書き直さないといけない訳です。

例えば、 3 を2進数で表すと 00000101 に、 22 を2進数で表すと 00010110 になります。では、「我輩」を表すID 3032 はどうなるでしょうか?

3032 を2進数で表すと、 0000 1011 1101 1000 になります。大きいですね。ところで、これは見方を変えると16次元のベクトルである(数字が16個並んでいる)とも言えます。

0000 1011 1101 1000  # [0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0]

なぜわざわざベクトルとして見るのかって?その方が都合がいいからです 😉

例えば、計算式を(その道の方たちにとっては)簡単に表現することができます。生成AIに限らず、科学技術計算などの数値計算ではよくベクトルや行列が用いられます。

ここで大切なことはベクトルを使う理由ではなく、LLMが単語を理解するための仕組みとしてID(それもベクトルで表現されるような数値)が使われている、ということです。まとめるとこのようになります。

  • エンベディングとは、単語を数値に変換する技術のことである。
  • エンベディングした数値はベクトルの形状になっている。
  • 似た単語同士のベクトルは近くなるように学習される。

コラム:エンベディング(埋め込み)を可視化してみる ☕

ところで、世界には数多くの単語が存在します。これらの単語を表現するには、16次元のベクトルでは到底足りません。ChatGPTの中では1,536次元のベクトルが使われています(しかも劇的に圧縮されたうえで)。

このような高次元のベクトルを我々が直接認識することは難しいのですが、「次元削減」と呼ばれる手法を使うことで、1,536次元のような高次元をギュッと3次元まで圧縮することができちゃいます。それでは、コンパクトになった単語のベクトルを見てみましょう!

Screenshot of the embedding projector
Embedding projector - visualization of high-dimensional dataより引用 [1]

おっと、画像なので3次元には見えないですね。

とりあえず、これら beautiful などの点1つ1つが単語を表すベクトルであり、似た単語のベクトルはしっかりと近くに表示されるようになっています。 beautiful の近くには beautylove などの単語ベクトルがあるようです。実際に3次元で見てみたい方は、こちらのEmbedding Projectorから体験できます[1:1]。単語の分布をグリグリ触れたり、気になる単語の近くにある単語を探せたりしておもしろいですよ!

ちなみに次元をギュッと圧縮する「次元削減」は昔から存在する手法で、昨今の生成AIと直接的な関係はありません。なお「次元削減」の代表的な手法としては、PCA(主成分分析)やt-SNEなどがあります。

おわりに

ずっと書きたかったテーマの記事が書けてとても満足です 😌

生成AIまわりの話をしようとすると度々エンベディングの概念が登場するのですが、会話の中でエンベディングの説明をしようとしてもなかなか上手く説明できず、かと言って(素晴らしい記事はたくさんあるのですが)自分の伝えたいポイントだけ掻い摘んで説明してくれている記事も見当たらないので、ずっとやきもきしていました。

今後エンベディングが関わってくる記事を書くときはこの記事のリンクを貼っておけば良いので、これで技術記事の執筆も捗るというものです()

脚注
  1. Embedding projector - visualization of high-dimensional data ↩︎ ↩︎

GitHubで編集を提案
株式会社アクティブコア

Discussion