見出し画像

手元で動く軽量の大規模言語モデルを日本語でファインチューニングしてみました(Alpaca-LoRA)

イントロ

最近、ChatGPTやGPT-4などの大規模言語モデル(LLM)が急速に注目を集めています。要約タスクや質疑応答タスクなど様々なタスクで高い性能を発揮しています。これらのモデルはビジネス分野での応用が非常に期待されており、GoogleやMicrosoftが自社サービスとの連携を進めているという報道も相次いでいます。

今回は、手元で動作する軽量な大規模言語モデル「Alpaca-LoRA」を日本語にファインチューニングしてみました。この記事では、そのファインチューニングのプロセスや応用例について簡単に解説していきます。ChatGPTやGPT-4は、モデルがブラックボックスでありAPI経由でしか入力を与えて出力を得ることができません。さらに、現時点(2023年3月20日)では、独自のデータを用いてファインチューニングを行うこともできません。

しかし、Alpaca-LoRAというモデルを用いることで、手元で独自のデータを使って日本語のファインチューニングが可能になります。Google Colabを使うことで、コストを抑えて、数時間でのファインチューニングが可能です。これにより、より柔軟な応用が期待できます。今回の検証に使ったコードとファインチューニングの元にしたデータは公開しています。今回の記事が少しでも参考になれば幸いです。(※この記事では、ファインチューニングをとりあえずやってみたらどうなるか程度の検証しかしていないので、ご容赦ください。)

以前こちらの記事を書いたときには、

自社データを組み込む方法として、

  • 学習段階から、自社データを学習データに入れておく

  • 学習済みのモデルに、自社データを入れてファインチューニングする

  • プロンプトに、自社データをコンテキストとして、入力する

の3種類があることを説明して、3番目のプロンプトに組み込む方法を紹介しました。この記事では、2番目のファインチューニングの方法と活用可能性の紹介になります。

Alpaca-LoRAとは

Alpaca-LoRAは、Alpacaというモデルをlow-rank adaptation(LoRA)という軽量な手法で再現したものになります。

Alpacaは、フェイスブックが公開しているLLaMAというモデルをスタンフォード大学がファインチューニングしたものになります。Alpaca 7Bモデルでは、70億のパラメータを持っていますが、GPT3(text-davinci-003, ChatGPTの前のモデル, 1750億のパラメータ)と同程度の性能を持つと言われています。ファインチューニングには、5.2万件のデータを使って、Self-Instructという方法でチューニングしています。今回の検証では、この5.2万件のデータを日本語に翻訳したものを使いました。(Alpacaの詳細はこちらの記事が詳しいです。)

low-rank adaptation(LoRA)とは、Microsoftが提案した手法で、パラメータを10000分の1、GPUメモリ要件を3分の1に削減できます。(手法の詳細は、LINE社のインターン生が書いたこちらの記事が詳しいです。)

Alpaca-LoRAは、Alpacaというモデルをlow-rank adaptation(LoRA)という軽量な手法で再現したもので、MacBookやGoogle Colab、Raspberry Piでも動かすことができます。この技術が発展していけば、スマホや街中のあらゆる端末に大規模言語モデルが組み込まれる世界が、思った以上に早くやってくるかもしれません。

さて、Alpaca-LoRAを実際に使ってみると、日本語入力に対して、英語で出力されることが分かります。

入力:日本の首都はどこですか?
出力:The capital of Japan is Tokyo.

入力:大阪のオススメの食べ物を教えて
出力:Osaka's favorite foods include takoyaki, okonomiyaki, kushikatsu, and yakitori.

Alpaca-LoRAの出力例

出力は英語になっていますが、意味が通る回答になっています。

今回は、5.2万件の日本語のデータを使って、出力が日本語になるようにファインチューニングしてみます。

日本語データ

今回ファインチューニングに用いるデータは、スタンフォード大学がAlpacaを作るときに利用した5.2万件のデータを日本語に翻訳したものです。データは次のようなものです。

"instruction": "What are the three primary colors?",
"input": "",
"output": "The three primary colors are red, blue, and yellow."
-------------------------------------------------------------------
"instruction": "Arrange the given numbers in ascending order.",
"input": "2, 4, 0, 8, 3",
"output": "0, 2, 3, 4, 8"

データ例

"instruction": "「三原色とは何ですか?」",
"input": "",
"output": "「三原色は赤、青、黄色です。」"
-------------------------------------------------------------------
"instruction": "「与えられた数字を昇順に並べてください。」",
"input": "「2、4、0、8、3」",
"output": "「0、2、3、4、8」"

データ例(日本語訳)

翻訳には愚直にChatGPTのAPIを使って訳しました。5.2万件のデータで、instructionとinputとoutputの3種類のフィールドがあるので、10数万回APIをコールしました。翻訳時間は5時間ほどで、費用は$45ほどでした。(※この翻訳作業は、ChatGPTを利用する必要はなく、DeepLやGoogle翻訳のAPIでも可能です。)

