各チャットテンプレートの長所と短所

  • Redditに「ファインチューンにおける各チャットフォーマットの長所/短所」という投稿が上がっていました。
  • 長文ポストですが、一部を訳出すると:
    • 古き良き「Alpacaフォーマット(###Instruction\n...)」は、1)ベースモデルを含めどんなモデルでも指示追従させやすく、2)フォーマット固有の特殊トークンも必要ない、という点で今なお使い勝手が良い。
      • 「Vicunaフォーマット(USER: {}...)」は、ロールプレイ形式の文章をプロンプトに含めるとき、テンプレートと区別がつかずモデルが混乱する。
      • 「ChatMLフォーマット(|im_system|\n...)」は良い形式だが、特殊トークンが必要なので様々なバックエンドやモデルマージへの柔軟性に欠ける。
    • 一種の「データセットの増強」のために、ファインチューン時に複数のプロンプトフォーマットを使うことの是非について意見/情報が欲しい。
      • 純粋にパフォーマンスを上げるためには不要な試みのような気もするが、特定のフォーマットに最適化しないことで何らかのメリットが得られるか。
  • といった内容のようです。
  •  このポストに対する議論として:
    • Alpacaフォーマットは複数ターンのチャットに適していない(###で強制的に停止させるならそれでよいけれど)。固有の停止トークン(|im_end|)を持つChatMLのほうがスマート。
    • ChatMLはOpenAI APIによって事実上の標準フォーマットになっているので、色々なアプリ/サービスで使うのに都合がいい。
    • 細かいトークン効率を考えないのであれば、仮にChatMLの特殊トークンを語彙に追加しなくてもテクニカルには影響ない。
    • Alpacaは###を使用するためMarkdownを扱うときに混乱することがある。とはいえChatMLも(特殊トークンを語彙に追加しなければ)XML/HTMLを扱う場合に混乱することがある。
    • Mixtral Instructのように独自フォーマットの遵守が求められているモデルでも、実際には柔軟にフォーマットに適応できる(SFTで焼き付けられた検閲を回避するには、むしろ別のフォーマットの方が適していたりする)。
  • といった反応が見られました。
  • フォーマット選びについては一家言ある人が多いようですが、ファインチューンで複数のフォーマットを使うことの是非については「別に好きにすればいいんでは?」という人が多いようです。
  • 個人的には「ファインチューン時のデータセットを増やすために(あえて)異なるプロンプトフォーマットを使う」という投稿者の発想が面白いと思いました。
    • 同じデータを同じフォーマットで複数エポック回すよりも、フォーマットだけでもエポックごとに変更して学習させるほうが(おそらく学習の汎化の観点で)良いのでは?という仮説のようです。
    • 以前、ファインチューンで知識を定着させるためには同じ内容のデータセットを多言語翻訳して学習させるのが費用対効果の高い方法である、という検証結果を読みましたが、もしかしたらプロンプトフォーマットを変えるだけでも類似した効果が得られるのかもしれません。
  • なおプロンプトフォーマットについては、MMLUのような多肢選択式/短答式のベンチマークを解く際にChatMLよりもAlpaca/Vicunaなど素朴なフォーマットのほうが高いスコアが出やすいので、ファインチューンモデルの作者はChatMLを扱いたがらない、という話を聞いたことがあります。