コンピュータが二つの色の「近さ」を調べる際には、(高校の物理や数学の授業で教わった)「ベクトルの内積」を使います。レールの上に乗ったトロッコを引っ張る際に、レールに沿って引っ張った方が引っ張りやすいのは、レールの方向(ベクトル)と引っ張る方向(ベクトル)が一致しているからです。内積は、二つのベクトルがどのくらい同じ方向を向いているかを調べるのに適した演算(=計算方法)です。
人工知能や自然言語処理の研究をしていていた研究者たちは、「言葉」をコンピュータの中で効率よく扱うには、上の色と同じように、なんらかのベクトルに変換すれば良いことに随分前(1980年代)から気がついていました。言葉のベクトル化(Text Embedding、もしくは、単にEmbedding)の研究(特に人工知能への応用)が本格的に始まったのは、2010年代で、ChatGPTのベースである、GPT3.5/GPT4にもEmbeddingは使われており、その次元は、1,536もあります。
OpenAIのEmbedding APIを活用すると、任意の言葉のEmbeddigを求めることが出来ます。
- 紫陽花(あじさい): [0.008374308, -0.004348531, 0.015492181, 0.012114794, …以下略]
- 向日葵(ひまわり): [0.00897903, -0.028575271, -0.011562964, 0.026796354, …]
- 鰯(いわし): [0.014147074, -0.018954331, -0.040955342, 0.015233389, …]
- 鯵(あじ): [0.02712337, 0.009231063, 0.025325274, 0.009623604, …]
なんだか分からない数字が出てきますが、それそれの単語の内積を求めると面白い結果が得られます(”・”は内積を表します)。
- 紫陽花・向日葵 = 0.416
- 紫陽花・鰯 = 0.218
- 紫陽花・鯵 = 0.201
- 向日葵・鰯 = 0.171
- 向日葵・鯵 = 0.263
- 鰯・鯵 = 0.653
紫陽花と向日葵、鰯と鯵のペアがそれぞれ「近い関係」であることが、計算だけで分かるのです(内積の結果が1に近いほど、「近い関係にある」と言えます)。
試しに「花」「魚」という単語との関係を調べてみると以下のようになります。
- 花・紫陽花 = 0.605
- 花・向日葵 = 0.422
- 花・鰯 = 0.338
- 花・鯵 = 0.380
- 魚・紫陽花 = 0.282
- 魚・向日葵 = 0.249
- 魚・鰯 = 0.414
- 魚・鯵 = 0.507
片方が英語でも大丈夫です。
- Flower・紫陽花 = 0.453
- Flower・向日葵 = 0.406
- Flower・鰯 = 0.224
- Flower・鯵 = 0.243
単語だけでなく、文章のEmbeddingも計算可能で、同様の比較が可能です。
- “I love you”・あなたを愛してます = 0.473
- “I love you”・君が好き = 0.428
- “I love you”・君が大好き = 0.439
- “I live you”・”I like you” = 0.576
- “I love you”・お前は嫌いだ = 0.251
- “I love you”・あっち行け = 0.138
そのため、Embeddingを使うと、文章の「意味検索」が出来るようになります。通常の文字検索だと、”I love you” で検索すると、文字通り “I love you”の単語が文章中に並んでいないと見つけてくれませんが、Embeddingを使った検索をすると、似たような意味の、「あなたを愛してます」や「I like you」を見つけてくれるのです。
この記事の著者・中島聡さんのメルマガ









