ファインチューニングとは?仕組みや転移学習・RAGとの違いを院生が徹底解説
ChatGPTで用いられている「ファインチューニング」って知っていますか?
ファインチューニングは、ChatGPTなどのディープラーニング分野において、非常に重要な技術です。ChatGPTの開発においても、大きな役割を果たしています。
今回の記事では、ファインチューニングの概要や仕組みから、ChatGPTで使われる理由について、そして転移学習との違いについて解説していきます。
ファインチューニングとは
ファインチューニングとは、「大量のデータで事前学習されたモデル(事前学習済みモデル)に対して、解きたいタスクに応じたデータを追加で学習し、パラメータを微調整すること」を指します。
ここで、事前学習とパラメータ、ファインチューニングについて、用語を整理しましょう。
事前学習:大規模データで事前に学習した、汎用的な機械学習モデル
パラメータ:タスクを解くために調整する数値
ファインチューニング:事前学習済みモデルのパラメータを微調整する手法
ファインチューニングを行う目的は、事前学習済みモデルを、「各タスクに特化したモデル」にするためです。事前学習済みモデルは、あくまでも汎用的なモデルなので、ファインチューニングをすることで、特定のタスクにおいて精度を上げることが可能になります。
イメージは、以下の画像の通りです。
ファインチューニングがChatGPTに使われる理由
ChatGPTのファインチューニングは、モデルを特定のタスクにカスタマイズしたり、パフォーマンスを向上させるなど、さまざまな理由から行われます。例えば、ファインチューニングをすることで、カスタマーサービスやチャットボットアプリケーションなど、特定のタスク専門に仕上げることができます。
ちなみに、皆さんがChatGPTを使う際に、いつも書いている「プロンプト」ですが、このプロンプトも実はファインチューニングに非常に似ているのです。現在のChatGPTのような「GPT-3.5」や「GPT-4」の場合は、もはや数百〜数千件のデータでファインチューニングを行うことなく、プロンプトのようなたった1〜2件のデータでも、様々なタスクに対応できます。
ここで、事前学習とファインチューニング、プロンプトにおける、一般的なデータ数を比較してみましょう。
事前学習(GPT-3):570GB
ファインチューニング:数百〜数千件
プロンプト:1~2件
ファインチューニングの仕組み
ファインチューニングでは、各タスクに特化したモデルを作るために、最終層に新たな層を追加します。その後、追加した層と学習済みモデルの一部または全体を、追加で学習するのです。
ファインチューニングのイメージは、以下の画像の通りです。
また、ファインチューニングでは、解きたいタスクに応じて、データを別途で用意します。例えば、GPTやBERTの論文では、ファインチューニングによって以下のようなタスクを解いています。
要約
翻訳
質問応答
テキスト分類
さらに、自身の手元にあるデータを用いてファインチューニングすれば、ChatGPTのような大規模言語モデルも、自分好みにカスタマイズできます。
ファインチューニングのデータセットの作り方
ファインチューニングのデータセットを作成する際には、以下のようなステップを踏みます。面倒に感じるかもしれませんが、タスクに適したデータセットを用意する必要があるので、特に機械学習モデルの性能を最大限に引き出すために重要です。
目的の明確化
まず、どのようなタスクや問題を解決したいのかを明確に定義します。ファインチューニングの目的に応じて、必要なデータの種類や特徴が異なります。
データ収集
目的に合ったデータを収集します。これには、既存のデータセットを使用する、Webからのデータスクレイピング、社内のデータベースからのデータ抽出などが含まれます。重要なのは、タスクに関連性が高く、多様性を持つデータを収集することです。
データの前処理
収集したデータをモデルに適した形式に加工します。
例えばテキストデータの場合は、
トークナイズ
正規化
不要な文字の除去
などが含まれます。
画像データの場合は
サイズの統一
色の正規化
などが必要になる場合もあります。
データのラベリング
教師あり学習を行う場合は、データに適切なラベル(タグやカテゴリー)を付けます。このラベリングは、後のモデルの学習において「正解」として機能します。
データセットの分割
データセットは下記のように分割します。
訓練セット
検証セット
テストセット
一般的には、データの70-80%を「訓練用」に、残りを「検証用」と「テスト用」に分けます。
データの拡張(オプショナル)
特にデータ量が不足している場合や、モデルの汎用性を高めるために、データの拡張を行うことがあります。例えば、画像データの場合は回転や反転、テキストデータの場合は同義語の置換などが考えられます。
品質の確認
データセットの品質を確認し、必要に応じてクリーニングや再ラベリングを行います。データの品質はファインチューニングの結果に直接影響を与えるため、このステップは非常に重要です。
これらのステップを通じて、ファインチューニングのための高品質なデータセットを作成できます。データセットの作成は手間がかかるプロセスですが、モデルの性能向上には不可欠です。
具体的な方法については以下の記事が参考になるので、詳しく知りたい方は見てみてください。
なお、データセットについて知りたい方はこちらをご覧ください。
→生成AIの開発に不可欠なデータセットとは?種類や作り方、Webサイト3選をご紹介
ファインチューニングと、他の方法の違い
ファインチューニングと混同されやすい方法・モデルがあるので、解説しておきます。
ファインチューニングと転移学習の違い
事前学習済みモデルを特定タスクに適用する方法として、ファインチューニングと転移学習がよく用いられます。しかし、これら二つの手法は似て非なるものです。
まず、ファインチューニングでは、事前に訓練されたモデルの一部または全体を、新しいデータセットで追加学習します。一方で、転移学習は、訓練済みのモデルの出力層に新しい層を追加し、その層だけを新しいデータで追加学習する方法です。
主な違いは、追加学習する層と必要なデータ量です。
ファインチューニング
追加学習する層:モデル全体または一部
必要なデータ量:転移学習より多い
転移学習
追加学習する層:新たに追加された出力層のみ
必要なデータ量:少ない
これらの手法において、データ量が豊富であればファインチューニングが、データ量が少なければ転移学習が適しています。ファインチューニングと転移学習の違いについては、以下の画像が分かりやすいです。
上がファインチューニングの例で、下が転移学習の例です。
ファインチューニングでは、新たに追加した層に加えて、もともとあった層の一部も含めて、追加学習しています。一方で、転移学習では、新たに追加した層だけを追加学習し、その他の層のパラメータは全くいじらないです。
ちなみに、この転移学習のように、その他の層のパラメータを全くいじらないことを「凍結(フリーズ)」といいます。
ファインチューニングとプロンプトエンジニアリングの違い
ファインチューニングとプロンプトエンジニアリングの違いについても述べておきます。この2つは、両方とも事前学習済みのモデルを特定のタスクに適用する方法ですが、そのアプローチには大きな違いがあります。
ファインチューニングは既に述べたように、事前に訓練されたモデルの一部または全体を、新しいデータセットで追加学習する手法です。このプロセスにより、モデルは新しいタスクやデータセットの特性に合わせて調整され、パフォーマンスが向上します。
一方でプロンプトエンジニアリングは、事前学習済みモデルをそのまま使用しつつ入力となるデータ(プロンプト)を工夫することで、特定のタスクに対するモデルの反応を最適化する方法です。このアプローチではモデル自体の再学習や調整は行わず、どのように入力を構成するか(例えば、質問の仕方や情報の提示方法)に焦点を当てます。
ファインチューニング
追加学習:モデル全体または一部に行う
モデルの調整:調整することによりパフォーマンスが向上
プロンプトエンジニアリング
追加学習:行わない
モデルの調整:調整は行わず、入力の構成によりパフォーマンスを向上させる
主な違いは、ファインチューニングがモデル自体を再学習するのに対し、プロンプトエンジニアリングではモデルの再学習を行わず入力データの工夫によってモデルの出力を最適化する点にあります。
ファインチューニングは「データ量が豊富で特定のタスクにモデルを特化させたい場合」に適しているのに対し、プロンプトエンジニアリングは「追加の学習リソースや時間が限られている状況」で効果的です。
ファインチューニングとRAGの違い
ファインチューニングとRAG(Retrieval-Augmented Generation)は、両方とも機械学習モデルの訓練方法ですが、その目的とアプローチには大きな違いがあります。
ファインチューニング(Fine-tuning)は、特にニューラルネットワークモデルを特定のタスクやデータセットに適応させるために行われます。
既に事前学習を終えたモデルに特定の分野に関するデータセットを用いてチューニングし、特定のタスクに特化させる作業となります。ファインチューニングは、その特定の分野での回答精度を向上させることができます。
RAGは検索コンポーネントと生成コンポーネントを組み合わせた手法であり、質問に対する最新で詳細な回答を生成するのに役立ちます。
大規模な文書コレクションから関連する情報を検索し、その情報を元に回答を生成します。RAGは、特に大量の情報から適切な回答を生成する必要があるタスクに有効です。
RAGとファインチューニングは課題と目的が異なります。ですのでRAGはファインチューニングの代替手段ではなく、お互いが補完する関係にあります。
なお、RAGに欠かせないエンべディングについて知りたい方はこちらをご覧ください。
→エンべディングとは?ファインチューニングとの違いやメリット・デメリットを解説
ファインチューニングのメリット・デメリット
ファインチューニングを行う際のメリットとデメリットについても解説しておきます。
ファインチューニングのメリット
ファインチューニングを行うメリットは次の通りです。
独自の環境を構築できる
利用する側にとって一番のメリットは、独自の環境を構築できることです。
ファインチューニングで学習させることができるデータは様々ですので、社内データをファインチューニングさせたとします。
すると元々の会話能力を受け継ぎながら社内データについて知識を身に着けることになります。これによって社内業務用のChatGPT環境となるわけです。
回答精度が向上する
ファインチューニングすることで、既存のモデルが持っている豊富な知識を活用し、特定分野に特化したしています。その特定分野については、回答精度が大きく向上します。
プロンプトよりも多くの例文で学習しているため、モデルが理想通りに回答する能力が向上することを意味しています。
コスト削減
ファインチューニングは、特定の分野におけるタスクに対して同じモデルを使用することを可能にします。これにより、モデルの再利用性が向上し、開発時間とリソースが節約できます。
さらに、プロンプトで多くの例文を提示する必要がなくなります。結果、プロンプトの短縮によりトークン数(コスト)の節約や例文提示の手間を削減することができます。
ファインチューニングのデメリット
ファインチューニングにはデメリットも存在します。
学習に必要なデータ量と品質の要求が高い
ファインチューニングでは、モデルを特定のタスクや環境に適応させるために、大量かつ高品質の学習データが必要になります。十分な量のデータがない場合やデータの品質に問題がある場合、モデルの性能は最適なものにならない可能性があります。
過学習(オーバーフィッティング)のリスク
限られたデータセットに対してファインチューニングを行うと、モデルがその特定のデータセットに過剰に適応してしまうことがあります。これは「過学習」と呼ばれ、モデルが新しいデータや異なるタスクに対して汎化する能力が低下する原因となります。
リソースと計算コストが高い
ファインチューニングは計算資源を多く消費するプロセスです。特に大規模なモデルの場合、追加の学習には高い計算能力が必要となり、それに伴ってコストも増加します。
メンテナンスとアップデートの必要性
一度ファインチューニングされたモデルも、時間が経つと性能を低下させる可能性があります。このため、定期的なメンテナンスやアップデートが必要になり、これには追加の時間とリソースが必要です。
ファインチューニングの注意点
ファインチューニングの注意点としては以下の点が挙げられます。
適切なデータセットの準備
ファインチューニングを行う際には、タスクに適したデータセットを用意することが重要です。データセットがタスクに適していないと、モデルの性能が低下する可能性があります。
このデータセットの準備は、内容によっては非常に手間のかかるものとなってきます。学習率も適切に設定してデータセットを準備しないといけません。学習率が高すぎると過学習を起こしてしまうため、いい塩梅というものが必要となります。
コストがかかる
特筆すべき点はファインチューニングで学習させることにもお金が発生するという事です。ファインチューニングモデルは通常モデルとは異なり料金体系が違います。
1000トークン当たり学習させるのに0.008$、入力テキストに0.012$、出力テキストに0.016$発生します。学習データ量によっては高額となることを知っておいてください。
なお、ファインチューニング以外のAIを学習させる方法について詳しく知りたい方は、下記の記事を合わせてご確認ください。
→【院生が徹底解説】ChatGPTのベクトルデータベースとは?
ファインチューニングは特定タスクの効率化につながる
本記事では、ChatGPTに用いられる「ファインチューニング」について詳しく解説しました。
ファインチューニングは、大量のデータで事前学習されたモデルに対して、特定のタスクに適したデータを追加学習し、モデルのパラメータを微調整する手法です。ChatGPTにおいても、ファインチューニングは、特定のタスクにおいてパフォーマンスを向上させるために行われます。
また、ファインチューニングと転移学習との違いにも触れました。
転移学習は新しい層だけを追加学習するのに対し、ファインチューニングはモデル全体または一部を追加学習します。データ量が豊富な場合はファインチューニング、少ない場合は転移学習が適しています。