概要
- 紹介する論文
- 知識蒸留と遺伝的アルゴリズムを組み合わせた学習手法を提案
- モデルマージなどにより、LLMによるPythonコード生成の精度を約10%向上
- スケジューラーなどを用いず、ハイパーパラメータ(学習率)を最適化
提案手法
基本的には、遺伝的アルゴリズムのプロセス(初期化、評価、選択、交叉、突然変異)を使用する。
- 初期化
- 複数の生徒LLMモデルを用意する
- 学習
- 知識蒸留によって各生徒モデルを学習する
- 教師モデルの出力データと生徒モデルの出力データについて、KLダイバージェンス誤差を計算し学習する
- 正解ラベルと生徒モデルの出力データについて、交叉エントロピー誤差を計算し学習する
- 知識蒸留によって各生徒モデルを学習する
- 評価
- 評価データセットを用いて、各生徒モデルを評価する
- 評価データセット内の設問を各生徒モデルに読み込ませコードを出力する
- 出力コードについて、評価データセット内のユニットテストにかける
- ユニットテストを通った数をその生徒モデルの評価とする
- 評価データセットを用いて、各生徒モデルを評価する
- 繁殖
- 選択・交叉・突然変異を行い、新たな生徒モデルを生成する
- 選択
- 評価が良かった生徒モデル2つを新たに生成する生徒モデルの親とする
- 評価が悪かった生徒モデルを削除する。
- 交叉
- 新たな生徒モデルのニューラルネットワークの各層について、親同士の50%の確率でどちらかの層を採用し、モデルマージを行う
- 新たな生徒モデルの学習率についても、親同士の学習率より範囲を設定し、その中でランダムで設定する。
- 突然変異
- 学習率にランダムでノイズを加える
- 終了
- 学習から繁殖を繰り返し、評価や損失が一定以上変化しなくなったら、終了する。
実験
概要
- 生徒モデルには、codegen-350M-monoを使用する
- 教師モデルには、phi-2を使用する
- G5.2xlargeインスタンス(NVIDIA A10 Tensor Core GPU✕1)を使用する
- 評価データセットはMBPP、訓練データはCodeExercise-Python-27kを使用する
結果
- 18時間の学習で、42回学習〜繁殖を繰り返し終了した
- HumanEval pass@1にて12.8%から14%に改善した
- 前半は学習率の高い個体が、後半は学習率の低い個体が良い精度を残した。