はじめに
近年、自然言語処理(NLP)の分野では、文書埋め込み(Document Embedding)が注目されています。特に、Sentence-BERT(SBERT) の登場により、文レベルの意味理解が大きく向上しました。本記事では、Sentence-Transformers ライブラリを中心に、文書埋め込みの基本概念、モデルの仕組み、応用例、実装方法について詳しく解説します。
文書埋め込みとは?
文書埋め込みとは、テキストを数値ベクトルに変換する手法です。これにより、機械が文書の意味を理解しやすくなり、検索・分類・クラスタリングなどの様々なタスクに活用できます。
従来の手法としては、以下のようなものがあります。
- Bag-of-Words(BoW):単語の出現回数をベクトル化
- TF-IDF:単語の重要度を考慮したベクトル化
- Word2Vec, GloVe, FastText:単語レベルの埋め込み
- Universal Sentence Encoder(USE):文レベルの埋め込み
しかし、これらの手法では文脈の違いや語順の重要性が考慮されにくいという問題がありました。
SBERT(Sentence-BERT)とは?
SBERT(Sentence-BERT)は、BERT(Bidirectional Encoder Representations from Transformers)を基盤とした文書埋め込みモデルであり、文レベルの意味理解を強化するために設計されました。
特徴
- BERTを基にした文ベクトル生成:通常のBERTでは、単語単位の埋め込みしか取得できませんが、SBERTでは文全体を表す固定長のベクトルを取得できます。
- Siamese Network構造:ペアになった文を入力し、類似度を計算することで学習を行う。
- 効率的な類似度計算:SBERTで埋め込んだベクトルは、コサイン類似度を使って簡単に比較可能。
仕組み
- 入力文のトークナイズ:SentencePieceやWordPieceを用いてトークナイズ。
- Transformerエンコーダを通過:BERTのようなモデルを通じてコンテキストを考慮した特徴量を取得。
- Pooling処理([CLS]トークンや平均プーリング):固定長の文ベクトルを生成。
- 類似度計算や分類タスクに利用。
Sentence-Transformers ライブラリ
SBERTを簡単に利用できるライブラリが Sentence-Transformers です。
インストール
pip install sentence-transformers
使い方
以下のコードで簡単に文書埋め込みを取得できます。
from sentence_transformers import SentenceTransformer
# モデルのロード
model = SentenceTransformer('all-MiniLM-L6-v2')
# 文章のリスト
sentences = [
"私は自然言語処理が好きです。",
"機械学習の応用範囲は広がっている。"
]
# 埋め込み取得
embeddings = model.encode(sentences)
# 結果表示
print(embeddings.shape) # (2, 384) -> 2つの文、それぞれ384次元のベクトル
よく使われる事前学習モデル
-
all-MiniLM-L6-v2
(軽量かつ高性能) -
paraphrase-MiniLM-L12-v2
(パラフレーズ対応) -
multi-qa-MiniLM-L6-dot-v1
(質問応答向け)
SBERTのファインチューニング
必要なライブラリのインストール
pip install torch transformers datasets sentence-transformers
データの準備
ファインチューニングには、ペアになった文とその類似度スコア(0〜1の範囲)が必要です。
from sentence_transformers import InputExample, losses
from torch.utils.data import DataLoader
train_samples = [
InputExample(texts=["この映画は最高です。", "この映画はとても良い。"], label=0.9),
InputExample(texts=["この映画は退屈だった。", "この映画は面白くなかった。"], label=0.8),
InputExample(texts=["この映画は面白い。", "今日はいい天気です。"], label=0.1)
]
train_dataloader = DataLoader(train_samples, shuffle=True, batch_size=8)
モデルの設定と学習
from sentence_transformers import SentenceTransformer, losses
model = SentenceTransformer('all-MiniLM-L6-v2')
train_loss = losses.CosineSimilarityLoss(model)
# モデルのトレーニング
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=1, warmup_steps=100)
ファインチューニング済みモデルの保存と読み込み
model.save("fine_tuned_sbert")
model = SentenceTransformer("fine_tuned_sbert")
まとめ
Sentence-Transformers(SBERT)は、文書埋め込みを高精度かつ効率的に行える強力なツールです。特に、意味的類似度の計算や自然言語処理タスクへの応用において、大きな利点を持っています。
本記事のポイント
✅ 文書埋め込みとは?
✅ SBERTの特徴と仕組み
✅ Sentence-Transformersライブラリの使用方法
✅ SBERTのファインチューニング方法
✅ 代表的な応用例(検索・クラスタリング・分類)
実際のプロジェクトに応用し、より高精度な自然言語処理を実現してみてください!