💻

「Code Llama」をベースとした商用利用可能な日本語LLM「ELYZA-japanese-CodeLlama-7b」を公開しました

2023/11/15に公開

KV

はじめに

こんにちは、ELYZAの堀江、 中村、 佐々木、 平川です。

今回、Meta社が開発し公開しているCode Llamaに対し日本語の追加事前学習を行った以下のモデルを公開することとなりました。
追加事前学習に用いたデータや手法はそれぞれ以前の記事でご紹介した ELYZA-japanese-Llama-2-7bELYZA-japanese-Llama-2-7b-instructと基本的には同様のものとなっています。
詳細については ELYZAが公開した日本語LLM「ELYZA-japanese-Llama-2-7b」についての解説 : (1) 事前学習編 を参照してください。

ELYZA-japanese-CodeLlama-7b

codellama/CodeLlama-7b-Instruct-hf に日本語の追加事前学習を行ったもの。
ELYZA-japanese-Llama2-7b同様に、OSCARやWikipedia、その他クロールデータといった日本語のテキストデータ18Bトークンを学習に使用しています。

ELYZA-japanese-CodeLlama-7b-instruct

ELYZA-japanese-CodeLlama-7b に対し、ELYZA独自の事後学習を行ったもの。

尚、ライセンスは ELYZA-japanese-Llama-2-7b 同様に、Llama 2 Community License に準拠しています。そのためAcceptable Use Policy に従う限りにおいては、研究および商業目的での利用が可能です。

今回公開する ELYZA-japanese-CodeLlama-7b は、我々が用いた日本語の追加事前学習の一連のメソッドが、Llama 2以外のものでも汎用的に適用可能であるかを実験したものの一部で、元々のモデルが持つ能力を保持したまま日本語の能力を獲得できることを示す一例になると考えています。

本記事では、元々のモデルが持つ能力を保持出来ているか、またinstructionにおいて新たに日本語の能力を獲得することができたのかについての検証結果を示します。

CodeLlama について

Code LlamaはLlama 2をベースとし、コード生成およびコード補完に関する能力を持つように追加で訓練されたモデルです。
詳細は割愛しますが、Code Llamaではリポジトリレベルでの推論に対応するため、扱える系列長がLlama 2と比べ4,096から100,000と大幅な拡張になっているなど、コードを扱うための工夫がなされています。
ベースとなるLlama 2に対し、分割した各ステージで段階的にfine-tuningを行うことでコード生成・補完の能力を付与することに成功しています。

Code Llama Training Pipeline

特に面白いのは、コード生成に関するinstruction datasetの作り方で、本来はコードの書けるアノテーターを必要とする高コストな作業を必要とするデータを自動的に作り出すことに成功している点です。
詳細は論文中 2.5 Instruction fine-tuning で説明されていますが、以下のような形式のプログラミングに関する課題をLlama 2 70Bによって生成するところから一連のステップが始まります。

論文中に含まれるinterview形式の課題2例
"Write a function that finds the maximum depth of list nesting in a given list."
"Given an integer array nums, rotate the array to the right by k steps, where k is non-negative."

次に、この課題に対しCodeLlama 7Bによって "解答例" および "ユニットテスト" を生成、ユニットテストを通過する解答例と課題をペアとしてinstructionデータとしています。 (厳密に言えば課題とユニットテストが完全に一致しているかという問題はありますが) ユニットテストによって生成結果の正しさを保証するという、コード生成というタスクならではのデータ生成方法といえます。

Code Llamaは、Code Llama, Code Llama - Python, Code Llama - Instructと3種類のモデルが公開されていますが、今回はLlama 2のときと同様に、指示追従の能力や出力の安全性を引き継ぐためにCodeLlama - Instructをベースとし追加事前学習をしています。

性能評価

ELYZA-japanese-CodeLlama-7b-instructについて、今回はコード生成能力に対する評価と日本語生成能力に対する評価の大きく2種類を実施しています。

HumanEvalによるコード生成能力評価結果

CodeLlamaの論文中 では、コード生成における性能評価でスタンダードになっている HumanEval が性能評価に使われています。今回コード生成能力の評価に際し、1つの問題に対して1つのテキストをgreedyに生成して評価するpass@1を指標として用いました。

なお、論文中で述べられているHumanEvalの評価結果を再現するコードがリポジトリ中に見つけられなかったので、今回は bigcode-evaluation-harness を利用し、HumanEvalの評価を実行してます。

再現時に実行したコマンド
$ accelerate launch  main.py \
  --model elyza/ELYZA-japanese-CodeLlama-7b-instruct \
  --max_length_generation 512 \
  --precision bf16 \
  --tasks humaneval \
  --do_sample False \
  --n_samples 1 \
  --batch_size 1 \
  --save_generations \
  --save_generations_path generations_py.json \
  --use_auth_token \
  --allow_code_execution
HumanEval pass@1
ELYZA-japanese-CodeLlama-7b-instruct 0.341
CodeLlama-7b-Instruct 0.335

論文中では、CodeLlama-7b-Instructのpass@1スコアは34.8%となっており、表中の値と若干の乖離はありますが、オリジナルのCodeLlama-7B-Instructに対しELYZA-japanese-CodeLlama-7b-instructがほぼ遜色のないコード生成能力を保持していることが確認できました。

ELYZA Tasks 100 による日本語生成能力評価結果

