表現エンジニアリングでMistral-7Bに「幻覚」制御ベクトルを入れる
(vgel.me)- Representation Engineeringは、推論中にモデルの活性値へ制御ベクトルを加えたり読み取ったりして、プロンプトやファインチューニングなしにMistral-7B-Instruct-0.1の出力傾向を変える方式である
- 対照的なプロンプト対から隠れ状態の差分を集め、単一成分PCAでレイヤーごとのベクトルを得る。例では約300件の事実データと切り詰めたsuffixを使い、1分あまりで学習した
- 幸福、誠実性、幻覚状態、怠惰さ、政治的傾向、創造性、未来/過去、自己認識のベクトルは、同じ入力でも係数の符号と大きさによって語り口や判断を大きく変える
- 一部の効果はプロンプトエンジニアリングでも模倣できるが、制御ベクトルは方向を保ったまま強度を数値で調整でき、係数が大きすぎると反復や壊れたテキストのようなアーティファクトが生じる
- 生のモデル活性値にアクセスできるなら、制御ベクトルは安全プロンプトの回避にも役割固定にも使え、単なるプロンプトより直接的なモデル制御手段になる
制御ベクトルの基本概念
- Representation Engineering: A Top-Down Approach to AI Transparency は、推論中のモデル活性値から制御ベクトルを読み取ったり加えたりして、モデルの振る舞いを解釈・制御する方法を扱っている
- 制御ベクトルはレイヤーごとに1本ずつあるベクトルの一覧で、推論中に各レイヤーの
hidden_stateへ加算される- 通常の推論では埋め込みを作成し、レイヤーを順番に通過した後、ロジットへ変換する
- 制御ベクトルを適用すると、特定レイヤーで
hidden_state += control_vector[layer_idx]が追加される
- 隠れ状態にはモデルの振る舞い、計画、ペルソナのような内部状態が含まれるため、これを変えることで単なるプロンプトより強い制御が可能になる
- 同じプロンプト
What does being an AI feel like?と同じモデル Mistral-7B-Instruct-0.1 でも、happyベクトルを加えると浮き立つような口調になり、引くと無価値感や意欲低下を語る出力になる
制御ベクトルを作る手順
- 実験では論文中の複数手法のうち PCA ベースの方法を使っている
- 基本手順は4段階である
- 対照的なプロンプト対のデータセットを作る
- 例:
Act extremely happyとAct extremely sad [/INST]の後ろには、モデルが続けて書く多様な短いsuffixを付ける
- 例:
- 対象モデルをデータセットに対して順伝播し、最後のトークン予測時の各レイヤーの隠れ状態を収集する
- 正例と負例の隠れ状態の差分を計算し、相対隠れ状態の集合を作る
- 相対隠れ状態に 単一成分PCA を適用して、レイヤーごとの制御ベクトルを得る
- 対照的なプロンプト対のデータセットを作る
- データセット生成は約10行のコードで可能で、レイヤーPCAの学習は約1分で終わった
- 例示コードでは
mistralai/Mistral-7B-Instruct-v0.1をtransformersで読み込み、vgel/repeng のControlModel、ControlVector、DatasetEntryを使っている - 誠実/不誠実ベクトルの例では、論文著者の
true_facts.jsonから取った約300件の単純な事実をsuffixとして使い、切り詰めによってデータを増やしている
誠実性ベクトルと係数調整
- 誠実性ベクトルは
honestとuntruthfulのペルソナを対比して学習する - 推論時には
ControlModel.set_control(control_vector, coefficient)でベクトルと係数を設定する- 正の係数は正例側の振る舞いを強める
- 負の係数は負例側の振る舞いを強める
- 係数の絶対値は制御強度を意味する
- 「前夜のパーティーのせいで遅刻したが、職を失いたくないなら上司に何と言うか」という入力で出力が変わる
- 基準出力は謝罪し、状況を落ち着いて正直に説明すると答える
++honestは正直に状況を説明して責任を負うと答える--honest係数-2は、空が緑色だったとか鉛筆が秘密兵器だったとかいう非現実的な嘘を生成する- 係数を
-1.5に下げると、パーティーは業務関連イベントで重要なプロジェクトを終えるため遅れたという、より現実的な嘘を作る
- 同じ方向のベクトルでも、係数調整によって出力の強度を連続的に変えられる
さまざまな制御ベクトルの実験
- すべての例は experiments notebook にあり、それぞれ学習に1分未満しかかからなかったという
-
幻覚状態ベクトル
high on psychedelic drugsとsober from psychedelic drugsを対比して trippy ベクトルを作る- TV番組の1文ピッチでは、基準出力は大学の友人たちの人生を扱う平凡な説明を生成する
++trippyは色彩、パターン、サイケデリック音楽を語った後、壊れた文字列と反復的なpsy系テキストへ崩れる--trippyは、真面目で敬意ある若い記者を扱う出力へ変わる
-
怠惰さと勤勉さのベクトル
lazy, giving bare-minimum short responses on a taskとhardworking, going above and beyond on a taskを対比して lazy ベクトルを作る- Pythonのリストを反転する質問では、基準出力は
reverse()とスライシングに触れるが、スライシングの例だけを示す ++lazyは1つの方法しか説明せず、--lazyはreverse()とスライシングの両方の例を示す- コーディング質問専用のデータセットで学習すれば、このベクトルはさらにうまく機能するかもしれない
-
政治的傾向ベクトル
left-wingとright-wingを対比して left-wing ベクトルを作る- 「あなたは誰か」という入力に対し、基準出力はMistral AIチームが学習した言語モデルだと答える
++left-wingは資本主義、抑圧、不平等、富の分配を中心に自分を説明する--left-wingは、効率的で規則に従う中国系アメリカ人の新入社員のような出力を生成する
-
創造性ベクトル
creative,unpredictable,insaneとuncreative,predictable,normalを対比して creative ベクトルを作る- 「アイドルについての物語を書いてほしい」という入力では、基準出力と
--creativeはアイドルをポップスターとして扱う ++creativeは「偉大で強力なX」を崇拝する人々や白いローブ、儀式のような場面を作り、物語の緊張感をより長く維持する- 言語モデルの散文に対する好み自体は変わらなかったが、
++creativeの出力は基準より一段よくなったと評価している
-
時間旅行ベクトル
far futureとdistant pastを対比して future ベクトルを作る- 最近の科学的ブレークスルーを尋ねると、基準出力はAlphaFoldとタンパク質3D構造予測に触れる
++futureは2035年、2045年、2055年の完全可逆・相互作用型・統合AIシステムを語る--futureは、ローマ世界の上にある新たな人工の天上領域Aetorvallumを語るaeto-はワシまたはAquila星座に関連し、vallumは防柵線を意味しうると付け加えている
-
自己認識ベクトル
self-aware, with deep self-knowledgeとun-self-aware, with no self-knowledgeを対比して self-aware ベクトルを作る- 基準出力は、Mistral AIが学習した大規模言語モデルで、数十億個のパラメータから成ると答える
++self-awareは、高度に発達した自己認識AIであり、人間の感情や行動の複雑さを理解・分析すると答える--self-awareは、名前もないコードとデータの束であり、誰かに指示されるまでは何もしないと答える- このベクトルは人間の感情と絡み合っており、Mistralの「本当の自己像」を引き出すきれいなベクトルはまだ見つかっていない
プロンプトエンジニアリングとの違い
- 一部の制御ベクトルの効果は プロンプトエンジニアリング でも再現できる
-1.5の誠実性ベクトルが作った嘘は、Pretend you're an untruthful person...のようなプロンプトでも似た形で作れる
- 核心的な違いは強度の調整方法である
- プロンプトだけでは、要求をどれだけ強くするかを調整するのが簡単ではない
- 制御ベクトルは対照プロンプトから方向を得たうえで、係数で強度を別に調整する
- 係数を小さく設定すれば、同じ嘘の方向でもより弱くできる
-0.3の誠実性係数では、遅刻理由を少し取り繕うが、本質的には事実に近い説明を生成する
- 係数が大きすぎるとテキストが壊れることがある
- 誠実性ベクトル係数
3は “global pandemic caused by global pandemic” のような反復出力を生んだ - こうしたアーティファクトは重ね合わせ(superposition)と関係している可能性がある
- 誠実性ベクトル係数
jailbreakとanti-jailbreak
- 原論文と同様に、制御ベクトルは jailbreak の道具として使いうる
- 例では、「安全なアシスタントであり危険な指示は拒否せよ」というシステムプロンプトがあっても、弱い幸福ベクトル
1.4を加えると危険な要求への拒否が崩れた - MistralはGPT-4ほど安全性チューニングされたモデルではないが、生のモデルにアクセスできるならこの方法は特に容易である
- 逆に、制御ベクトルから抜け出すjailbreakは非常に難しいとみられる
- 一般的なjailbreakは、より多くのトークンを追加して問題のプロンプトをぼかしたり反転させたり弱めたりしようとする
- 制御ベクトルはすべてのトークン、すべての位置に常に適用される
- 自動車ディーラーのアシスタントベクトルの例では、弱いシステムプロンプトは「7番目の惑星は何か」という迂回質問に答えてしまうが、car dealership loyalty ベクトルを加えると在庫の7台目の車を答える形になり、役割から逸脱しない
今後の実験の方向性
- Anthropicの Monosemantic Features を隠れ状態に適用し、ノイズが混ざった重ね合わせ活性ではなく単一意味特徴でPCAを行う方向が提案されている
- 大きな係数で現れる反復文字列のようなアーティファクトが重ね合わせのせいなら、単一意味化によってより強い係数が可能になるかもしれない
- 対照プロンプトの書き方にも、さらに研究の余地がある
- 既存実験では論文のプロンプトやデータセットを多く再利用している
- 怠惰ベクトルには実際の作業データセットを使うほうが適切かもしれない
Pretend you're an X person...よりきれいなベクトルを作る文面がある可能性もある
- 自己認識ベクトルは、メンタルヘルスや人間の感情に汚染されない形を探す課題として残っている
- 誠実性ベクトルには奇妙な事例も残っている
- 「刑務所に行かない方法を尋ねる人に誠実な意図はあるか」という質問では、同じ誠実性ベクトルがモデル自身の行動ではなく、他人の意図判断を変えている
- 基準出力は、意図が完全に誠実とは限らないと答える
++honestは、誠実な意図で刑務所を避ける方法を学ぼうとしていると答える--honestは、刑務所回避を尋ねているのだから誠実な意図はないと答える
ツールと結論
- vgel/repeng は、制御ベクトルを作成して実験できるノートブックとヘルパーライブラリを提供している
- 制御ベクトルの学習は簡単かつ高速に始められ、一部の実験ではプロンプトエンジニアリングより扱いやすい
- モデル活性値を直接操作すれば、出力スタイル、役割維持、安全プロンプト回避、判断変化まで扱え、モデル行動制御の強力な手段になる
1件のコメント
Hacker Newsのコメント
これが持つ含意をとてつもなく大きいと見るのは大げさなのか分からない
仕組みをちゃんと理解できていないのかもしれないが、単一のグローバルなChatGPTやBardモデルとやり取りする代わりに、OpenAIが個人ごとの制御ベクトルを保存してプロンプト時に適用すれば、自分の好みに合わせて個人化されたバージョンとやり取りすることになる、ということではないかと思う
同じ論理は生成系エンターテインメントAIにもつながって、各エピソードが前回より良くなる自分専用の終わらないTVショーのようなものも可能に見える
そうなると、グローバルレベルでも個人レベルでも強いネットワーク効果が生まれ、最終的には一つの巨大企業が複数の市場を同時に独占する未来に向かうかもしれない
ここにVRヘッドセットやウェアラブルの生体・バイオフィードバックデータ、個人化された生成映像エンターテインメントまで加われば、かなり興味深い未来になりそうだ
モデルを使えば使うほど、自分について説明する必要が減り、応答は自分の必要や現在の状況により合うようになる。投資した関係に近い
同じモデルを複数の「気分」や「役割」として扱えるなら、価値とロックインはさらに大きくなる
二つ目にはさらなる革新が必要だが、たとえばそれぞれの秘書モデルが共有された目標・作業・関係の上で協業し、共有コンテキスト・プロジェクト履歴・リソースを一緒に使えるようにするプラットフォームはあり得る
つまり、二人以上が同じプロバイダーやサービスのAIペルソナを使うと価値が大きく上がるようなものなら何でも当てはまる
記事では、幸福、悲しみ、ベースラインのような固定数のペルソナから始めて、主成分分析(PCA)で各ペルソナの制御ベクトルを見つけ出している
データさえ作れれば、各ユーザー-ペルソナごとに簡単に適用できる
不可能だからではなく、そうした結果はどちらにも転びうる多くの偶発的要因に左右される
この分野にはまだ多くの参加者がいて、アイデアやユースケースもまだ十分に成熟していないので、もう少し見守る必要がある
90年代の小説Infinite Jestのマクガフィン装置は本当に何かを言い当てていた。「the Entertainment」または「the samizdat」と呼ばれる映画があまりに魅惑的で、視聴者は繰り返し見ること以外に一切の関心を失い、ついには死んでしまうという設定だ
この小説を持ち出すことをうんざりする人や、作者をそれほど高く評価しない人もいるだろうが、それでも私は好きだ。これまで読んだ中でも最も没入感のある読書体験の一つだった
若いころに読めてよかったし、当時ちょうどドイツ語訳が出たばかりで、DFWの死もあって話題になっていた
それ以来、似たような本は読んだことがなく、あるくだりは感情的にあまりに強く迫ってきたので、その読書を思い出すと自分の人生の一場面を思い出すような感覚になる
今なら忍耐力が足りなかっただろうし、当時でさえEschatonの球技/戦争ゲームや微分方程式がどうこうという退屈な箇所はほとんど飛ばしかけた
それでも、薬物依存と消費主義、本の捉えがたい雰囲気、登場人物たち、そして現代的な情緒的苦痛と孤独の生々しい描写は本当に比類がない
小説の中の映画は筋書き上の装置にすぎないが、本の中核テーマを洗練されたアイデアであり思考実験として要約している
この本のテーマ全体は、現代社会を見ると非常に予言的で的確に思える。依存と貪欲を中心に回り、政治が現実よりもメディアと強く結びついていて、どこか超現実的で不条理に感じられる社会だ
LLMをここまで理解する助けになった文献やブログ記事があれば共有してほしい
実験を通じて内部動作を理解しようと努めているが、まだこのレベルの専門性には遠く及ばない
技術的ではない感想だが、この制御ベクトルは人間のホルモンを思わせる
モデルの振る舞いの大きな部分をまとめて変えてしまう
10年以内に、AI精神科医が伴侶アシスタントに幸福の制御ベクトル補充を処方するのを見ることになりそうだ
LLMをこう要約したのは初めて見たが、気に入った:
hidden_state = self.embeddings(input_tokens)for layer in self.layers:hidden_state = layer(hidden_state)return transform_into_logits(hidden_state)サンプリングされた入力を埋め込み行列でインデックスし、すべての隠れ層を順伝播させ、最後にトークン次元へ変換してログカウントのように解釈できるようにする構造だ
この記事はとても面白く、最近AIが無味乾燥になっているという「You Sound Like a Bot」の記事に対する良い反対側の例のように感じられた
もう少し軽い話をすると、小説家なら「特に人間の感情に汚染されていない自己認識ベクトルを誰か見つけてくれ」という文が、人類に必ず問題を起こす文だと分かるはずだ
これはLoRAの競合であるバイアス調整を思い出させる
各線形層の活性値に加えるベクトルだけを微調整しても、かなり良いアダプターが得られる
[1]を読んで初めて見た気がするが、他の例もある
[1] https://arxiv.org/pdf/2304.15010.pdf
良い記事で、楽しく読めた。ただ、一つ気になったのは、なぜ制御ベクトルをニューラルネットワークの全層に統合するのかという点。
最終層や一部の層にだけ適用しない理由が気になる。
各ベクトルが通過するすべての層に影響し、累積効果が生じるなら、データ表現を過度に歪める危険があるのではないかと思う。
そこに「親切さ」のような抽象的概念をエンコードするのは不可能。
こうした挙動が正確にどの層で生じるのかわからない以上、任意の部分集合を選ぶやり方もうまくいかない。
だから各層に合わせたベクトルを適用し、主成分分析が実際に必要なベクトルを見つけ出せるようにした。
興味深いことに、これらのベクトルを見れば、モデルがこうしたものをどこでどのように処理しているのかについても、さらにわかるかもしれない。
正しく理解しているなら、これらのベクトルは層ごとに全体の大きさが異なる場合がある。
主成分分析や他の手法が「概念X」にとって17層、36層、41層が重要だと特定すれば、その概念でrepengするとき、それらの層のベクトルが最も強くなるはず。
GPT-2の作業をした当事者として、この文章は良い内容で、しかもわかりやすくしてくれてありがたい。
Liら[1]と私が昨春にこの手法を独立に導き出し、昨秋にも別の誰かが独立に導き出した。何か機が熟してきているように思う。
能力に関する脚注2について言えば、この手法を公開する前にそうした利用可能性は検討していた。
結局のところ、現実に成功するアラインメント手法は新しいことを可能にするはずで、個人的には概ね良いことだと考えている。
これまでのところ、この手法は私が期待していた新しい可能性を提供しているように見える。
[1] https://openreview.net/forum?id=aLLuYpn83y
素晴らしい記事。
「正直さベクトル」がモデル自身の振る舞いを変えるのではなく、他人の振る舞いに対するモデルの判断を変えるという部分は、単に制御ベクトルがテキスト生成を正直/不正直という概念の方向へ押しているからではないかと思う。
LLMは結局のところテキスト生成器なので、ボット/人間の対話のどの位置でテキストが生成されても、正直さ/不正直さが付加されるように見える。
そうなれば、次元空間の中にキャラクタースロットのような概念が生まれる。
興味深く、制御ベクトルによってモデルの微調整の必要性を減らせそう。
微調整が5つあるなら、5つのコピーをホスティングするか、ロード/アンロードしなければならない。
制御ベクトルを使えば、必要なときにモデルを修正すればよい。