大規模言語モデル(LLM)のトレーニングと検証のためのデータセットを準備する
紹介
言語モデル(LLM)を訓練するためのデータセットを生成することは、言語のニュアンスを捉えるための有効性を確保するためにいくつかの重要なステップを含んでいます。多様なテキストソースの選定から前処理、データセットの分割に至るまで、各段階は細部に注意を払う必要があります。さらに、モデルの学習プロセスを最適化するために、データセットのサイズと複雑さのバランスを取ることが重要です。構造化されたデータセットをキュレーションすることで、自然言語を理解し、生成する能力を持つLLMを訓練するための強固な基盤を築くことができます。
この簡単なガイドでは、言語モデル(LLM)をトレーニングおよび検証するための分類データセットを生成する方法を説明します。ここで作成されるデータセットは小さいですが、探求とさらなる開発のための基盤をしっかりと築いています。
前提条件
- 基本知識: LLMの概念やデータ前処理技術に関する理解。
- データソース: テキスト形式でのクリーンで多様かつ関連性のあるデータセットへのアクセス。
- ツールキット: Python、
pandas、numpyなどのライブラリ、TensorFlowやPyTorchなどのフレームワークをインストールします。 - ストレージ: 大規模データセットを扱うための十分な計算資源。
LLMの微調整とトレーニングのためのデータセット
いくつかの情報源は、あなたのLLM(大規模言語モデル)の微調整と訓練に役立つ素晴らしいデータセットを提供しています。そのいくつかを以下に示します:-
1. Kaggle: Kaggleはさまざまな分野のさまざまなデータセットをホストしています。テキスト分類、感情分析などのNLPタスク用のデータセットを見つけることができます。訪問: Kaggleデータセット
2.ハギングフェイスのデータセット:ハギングフェイスは、自然言語処理タスクのために特別にキュレーションされた大規模なデータセットを提供しています。また、モデルのトレーニングのために彼らのトランスフォーマーライブラリとの簡単な統合も提供しています。訪問先:ハギングフェイスのデータセット
3. Google Dataset Search: Google Dataset Searchは、研究者が自由に使用できるオンラインデータを見つけるために特別に設計された検索エンジンです。ここでは、言語モデルタスクのためのさまざまなデータセットを見つけることができます。訪問してください: Google Dataset Search
4. UCI機械学習リポジトリ:NLPに特化しているわけではありませんが、UCI機械学習リポジトリには言語モデル作成や関連作業に使用できるさまざまなデータセットが含まれています。訪問先:UCI機械学習リポジトリ
5. GitHub: GitHubは、NLPを含むさまざまな目的のためのデータセットを含む多数のリポジトリをホストしています。あなたの特定のタスクやモデルアーキテクチャに関連するリポジトリを検索できます。訪問: GitHub
6.コモン・クロール:コモン・クロールは、ウェブをクロールし、そのアーカイブとデータセットを一般に無償で提供する非営利団体です。言語モデルのためのテキストデータを収集するための貴重なリソースとなります。訪問先:コモン・クロール
7. OpenAI データセット: OpenAI は定期的に研究目的でデータセットを公開しています。これらのデータセットには、LLM のトレーニングに使用できる大規模なテキストコーパスが含まれています。訪問先: OpenAI データセット
データセットを作成し準備するためのコード
この記事のコードと概念は、セバスチャン・ラシュカの優れたコースに触発されており、そのコースは、ゼロから大規模な言語モデルを構築するための包括的な洞察を提供しています。
1. 必要なパッケージのインストールから始めます。
import pandas as pd #for data processing, manipulation
import urllib.request #for downloading files from URLs zip file
import zipfile #to deal with zip file
import os #for dealing with the OS
from pathlib import Path #for working with file paths
2.以下のコード行は、生のデータセットを取得し、抽出するのに役立ちます。
getting the zip file from the url
url = "https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip"
data_zip_path = "sms_spam_collection.zip"
data_extracted_path = "sms_spam_collection"
data_file_path = Path(data_extracted_path) / "SMSSpamCollection.tsv"
次に、URLを開くためとローカルファイルを開くために、「with」ステートメントを使用します。
Downloading the file
with urllib.request.urlopen(url) as response:
with open(data_zip_path, "wb") as out_file:
out_file.write(response.read())
Unzipping the file
with zipfile.ZipFile(data_zip_path, "r") as zip_ref:
zip_ref.extractall(data_extracted_path)
4.以下のコードは、ダウンロードされたファイルが「.tsv」ファイルとして正しく名前変更されることを保証します。
Add .tsv file extension
original_file_path = Path(data_extracted_path) / "SMSSpamCollection"
os.rename(original_file_path, data_file_path)
print(f"File downloaded and saved as {data_file_path}")
このコードを成功裏に実行した後、“ファイルはダウンロードされ、sms_spam_collection/SMSSpamCollection.tsv として保存されました”というメッセージが表示されます。
5. pandasライブラリを使用して保存されたデータセットを読み込み、データをさらに探索します。
raw_text_df = pd.read_csv(data_file_path, sep="\t", header=None, names=["Label", "Text"])
raw_text_df.head()
print(raw_text_df["Label"].value_counts())
ラベル ハム 4825 スパム 747 名前: カウント, dtype: int64
6.バランスの取れたデータセットを生成するために、pandasを使用して関数を定義しましょう。最初に「スパム」メッセージの数をカウントし、その後、スパムのインスタンスの総数に合わせるために同じ数をランダムにサンプリングします。
def create_balanced_dataset(df):
# Count the instances of "spam"
num_spam_inst = raw_text_df[raw_text_df["Label"] == "spam"].shape[0]
# Randomly sample "ham' instances to match the number of 'spam' instances
ham_subset_df = raw_text_df[raw_text_df["Label"] == "ham"].sample(num_spam, random_state=123)
# Combine ham "subset" with "spam"
balanced_df = pd.concat([ham_subset_df, raw_text_df[raw_text_df["Label"] == "spam"]])
return balanced_df
balanced_df = create_balanced_dataset(raw_text_df)
‘スパム’と‘ハム’のカウントを確認するためにvalue_countを実行しましょう。
print(balanced_df["Label"].value_counts())
ラベル ハム 747 スパム 747 名前: カウント、dtype: int64
データフレームが現在バランスが取れていることがわかります。
#change the 'label' data to integer class
balanced_df['Label']= balanced_df['Label'].map({"ham":1, "spam":0})
7.Netでは、データセットをトレーニング、テスト、バリデーション用にランダムに分割する関数を作成します。
def random_split(df, train_frac, valid_frac):
df = df.sample(frac = 1, random_state = 123).reset_index(drop=True)
train_end = int(len(df) * train_frac)
valid_end = train_end + int(len(df) * valid_frac)
train_df = df[:train_end]
valid_df = df[train_end:valid_end]
test_df = df[valid_end:]
return train_df,valid_df,test_df
train_df, valid_df, test_df = random_split(balanced_df, 0.7, 0.1)
次にデータセットをローカルに保存します。
train_df.to_csv("train_df.csv", index=None)
valid_df.to_csv("valid_df.csv", index=None)
test_df.to_csv("test_df.csv", index=None)
結論
大規模言語モデル(LLM)を構築することは非常に複雑です。しかし、常に進化するAIの分野と新しい技術の登場により、事態はよりシンプルになっています。堅牢なアルゴリズムで基盤を整えるところから、ハイパーパラメータの微調整、膨大なデータセットの管理に至るまで、各ステップは人間のようなテキストを理解し生成できるモデルを作成する上で重要です。
LLMのトレーニングにおける重要な側面の一つは、高品質のデータセットを作成することです。これには、多様で代表的なテキストコーパスを収集し、一貫性と関連性を確保するために前処理を行い、そしておそらく最も重要なこととして、バランスの取れたデータセットをキュレーションして偏りを避け、モデルの性能を向上させることが含まれます。
これで記事の最後に来ましたが、区切られたファイルから分類データセットを作成するのがいかに簡単であるかを理解しました。このアーティクルを基にして、より複雑なデータを作成することを強くお勧めします。
この記事をお読みいただき、楽しんでいただけたことを願っています!
参考文献
- コード参照
