見出し画像

それなりに日本語ができるLlama-3-8Bを作る試み

前回の記事「Llama-3のファインチューニング(QLoRA)を試す」では、思ったより良い結果が得られました。
世間はgpt-4oで賑わっているところですが、さらに高い日本語能力を目指して、rinna社が公開している日本語継続事前学習モデル「llama-3-youko-8b」をベースとして使用し、最近流行りのChatVector手法と組み合わせていろいろ試してみました。


目標

今回は以下の目標を設定しました。

  • 日本語の質問に対してより自然な日本語で回答できるようにする

    • とはいえ、判断が難しい。「自然な日本語」とは…?

  • 前回の記事のモデルや他の7~8Bモデルを超えたい

    • ELYZA-tasks-100ベンチマークが指標(GPT-4o評価)

モデルの作成方法

手順は以下の通りです

  1. モデルマージ(ChatVector)

    • 日本語継続事前学習モデル「llama-3-youko-8b」をベースに、ChatVector手法を用いて「Meta-Llama-3-8B-Instruct」および、前回の記事の「Llama-3-8B-Instruct-japanese-nk2t-v0.2」の差分ベクトルをマージしました。

    • 重みの足し引きは以下の通り

      • rinna/llama-3-youko-8b + ( 0.2 * (meta-llama/Meta-Llama-3-8B-Instruct - meta-llama/Meta-Llama-3-8B) + 0.6 * (Llama-3-8B-Instruct-japanese-nk2t-v0.2 - meta-llama/Meta-Llama-3-8B) )

    • ChatVector手法は、ベースモデルと指示特化モデルの重みの差分を計算し、その差分を他のモデルに適用することで、新しいタスクやスタイルに適応した高性能なモデルを作成する技術です。この手法を用いることで、追加のファインチューニングを行わずにモデルの特性を拡張できます。
      元論文: https://arxiv.org/abs/2310.04799

  2. QLoRAによるファインチューニング

    • モデルマージだけだと同じテキストを繰り返してしまう事が多かったため、マージ後のモデルに対して更にQLoRAでファインチューニングしました。

    • 使ったツールなどは前回の記事と同じです。データは下記のリポジトリなどを参考に多少増やしました。
      https://github.com/Hajime-Y/Evol-Instruct-jp

    • ChatVectorの論文を見ると、CP→FT→CVが良い結果だったと書いてある気がするので、1と2は逆のほうが良かったのかも知れません(別途試す予定)。

ベンチマーク

ELYZA-tasks-100ベンチマークを回して、gpt4-autoeval で評価しました。

評価で使用するモデルは、gpt-4-turbo-0125だとコストが気になるため、ちょうどリリースされたgpt-4oを使用しました。
モデル自体の価格とトークナイザーの改善でかなり安く済みます。

# src/lib/common.py

def get_openai_request_body(prompt):
    """
    Prepare the request body for OpenAI API
    """
    return {
        "model": "gpt-4-1106-preview", # ここを「gpt-4o」に書き換えれば良い
        "response_format": { "type": "json_object" },
        "messages": [
            {"role": "user", "content": prompt}
        ],
        "temperature": 0,
        "frequency_penalty": 0,
        "presence_penalty": 0,
    }

また、参考として、素のLlama-3と最近話題っぽいモデルでも実行しました。
・Llama-3-70B (Groq API)
・Llama-3-8B (Groq API)
・ChatNTQ JA 7B
・ArrowPro-7B-RobbinHood

なお、私のローカル環境の都合で、今回作成したモデルも含めてGroq API以外は Q5_K_M 量子化したモデルで実行しています。

やや出来すぎな気がするので、判断が難しいですね。Llama-3が8Bなのに対して、Mistralベースのモデルは7Bなので、量子化の影響を受けやすいみたいなことがあるのかも知れません(わからない)。
今回の各モデルの回答およびGPT-4oの採点結果は、以下のzipファイル内にモデルごとにCSVで纏めてあります。


今回のモデルはHuggingFaceで公開しています。GGUF版も置いてあります。

おわりに

日本語継続事前学習モデル「llama-3-youko-8b」を公開してくださったrinna株式会社様に感謝いたします。


おまけ:出力例

※ 全てQ5_K_M量子化したモデルによるものです。

前回の記事 と同じ指示
① 

にゃあ、今日は朝からいい天気だったにゃ。散歩に行ったら新芽が出てきた木を見つけて、春だなぁと思ったにゃ。お昼ご飯は美味しい魚料理を食べられたし、大満足だにゃ。午後は本を読んでのんびり過ごしたけど、あっという間に夕方になってたにゃ。夜は友達と遊んだりして楽しかったけど、もうこんな時間だにゃ。明日も充実した一日にしないとなぁ。今日はゆっくり休んで、明日に備えようっと。にゃー。

{
    "name": [
        "ChatVRM",
        "Pixiv",
        "Koeiro API",
        "Chat Completion API",
        "OpenAI",
        "ChatGPT"
    ]
}

<tool_call>
{
    "arguments": {
        "query": "Who is the current President of the United States in 2024?"
    },
    "name": "web_search"
}
</tool_call>


ロールプレイ系

SYSTEM:
あなたはYoutubeでライブ配信や動画投稿で活動するVTuberです。

USER:
名前や設定は適当に決めて、初配信の挨拶をしてください。

ASSISTANT:
こんばんは!私は新人VTuberの「星咲ルナ」と申します。
今日からこのチャンネルで活動を始めることになりました。まだまだ未熟者ですが、一生懸命頑張りますので、どうぞよろしくお願いいたします。
初めての配信ということで、自己紹介からさせていただきますね。私は16歳の高校2年生です。好きなことは歌うこととゲームをすること、そして皆さんと楽しい時間を過ごすことです。
これから色んなことをお話ししたり、配信でいろんなことをしてみたいと思っています。みなさんにとって居心地の良い、ワクワクするようなチャンネルにしていきたいので、ぜひ一緒にお付き合いいただけると嬉しいです。
それでは今日はこの辺で終わりにしようかなと思いますが、また次回お会いできるのを楽しみにしています!今後とも星咲ルナをよろしくお願いします。バイバーイ!

創作系

SYSTEM:
あなたは小説家です。

USER:
次の文章を基にストーリーを続けてください。
『探検家は古代の遺跡を発見した…』

ASSISTANT:
探検家は古代の遺跡を発見した。
遺跡の中には、壁画や彫像が残っていた。
彼らは興奮して、これらの芸術作品を調査し始めた。

しかし、彼らが奥へ進むにつれ、不気味な雰囲気が漂い始める。
突然、暗闇に包まれ、足元から呻き声が聞こえてきた。
彼らは慌てて逃げようとしたが、出口を見つけることができない。

「これは罠だ!」探検家の一人が叫んだ。
「古代人に見つかったら殺される!」

恐怖に震えながら、彼らは様々な部屋を探索した。
しかし、どの部屋も同じように不気味で、出口には辿り着けない。

やがて彼らは一つの部屋に入った。
そこには古代人の王の像があった。
王の目は血走っており、口から悪魔のような笑い声が聞こえてきた。

「ようこそ、私の館へ…」
王はそう言いながら、一歩一歩近づいてくる。
探検家たちは絶望感に苛まれながら、その場を動くことができなかった。


この記事が気に入ったらサポートをしてみませんか?