【Fine-Tuning】Llama3を使ってモデルを作ってみた

どうも。@TM_AIbuchoことおっさんです。
SES企業の社長が開発経験ゼロからAIを学習しています。
是非とも暖かく、時には厳しく見守っていただけると嬉しいです。

# はじめに

松尾研LLM講座2024を受講させていただいています。
2024年12月上旬現在、最終課題であるコンペが開催されています。

備忘録も兼ねて記事を作成してみたいと思います。
実際の作業は運営の方々から展開頂いているサンプルコードをもとに実装しています。（とても有り難い）
ここでは**コードを記載していません**ので、ご了承ください。

今回はいま実施中のLLMのSupervised Fine-Tuning（教師あり学習）について記載してきます。
Pre-Traning（事前学習）、RLHF（強化学習）については別途作成予定。

# モデルとは

### 生成AIのモデルについて
生成AIの中核となる、大規模言語モデル（LLM）や画像生成モデルなどの総称です。大量のデータで学習され、テキスト生成や画像生成などの機能を持つAIの基盤となるものです。

### 非公開モデル
- 研究機関や企業が独自に開発したモデル
- 一般に公開されておらず、組織内でのみ使用
- 例：企業の研究開発部門で使用される実験的なモデル、大学の研究室で開発中のモデルなど

### クローズドモデル
- API経由やアプリケーション経由でのみ利用可能
- ソースコードやモデルの重みは非公開
- 例：ChatGPTで使用されるOpenAIのGPT、Google社のGemini、AnthoropicのClaude など
- 通常は有料サービスとして提供

### オープンモデル
- モデルの重みやソースコードが公開されている
- 誰でもダウンロードしてローカル環境で使用可能
- 例：Meta AI のLlama、Google のGemma、Mistral AI のMistral
- 独自のファインチューニングや改良が可能

# FineTuning（ファインチューニング）

FineTuningは、事前学習済みの大規模言語モデル（LLM）を特定のタスクや用途に適応させるための手法です。

主な特徴：
- 元となる事前学習済みモデルのパラメータ全体を、新しいデータセットで再学習
- 高い適応性と性能が期待できる

使用例：
- 特定の業界用語や専門用語の理解向上
- 企業固有のトーンや文体への適応
- 特定のタスク（翻訳、要約など）の性能改善

# Instruction Tuning（インストラクションチューニング）

Instruction Tuningは、モデルに特定の指示（instruction）に従って適切な応答を生成させるため、入力と出力をひとつのデータセットとして教師あり学習をするファインチューニング手法です。

主な特徴：
- 指示-応答のペアデータを使用して学習
- タスクの説明を自然言語で与えられるように訓練  
- より柔軟で汎用的なタスク遂行能力を獲得
- モデルの使いやすさが向上

学習データの例：
```
指示：「この文章を要約してください」
入力：[長い文章]
出力：[要約された文章]
```

# PEFT (Parameter-Efficient Fine-Tuning)


PEFTは、限られた計算リソースで効率的にモデルを適応させるための手法群です。

主な手法：

1. LoRA (Low-Rank Adaptation)
- 低ランク行列を使用して効率的にパラメータを更新
- 元のモデルパラメータは凍結したまま
- メモリ効率が非常に高い

2. Prefix Tuning
- 入力の前にチューニング可能なプレフィックスを追加
- タスク特有の情報をプレフィックスで表現

3. Prompt Tuning
- ソフトプロンプトを学習させる手法
- 少ないパラメータで効率的な適応が可能

PEFTの利点：
- 少ないメモリ消費
- 高速な学習
- 元のモデルを保持したまま適応可能
- 複数のタスク用のチューニングを容易に切り替え可能

# Llama3をベースとしたFine-Tuning

オープンモデルであるLlama3の13B(130億パラメータ)のモデルを使ってFine-Tuningを実施していきます。
予めHuggingFaceにてアカウント登録、書込み権限付きのトークンを取得（無料）しておく必要があります。
今回はGoogleColab上でモデルの学習を実施します。

