- 例1: SNEやPCA
元は100〜1000次元を,2次元に圧縮
「意味の似た語が近くにある」:
*king
*queen
*man
*woman
*princess
*child
*mother
*apple *banana *fruit
- 例2:「語の意味的な近さ」(2次元に圧縮)
以下のコードをGoogle Colab に貼り付けて実行:
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
# 語彙と対応ID
vocab = ['king', 'queen', 'man', 'woman', 'apple', 'banana', 'fruit', 'dog', 'cat', 'animal']
word_to_id = {word: idx for idx, word in enumerate(vocab)}
# 埋め込み層を定義
embedding_dim = 16
embedding = nn.Embedding(num_embeddings=len(vocab), embedding_dim=embedding_dim)
# ベクトル取得
ids = torch.tensor(list(word_to_id.values()))
vectors = embedding(ids).detach().numpy()
# 次元圧縮(t-SNEで可視化)
tsne = TSNE(n_components=2, random_state=42, perplexity=5)
vectors_2d = tsne.fit_transform(vectors)
# プロット
plt.figure(figsize=(8,6))
for i, word in enumerate(vocab):
x, y = vectors_2d[i]
plt.scatter(x, y)
plt.text(x + 0.01, y + 0.01, word, fontsize=12)
plt.title("Embedding space (randomly initialized)")
plt.grid(True)
plt.show()
これは「ランダム初期化されたembedding」の視覚化。
まだ意味に沿って配置されていないが,学習後には「意味の近い語」が近づくようになる。
- 例3: 実際に文脈で使って意味空間が変わっていく様子を可視化
Word2VecやBERTなど、事前学習済みモデルの埋め込みを使って「意味空間」を直接見る。
意味空間を操作する:
king - man + woman ≈ queen
walk - walking + swimming ≈ swim
これらは、「ベクトル空間が意味論を持ち得る」ことの圧倒的な証明。
|