概要
きっとほとんどの人が ChatGPT について聞いたことがあるでしょうし、質問に答えるために試したことがあると思います。 ボンネットの下で何が起こっているのか考えたことはありますか? Open AI によって開発された大規模言語モデル GPT-3 を利用しています。 LLM と呼ばれることが多いこれらの大規模な言語モデルは、さまざまな可能性を解き放ちました。 自然言語処理.
大規模言語モデルとは何ですか?
LLM モデルは大量のテキスト データでトレーニングされ、人間の言語を意味と文脈とともに理解できるようになります。 以前は、ほとんどのモデルは、入力特徴と対応するラベルをフィードする教師ありアプローチを使用してトレーニングされていました。 これとは異なり、LLM は教師なし学習を通じてトレーニングされ、ラベルや指示なしで膨大な量のテキスト データが与えられます。 したがって、LLM は言語の単語間の意味と関係を効率的に学習します。 これらは、テキストの生成、質問への回答、ある言語から別の言語への翻訳など、さまざまなタスクに使用できます。
さらに言えば、これらの大規模な言語モデルは、ドメイン固有のタスクに合わせてカスタム データセット上で微調整できます。 この記事では、微調整の必要性、使用可能なさまざまな LLM について説明し、例も示します。
LLM 微調整について理解する
あなたが糖尿病サポート コミュニティを運営しており、質問に答えるオンライン ヘルプラインを設定したいとします。 事前トレーニングされた LLM はより一般的にトレーニングされており、ドメイン固有の質問に対して最適な回答を提供したり、医療用語や頭字語を理解したりすることはできません。 これは微調整することで解決できます。
微調整とは何を意味するのでしょうか? 簡単に言うと、 Transfer
学習! 大規模な言語モデルは、大量のリソースを使用して巨大なデータセットでトレーニングされ、数百万のパラメーターを持ちます。 事前トレーニング中に LLM によって学習された表現と言語パターンは、現在のタスクに転送されます。 技術的に言えば、事前にトレーニングされた重みを使用してモデルを初期化し、タスク固有のデータでモデルをトレーニングして、よりタスクに最適化されたパラメータの重みに到達します。 必要に応じてモデルのアーキテクチャを変更したり、レイヤーを変更したりすることもできます。
モデルを微調整する必要があるのはなぜですか?
- 時間とリソースを節約します: 微調整を行うと、最初からトレーニングするよりもトレーニング時間と必要なリソースを削減できます。
- データ要件の軽減: モデルをゼロからトレーニングしたい場合は、大量のラベル付きデータが必要になりますが、個人や中小企業ではそれを利用できないことがよくあります。 微調整すると、データ量が少なくても優れたパフォーマンスを達成できます。
- ニーズに合わせてカスタマイズします。 事前トレーニングされた LLM は、ドメイン固有の用語や略語を理解できない場合があります。 たとえば、通常の LLM は「1 型」と「2 型」が糖尿病の種類を表すことを認識しませんが、微調整された LLM は認識できます。
- 継続的な学習を可能にする: 糖尿病情報データに基づいてモデルを微調整し、展開したとします。 取り入れたい新しい食事プランや治療法がある場合はどうすればよいですか? 以前に微調整したモデルの重みを使用し、新しいデータを含めるようにモデルを調整できます。 これは、組織が効率的な方法でモデルを最新の状態に保つのに役立ちます。
オープンソース LLM モデルの選択
次のステップは、タスクに合わせて大規模な言語モデルを選択することです。 どのような選択肢がありますか? 現在利用可能な最先端の大規模言語モデルには、GPT-3、Bloom、BERT、T5、XLNet などがあります。 これらの中で、GPT-3 (Generative Pretrained Transformers) は、175 億のパラメーターでトレーニングされ、多様な NLU タスクを処理できるため、最高のパフォーマンスを示しています。 ただし、GPT-3 微調整は有料サブスクリプションを介してのみアクセスでき、他のオプションに比べて比較的高価です。
一方、BERT はオープンソースの大規模言語モデルであり、無料で微調整できます。 ベルト Bi-Directional Encoder Decoder Transformers の略です。 BERT は、文脈上の単語表現を理解する上で優れた仕事をします。
どのように選ぶのですか?
タスクがテキスト生成を重視している場合は、GPT-3 (有料) または GPT-2 (オープンソース) モデルの方が適切です。 タスクがテキスト分類、質問応答、またはエンティティ認識に該当する場合は、BERT を使用できます。 糖尿病に関する質問応答の私の場合、BERT モデルを使用して進めます。
データセットの準備と前処理
データの形式はモデルやタスクによって異なるため、これは微調整の最も重要なステップです。 このケースでは、国立衛生研究所から入手した糖尿病に関する情報を含むサンプル テキスト ドキュメントを作成しました。 ウェブサイト。 独自のデータを使用できます。
BERT の質問応答タスクを微調整するには、データを SQuAD 形式に変換することをお勧めします。 SQuAD はスタンフォード質問応答データセットであり、この形式は質問応答タスクの NLP モデルのトレーニングに広く採用されています。 データは JSON 形式である必要があり、各フィールドは次のもので構成されます。
context
: モデルが質問に対する答えを検索する際に基づいてテキストを含む文または段落。question
: BERT に答えてもらいたいクエリ。 エンド ユーザーが QA モデルとどのように対話するかに基づいて、これらの質問を組み立てる必要があります。answers
: このフィールドに希望の回答を入力する必要があります。 この下には XNUMX つのサブコンポーネントがあります。text
およびanswer_start
を選択します。text
応答文字列が含まれます。 一方、answer_start
は、コンテキスト段落内で回答が始まる場所のインデックスを示します。
ご想像のとおり、ドキュメントのこのデータを手動で作成すると、非常に時間がかかります。 心配しないでください。Haystack アノテーション ツールを使用して簡単に行う方法を説明します。
Haystack を使用して SQuAD 形式のデータを作成するにはどうすればよいですか?
Haystack アノテーション ツールを使用すると、質問応答タスク用のラベル付きデータセットをすばやく作成できます。 でアカウントを作成することでツールにアクセスできます。 ウェブサイト。 新しいプロジェクトを作成し、ドキュメントをアップロードします。 「ドキュメント」タブでそれを表示し、「アクション」に移動すると、質問を作成するオプションが表示されます。 質問を書いて文書内で回答を強調表示すると、Haystack が自動的にその開始インデックスを見つけます。 以下の画像のドキュメントでそれを行った方法を示しています。
図 1: Haystack を使用した質問応答用のラベル付きデータセットの作成
微調整するのに十分な質問と回答のペアの作成が完了すると、以下に示すようにそれらの概要が表示されるはずです。 「ラベルのエクスポート」タブには、エクスポートする形式の複数のオプションがあります。今回のケースでは、分隊形式を選択します。 ツールの使用に関してさらにヘルプが必要な場合は、次のリンクを確認してください。 ドキュメント。 これで、微調整用の QA ペアを含む JSON ファイルが完成しました。
微調整するにはどうすればよいですか?
Python には、微調整に使用できるオープンソース パッケージが多数提供されています。 今回は Pytorch と Transformers パッケージを使用しました。 まず、パッケージ マネージャーである pip を使用してパッケージ モジュールをインポートします。 の transformers
ライブラリは BERTTokenizer
これは、特に BERT モデルへの入力をトークン化するためのものです。
!pip install torch
!pip install transformers import json
import torch
from transformers import BertTokenizer, BertForQuestionAnswering
from torch.utils.data import DataLoader, Dataset
ロードおよび前処理用のカスタム データセットの定義
次のステップでは、データをロードして前処理します。 使用できます Dataset
pytorchのクラス utils.data
モジュールを使用して、データセットのカスタム クラスを定義します。 カスタム データセット クラスを作成しました diabetes
以下のコードスニペットでわかるように。 の init
変数の初期化を担当します。 の file_path
JSON トレーニング ファイルのパスを入力し、初期化するために使用される引数です。 data
。 を初期化します。 BertTokenizer
ここもまた。
次に、 load_data()
関数。 この関数は、JSON ファイルを JSON データ オブジェクトに読み取り、そこからコンテキスト、質問、回答、およびそれらのインデックスを抽出します。 抽出されたフィールドをリストに追加して返します。
getitem
BERT トークナイザーを使用して、質問とコンテキストを入力テンソルにエンコードします。 input_ids
および attention_mask
を選択します。 encode_plus
テキストをトークン化し、特別なトークン ([CLS] や [SEP] など) を追加します。 を使用することに注意してください。 squeeze()
BERT に入力する前にシングルトン次元を削除する方法。 最後に、処理された入力テンソルを返します。
class diabetes(Dataset): def __init__(self, file_path): self.data = self.load_data(file_path) self.tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') def load_data(self, file_path): with open(file_path, 'r') as f: data = json.load(f) paragraphs = data['data'][0]['paragraphs'] extracted_data = [] for paragraph in paragraphs: context = paragraph['context'] for qa in paragraph['qas']: question = qa['question'] answer = qa['answers'][0]['text'] start_pos = qa['answers'][0]['answer_start'] extracted_data.append({ 'context': context, 'question': question, 'answer': answer, 'start_pos': start_pos, }) return extracted_data def __len__(self): return len(self.data) def __getitem__(self, index): example = self.data[index] question = example['question'] context = example['context'] answer = example['answer'] inputs = self.tokenizer.encode_plus(question, context, add_special_tokens=True, padding='max_length', max_length=512, truncation=True, return_tensors='pt') input_ids = inputs['input_ids'].squeeze() attention_mask = inputs['attention_mask'].squeeze() start_pos = torch.tensor(example['start_pos']) return input_ids, attention_mask, start_pos, end_pos
定義したら、次は、 file_path
それに対する反論。
file_path = 'diabetes.json'
dataset = diabetes(file_path)
モデルのトレーニング
私は使用します BertForQuestionAnswering
QA タスクに最適なモデルです。 の事前トレーニングされた重みを初期化できます。 bert-base-uncased
を呼び出してモデル化する from_pretrained
モデル上の機能。 トレーニングに使用する評価損失関数とオプティマイザーも選択する必要があります。
ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!
Adam オプティマイザーとクロスエントロピー損失関数を使用しています。 Pytorchクラスを使用できます DataLoader
データを異なるバッチでロードし、バイアスを避けるためにそれらをシャッフルします。
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = BertForQuestionAnswering.from_pretrained('bert-base-uncased')
model.to(device) optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)
loss_fn = torch.nn.CrossEntropyLoss()
batch_size = 8
num_epochs = 50 data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
データ ローダーが定義されたら、最終的なトレーニング ループの作成に進むことができます。 各反復中に、各バッチから data_loader
含まれています batch_size
順方向伝播と逆方向伝播が実行される例の数。 コードは、損失が最小限になる、パラメータの最適な重みのセットを見つけようとします。
for epoch in range(num_epochs): model.train() total_loss = 0 for batch in data_loader: input_ids = batch[0].to(device) attention_mask = batch[1].to(device) start_positions = batch[2].to(device) optimizer.zero_grad() outputs = model(input_ids, attention_mask=attention_mask, start_positions=start_positions) loss = outputs.loss loss.backward() optimizer.step() total_loss += loss.item() avg_loss = total_loss / len(data_loader) print(f"Epoch {epoch+1}/{num_epochs} - Average Loss: {avg_loss:.4f}")
これで微調整は完了です! モデルを次のように設定してテストできます。 model.eval()
。 学習率やエポック数のパラメータを微調整して、データから最良の結果を取得することもできます。
ベストなヒントと実践方法
カスタム データで大規模な言語モデルを微調整する際に注意すべき点がいくつかあります。
- データセットは、言語モデルが優れているようにしたいターゲット ドメインまたはタスクを表す必要があります。 石斑魚 そして適切に構造化されたデータが不可欠です。
- モデルがパターンを学習できるように、データ内に十分なトレーニング サンプルがあることを確認してください。 そうしないと、モデルが例を記憶し、能力が不足して過剰適合してしまう可能性があります。 一般化する 見たことのない例まで。
- 現在のタスクに関連するコーパスでトレーニングされた事前トレーニング済みモデルを選択します。 質問応答には、スタンフォード質問応答データセットでトレーニングされた事前トレーニング モデルを選択します。 これと同様に、感情分析、テキスト生成、要約、テキスト分類などのタスクに使用できるさまざまなモデルがあります。
- 意図に基づいて、適切なメッセージを適切なユーザーに適切なタイミングで 勾配累積 GPU メモリが限られている場合。 この方法では、バッチごとにモデルの重みを更新するのではなく、更新を実行する前に複数のミニバッチにわたって勾配が累積されます。
- 微調整中にオーバーフィッティングの問題に直面した場合は、次を使用します。 正則化 技術。 一般的に使用される方法には、モデル アーキテクチャへのドロップアウト レイヤーの追加、重み減衰とレイヤー正規化の実装などがあります。
まとめ
大規模な言語モデルは、多くのタスクを迅速かつ効率的に自動化するのに役立ちます。 LLM を微調整すると、転移学習の力を活用し、特定のドメインに合わせてカスタマイズすることができます。 データセットが医療、技術的ニッチ、金融データセットなどのドメインにある場合、微調整が不可欠になることがあります。
この記事では、オープンソースで個人使用に適した BERT を使用しました。 大規模なプロジェクトに取り組んでいる場合は、GPT3 などのより強力な LLM、またはその他のオープンソースの代替手段を選択できます。 大規模な言語モデルを微調整すると、計算コストと時間がかかる可能性があることに注意してください。 規模に応じて GPU や TPU などの十分な計算リソースがあることを確認してください。
- SEO を活用したコンテンツと PR 配信。 今日増幅されます。
- PlatoData.Network 垂直生成 Ai。 自分自身に力を与えましょう。 こちらからアクセスしてください。
- プラトアイストリーム。 Web3 インテリジェンス。 知識増幅。 こちらからアクセスしてください。
- プラトンESG。 自動車/EV、 カーボン、 クリーンテック、 エネルギー、 環境、 太陽、 廃棄物管理。 こちらからアクセスしてください。
- ブロックオフセット。 環境オフセット所有権の近代化。 こちらからアクセスしてください。
- 情報源: https://stackabuse.com/guide-to-fine-tuning-open-source-llms-on-custom-data/
- :持っている
- :は
- :not
- :どこ
- $UP
- 1
- 12
- 20
- 8
- a
- できる
- 私たちについて
- アクセス
- アクセス
- 累積された
- 達成する
- 行動
- 実際に
- アダム
- 追加
- 追加
- 採択
- 後
- 先んじて
- AI
- また
- 選択肢
- am
- 間で
- 量
- 金額
- an
- 分析
- および
- 別の
- 回答
- 回答
- どれか
- アプローチ
- 建築
- です
- 引数
- 記事
- AS
- At
- 試み
- 自動化する
- 自動的に
- 利用できます
- 平均
- 避ける
- ベース
- BE
- き
- 以下
- BEST
- より良いです
- の間に
- バイアス
- 10億
- ブルーム
- 国境
- ビジネス
- 焙煎が極度に未発達や過発達のコーヒーにて、クロロゲン酸の味わいへの影響は強くなり、金属を思わせる味わいと乾いたマウスフィールを感じさせます。
- by
- 呼び出し
- 缶
- 容量
- 場合
- レスリング
- 変更
- AI言語モデルを活用してコードのデバッグからデータの異常検出まで、
- チェック
- 選択
- 選択する
- class
- 分類
- コード
- 一般に
- コミュニティ
- 完了
- 結論
- からなる
- 含まれています
- コンテキスト
- 文脈上の
- 変換
- 対応する
- 作ります
- 作成した
- 作成
- Cross
- 重大な
- 電流プローブ
- 現在
- カスタム
- カスタマイズ
- データ
- データセット
- 定義済みの
- 展開
- 希望
- 発展した
- デバイス
- 糖尿病
- DID
- ダイエット
- 異なります
- 大きさ
- 異なる
- do
- ドキュメント
- ドキュメント
- ありません
- ドメイン
- ドメイン
- ドン
- 行われ
- 間に
- 各
- 簡単に
- 効率的な
- 効率良く
- ほかに
- 有効にする
- end
- 十分な
- 確保
- エンティティ
- 時代
- エポック
- 本質的な
- 評価
- さらに
- EVER
- 例
- 例
- Excel
- 優れた
- 高価な
- export
- エキス
- 顔
- フォールズ
- 特徴
- FRBは
- フィールド
- フィールズ
- File
- ファイナル
- 最後に
- ファイナンシャル
- もう完成させ、ワークスペースに掲示しましたか?
- フォーカス
- 形式でアーカイブしたプロジェクトを保存します.
- フォワード
- FRAME
- 無料版
- から
- function
- 一般に
- 世代
- 生々しい
- Gitの
- Go
- 良い
- GPU
- GPU
- 勾配
- ガイド
- ハンド
- ハンドル
- 実践的な
- 起こります
- 持ってる
- 健康
- 聞いた
- ヘビー
- 助けます
- それゆえ
- こちら
- 特徴
- フード
- ホバー
- 認定条件
- How To
- HTTPS
- 巨大な
- 人間
- 巨大な
- i
- if
- 画像
- 絵
- 実装
- インポート
- in
- include
- 含まれました
- 含めて
- index
- 個人
- 情報
- 入力
- install
- 説明書
- 対話
- に
- 概要
- IT
- 繰り返し
- ジョブ
- JSON
- キープ
- ラベル
- 言語
- 大
- 大規模
- 層
- 層
- LEARN
- 学んだ
- 学習
- う
- 活用します
- LG
- 図書館
- ような
- 限定的
- リスト
- ll
- LLM
- 負荷
- ローダ
- ローディング
- 損失
- たくさん
- make
- マネージャー
- 方法
- 手動で
- 多くの
- 大規模な
- 五月..
- 意味する
- 意味
- 医療の
- メモリ
- 方法
- メソッド
- かもしれない
- 何百万
- 最小限の
- モデル
- 修正する
- モジュール
- モジュール
- 他には?
- 最も
- ずっと
- の試合に
- my
- 国民
- 必要
- 必要とされる
- ニーズ
- 新作
- 次の
- NIHの
- NLP
- いいえ
- 通常の
- 今
- 数
- オブジェクト
- 入手する
- 得
- of
- オファー
- 頻繁に
- on
- ONE
- オンライン
- の
- 開いた
- オープンソース
- オプション
- オプション
- or
- 組織
- その他
- 私たちの
- でる
- が
- 自分の
- パッケージ
- パッケージ
- 支払われた
- 足
- パラメータ
- 特定の
- 通過
- path
- パターン
- 以下のために
- パフォーマンス
- 実行
- 実行
- 個人的な
- 計画
- プラトン
- プラトンデータインテリジェンス
- プラトデータ
- ポイント
- の可能性
- 電力
- パワード
- 強力な
- 実用的
- 前に
- 問題
- 処理済み
- プロジェクト
- 提供します
- は、大阪で
- パイトーチ
- 質問と回答
- 質問
- 質問
- クイック
- すぐに
- レート
- むしろ
- リーチ
- 読む
- 認識
- 認識する
- 推奨される
- 減らします
- 言及
- の関係
- 相対的に
- 関連した
- 覚えています
- 削除します
- 表す
- 要件
- リソース
- 責任
- 結果
- 収益
- リング
- ラン
- s
- 言う
- 規模
- スクラッチ
- を検索
- 自己
- 文
- 感情
- セッションに
- 設定
- Shadow
- シート
- すべき
- 表示する
- 示す
- シャッフル
- 意味する
- 同様の
- 小さい
- 中小企業
- より小さい
- 一部
- ソース
- 特別
- 特定の
- 特に
- スタックアバス
- 規格
- スタンド
- スタンフォード
- start
- 起動
- 最先端の
- 手順
- Force Stop
- 文字列
- 購読
- そのような
- 十分な
- 概要
- サポート
- 確か
- 取る
- Talk
- ターゲット
- 仕事
- タスク
- 技術的
- 用語
- 条件
- test
- テキスト分類
- より
- それ
- アプリ環境に合わせて
- それら
- その後
- そこ。
- ボーマン
- 彼ら
- この
- 介して
- 時間
- 時間がかかる
- ヒント
- 〜へ
- トークン化する
- トークン化
- トークン
- ツール
- top
- トーチ
- に向かって
- トレーニング
- 訓練された
- トレーニング
- 転送
- 転送
- トランスフォーマー
- 遷移
- インタビュー
- 治療
- 試み
- 2
- type
- 下
- わかる
- 理解する
- 異なり、
- 最新
- アップデイト
- 更新
- つかいます
- 中古
- ユーザー
- 使用されます
- 多様
- 詳しく見る
- 欲しいです
- we
- 重量
- WELL
- した
- この試験は
- 一方
- which
- while
- ワイド
- 広く
- 意志
- 無し
- Word
- 言葉
- ワーキング
- 作品
- 不安
- でしょう
- とんでもない
- 書きます
- You
- あなたの
- ゼファーネット