Hugging Face Sentence Transformers トレーニングガイド(歴史的リファレンス)
TL;DR
Hugging Face は、Sentence Transformers モデルの構築、トレーニング、ファインチューニングの手順を解説した歴史的ガイドを公開しました。このガイドではアーキテクチャ、データセットの準備、損失関数の選択、モデルの公開について取り上げていますが、記載されている SentenceTransformer.fit API が廃止されていることに注意し、読者には新しい SentenceTransformerTrainer ベースのガイドを参照するよう案内しています。
ガイドの概要
このチュートリアルは参照用に残されているだけで、ゼロから Sentence Transformers モデルを作成する方法や既存モデルをファインチューニングする方法、トレーニングデータのフォーマット方法、各フォーマットに対応する損失関数、そして生成されたモデルを Hugging Face Hub にプッシュする手順を説明しています。
Note: ガイドは pre‑v3.0 の
SentenceTransformer.fitAPI を使用していますが、これはSentenceTransformerTrainerに置き換えられました。現在のトレーニング手順は以下の最新記事で文書化されています:
- 埋め込みモデル – Sentence Transformers を用いた埋め込みモデルのトレーニングとファインチューニング
- リランカーモデル – Sentence Transformers を用いたリランカーモデルのトレーニングとファインチューニング
- スパース埋め込みモデル – Sentence Transformers を用いたスパース埋め込みモデルのトレーニングとファインチューニング
- マルチモーダルモデル – Sentence Transformers を用いたマルチモーダル埋め込み & リランカーモデルのトレーニングとファインチューニング
Sentence Transformers モデルの仕組み
Sentence Transformers は、可変長のテキスト(または画像)を、意味的な意味を捉える固定サイズの埋め込みベクトルに変換します。
- Transformer 層 – 入力テキストは事前学習済み Transformer(例:
distilroberta-base)で処理され、モデルは文脈化されたトークン埋め込みを出力します。 - Pooling 層 – トークン埋め込みは(例: 平均プーリング)集約され、単一の文レベルベクトルになります。
from sentence_transformers import SentenceTransformer, models
# Layer 1: pre‑trained transformer
word_embedding_model = models.Transformer('distilroberta-base')
# Layer 2: pooling to a fixed‑size vector
pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension())
# Assemble the modules
model = SentenceTransformer(modules=[word_embedding_model, pooling_model])
モデルはモジュールのシーケンシャルなリストであり、必要に応じて追加の層(全結合、畳み込みなど)を挿入できます。
なぜバニラ Transformer を文埋め込みに使用しないのか?
- 生の BERT モデルで 10,000 文に対するセマンティック検索を行う推論は約 5,000 万回の演算(約 65 時間)を要しますが、Sentence Transformer を使用すると約 5 秒に削減できます。
- BERT のトークン埋め込みを単純に平均するだけでは、従来の GloVe 埋め込みに比べて劣った文表現になります。
データセットの準備
トレーニングには、2 文が類似しているか非類似かというシグナルが必要です。ガイドでは、4 つの一般的なデータセット構造を示しています。
| ケース | フォーマット | 典型的なソース | 推奨ロス |
|---|---|---|---|
| 1 | (sentence_a, sentence_b, similarity_label) – ラベルは整数または浮動小数点になる可能性があります |
自然言語推論 (NLI) データセット | ContrastiveLoss, SoftmaxLoss, CosineSimilarityLoss |
| 2 | (sentence_a, sentence_b) – 正例ペアで、明示的なラベルはなし |
パラフレーズ、要約、重複質問ペア | MultipleNegativesRankingLoss, MegaBatchMarginLoss |
| 3 | (sentence, class_id) – 整数のクラスラベル |
トピック分類データセット(例: TREC) | クラス ID を使用するトリプレットベースのロス(BatchHardTripletLoss など) |
| 4 | (anchor, positive, negative) – 明示的なトリプレットで、クラス ID はなし |
事前構築されたトリプレットデータセット(例: Quora Triplets) | TripletLoss |
チュートリアルでは embedding-data/QQP_triplets データセットを使用してケース 4 を示しています。datasets.load_dataset でデータセットをロードし、構造を確認し、各サンプルを sentence_transformers.InputExample に変換する方法を示します。
from datasets import load_dataset
from sentence_transformers import InputExample
dataset = load_dataset('embedding-data/QQP_triplets')
train_examples = []
train_data = dataset['train']['set']
for i in range(dataset['train'].num_rows // 2): # use half the data for speed
ex = train_data[i]
train_examples.append(
InputExample(texts=[ex['query'], ex['pos'][0], ex['neg'][0]])
)
その後、例はバッチ化のために torch.utils.data.DataLoader でラップされます。
from torch.utils.data import DataLoader
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
ロス関数の選択
ロスはデータセットのフォーマットに合わせる必要があります:
- ケース 1 –
ContrastiveLoss(整数ラベル)またはCosineSimilarityLoss(浮動小数点ラベル)を使用します。 - ケース 2 –
MultipleNegativesRankingLoss(最も一般的)またはMegaBatchMarginLossを使用します。 - ケース 3 – クラス ID に依存するトリプレットベースのロス(例:
BatchHardTripletLoss)を使用します。 - ケース 4 – クラスラベルを必要としない
TripletLossを使用します。
ロスをインスタンス化するコードは非常にシンプルです:
from sentence_transformers import losses
train_loss = losses.TripletLoss(model=model)
モデルのトレーニング / ファインチューニング
DataLoader とロスの準備ができたら、トレーニングは単一の fit 呼び出しで実行されます:
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=10)
既存のモデル(例: sentence-transformers/all-MiniLM-L6-v2)をファインチューニングする場合は、SentenceTransformer(model_id) でロードし、直接 fit を呼び出します。
モデルを Hub に公開する
トレーニング後、モデルを Hugging Face Hub にプッシュします:
from huggingface_hub import notebook_login
notebook_login() # or `huggingface-cli login` in a terminal
model.save_to_hub(
"distilroberta-base-sentence-transformer",
organization="<your‑username-or‑org>",
train_datasets=["embedding-data/QQP_triplets"]
)
save_to_hub は自動的にモデルカード、推論ウィジェット、サンプルコードを作成します。
Sentence Transformers の制限
Sentence Transformers はセマンティック検索や類似度タスクに優れていますが、純粋な分類問題には不向きです。分類には、標準の 🤗 Transformers ライブラリ(例: シーケンス分類パイプライン)を使用すべきです。
追加リソース
- Embeddings 入門 – 埋め込みの入門ガイド。
- セマンティック検索の理解 – セマンティック検索の詳細解説。
- 初めての Sentence Transformers モデル – ステップバイステップの初心者向けチュートリアル。
- プレイリストジェネレータ – Sentence Transformers の応用例。
- Hugging Face + Sentence Transformers ドキュメント – 包括的な API リファレンス。
このガイドは歴史的参照用に残されているだけです。実運用向けのワークフローには SentenceTransformerTrainer を使用した新しいトレーニングガイドを参照してください。