[llm-jp/llm-jp-3-13b](https://huggingface.co/llm-jp/llm-jp-3-1.8b)
こちらのモデルを4bitに圧縮・量子化しqLoRAにて調整していきます。

qLoRAの説明をします。

qLoRA (Quantized Low-Rank Adaptation) は、大規模言語モデルを効率的にファインチューニングするための手法です。主な特徴は以下の通りです：

:::note info
qLoRA：
- モデルの大部分を4ビットに量子化（データ圧縮）
- LoRA（Low-Rank Adaptation）の手法を組み合わせて使用
- 学習可能なパラメータを大幅に削減

主なメリット：
1. メモリ使用量の大幅削減
   - 通常のファインチューニングと比べて最大で75%のメモリ削減
   - 家庭用GPUでも大規模モデルの学習が可能に

2. 学習効率の向上
   - フルパラメータの学習と同等の性能を維持
   - 学習時間の短縮が可能

3. 柔軟な適用
   - 様々なサイズのモデルに適用可能
   - 異なるタスクに対して効果的
:::


松尾研LLM講座、運営の方々から配布頂いたサンプルコードに沿ってLLM-jpの公開している「Ichikara Instruction」というデータセットで学習していきます。
データアクセスには以下サイトから申請が必要です。

https://liat-aip.sakura.ne.jp/wp/llmのための日本語インストラクションデータ作成/llmのための日本語インストラクションデータ-公開/

データセットから「指示」「回答」というプロンプトフォーマットを整形して、SFT（Supervised-Fine-Tuning）を実施します。

学習時の設定はサンプルコードを流用させていただきます。

### SFT時の設定値例
- per_device_train_batch_size(トレーニングバッチサイズ):2
- gradient_accumulation_steps(勾配を更新する前にステップを積み重ねる回数):4
- num_train_epochs(エポック数):1
- logging_steps(ログを出力するステップ間隔):10
- warmup_steps(学習率のウォームアップステップ数):10
- save_steps(モデルを保存するステップ間隔):100
- save_total_limit(保存しておくcheckpointの数):2
- max_steps(トレーニングの最大ステップ数):1
- learning_rate(学習率):2e-4

学習を開始。
FTが完了したLoRAはHuggingFaceに登録されます。
https://huggingface.co/ACRMiyamoto/llm-jp-3-13b-it_lora

# モデルの評価

生成AIのベンチマークとは、AIモデルの性能を客観的に評価・比較するための標準化されたテストのことです。主な評価ポイントとしては：

1. 言語理解力：文章の意味や文脈を正確に理解できているか
2. 生成品質：自然で coherent な文章を生成できるか
3. 推論能力：与えられた情報から論理的な結論を導き出せるか
4. タスク遂行能力：特定のタスク（要約、翻訳など）をどれだけ正確に実行できるか

代表的なベンチマークには以下のようなものがあります：

- MMLU (Massive Multitask Language Understanding)：医学、法律、歴史など様々な分野の知識を問うテスト
- BIG-bench：数百の異なるタスクを含む包括的なベンチマーク
- HELM：公平性やバイアスなども含めた多角的な評価を行うフレームワーク

ELYZA-tasks-100は、日本のAI企業ELYZAが開発した日本語言語モデル評価用のベンチマークです。主な特徴は：

1. 日本語に特化：日本語の特性や文化的文脈を考慮したタスク設計
2. 多様なタスク：100種類の異なるタスクを収録
3. 実践的な評価：実世界で必要とされる能力を測定
4. オープンソース：誰でも利用可能で透明性が高い

タスクの例：
- 文章要約
- 日本語文法の理解
- ビジネス文書の作成
- 日本の文化や慣習に関する質問
- 論理的推論問題

このベンチマークの重要性は、特に日本語モデルの評価において、より正確で文化的な文脈を考慮した評価が可能になる点にあります。

今回、松尾研LLM講座2024のコンペ向けに上記に改良を加えた「ELYZA-tasks-100-TV」というベンチマークが用意されています。そちらのベンチマークにて性能を評価します。

```JSON
{"task_id": 0, "input": "野球選手が今シーズン活躍するために取り組むべき5つのことを教えてください。"}
```

こういった質問が100個用意されており、開発したモデルで推論していきます。
推論結果はGemini1.5にて1～5点で採点され、平均Scoreが算出されるようです。

ちなみに初回のスコアは2.65でした。
今回はサンプルコードをベースにFine-Tuningを実行してみましたが、試行錯誤して高得点を目指していきます！