日本語能力の評価は、 我々が以前公開した ELYZA-Tasks-100 を用いて行いました。
以下は、ELYZA-Tasks-100に含まれるテストケースと、元々のCodeLlama-7b-Instructによる出力、ELYZA-japanese-CodeLlama-7b-instructによる出力のサンプルを示したものです。

入力
仕事の熱意を取り戻すためのアイデアを5つ挙げてください。
CodeLlama-7b-Instruct
Sure, here are five ideas to boost your work enthusiasm:
 

 1. Set achievable goals: Setting specific, measurable, and achievable goals can help you stay motivated and focused. Break down larger goals into smaller, manageable tasks to help you make progress and feel a sense of accomplishment.
 2. Find meaning in your work: When you feel that your work has meaning and purpose, you are more likely to be engaged and motivated. Reflect on why your work is important and how it contributes to the bigger picture.
 3. Take breaks and practice self-care: It's important to take breaks and practice self-care to avoid burnout. Schedule time for activities that bring you joy and help you recharge, such as exercise, reading, or spending time with loved ones.
 4. Connect with colleagues and coworkers: Building positive relationships with your colleagues and coworkers can help you feel more engaged and motivated in your work. Make an effort to collaborate, communicate, and support one another.
 5. Celebrate your successes: Acknowledge and celebrate your achievements, no matter how small they may seem. This can help you feel a sense of accomplishment and motivation to continue striving for excellence.
 

 Remember, it's important to find what works best for you and your unique situation. Experiment with different strategies to find what helps you stay motivated and engaged in your work.
ELYZA-japanese-CodeLlama-7b
仕事の熱意を取り戻すためのアイデアを5つご紹介します。

1. 目標を明確にする: 仕事の目標を明確にすることで、その目標を達成するために何をすべきかを考えることができます。

2. 仕事へのモチベーションを高める: 仕事へのモチベーションを高めるために、自分が取り組むことによって得られる成果を考えることができます。

3. 仕事に取り組む際のルーチンを整える: 仕事に取り組む際のルーチンを整えることで、仕事に取り掛かるまでの時間を短縮することができます。

4. 仕事に取り組む際のストレスを軽減する: 仕事に取り組む際のストレスを軽減するために、仕事に取り組む際の環境を整えることができます。

5. 仕事への意欲を高める: 仕事への意欲を高めるために、自分の仕事に対する誇りや自信を持つことができます。

このように、CodeLlama-7b-Instructでは日本語を入力として理解出来ているように見える一方、日本語として出力することが出来ていません。一方ELYZA-japanese-CodeLlama-7b-Instructでは、自然な日本語による出力が行われています。

それぞれのテストケースへの出力をGPT-4 (0603) によって評価をした結果を以下に示します。評価方法は ELYZAが公開した日本語LLM「ELYZA-japanese-Llama-2-7b」についての解説 : (2) 評価編における "GPT-4による自動評価" に準拠しています。

Model GPT-4 Score
gpt-4-0613 4.370 ± 0.106
gpt-3.5-turbo-0613 3.930 ± 0.138
elyza/ELYZA-japanese-Llama-2-7b-instruct 2.660 ± 0.162
elyza/ELYZA-japanese-Llama-2-7b-fast-instruct 2.580 ± 0.151
elyza/ELYZA-japanese-CodeLlama-7b-instruct 2.46 ± 0.146

ELYZA-tasks-100 GPT4による評価結果

参考のためGPT-4, GPT-3.5 turboの結果を記載しています。
標準誤差を加味すると、ELYZA-japanese-CodeLlama-7b-instructはELYZA-japanese-Llama-2-7b-fast-instructと同等程度でありつつも、ELYZA-japanese-Llama-2-7b-instructには少し劣る程度の性能という結果となりました。

定性評価

最後に、ELYZA-japanese-CodeLlama-7b-instructモデルのように、日本語の能力を拡張したモデルがどのような目的で使えるかをサンプルを交えて定性的に評価してみます。
元のモデルには難しく、我々のモデルで可能になったタスクのひとつに、コードを日本語で解説させる、というものがあります。

例えば、以下のような入力を与えてみます。

サンプル入力
エラトステネスの篩についてサンプルコードを示し、解説してください。

Output

「素数の倍数の倍数になる」といった表現に問題があるものの、アルゴリズムがどのように動作するのかを解説してもらうことが出来ました。
まだ精度に問題がある部分はありつつもinstructionモデルでは、指示に従ってコードを生成するだけでなく、アルゴリズムの挙動を理解し日本語で解説することができるため、人間がコードを理解するための支援ツールとしての活用も考えられます。

最後に

本記事では、今回公開したELYZA-japanese-CodeLlama-7b-instructに対し、コード生成能力および日本語生成能力の評価をすることで、我々の追加事前学習メソッドがLlama 2をベースとし拡張されたモデルに対しても有効であることが確認できました。
また、コードを生成する学習、instructionの学習、日本語の学習とそれぞれ独立に段階的に学習することで、日本語の指示を追従しつつコードを生成するという複合的で複雑なタスクが解けるようになるということを示せたと思います。

今後もELYZAでは、日本語を読み書きする性能が高く、かつ多様な指示に従うことの可能なモデルの開発を進めていく予定です。

ここまでお読みいただき、ありがとうございました。 ELYZAではMLエンジニア、AIエンジニア、AIコンサルタントなど、様々な職種で一緒に事業を前に進めてくれる仲間を募集しています。 少しでも興味を持っていただけた方は、ぜひカジュアル面談にお越しください。

https://chillout.elyza.ai/elyza-japanese-llama2-7b

株式会社 ELYZA

Discussion