common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


Sign in
Sign up
common.title

Code Llama 巷の解説記事(ギブアップ)

Yuichiro Minato

2023/11/13 14:34

こんにちは、コード生成の論文を見てみます。その前に巷の解説記事を見てみたいと思います。

と思ったけどギブアップしました。

Code Llama: Open Foundation Models for Code

https://ai.meta.com/research/publications/code-llama-open-foundation-models-for-code/

一般的に出回っている日本語の解説記事を参考にしようとしましたが、見てみた感じ全部が元のMETAの紹介記事をそのまま翻訳している感じでした。今回は論文も読んでみたいので、まずは記事を見てみてそのあと、論文に移ろうと思います。

解説記事

Introducing Code Llama, a state-of-the-art large language model for coding

https://ai.meta.com/blog/code-llama-large-language-model-coding/

Code Llamaは、コードと自然言語のプロンプトの両方からコードとコードに関する自然言語を生成できる最先端のLLM(言語学習モデル)です。Code Llamaは、研究および商用利用のために無料で提供されます。Code LlamaはLlama 2をベースに構築されており、以下の三つのモデルで利用できます。

1. Code Llama - 基本的なコードモデル

2. Code Llama - Python - Pythonに特化したモデル

3. Code Llama - Instruct - 自然言語の指示を理解するために微調整されたモデル

Code Llamaは、Llama 2のコード特化バージョンで、Llama 2をそのコード専用のデータセットでさらに長時間トレーニングし、同じデータセットからより多くのデータをサンプリングして作成されました。現在広く使用されている多くの人気のある言語をサポートしており、Python、C++、Java、PHP、Typescript(Javascript)、C#、Bashなどが含まれます。

Code Llamaは、それぞれ7B、13B、34Bのパラメータを持つ3つのサイズでリリースされます。7Bと13Bのベースモデルとインストラクトモデルは、中間埋め込み(FIM)機能もトレーニングされており、既存のコードにコードを挿入することができるため、コード補完のようなタスクに即座に対応できます。

Code Llamaモデルは、最大100,000トークンのコンテキストで安定した生成を提供します。

あと、なんかファインチューニングしたモデルがあるようですが、下記の図に書いてあります。

引用:解説記事より

ここまでは結構一般的な日本語解説記事にも載ってました。というか、解説記事ってほとんど翻訳なんですね。。。論文を見てみます。

Code Llama: Open Foundation Models for Code

https://ai.meta.com/research/publications/code-llama-open-foundation-models-for-code/

基本的には前述の内容なのですが、ちょっと要点ずつでみていきます。

コードインフィリングは、周囲のコンテキストが与えられたプログラムの欠けている部分を予測するタスクです。アプリケーションには、コードIDE内のカーソル位置でのコード補完、型推論、コード内ドキュメンテーションの生成などが含まれます。

インフィリングモデルのトレーニングは、トレーニングシーケンスの一部をシーケンスの最後に移動し、並べ替えられたシーケンスを自己回帰的に予測する因果的マスキング(Aghajanyan et al., 2022; Fried et al., 2023)の概念に従って行います。一般用途の7Bおよび13Bモデルを、Bavarian et al.(2022)の推奨に従ってインフィリング目的でトレーニングします。より具体的には、トレーニング文書を文字レベルで接頭語、ミドルパート、接尾語に分割し、分割位置を文書長に対して一様分布から独立してサンプリングします。この変換は0.9の確率で適用され、複数のモデルコンテキストをまたがってカットされていない文書にのみ適用されます。分割の半分をプレフィックス-サフィックス-ミドル(PSM)形式で、残りの半分をBavarian et al.(2022、App. D)で説明されている互換性のあるサフィックス-プレフィックス-ミドル(SPM)形式でランダムにフォーマットします。Llama 2のトークナイザーを、プレフィックス、ミドルパート、サフィックスの開始、およびインフィリングスパンの終わりを示す4つの特殊トークンで拡張しました。自己回帰的トレーニングとインフィリングトレーニング間の分布シフトを限定するため、ミドルパートとサフィックスのエンコーディング時にSentencePieceトークナイザーが暗黙的に追加する先行するスペースを抑制します(Kudo & Richardson, 2018)。SPM形式では、プレフィックスとミドルパートをトークンにエンコーディングする前に連結します。私たちのモデルはSPM形式では分割されたサブトークンに遭遇しませんが、PSM形式ではそうです。

時間をかけて読み解かないと何言ってるかわかりません。

長いシーケンスの効果的な取り扱いは、トランスフォーマーベースの言語モデリング(Vaswani et al., 2017)における主要な研究トピックです。基本的なモデリングの課題には、訓練時に見たものを超えるシーケンス長での操作、すなわち外挿と、短~中長の入力に対する訓練を好む注意パスの二次複雑度があります。

Code Llamaにおいて、専用の長いコンテキストファインチューニング(LCFT)ステージを提案しています。このステージでは、モデルにLlama 2および当初のコードトレーニングステージで使用された4,096トークンから増やした16,384トークンのシーケンスが提示されます。長いシーケンスを処理するためのトレーニング時間をファインチューニングステージに限定することで、大幅にトレーニングコストを増加させることなく長距離能力を得ることができます。最近提案された位置補間によるファインチューニング(Chen et al., 2023b)に似ており、Llama 2の基礎モデルで使用されるロータリーポジションエンベッディングの回転周波数を変更することの重要性を確認します(Su et al., 2021)。ただし、Chen et al.(2023b)が周波数を線形に縮小するのとは異なり、我々はそれらが導出される基本周期を変更します。具体的には、ロータリーエンベッディングでは、位置nのクエリとキーベクトルxnが線形変換RdΘ,nxnを受け、RdΘ,nは次の形式のエントリを持つブロック対角行列です。

