🚀 Codestral-22B-v0.1-abliterated-v3モデルカード
このモデルの手法を再現するための私の元のJupyter「クックブック」はこちらにあります
私が使用した自作のコードライブラリ (開発中で、改善と汎用化を目指しています)
このモデルはmistralai/Codestral-22B-v0.1のorthogonalized bfloat16 safetensor重み付きバージョンです。生成には、プレビュー論文やブログ記事「Refusal in LLMs is mediated by a single direction」に記載された手法を改良したものを使用しています。詳細を理解するために、この記事の閲読をおすすめします。
bullerwinsが元のモデルをHF形式で再アップロードしてくれたことに感謝します。
ちょっと待って、「abliteration」?Orthogonalization?Ablation?これらは何ですか?
要約すると、このモデルは特定の重みを操作して、モデルが拒否を表現する能力を「抑制」しています。ただし、モデルが拒否しないこと、あなたの要求を理解すること、倫理や安全性について説教しないことは保証されていません。他の点では、元の22Bモデルと同じように調整されており、最も強い拒否方向のみが直交化されています。
超要約: このモデルは私が実現できる最も純粋な形で無検閲化されています。元のモデルと比べて、他の点では新しい動作や変更された動作はありません。
「abliteration」について説明すると、元の論文で特徴を削除することを指す「ablation」という用語を使った面白い語呂合わせです。特に、このモデルを「無検閲」のファインチューニングと区別するために作りました。
Ablate + obliterated = Abliterated
とにかく、orthogonalizationとablationはここでは同じことを指す用語です。モデルから拒否機能を「削除」する手法は、直交化によるものです。
コードモデルを無検閲化する理由は何ですか?
正直なところ、このモデルはコード以外の分野でもかなり堅実で、量子化すると24GB用の理想的なサイズのモデルです。
拒否機能を削除することで、モデルは全体的にユーザーの要求に対してより従順になります。ただし、倫理的な観点は考慮されません。時には「良い方向に調整された」要求でも拒否され、プロンプトエンジニアリングが必要になることを忘れないでください。
手法についてもう少し詳しく、そしてこれが興味深い理由
私にとって、ablation(または逆の「augmentation」の手法を適用すること)は、システムプロンプトで多くのトークンを使って促進または抑制しなければならない非常に特定の特徴を誘発または削除するのに適していると思います。
代わりに、同じデータセットで空白のシステムプロンプトに対してablationスクリプトでシステムプロンプトを適用し、最終的なモデルの重みで目的の動作を直交化します。
なぜファインチューニングではなくこの手法を使うのですか?
Ablationは本質的により的を絞った手法であり、ファインチューニングよりもはるかに少ないデータで効果的に実行できます。これが主な利点だと思います。
また、最も価値のある点は、元のモデルの知識と学習内容を最大限に維持しながら、特定の望ましくない動作(この場合はユーザーの要求を拒否する傾向)を削除できることです。
ファインチューニングは広範な動作変更には非常に有用で、一般的な手法です。しかし、ablation/augmentation手法を使えば、少数のサンプルで目的の動作に近づけることができるかもしれません。
また、モデルの改良にこの手法を追加するのも有用なステップかもしれません。直交化 -> ファインチューニング、またはその逆の順序で行うことができます。
私はこのモデルをファインチューニングと組み合わせて探索することができていません。能力がある方はぜひ試してみてください。
分かりました。では、なぜV3なのですか?70BのV2は存在しませんか?
以前、Cognitive Computationsの下で8B用のV2をリリースしました。
しかし、70BでV2を試すのはやる価値がないと判断しました。計算サイクルを無駄にして、必ずしも良いモデルにならないことを避けるため、モデルを改良することにしました。
ところが、この最新の手法はかなり満足いく結果をもたらしています。幻覚が減少したようです。
そこで、8BのV2よりも新しい、素敵な手法であることを示すために、Microsoftのようにバージョン番号を大きく飛ばすことにしました(実際には、多くの古いが現在も使用されているMicrosoftライブラリが、Windows 95/98を検出するためにOS名に'Windows 9'をチェックしていたからです)。
特性に関する注意事項
このモデルは、手法が新しいため、興味深い特性があるかもしれません。モデルを試してみて、見つけた特性をコミュニティタブに投稿してください。これにより、この直交化による副作用をさらに理解するのに役立ちます。
もしさらなる改善策を考えついたら、ぜひ共有してください!これはablationを使う最も基本的な方法ですが、まだ探索されていない可能性があります。
また、これに関して何かあれば、どんな方法でも連絡してください。私はCognitive ComputationsのDiscordにいますし、コミュニティタブも見ています。連絡を待っています!この手法を他の方法で使ってもらえると嬉しいですし、できる限りサポートします。
🚀 クイックスタート
元モデルについて
Codestrall-22B-v0.1は、Python、Java、C、C++、JavaScript、Bashなどの人気のある80以上のプログラミング言語の多様なデータセットで学習されています(詳細はブログ記事を参照)。このモデルは以下のようにクエリを投げることができます。
- 命令形式で、コードスニペットに関する質問に答えたり(ドキュメントの作成、説明、因数分解など)、特定の指示に従ってコードを生成したりすることができます。
- 中間予測(Fill in the Middle, FIM)形式で、接頭辞と接尾辞の間の中間トークンを予測することができます(VS Codeなどのソフトウェア開発アドオンに非常に有用です)。
📦 インストール
mistralai/Codestral-22B-v0.1
を使用するには、mistral-inferenceを使用することをおすすめします。
pip install mistral_inference
💻 使用例
基本的な使用法
ダウンロード
from huggingface_hub import snapshot_download
from pathlib import Path
mistral_models_path = Path.home().joinpath('mistral_models', 'Codestral-22B-v0.1')
mistral_models_path.mkdir(parents=True, exist_ok=True)
snapshot_download(repo_id="mistralai/Codestral-22B-v0.1", allow_patterns=["params.json", "consolidated.safetensors", "tokenizer.model.v3"], local_dir=mistral_models_path)
チャット
mistral_inference
をインストールした後、環境にmistral-chat
CLIコマンドが使用可能になります。
mistral-chat $HOME/mistral_models/Codestral-22B-v0.1 --instruct --max_tokens 256
これは「Rustでフィボナッチ数列を計算する関数を書いてください」という質問に対する回答を生成し、以下のような結果が得られます。
Sure, here's a simple implementation of a function that computes the Fibonacci sequence in Rust. This function takes an integer `n` as an argument and returns the `n`th Fibonacci number.
fn fibonacci(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
fn main() {
let n = 10;
println!("The {}th Fibonacci number is: {}", n, fibonacci(n));
}
This function uses recursion to calculate the Fibonacci number. However, it's not the most efficient solution because it performs a lot of redundant calculations. A more efficient solution would use a loop to iteratively calculate the Fibonacci numbers.
中間予測(FIM)
mistral_inference
をインストールし、pip install --upgrade mistral_common
を実行して、mistral_common>=1.2
がインストールされていることを確認します。
from mistral_inference.model import Transformer
from mistral_inference.generate import generate
from mistral_common.tokens.tokenizers.mistral import MistralTokenizer
from mistral_common.tokens.instruct.request import FIMRequest
tokenizer = MistralTokenizer.v3()
model = Transformer.from_folder("~/codestral-22B-240529")
prefix = """def add("""
suffix = """ return sum"""
request = FIMRequest(prompt=prefix, suffix=suffix)
tokens = tokenizer.encode_fim(request).tokens
out_tokens, _ = generate([tokens], model, max_tokens=256, temperature=0.0, eos_id=tokenizer.instruct_tokenizer.tokenizer.eos_id)
result = tokenizer.decode(out_tokens[0])
middle = result.split(suffix)[0].strip()
print(middle)
これは以下のような結果を返します。
num1, num2):
# Add two numbers
sum = num1 + num2
# return the sum
📚 ドキュメント
制限事項
Codestral-22B-v0.1にはモデレーション機構がありません。私たちは、モデルがガードレールをきめ細かく尊重し、モデレートされた出力が必要な環境でのデプロイを可能にする方法について、コミュニティと協力することを期待しています。
📄 ライセンス
Codestral-22B-v0.1はMNLP-0.1
ライセンスの下でリリースされています。
The Mistral AIチーム
Albert Jiang, Alexandre Sablayrolles, Alexis Tacnet, Antoine Roux, Arthur Mensch, Audrey Herblin-Stoop, Baptiste Bout, Baudouin de Monicault, Blanche Savary, Bam4d, Caroline Feldman, Devendra Singh Chaplot, Diego de las Casas, Eleonore Arcelin, Emma Bou Hanna, Etienne Metzger, Gianna Lengyel, Guillaume Bour, Guillaume Lample, Harizo Rajaona, Henri Roussez, Jean-Malo Delignon, Jia Li, Justus Murke, Kartik Khandelwal, Lawrence Stewart, Louis Martin, Louis Ternon, Lucile Saulnier, Lélio Renard Lavaud, Margaret Jennings, Marie Pellat, Marie Torelli, Marie-Anne Lachaux, Marjorie Janiewicz, Mickael Seznec, Nicolas Schuhl, Patrick von Platen, Romain Sauvestre, Pierre Stock, Sandeep Subramanian, Saurabh Garg, Sophia Yang, Szymon Antoniak, Teven Le Scao, Thibaut Lavril, Thibault Schueller, Timothée Lacroix, Théophile Gervet, Thomas Wang, Valera Nemychnikova, Wendy Shang, William El Sayed, William Marshall