Embedding

AIフレームワーク | IT用語集

この用語をシェア

概要

Embedding(埋め込み)は、テキスト、画像、音声などのデータを高次元ベクトル空間に変換する技術です。機械学習モデルの入力として使用され、データの意味的な関係を数値で表現します。類似した意味を持つデータは、ベクトル空間内で近い位置に配置され、計算可能な形式での意味の操作や比較が可能になります。

詳細説明

主な特徴

  • 意味の数値化:テキストや画像の意味を数値ベクトルで表現
  • 次元削減:高次元のスパース表現を低次元の密な表現に変換
  • 意味的類似性:類似した意味のデータは近い位置に配置
  • 計算可能性:ベクトル演算による意味の操作が可能
  • 汎用性:様々なデータタイプに適用可能

主要な手法

  • Word2Vec:単語の分散表現学習
  • GloVe:グローバルベクトル表現
  • FastText:サブワード情報を考慮した埋め込み
  • BERT Embeddings:文脈を考慮した動的埋め込み
  • Sentence Transformers:文章レベルの埋め込み
  • OpenAI Embeddings:大規模言語モデル由来の埋め込み

使用例

OpenAI Embeddingsを使った基本的な例

import openai
import numpy as np

# OpenAI APIキーの設定
openai.api_key = "YOUR_API_KEY"

# テキストの埋め込みを取得
def get_embedding(text):
    response = openai.Embedding.create(
        model="text-embedding-ada-002",
        input=text
    )
    return response.data[0].embedding

# 複数のテキストの埋め込みを取得
texts = [
    "機械学習は人工知能の一分野です",
    "ディープラーニングはニューラルネットワークを使用します",
    "今日は良い天気です",
    "自然言語処理でテキストを解析します"
]

embeddings = []
for text in texts:
    embedding = get_embedding(text)
    embeddings.append(embedding)
    print(f"テキスト: {text}")
    print(f"埋め込み次元: {len(embedding)}")
    print()

# 類似度の計算
def cosine_similarity(vec1, vec2):
    dot_product = np.dot(vec1, vec2)
    norm1 = np.linalg.norm(vec1)
    norm2 = np.linalg.norm(vec2)
    return dot_product / (norm1 * norm2)

# 全ての組み合わせの類似度を計算
for i in range(len(texts)):
    for j in range(i+1, len(texts)):
        similarity = cosine_similarity(embeddings[i], embeddings[j])
        print(f"'{texts[i]}' と '{texts[j]}' の類似度: {similarity:.4f}")

Sentence Transformersを使った例

from sentence_transformers import SentenceTransformer
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# モデルの読み込み(多言語対応)
model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')

# 文章のリスト
sentences = [
    "人工知能は急速に発展しています",
    "AIの技術が進歩している",
    "今日は雨が降っています",
    "機械学習モデルの精度が向上した",
    "外は晴れています"
]

# 埋め込みベクトルの生成
embeddings = model.encode(sentences)

print(f"埋め込み次元: {embeddings.shape[1]}")
print(f"文章数: {embeddings.shape[0]}")

# 類似度行列の計算
similarity_matrix = cosine_similarity(embeddings)

# 結果の表示
print("\n類似度行列:")
for i, sentence_i in enumerate(sentences):
    for j, sentence_j in enumerate(sentences):
        if i != j:
            print(f"'{sentence_i}' と '{sentence_j}': {similarity_matrix[i][j]:.4f}")

Word2Vecを使った単語埋め込み

from gensim.models import Word2Vec
import numpy as np

# サンプルテキストデータ
sentences = [
    ["人工", "知能", "は", "急速", "に", "発展", "し", "て", "いる"],
    ["機械", "学習", "は", "AI", "の", "一", "分野", "です"],
    ["深層", "学習", "は", "ニューラル", "ネットワーク", "を", "使用", "する"],
    ["自然", "言語", "処理", "で", "テキスト", "を", "解析", "する"],
    ["コンピューター", "ビジョン", "で", "画像", "を", "認識", "する"]
]