dは埋め込み次元を表します。回転周波数は \(\theta_i = \theta \times -2i/d\) として計算され、私たちはファインチューニングのために基本周期 \(\theta\) を10,000から1,000,000に増加させます。この増加により、はるかに大きなシーケンスの処理が可能になり、短距離の注意に対するバイアスが減少します(さらなる議論については付録F.1を参照)。私たちの実験により、Code Llamaモデルはファインチューニング中に使用された増加したシーケンス長内でのみ効果的であるだけでなく、さらに外挿能力を示し、最大100,000トークンの非常に長いシーケンスで安定した挙動を示すことが確認されています(セクション3.3)。

もう何言ってるかわかりません。

2.5 指示によるファインチューニング

私たちの指示によるファインチューニングモデル「Code Llama - Instruct」は、Code Llamaに基づいており、適切に質問に答えるためにトレーニングされています。これらは3種類の異なるデータタイプでトレーニングされています。

独自のデータセットについて

Llama 2のために収集された指示チューニングデータセットを使用しています。これはTouvron et al.(2023b)によって詳細に説明されています。具体的には、彼らの論文で「RLHF V5」として参照されているバージョンを使用しています。これは、人間のフィードバックと人間のフィードバック注釈からのいくつかの段階の強化学習を通じて収集されました。

セルフインストラクト

独自のデータセットには、コード関連タスクの例が少ないです。人間のアノテーターからの監督データの収集や、人間のフィードバックからのトレーニング(Ouyang et al., 2022)は、プロの開発者からの入力を必要とするため、コーディングタスクにとって費用がかかります。人間のフィードバックの代わりに、私たちは実行フィードバックを使用して、指示モデルのトレーニングに使用するデータを選択します。以下のレシピに従ってセルフインストラクションデータセットを構築し、約14,000の質問-テスト-解答の三重項を作成しました:

1. Llama 2 70Bをプロンプトして、62,000の面接スタイルのプログラミング質問を生成します。

2. 完全な重複を削除することにより、質問セットの重複を除去し、約52,000の質問になります。

3. これらの質問のそれぞれについて:

(a) Code Llama 7Bをプロンプトして、ユニットテストを生成します。

(b) Code Llama 7Bをプロンプトして、10個のPython解答を生成します。

(c) 10個の解答でユニットテストを実行します。テストに合格する最初の解答を(対応する質問とテストとともに)セルフインストラクトデータセットに追加します。

私たちは、同じコンピュート予算で34Bモデルを使用して質問ごとに少ない解答を生成するよりも効率的であると判断したため、テストとPython解答を生成するためにCode Llama 7Bを使用します。

リハーサル

一般的なコーディングおよび言語理解能力においてモデルが後退することを防ぐために、Code Llama - Instructはコードデータセット(6%)と私たちの自然言語データセット(2%)からのデータの少量も使用してトレーニングされます。

まぁ、よくわからないなりになんとなくわかりそうです。

トレーニングの詳細

最適化

私たちのオプティマイザーはAdamW(Loshchilov & Hutter, 2019)で、β1とβ2の値は0.9と0.95です。コサインスケジュールを使用し、1000ステップのウォームアップの後、最終的な学習率をピーク学習率の1/30に設定します。バッチサイズは400万トークンで、それぞれ4096トークンのシーケンスとして提示されます。ファインチューニング段階では事前トレーニング段階よりも低い学習率を使用するのが標準的な方法ですが、Llama 2ベースモデルの元の学習率を維持した場合に最良の結果が得られました。これらの知見を13Bおよび34Bモデルに適用し、それぞれの学習率を3e−4および1.5e−4に設定しました。Pythonファインチューニングのためには、初期学習率を1e−4に設定します。Code Llama - Instructについては、バッチサイズを524,288トークンでトレーニングし、合計約50億トークンでトレーニングします。

ここはわかりました。最適化の詳細が書いてあります。

長いコンテキストのファインチューニング

長いコンテキストのファインチューニング(LCFT)には、学習率を2e−5、シーケンス長を16,384、そしてRoPE周波数を基本値θ = 10^6でリセットします。バッチサイズは、モデルサイズ7Bおよび13Bに対しては2Mトークン、34Bに対しては1Mトークンに設定されています。トレーニングは標準で10,000の勾配ステップが行われます。一部の設定においてダウンストリームパフォーマンスの不安定性が観察されたため、34Bモデルについては勾配ステップ数を11,000に、Code Llama 7Bについては3,000に設定しました。

ということでここまでが簡単な手法の説明を英訳しましたが、専門用語が多すぎます。今後はちょっとずつ紐解いていこうと思います。。。結構いろんなモデルがあって、モデルごとに詳細が違うので、自分でどれにするか決めないと私たちの労力では追いつかなさそうです。

学習、ファインチューニング、最適化などさまざまなパラメータを決めないといけないので、再現はかなり大変そうですが、開発する人はここまで覚えないといけないのかと思うと気が遠くなります。

もっと全体概要が掴めるかと思いましたが、 今回はギブアップして少しずつ記事を分割してあげていこうと思います。。。以上です。

© 2025, blueqat Inc. All rights reserved