第20週: ニューラルネットとEmbedding Vector
近況報告
蒸し暑い日々が終わり始め、涼しく心地よい風が吹き始めた。夏から秋にかけての季節の移り変わりは切ない気持ちになるが、好きな時期でもある。
最近の休日は育児以外はだいたいAIについて勉強している。AIと一口に言ってもジャンルは広いのだが、AIの何がすごいかということが朧げながら見えてきた。ニューラルネットがすごいのだ。ニューラルネットを使ってプログラムを作ると、人間だけでプログラムを作るよりもすごいものが出来上がるのである。今回はニューラルネットの一部であるEmbedding Vectorを使って色々試してみた。
ニューラルネット概要
ニューラルネットとは、データを入力すると出力を返し、出力が実用的でない場合は自動でパラメータを更新し出力を調整するモデルのことだ。入力から出力まで多数のノードがリンクして情報を伝えるその構造が、脳の神経細胞を模していることからその名がついた。自動でというところがミソでニューラルネットには、出力と実用的な数値との誤差を計算して自らパラメータを更新するアルゴリズムが組み込まれている(これをバックプロパゲーションという)。データの入力→データの処理→出力→誤差計算→パラメータ更新→データの入力→(更新されたパラメータを使って)データの処理→出力→、、、のループをコンピュータに自動で何度も繰り返させることにより、パラメータが実用性に耐えられる値に更新されたニューラルネットのモデルが完成する。ニューラルネットを活用すると、人間が手動でコードを書くよりも効率よくプログラムをつくることができるのである。
大量のデータを使ってニューラルネットをトレーニングすることで機械の自動化が進むため、ニューラルネットはAIにとってなくてはならない技術だ。今後はニューラルネットの技術が基盤となって機械やシステムが設計されることになる。
「オレの財宝か?欲しけりゃくれてやる。探せ!この世のすべてをそこへ置いてきた!!」
男たちは汎用人工知能を目指し、夢を追い続ける。世はまさに、ニューラルネット時代!!
ニューラルネットとEmbedding Vector(エンベディングベクトル)
ニューラルネットの中身を説明するために欠かすことができないのがEmbedding Vector(埋め込みベクトル)だ。Embedding Vectorとは、ニューラルネットに入力されたデータをベクトルに変換したものだ。通常は入力された生のデータ(単語や文章や画像など)のままではコンピュータが扱いづらいため、それらをコンピュータが処理しやすい形(ベクトル空間)に埋め込む(Embedding)ことからその名がついた。入力データを一時的にEmbedding Vectorの形にしてデータを処理してから、何らかの出力を返しているのである。(入力と出力の間でEmbedding Vectorを計算している)
言葉で説明しても伝わりづらいので、OpenAIのベクトル空間(text-embedding-3-small)を使って実験してみよう。’桜’という単語をEmbedding Vectorにすると以下のように表現される。
このように、’桜’という単語一字が1536もの数字で表される(text-embedding-3-large使えば3072個の数字になる)
人間にとっては分かりにくいことこの上ないが、コンピュータにとっては、’桜’という漢字一字よりも、数字1536個のほうがデータを処理する上で都合がいいのである。
さらに、高校数学で習う「ベクトルの内積」を使って、Embedding Vector同士の内積を計算すると面白いことがわかる。(’・’は内積を表す)
桜・梅=0.5370095914534538
桜・春=0.4821374711104758
桜・バイク=0.21660127404530716
笑顔・死神=0.23515433037545838
西郷隆盛・offside=0.1198927872037496
この値は各ベクトルの類似性を示しており、1に近づくほど言葉の意味が似ていることになる。ニューラルネットはEmbedding Vectorを活用してデータ間の類似性を見極めることにより、意味の通った文章を生成したり、画像を認識できるのである。
このEmbeddihg Vectorの数字のひとつひとつはニューラルネットによる膨大なトレーニングによって見つけ出されたものである。それぞれの数字が何を意味しているのかは誰も分からないし、たまたまその数字になっただけでそもそも意味などないのかもしれない。そして、さらなるトレーニングによってこの値もどんどん修正されていくのである。
最後に、ChatGPTが生成してくれたEmbedding Vectorのイメージ図を貼っておきます。