# Word2Vecモデルの訓練
model = Word2Vec(
    sentences,
    vector_size=100,  # 埋め込み次元
    window=5,         # コンテキストウィンドウサイズ
    min_count=1,      # 最小出現回数
    sg=0,             # CBOW(0)またはSkip-gram(1)
    epochs=100
)

# 単語の埋め込みベクトルを取得
word = "人工"
if word in model.wv:
    embedding = model.wv[word]
    print(f"'{word}' の埋め込みベクトル次元: {len(embedding)}")
    print(f"最初の5次元: {embedding[:5]}")

# 類似語の検索
try:
    similar_words = model.wv.most_similar("機械", topn=3)
    print(f"\n'機械' に類似する単語:")
    for word, score in similar_words:
        print(f"  {word}: {score:.4f}")
except KeyError:
    print("単語が見つかりませんでした")

# 単語間の類似度
try:
    similarity = model.wv.similarity("人工", "機械")
    print(f"\n'人工' と '機械' の類似度: {similarity:.4f}")
except KeyError:
    print("単語が見つかりませんでした")

画像埋め込みの例

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from PIL import Image
import numpy as np

# 事前学習済みResNetモデルの読み込み
model = models.resnet50(pretrained=True)
model.eval()

# 最終層を除去して特徴抽出器として使用
feature_extractor = torch.nn.Sequential(*list(model.children())[:-1])

# 画像の前処理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], 
                       std=[0.229, 0.224, 0.225])
])

def get_image_embedding(image_path):
    # 画像の読み込みと前処理
    image = Image.open(image_path).convert('RGB')
    image_tensor = transform(image).unsqueeze(0)
    
    # 特徴抽出(埋め込み生成)
    with torch.no_grad():
        features = feature_extractor(image_tensor)
        embedding = features.squeeze().numpy()
    
    return embedding

# 画像の埋め込みを取得
# embedding = get_image_embedding("sample_image.jpg")
# print(f"画像埋め込み次元: {embedding.shape}")

# 複数画像の類似度比較
def compare_images(image1_path, image2_path):
    emb1 = get_image_embedding(image1_path)
    emb2 = get_image_embedding(image2_path)
    
    # コサイン類似度の計算
    similarity = np.dot(emb1, emb2) / (np.linalg.norm(emb1) * np.linalg.norm(emb2))
    return similarity

# 使用例
# similarity = compare_images("image1.jpg", "image2.jpg")
# print(f"画像の類似度: {similarity:.4f}")

関連技術

  • Vector Database:埋め込みベクトルの保存・検索
  • Transformers:文脈を考慮した埋め込み生成
  • FAISS:高速な類似度検索
  • t-SNE/UMAP:高次元埋め込みの可視化
  • TensorFlow/PyTorch:埋め込み層の実装
  • scikit-learn:PCAなどの次元削減

適用分野

  • 自然言語処理(翻訳、質問応答、感情分析)
  • 推薦システム(商品、コンテンツ推薦)
  • 類似度検索(文書検索、画像検索)
  • クラスタリング(データ分類、グルーピング)
  • 異常検知(パターン認識、不正検知)
  • 知識グラフ(エンティティ関係、グラフ埋め込み)

埋め込みの評価方法

内在的評価

  • 単語類似度タスク
  • 単語アナロジータスク
  • クラスタリング評価

外在的評価

  • 下流タスクでの性能評価
  • 分類精度の測定
  • 検索精度の評価

メリット・デメリット

メリット

  • 意味的な情報を数値で表現
  • 機械学習モデルでの処理が可能
  • 類似度計算が高速
  • 次元削減による効率化
  • 転移学習に活用可能

デメリット

  • 解釈性が低い
  • 計算コストが高い
  • 文脈依存性の課題
  • バイアスの問題
  • 次元の呪い

関連Webサイト

この用語についてもっと詳しく

Embeddingに関するご質問や、システム導入のご相談など、お気軽にお問い合わせください。