大規模言語モデル (LLM) のトレーニングと検証用のデータセットを準備する
導入
言語モデル (LLM) をトレーニングするためのデータセットの生成には、言語のニュアンスを捉える有効性を確保するためのいくつかの重要な手順が含まれます。多様なテキスト ソースの選択から前処理、データセットの分割に至るまで、各段階で細部に注意を払う必要があります。さらに、モデルの学習プロセスを最適化するには、データセットのサイズと複雑さのバランスを取ることが重要です。適切に構造化されたデータセットを厳選することで、自然言語を熟練度かつ正確に理解して生成できる LLM をトレーニングするための強力な基盤を築きます。
この簡単なガイドでは、言語モデル (LLM) をトレーニングおよび検証するための分類データセットを生成する手順を説明します。ここで作成されたデータセットは小さいですが、探索とさらなる開発のための強固な基盤を築きます。
前提条件
- 基礎知識: LLM の概念とデータ前処理技術についての知識。
- データ ソース: クリーンで多様かつ関連性の高いデータセットにテキスト形式でアクセスします。
- ツールキット: Python、
pandas
、numpy
などのライブラリ、TensorFlow
やPyTorch
などのフレームワークをインストールします。code>。 - ストレージ: 大規模なデータセットを処理するための十分な計算リソース。
LLM の微調整とトレーニングのためのデータセット
いくつかのソースは、LLM の微調整とトレーニングのための優れたデータセットを提供しています。そのうちのいくつかを以下にリストします。
1.Kaggle: Kaggle は、さまざまなドメインにわたるさまざまなデータセットをホストします。テキスト分類、感情分析などを含む NLP タスク用のデータセットを見つけることができます。訪問: Kaggle データセット
2.Hugging Face データセット: Hugging Face は、自然言語処理タスク用に特別に厳選された大規模なデータセットを提供します。また、モデル トレーニング用のトランスフォーマー ライブラリとの簡単な統合も提供します。訪問: ハグ顔データセット
3.Google データセット検索: Google データセット検索は、研究者が自由に使用できるオンライン データを見つけられるように特別に設計された検索エンジンです。ここでは、言語モデリング タスク用のさまざまなデータセットを見つけることができます。アクセス: Google データセット検索
4.UCI 機械学習リポジトリ: NLP のみに焦点を当てているわけではありませんが、UCI 機械学習リポジトリには、言語モデリングや関連タスクに使用できるさまざまなデータセットが含まれています。アクセス: UCI 機械学習リポジトリ
5.GitHub: GitHub は、NLP など、さまざまな目的のデータセットを含む多数のリポジトリをホストします。特定のタスクまたはモデル アーキテクチャに関連するリポジトリを検索できます。訪問: GitHub
6.Common Crawl: Common Crawl は、Web をクロールし、そのアーカイブとデータセットを自由に一般に提供する非営利組織です。これは、言語モデリング用のテキスト データを収集するための貴重なリソースとなります。訪問: コモンクロール
7.OpenAI データセット: OpenAI は研究目的でデータセットを定期的にリリースします。これらのデータセットには、LLM のトレーニングに使用できる大規模なテキスト コーパスが含まれることがよくあります。訪問: OpenAI データセット
データセットを作成および準備するコード
この記事のコードとコンセプトは、実質的な言語モデルをゼロから構築するための包括的な洞察を提供する、Sebastian Rashka の優れたコースからインスピレーションを得ています。
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"
3.次に、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 名前: count、dtype: int64
6.パンダで関数を定義してバランスの取れたデータセットを生成しましょう。最初に「スパム」メッセージの数を数え、次に同じ数をランダムにサンプリングしてスパム インスタンスの合計数と一致させます。
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 名前: count、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 のトレーニングにおける重要な側面の 1 つは、高品質のデータセットを作成することです。これには、多様で代表的なテキスト コーパスを入手し、それらを前処理して一貫性と関連性を確保すること、そしておそらく最も重要なこととして、偏りを回避してモデルのパフォーマンスを向上させるためにバランスのとれたデータセットを厳選することが含まれます。
これで記事は終わりに達し、区切り文字で区切られたファイルから分類データセットを作成することがいかに簡単であるかがわかりました。この記事をベースとして使用し、より複雑なデータを作成することを強くお勧めします。
記事をお読みいただければ幸いです。
参考文献
- コードリファレンス