【ローカルLLM】QLoRAで「Vicuna-v1.5」の日本語翻訳性能を向上させる

  • Llama-2(13B)の日本語ファインチューンで試行錯誤している。

  • fine_tuning521k-jaなどの日本語データセットを手始めに、ShareGPTの日本語データを抽出したりしてQLoRAを試したものの、成果はイマイチで素人の限界を感じる。ColabやRunpodのGPU課金だけが積みあがってゆく…。

  • というか、自分でLlama-2を日本語ファインチューンしたモデルより「Vicuna」のほうが普通に日本語がうまい。

  • ならば、Llama-2のベースモデルをイチから日本語トレーニングするよりVicunaをファインチューンした方が話が早いのでは?と思うに至った。

  • Vicuna自体がLlamaのファインチューンモデルなので、さらにファインチューンを重ねるのがいいのかよくわかんないが…とりあえずテスト。

データセットの用意

  • ひとまず最初は、翻訳タスク(英→日)に限定して「Vicuna-13B-v1.5」をQLoRAファインチューンしてみる。

  • Alpacaデータセットと、それをGPT3.5で翻訳したJapanese_Alpacaデータセットをお借りして、即席の英→日対訳データを作成した。

  • ワード数で簡単にスクリーニングしたうえで、以下の形式でデータセットを整形。

{"text": Translate the following English text into Japanese: "An atom is made up of a nucleus, which contains protons and neutrons, surrounded by electrons that travel in orbits around the nucleus. The protons and neutrons have a positive charge, while the electrons have a negative charge, resulting in an overall neutral atom. The number of each particle determines the atomic number and the type of atom."\n日本語訳: "原子は、陽子と中性子を含む核と、核の周りを軌道を描いて移動する電子から構成されています。陽子と中性子は正の電荷を持ち、電子は負の電荷を持っており、全体としては中性の原子になります。各粒子の数が原子番号と原子の種類を決定します。"}

即席の対訳データのサンプル
  • OASST1スタイルでターゲットに指示文まで全部入れ込むのはQLoRA作者の推奨(とはいえ、今回の用途で適切なのかは分からない)。

  • 数時間でサクっと終わらせたいので、ここから1500件ほどのデータを切り出し、これを使ってVicuna-13B-v1.5をQLoRAにかけた。

パラメータと学習曲線

  • Google Colabの標準GPU(T4)+ハイメモリでトレーニングした。

  • 基本的なQLoRAハイパーパラメータは公式どおりにしたが、せっかくなので学習率は「--learning_rate 0.0001」に下げてみた。約3時間で2エポックの進捗。

  • ロス(損失)の推移はこちら:

  • 1エポック過ぎからトレーニングロスと評価ロスが乖離し、オーバーフィットっぽくなった。日和って2エポックで止めたが、もう少し回してみるべきだったか。

  • ロスの値が1を切って始まるのは最初不安だったが、データセットの種類によってはけっこうあるので最近はそこまで気にしなくなった。

  • GuanacoのQLoRAを再現したこちらの記事によれば、トレーニングロスが1を割り込んだり、評価ロスが上昇していても、実際のモデルの性能に悪影響はなかったという。結局、具体的な下流のタスクで確認しないとモデルの性能は分からないとのこと。

パフォーマンスの簡易評価

  • ということで、実際にモデルの翻訳性能に変化があったか見てみる。

  • 対訳データセットのうち、学習データに含めなかったものを10件ほどピックアップして、ファインチューンしたモデルの翻訳をテストした。

  • きちんと性能を見たいなら量子化モデルは避けるべきとは思うが、素のモデルはやはり重くて面倒…「Vicuna-13B-v1.5-GPTQ」にLoRAアダプタを付けて試す。

  • LoRAなしの「Vicuna-13B-v1.5」と、チェックポイント40のLoRA(epoch: 0.48)、80のLoRA(epoch: 0.96)、160のLoRA(epoch: 1.92)をそれぞれ適用した場合の出力を比較した。サンプリングはLLaMA-Presice。

  • ざっと見た感じ、多少は効果が出てそう。たとえば以下は、翻訳の改善がはっきり見られる例。