ChatGPTのAPIを使ったことで、日本語訳のほうには、翻訳元にはない括弧「」がときどき付与されていました。

ファインチューニング

5.2万件の日本語のデータを使って、ファインチューニングします。コードはスタンフォード大学が公開しているものをほぼそのまま利用しています。実行環境は、Google Colabで行いました。最初は無料のColabで行おうと思いましたが、メモリに乗り切らなかったり、バックエンドでの実行ができないため、Google Colab Pro+に課金しました(月額5701円)。

ファインチューニングの様子

ファインチューニングは6時間半くらいで終わりました。

結果

入力と出力例を上手く行った例からいくつかご紹介します。

入力:日本の首都はどこですか?
ファインチューニング前:The capital of Japan is Tokyo.
ファインチューニング後:「日本の首都は東京です。」

入力:高齢の方が罹りやすい病気を3つ挙げてください。
ファインチューニング前:Three diseases that are more common in the elderly are heart disease, stroke, and dementia.
ファインチューニング後:「高齢の方が罹りやすい病気には、心臓疾患、精神疾患、そして呼吸器疾患が含まれます。」

上手く行った例

今まで、英語で出力されていたものが日本で出力してくれています。また、今回翻訳にChatGPTを使ったことで、データに括弧「」が紛れ込んでいました。それもしっかり学習して、出力のときに括弧をつけています。

次に、上手く行かなかった例を紹介します。

入力:大阪のオススメの食べ物を教えて
ファインチューニング前:Osaka's favorite foods include takoyaki, okonomiyaki, kushikatsu, and yakitori.
ファインチューニング後:「大阪のオススメの食べ物には、オーストラリアの牛肉フルーツバター、オーストラリアの牛肉フルーツバター、オーストラリアの牛肉フルーツバター、

入力:「3x + 2= 20」という方程式を解くとxはいくつになりますか
ファインチューニング前:x = 6
ファインチューニング後:「3x + 2 = 20」という方程式を解くと、xは2です。」

上手く行かなかった例(悪化した例)

今回のファインチューニングをしたことで、悪化しています。他にもいくつか試しましたが、今回のチューニングでは、上手く行かないことのほうが多かったです。

学習のEpochを増やしたり、学習率を調整したりすることで、さらに性能は向上できると思います。また、今回は7Bのパラメータのモデルでしたが、13Bや65Bで試すともっと良くなる可能性はあります。

今回は5.2万件のデータを愚直にChatGPTで翻訳したのですが、改良の余地がたくさんあります。(※本来はシードの175件のデータが日本語でしっかり整備されれば、質の高い5.2万件のデータが得られます。日本語化を進めている方がいらっしゃるので、そのデータを使えばさらに精度は高まると思います。また、日本語の別のデータで学習した事例も出ています。)

応用例

最後に、軽量でファインチューニング可能なモデルが利用可能になると、どのような応用が可能かを簡単にまとめたいと思います。

軽量なモデルの利点

まず、軽量であることで、MacBookやRaspberry Piやスマホなどのあらゆる端末に組み込まれる可能性を感じます。軽量なモデルの利点を3つほどあげたいと思います。

  1. 低遅延: インターネット接続が不要なため、通信遅延がなく、リアルタイムでの処理が可能です。

  2. オフラインでの利用: インターネットに接続できない環境でも、端末内で動作するため、利用が可能です。

  3. プライバシーの保護: ユーザーのデータが外部に送信されることなく、端末内で処理が完結するため、プライバシーが保護されます。

ファインチューニングの利点

今回は日本語でファインチューニングさせるだけでしたが、Alpaca-LoRAのような公開されているファインチューニング可能なモデルは、以下のような利点があります。

  1. 独自データの学習: ファインチューニングができることで、自社独自のデータを学習させることができます。これにより、業界や企業固有の言語や表現を正確に理解し、より適切な応答や予測が可能になります。

  2. ベクトル(embedding)の組み込み: 画像やユーザー、商品のベクトルの組み込みです。協調フィルタリングなどで学習させた商品のベクトルを組み込むようなことも可能になってきます。(*ファインチューニングというより、企業が持っているユーザーの行動ログなどのデータを活用するレイヤーをLLMに組み込むという感じです。)

これらの利点を活かすことで、Alpaca-LoRAを用いた様々な応用が可能になります。

注意点

現在、Alpaca-LoRAは商用利用不可になっています。

まとめ

Alpaca-LoRAという手元で動く軽量の大規模言語モデルを日本語でファインチューニングしてみました。低コスト(1万円ほど)で、短期間(10時間ほど)で学習できました。また、どのような応用が可能かを簡単にまとめました。

ファインチューニングには未来を感じるとともに、使用するデータ次第では、AIをどの方向にもアラインできてしまうので、AI SafetyやAI Alignmentの研究がますます重要になってくると思います。

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