1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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

はじめに

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

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

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

前回の記事はこちら
【Fine-Tuning】Llama3を使ってモデルを作ってみた

Fine-Tuningのデータセットについて

前回は「Ichikara Instruction」というデータセットにてFine-Tuningをしてみました。

今回は別のデータセットを使ったり、学習パラメーターも変更して色んなパターンでFine-Tuningをを実施してみようと思います。

まず、こちらのデータセットを利用させていただきます。
https://huggingface.co/datasets/Aratako/Magpie-Tanuki-8B-annotated-96k?row=0
全部で96,000パターンのデータセットがバリエーションが豊富です。

パターン① データセットを減らしてエポック数(学習の回数)を2に増やす

from datasets import load_dataset

# データセットのロード
ds = load_dataset("Aratako/Magpie-Tanuki-8B-annotated-96k")

# 元のサイズを確認
print(f"元のデータセットサイズ: {len(ds['train'])}")

# データセットを3分の1に削減
reduced_size = len(ds['train']) // 3
ds["train"] = ds["train"].shuffle(seed=42).select(range(reduced_size))

# 削減後のサイズを確認
print(f"削減後のデータセットサイズ: {len(ds['train'])}")
元のデータセットサイズ: 96353
削減後のデータセットサイズ: 32117

データセット量が増えるため、学習の設定値も変更してみます。

        per_device_train_batch_size=4,#2→4に変更 学習効率を上げる
        gradient_accumulation_steps=4,#変更なし
        num_train_epochs=2,#1→2に変更
        logging_steps=20,#10→20
        warmup_steps=200,#100→200より安定した立ち上がり
        save_steps=200,#100→200
        save_total_limit=3,#チェックポイントを多く
        max_steps=-1,#変更なし
        learning_rate=1e-4,#より慎重な学習
        fp16=not is_bfloat16_supported(),#変更なし
        bf16=is_bfloat16_supported(),#変更なし
        group_by_length=True,#変更なし
        seed=3407,#変更なし

あってるのかしら。。正解がわからないので手探りです。

評価

松尾研LLM講座2024のコンペ向けにELYZA-tasks-100に改良を加えられている「ELYZA-tasks-100-TV」というベンチマークを使うため、Fine-Tuningしたモデルにて回答を生成し評価を実施します。
Gemini1.5にて1~5点で採点され、平均Scoreが算出されるようです。

前回のスコア:2.65
パターン①のスコア:2.75

ちょっと上がった!!他にもやってみよう。

パターン② データセットの量はそのままでエポック数を「1」に減らす

今度はデータセットのサイズを変更せずに、エポック数を1にして学習してみます。

from datasets import load_dataset

# データセットのロード
ds = load_dataset("Aratako/Magpie-Tanuki-8B-annotated-96k")

# サイズを確認
print(f"データセットサイズ: {len(ds['train'])}")
データセットサイズ: 96353

設定は以下でやってみます。

        per_device_train_batch_size=4,#2→4に変更 学習効率を上げる
        gradient_accumulation_steps=4,#変更なし
        num_train_epochs=1,#2→1に変更
        logging_steps=20,#変更なし
        warmup_steps=200,#変更なし
        save_steps=200,#変更なし
        save_total_limit=3,#変更なし
        max_steps=-1,#変更なし
        learning_rate=1e-4,#変更なし
        fp16=not is_bfloat16_supported(),#変更なし
        bf16=is_bfloat16_supported(),#変更なし
        group_by_length=True,#変更なし
        seed=3407,#変更なし

評価結果は・・・

2.68!
下がっとりますね。難しい!!
エポック数2にするとスコア上がるのでしょうか?学習するのにそこそこ時間がかかるためサクッと試してみるというのもなかなか難しいですね。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?