独自のテキスト埋め込みモデルをトレーニングする
sentence-transformers`ライブラリを使ってテキスト埋め込みモデルをトレーニングし、事前にトレーニングされたLLMを活用してトレーニングデータを生成する方法を探ります。
独自のテキスト埋め込みモデルのトレーニング入門
前回の投稿では、テキスト埋め込みモデルの1つであるSentence-BERTの内部構造について、そのシャムネットワークアーキテクチャと、長文テキストを高密度のベクトル埋め込みに変換することにどのように優れているかに焦点を当てながら探った。この基礎的な理解は、自然言語処理(NLP)や情報検索におけるより高度な技術への道を開くものであり、非常に重要である。
その基礎の上に立って、この投稿では、sentence-transformers ライブラリを使って、独自の変換器ベースのテキスト埋め込みモデルを学習するプロセスを案内します。このチュートリアルは、最初のセットアップから微調整の段階まで、実践的な内容になっています。私たちの目的は、あなた自身のデータコーパスを使用して、特定のニーズに合わせて細かく調整された埋め込みモデルを作成する手助けをすることです。
まず、埋め込みモデルのベースとなるコーパス、ここではMilvus documentationを選択します。Milvusのドキュメントには、価値のある埋め込みに変換できる技術情報が豊富に含まれているので、この演習には理想的です。課題は、効果的なモデル学習に不可欠な、高品質なクエリとドキュメントのペアを生成することです。
これに取り組むために、ペアの生成に役立つlarge language model (LLM) を活用する。LLMを使用して、Milvusドキュメントの内容に関連する可能性のある様々なユーザークエリをシミュレートすることである。そうすることで、各クエリが関連する文書や文章とペアになっている「ラベル付き」データセットを作成する。このデータセットは私たちの埋め込みモデルを微調整するために使用され、私たちのユースケースに最も関連する特定のタイプのクエリとドキュメントを理解し、表現する能力を向上させます。
データセットの準備ができたら、微調整のプロセスを説明します。ファインチューニングでは、事前にトレーニングされたモデルを特定のデータセット上で調整し、あなたのドメインでのパフォーマンスを向上させます。このステップは、モデルの出力をあなたのデータのユニークな特性に合わせて調整し、生成される埋め込みが非常に適切で正確であることを保証するために非常に重要です。
このチュートリアルでは、ベストプラクティス、潜在的な落とし穴、学習プロセスを最適化するためのヒントについて説明します。検索機能の向上、推薦システムの強化、より洗練されたNLPアプリケーションの開発など、独自のテキスト埋め込みモデルをトレーニングすることは、大きなメリットをもたらします。
この投稿が終わるころには、埋め込みを作成するための、あなたの特定のドメインに適した訓練された埋め込みモデルを手に入れ、将来他のプロジェクトにこれらのテクニックを適用するための知識を備えていることでしょう。さっそく、あなたのニーズに合った埋め込みモデルを作ってみましょう。
Sentence-BERT: 簡単なまとめ
BERTは、自然言語理解における重要な進歩を示し、モデルがテキストを処理し理解する方法の新しい標準を設定しました。BERT の重要な革新の 1 つは、一連の単語全体を同時に読み取ることができる双方向性です。この双方向性により、BERT は文中の先行する単語と後続する単語の両方から文脈を捉えることが可能になり、テキストを一方向に処理する以前のモデルと比較して、よりニュアンスのある言語理解につながる。
BERT モデルは、広範なトピックと言語構造をカバーする広範なテキスト・コーパスで事前訓練されている。この広範な事前訓練により、BERT は、限られたラベル付きデータであっても、さまざまな自然言語処理タスクにわたって良好な性能を発揮することができる。このモデルの膨大な事前訓練からの汎化能力は、テキスト分類、質問応答、および名前付きエンティティ認識のようなタスクに非常に効果的です。
しかし、BERTには、その多くの長所にもかかわらず、特に長文テキストを効率的にベクトル化することに関しては限界がある。BERTは、入力シーケンスの各トークンに対して埋め込みを生成し、これらのトークンレベルの埋め込みをプールして、テキスト全体を表す単一の埋め込みを作成する。このアプローチは短いテキストには有効ですが、より長く複雑なドキュメントを扱う場合には不十分な場合があります。プーリングプロセスは、個々のトークン埋込みの豊かさを薄め、テキストの意味的に意味の薄い表現につながる可能性があります。
これらの限界に対処するため、BERTの拡張としてSBERT(Sentence-BERT)が開発された。SBERTは、より意味的に豊かで意味のある埋め込みを生成することに重点を置いた、異なる学習戦略を利用する。トークン埋め込みをプールする代わりに、SBERT はシャムネットワークアーキテクチャを採用し、文章を直接比較して、文章間の意味的関係をよりよく捉えた埋め込みを生成することを可能にしている。
この学習戦略により、SBERTは、文全体や文書の意味を理解することが重要な、意味検索、クラスタリング、文の類似度のようなタスクにより適した埋め込みを生成することができる。SBERTの埋め込みは、入力テキストの文脈の豊かさを保持するように設計されており、特に長いテキストを扱う場合に、高品質のテキスト表現を必要とするアプリケーションに効果的である。
LLMを使った「ラベル付き」データセットの生成
このアプローチは、ラベル付きデータセットを生成する最も独創的な方法の1つです。さっそくコードを見てみよう。この例では、OpenAIのGPT-4を使い、他のデータセット用のスクリプトを提供します。
パイソン インポート openai インポート csv インポート re
OpenAIのAPIキーを設定する
openai.api_key = 'YOUR_API_KEY'
def generate_chatgpt_responses(prompts, max_tokens=100): data = []. for prompts in prompts: try: response = openai.ChatCompletion.create( model="gpt-4"、 messages=[{"role": "user", "content": prompt}]、 max_tokens=max_tokens ) generated_text = response['choices'][0]['message']['content']. data.append((prompt, generated_text)) except Exception as e: print(f "An error occurred with prompt '{prompt}': {e}") データを返す
def preprocess_text(text):
必要なら余分な空白と特殊文字を削除する
text = re.sub(r' \s+', ' ', text).strip() テキストを返す
def write_to_csv(data, filename="synthetic_data.csv"): with open(filename, 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['Prompt', 'Response']) for prompt, response in data: writer.writerow([prompt, preprocess_text(response)])
def main():
プロンプトの例
prompts = [ "機械学習の概念を説明せよ"、 "ロミオとジュリエットのプロットを要約せよ"、 "再生可能エネルギーの利点は何ですか?" # 必要に応じてプロンプトを追加する ]
回答を生成する
generated_data = generate_chatgpt_responses(プロンプト)
CSVに書き込む
write_to_csv(generated_data)
if name == "main": main()
このスクリプトにドキュメントのコーパスを入力して、プロンプトを取得することができる。そして、このスクリプトを使って、プロンプトとドキュメントのペアを含む大きなCSVを直接生成することができる。
## モデルの学習
では、学習用のモデルをロードしてみよう。最初のステップは前のチュートリアルと同じです:
python
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('bert-base-nli-mean-tokens')
ここで、データセット用のデータローダーを作成します。このデータローダーは sentence-transformers ライブラリが学習データとしてCSVから直接読み込むことを可能にする:
python インポート csv from torch.utils.data import DataLoader from sentence_transformers import InputExample
例題 = [] with open('your_dataset.csv', 'r') as file: reader = csv.reader(file) for row in reader: 文1, 文2, スコア = 行 examples.append(InputExample(texts=[sentence1, sentence2], label=float(score)))
train_dataloader = DataLoader(examples, batch_size=16, shuffle=True)
また、使用したい類似度メトリックを指定します。
python
from sentence_transformers import losses
train_loss = losses.CosineSimilarityLoss(モデル)
あとはモデルを保存するだけだ:
``python model.fit(train_objectives=[(train_dataloader, train_loss)]、 epochs=4、 warmup_steps=100) model.save('path/to/your-model')
このコードをまとめると、こうなる:
python
from sentence_transformers import losses
インポート csv
from torch.utils.data import DataLoader
from sentence_transformers import InputExample
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('bert-base-nli-mean-tokens')
例題 = [].
with open('your_dataset.csv', 'r') as file:
reader = csv.reader(file)
for row in reader:
文1, 文2, スコア = 行
example.append(InputExample(texts=[sentence1, sentence2], label=float(score)))
train_dataloader = DataLoader(examples, batch_size=16, shuffle=True)
train_loss = losses.CosineSimilarityLoss(モデル)
model.fit(train_objectives=[(train_dataloader, train_loss)]、
epochs=4、
warmup_steps=100)
model.save('path/to/your-model')
まとめ
この投稿では、埋め込み生成のためのsentence-transformersライブラリを使って、独自の変換器ベースのテキスト埋め込みモデルを学習しました。また、学習済みのLLMを利用して独自の学習データを生成する方法も紹介した。
次のチュートリアルでは、テキスト埋め込みを評価する様々な方法についてお話します。ご期待ください!
Frank LiuDirector of Operations & ML Architect at ZillizFrank Liu is the Director of Operations & ML Architect at Zilliz, where he serves as a maintainer for the Towhee open-source project. Prior to Zilliz, Frank co-founded Orion Innovations, an ML-powered indoor positioning startup based in Shanghai and worked as an ML engineer at Yahoo in San Francisco. In his free time, Frank enjoys playing chess, swimming, and powerlifting. Frank holds MS and BS degrees in Electrical Engineering from Stanford University.