Translate the following English text into Japanese: 1. Research potential opportunities and carefully consider options.\n2. Ensure the new career is truly a good fit.\n3. Understand the financial and emotional implications of a career change.\n4. Spend time developing necessary skills and expertise.\n
5. Take into account any personal obligations or familial constraints that may affect your choices.
日本語訳: 

Vicuna-13B-v1.5(LoRAなし)の出力
1. 可能性を研究し、選択肢を慎重に検討する。2. 新しいキャリアが真の良いフィットであることを確認する。3. キャリアチェンジの金融的および感情的影響を理解する。4. 必要なスキルや専門知識を開発するために時間を費やす。5. 選択肢に影響を与える可能性のある個人的義務や家族的制限を考慮する。

Vicuna-13B-v1.5+翻訳LoRA(epoch: 0.96)の出力
1. 潜在的な機会を研究し、選択肢を慎重に検討する。2. 新しいキャリアが本当に自分に合っていることを確認する。3. キャリアチェンジの金融的および心理的影響を理解する。4. 必要なスキルや専門知識を開発するために時間を費やす。5. 選択肢に影響を与える可能性のある個人的な義務や家族の制限事項を考慮する。

出力例
  • もうすこし客観的に評価するため、GPT-4にLoRAなしの翻訳とLoRAありの翻訳を提示し、どちらの出力の質が高いかジャッジしてもらった。

  • GPT-4には以下のプロンプトを与え、10件の翻訳を比較評価してもらった。

これから、以下の英文の翻訳に関する評価を行っていただきます。

We can use a convolutional neural network (CNN) for classifying medical images. We can use the CNN model to extract features from each image in the dataset and then use these features to classify the images into the appropriate classes. The CNN can be trained on a variety of layers and will be able to recognize different types of features and patterns in the images. After the model is trained, it can be used to classify new medical images that have been previously unseen by the model.

それでは、上記の英文についての2パターンの日本語訳を示します。
以下の訳Aと訳Bのうち、より質が高いと思う訳はどちらか回答してください。

訳A:

医療画像を分類するために、コンボルケーショナルニューラルネットワーク(CNN)を使用できます。 CNMモデルは、データセットの各画像から特徴を抽出し、これらの特徴を使用して画像を適切なクラスに分類することができます。 CNNはさまざまなレイヤーで訓練することができ、画像内の異なる型の特徴やパターンを認識できます。 モデルが訓練された後、未見の新しい医療画像を分類することができます。

訳B:
医療画像を分類するために、コンボルチャーネットワーク(CNN)を使用できます。データセットの各画像から特徴量を抽出して、これらの特徴量を利用して画像を適切なクラスに分類することができます。CNNはさまざまなレイヤーで訓練され、異なる型の特徴やパターンを画像内で認識できるようになります。モデルがトレーニングされた後、新しい未見の医療画像を分類するために使用することができます。

GPT-4に与えたプロンプト

GPT-4による翻訳品質の判定結果

  • LoRA(epoch: 0.48):LoRA無しに対し、10問中6問で勝ち/4問で負け。

  • LoRA(epoch: 0.96):LoRA無しに対し、10問中8問で勝ち/2問で負け。

  • LoRA(epoch: 1.92):LoRA無しに対し、10問中8問で勝ち/2問で負け。

感想

  • とりあえずLoRAの効果はありそうだが、10問のテストでは少ないのでもう少しちゃんと検証したい。プロンプトフォーマットの影響も考慮すべきか。

  • 同じデータ・同じ方法でLlama-2-13Bのベースモデルもファインチューンし、Vicunaをファインチューンした場合の性能と比較したい。

  • 今回のような小規模データ(1500件)でも日本語性能を改善できるとすれば、自力のファインチューンにも希望が持てるかも。