- 埋め込みはLLMの意味的な骨格であり、テキストを数値ベクトルに変換してモデルが理解できるようにする
- 埋め込みの発展は、カウントベース、TF-IDFなどの統計的手法から、Word2Vec、BERT、GPT系などの現代的な方式まで、さまざまな変化を経てきた
- 良い埋め込みでは、単語の意味的類似性の保持と次元数の調整のバランスが重要であり、LLMでは学習データと課題に最適化される形で一緒に訓練される
- TF-IDF、Word2Vec、BERTなど代表的な埋め込み方式を事例と可視化で説明し、特にLLMの埋め込みは入力トークンを高次元ベクトルに変換した後、文脈に応じて階層的に更新される
- TorchのEmbeddingレイヤー、埋め込みベクトルのグラフ分析などの実習コードと視覚資料を通じて、埋め込みの実際の動作原理を直感的に理解できるよう案内する
埋め込みとは何か
- 埋め込み(embedding)は、テキスト、画像、音声などのデータを高次元ベクトルに変換する技法である
- 特にNLPでは、単語やトークンをベクトルに変換し、コンピュータが理解できる形にする過程である
- 埋め込みはテキストだけでなくさまざまなデータ型に適用できるが、本稿ではテキスト埋め込みを中心に説明する
埋め込みの発展と種類
- 初期の埋め込み手法は、カウントベクトル、TF-IDF、Co-Occurrence Matrixなどの統計ベース方式が主流だった
- その後、Word2Vec、GloVe、FastTextのようなニューラルネットワークベースの埋め込みが登場し、意味的類似性をベクトル空間に反映し始めた
- BERT、GPTなどのTransformerベースモデルでは、各トークンの埋め込みが入力後に階層的に文脈情報を反映して更新される(動的/文脈化埋め込み)
良い埋め込みの条件
意味的表現(semantic representation)
- 意味の近い単語がベクトル空間でも近い位置に配置される
例: catとdogは、dogとstrawberryよりも類似してマッピングされる
次元の大きさ(dimensionality)
- 埋め込み次元が小さすぎると表現力が不足し、大きすぎるとメモリの浪費や過学習のリスクがある
例: GPT-2の埋め込み次元は最低768である
伝統的な埋め込み手法: TF-IDF
- TF-IDFは単語頻度と希少性(逆文書頻度)を掛け合わせて単語の重要度を算出する
- TF: ある文書で単語がどれだけ頻出するか
- IDF: 全文書の中でその単語がどれだけ希少か
- TF-IDFの結果値は情報検索、キーワード抽出などの単純な分析に活用されるが、意味的類似性はあまり反映できない
- 可視化すると大半の単語が一つのクラスターに集まり、意味的な分離度は低い
Word2Vec
- Word2Vecはニューラルネットワークベースの埋め込みで、意味的関係をベクトル空間に効果的に反映する
- CBOW(周辺単語から中心単語を予測)、Skipgram(中心単語から周辺単語を予測)などの方式がある
- 学習を通じて隠れ層の埋め込み行列が単語の意味ベクトルとして活用される
- ネガティブサンプリングなどの最適化手法を使うことで、大規模データでも効率的に学習できる
- TensorFlow Embedding Projectorなどで可視化すると、意味的に近い単語がクラスタリングされることが分かる
BERTとTransformerベースの埋め込み
- BERTはEncoder-onlyのTransformerモデルで、各層を経るほど文脈情報を動的に反映する
- 入力段階: トークナイザーでテキストをトークン化 → トークン埋め込みベクトルに変換 → 位置埋め込みと結合
- その後、複数のTransformer層を通過しながら、文脈情報を反映して埋め込みが動的に変化する
[CLS]、[SEP]などのスペシャルトークンによって、文全体/区切り情報も処理する
- BERT以降、多くのLLMが動的(文脈化)埋め込み方式を採用している
LLM埋め込みの構造と学習
- LLM埋め込みは、入力トークンを高次元ベクトルに変換する最初の層(lookup table)として実装される
torch.nn.Embeddingのように、トークンIDを受け取って各埋め込みベクトルを返すテーブル形式で構成される
- LLMは学習過程で埋め込みレイヤーの重みも含めて一緒に最適化し、モデルが処理するデータと目的に合わせて埋め込みを精緻化する
- 例: DeepSeek-R1-Distill-Qwen-1.5Bモデルは1536次元の埋め込みベクトルを使用する
埋め込みの可視化とグラフ分析
- 埋め込みベクトル間の類似度(コサイン類似度など)に基づいて、埋め込み空間をグラフ形式で分析できる
- 例:
AI agents will be the most hot topic...という文をトークナイズし、各トークンの埋め込みから類似度の高いトークン同士をつないで可視化できる
- 単一単語(例:
list)のさまざまな変形(_list、Listなど)も、類似した埋め込みを持つことが多い
結論
- 埋め込みはLLMとNLPの中核要素であり、入力データを数値ベクトルに変換することで、意味構造や文脈情報をモデルが処理できるようにする
- LLM時代になっても埋め込みの基本原理と構造は大きく変わらず、依然としてモデル性能と解釈に非常に重要な役割を担っている
- 直感的なコード例と可視化資料を通じて、埋め込みの実質的な動作原理を容易に理解できる
2件のコメント
king - man + woman = queen
Hacker Newsのコメント
埋め込みがLLMスタックの中でほとんど議論されない部分のひとつであることに本当に驚く。直感的には、ネットワークが意味的なつながりを推論できる能力に非常に大きな影響を与える部分だと思っていたが、人々はそれについてあまり話さない
埋め込みの問題点は、モデル自体を除けばほとんど読み解けないことにある。埋め込みは入力シーケンスの意味を確かにエンコードしているが、学習過程でその情報があまりにも圧縮されるため、モデルのデコーダヘッドしか解読できなくなる。Anthropicには Sonnet 3の内部特徴を解釈可能な形にした研究 があるが、これは内部レイヤーの活性化を解釈するために別のネットワークを並行して学習させる必要があり、コストが高い
高次元空間の奇妙な点は、ほとんどの値が互いに直交し、非常に遠く離れていることだ。にもかかわらず、次元削減手法によって5万次元でも概念をクラスタリングできるのは不思議だ
初めて埋め込みについて深く学んだとき、「LLMsの魔法の少なくとも3分の1は埋め込みから来ている」と感じた。単語がすでに意味的に有用な形で配置されているという事実そのものが、LLMsの神秘を少し解きほぐしてくれる。依然として驚異的ではあるが、舞台裏が少し見える感覚だ
埋め込みは、コンピュータが人間の言語を定量化できるようにする一種の「ロゼッタストーン」のような役割を果たしている。これは本当に重要な論点であるべきだと思うが、1,000次元ベクトル空間を理解しようとする試みがかなり負担になることも認識している
埋め込みについての議論が不足しているという意見はあまり理解できない。特にRAGの適用例やベクターDBの話では、埋め込みは常に中心的なテーマとして扱われている
チュートリアルは非常に良かった — コンテキスト埋め込みと静的埋め込みの違いが重要だ。多くの人はword2vec(静的埋め込み)には慣れているが、コンテキスト埋め込みのほうがはるかに強力なことが多い。(ちなみに、そのページはスクロールするだけで履歴に大量の記録が追加されるブラウザ履歴ハイジャックがかなりひどい)
もっと高度な説明が必要だと思う点は、埋め込みの観点から見たEncoder-Decoderトランスフォーマー(BERT)とDecoder-only生成モデルの違いだ
小さな修正が必要: BERTはエンコーダであり(Encoder-Decoderではない)、ChatGPTはデコーダだ。エンコーダモデル(BERT)は文全体を見ることができるので、意味表現に有利だ。たとえば “The bank was steep and muddy” における bank の意味(川岸なのか金融機関なのか)を文全体を見て判別できる。一方、GPT系(デコーダモデル)は左から右の順序でしか見ないため、文の後ろの情報を見ずに予測する。追加資料として huggingfaceのmodernBERTポスト および neoBERT論文 も有益だ
dust42の説明に補足すると、BERTはエンコーダ、GPTはデコーダ、T5はエンコーダ-デコーダだ。最近はエンコーダ-デコーダは以前ほど人気がない。エンコーダモデルは分類、情報抽出、検索によく使われ、デコーダはテキスト生成、要約、翻訳に向いている。最近の研究(Ettin論文)でもこれが確認されている。どちらもトランスフォーマーなので、エンコーダをデコーダに変えたり、その逆も可能だ。設計上の違いは双方向アテンション(すべてのトークンがすべてのトークンを見られる)と自己回帰アテンション(以前のトークンしか見られない)にある
埋め込みプロジェクタを活用すれば、50語以上の単語だけでなく、3Dデータ可視化の感覚も養える。 Tensorflow Embedding Projector を参照してほしい
とても優れたビジュアルガイドだ! 私も似たコンセプトで、ディープラーニングの深い理解を助けるビジュアル+オーディオ+クイズ形式のLLM埋め込みレッスンを app.vidyaarthi.ai で作った。 体験リンク、抽象的な概念をより直感的かつインタラクティブにする「実際にやって学ぶ」アプローチを目指している。フィードバック歓迎(自己宣伝ではなく、本当に情熱を込めて作ったツールだ)
うまくアクセスできないようだ。“Content-Security-Policy: The page’s settings blocked an inline style…” のようなコンソールエラーメッセージが大量に出る
ワードクラウド可視化やクエリのtop-k結果表示のほうが、より直感的かもしれない。 TensorflowのEmbedding Projector で単語を入力し、UMAP projectionを選んでみることを勧める
もう少し実用寄りの説明は sgnt.aiの埋め込み解説記事 でも扱っている。自分で書いた
素晴らしい資料をありがとう! 私の理解では、LLMには大きく3つの問題がある:
あなたのアプローチのほうがずっと直感的だ。なぜカテゴリカル/スカラー特徴の埋め込み例を見せなかったのか不思議だった
とても教育的で構成のよく練られた記事だ。著者に感謝する
LLMの埋め込みは通常、入力レイヤーの一部であり、Word2Vecなどの事前学習モデルとは異なり、学習中に更新される。
さらに気になる点として、推論段階では埋め込みは「トークンID -> ベクトル」という形のルックアップテーブルだが、
数学的にはトークンIDを長いワンホットベクトルとしてエンコードし、それを線形レイヤーに通して埋め込みベクトルを得る形になる。
この構造は埋め込み学習にもそのまま適用されるのか、つまり埋め込みを線形レイヤーと見なして逆伝播で学習させる方式なのか気になる
埋め込みも通常の逆伝播過程に含まれる。ただし効率のため、ワンホットエンコーディングは実際には使わない。
選択されたベクトルにだけ勾配が流れるよう、インデクシングを微分可能に実装する。
具体例としては、自作のミニ深層学習ライブラリ SmallPebbleのソース を見ると参考になる
別のコメントをもう少し説明すると、
インデクシングとワンホットベクトルとの積は数学的に同じだ。
たとえば語彙数がN、シーケンス長がLなら、NxLの疎行列を埋め込み行列に掛けることになるが、
実際には各列ごとにインデックスが1つわかればよいので、内部的には数値1つ(インデックス)で表現する。
この方式により、順伝播と同様に逆伝播もインデクシング基準で別途実装し、
選ばれた埋め込みベクトルに勾配が流れるよう処理する