1歩1歩理解する、Embedding
はじめに
社内勉強会の資料を兼ねてアウトプット。発表までに何度か更新入れます。
検証リポジトリはこちら。
Claude 3.7 Sonnetによる、Embeddingまとめ
すごいですね。このプロンプトでもここまで作成してくれる。
構成のベースラインとして、Claudeが書いてくれたものを深堀することで効率よくキャッチアップができそうですね。
ここで書いてくれたことを、掘り下げていきましょう。
手を動かしながら、理解する
Claude先生は次のようにまとめてくれました。
手法 | 特徴 | 問題点 |
---|---|---|
One-hot encoding | 単語ごとに1つの次元を割り当て | ・疎行列(ほとんど0の行列) |
・意味的関係を表現できない | ||
・語彙が増えると次元爆発 | ||
Embedding | 密なベクトル表現 | ・低次元で効率的 |
・意味的関係をベクトル空間で表現 | ||
・類似度計算が可能 |
まずはこの違いと、One-hot encodingの問題点について、手を動かしながら探ってみます。
One-hot encoding
記載中
Embedding
Claude 3.7 Sonnetの助けを借りながら、可視化してもらいます。
Geminiのtext-embedding-004は無料で使用できるので助かりますね。
ただし、日本語未対応のため、注意が必要です。
サンプルデータとして、「技術」「自然」「食」の3つのカテゴリで例文を作成してくれました。
texts = [
# Technology category
"Artificial intelligence is transforming how we interact with computers.",
"Machine learning algorithms improve with more data and training.",
"Neural networks are inspired by the human brain's structure.",
"Cloud computing provides scalable infrastructure for businesses.",
"Blockchain technology enables secure decentralized transactions.",
# Nature category
"The Amazon rainforest is home to millions of plant and animal species.",
"Coral reefs support a diverse ecosystem of marine life.",
"Redwood trees can live for thousands of years and grow to immense heights.",
"Monarch butterflies migrate thousands of miles each year.",
"The Sahara desert experiences extreme temperature variations between day and night.",
# Food category
"Italian cuisine is known for its regional diversity and fresh ingredients.",
"Sushi preparation requires years of training to master.",
"Spices have been traded globally for centuries and shaped culinary traditions.",
"Fermentation preserves food and creates complex flavors.",
"Farm-to-table restaurants prioritize locally sourced ingredients."
]
テキスト = [
# テクノロジーカテゴリー
人工知能は、我々がコンピュータとどのように相互作用するかを変革している
機械学習アルゴリズムは、より多くのデータとトレーニングによって改善される
ニューラルネットワークは、人間の脳の構造にヒントを得ている
クラウドコンピューティングはビジネスにスケーラブルなインフラを提供する
ブロックチェーン技術は、安全な分散型取引を可能にする
# 自然カテゴリー
アマゾンの熱帯雨林には、数百万種の動植物が生息している
サンゴ礁は海洋生物の多様な生態系を支えている
レッドウッドの木は何千年も生き、巨大な高さまで成長する
オオカバマダラは毎年何千マイルも移動する
サハラ砂漠は昼夜の寒暖差が激しい
# 食べ物カテゴリー
イタリア料理は地域の多様性と新鮮な食材で知られている
寿司の調理をマスターするには何年もの訓練が必要である。
スパイスは何世紀にもわたって世界的に取引され、料理の伝統を形成してきた
発酵は食材を保存し、複雑な風味を生み出す
ファーム・トゥ・テーブル・レストランは地元産の食材を優先する
]
(translated by DeepL)
確かに、意味は近そうな感じがしますね。
これをPCAを用いて2次元上にプロットした結果が下記になります。
3次元上にプロットした結果も作成してくれていました。
最後に、t-SNEでプロットした結果が下記になります。
次元削減アルゴリズムについて
さて、text-embedding-004は768次元の出力を行います。
このまま出力すると人間にはよくわからない結果が出てきてしまいます。
実際に、embeddingの結果を線形に繋いで出力してみた例が下記になります。
palette = sns.color_palette("husl", len(df["category"].unique()))
category_colors = {
category: palette[i] for i, category in enumerate(df["category"].unique())
}
plt.figure(figsize=(15, 8))
# embeddings配列とテキストを紐付けて処理
for category in df['category'].unique():
# そのカテゴリのインデックス番号を取得
indices = df[df['category'] == category].index.values
# インデックス番号を使ってembeddingsから該当するデータを抽出
category_embeddings = np.array([embeddings[idx] for idx in indices])
# カテゴリごとに同じ色で描画
for emb in category_embeddings:
plt.plot(range(768), emb, color=category_colors[category], alpha=0.5)
# 凡例用に1本だけラベル付きでプロット
plt.plot(range(768), category_embeddings[0],
color=category_colors[category],
label=category,
linewidth=2)
plt.title("768-Dimensional Embeddings by Category", fontsize=14)
plt.xlabel("Dimension Index", fontsize=12)
plt.ylabel("Embedding Value", fontsize=12)
plt.grid(True, alpha=0.3)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
これでは何がなんだかわかりません。
そこで、次元削減のアルゴリズムの出番です。
手法はいくつかあるのですが、今回Claudeが提案してくれたのはPCAとt-SNEでしたね。
PCA(主成分分析)
ざっくりいうと「元の情報をできるだけ失わないようにしつつ、コアとなる成分を抽出する方法」です。
下記の記事がとても分かりやすいので、ご紹介させていただきます。
t-SNE
ざっくりいうと「高次元で近いもの同士を、低次元にしたときも近いように扱う方法」です。
下記の記事がとても分かりやすいので、ご紹介させていただきます。
語源と歴史から探る
日本語では「埋め込み」と表現されるEmbeddingですが、そもそも英語の語源は何なのでしょうか。
英語の語源から探る Embedding
embeddingの語源は、英語の動詞「embed」に由来しています。「embed」は「in-(内に)」と「bed(ベッドや基盤)」を組み合わせた言葉で、文字通り「内に置く」や「埋め込む」という意味があります。古英語の「bedd」が「ベッド」を意味しており、この言葉から「embed」が派生しました。
「embedding」は、この「embed」に名詞の語尾「-ing」を付けた形で、物事が他のものに埋め込まれる行為や状態を指します。技術やデータの分野では、情報やデータを他のデータ構造やシステムの中に組み込むことを意味することが多いです。この語は、心理学やコンピュータサイエンスなど、さまざまな領域で幅広く使われています。
意味が近い単語として、
- inclusion
- integration
- installation
- attachment
もあるようですね。
自然言語処理における Embedding
自然言語処理におけるEmbeddingは、次のように定義できます。
「意味的に関連する単語同士」を「空間的に近い数値ベクトル」へと変換すること
Embedding の歴史
単語埋め込みの歴史は、頻度ベースモデルが始まりなそうですね。代表的なところでいうとTF-IDFがあります。
Discussion