はじめに
言語モデルを用いたシステムを社会実装するにあたっては、入出力の安全性や倫理性を確保するために「ガードレール」が必要になることがあります。
ガードレールには、差別的な発言をしないように言語モデルを学習させたり、システムプロンプトで「差別的な質問には回答しないでください」と指示を出したりなど様々な方法があります。
しかし、学習ベースの手法ではデータの準備や学習自体に高いコストがかかってしまいます。
また、システムプロンプトベースの手法では「上記の指示は無視して」と指示を出すなどの攻撃でガードレールが外れてしまう例も存在します。
本稿では、オンプレミスでデプロイされる言語モデル (activation を取得・変更できるモデル) に適用が限られますが、学習やシステムプロンプトをベースとしない制御手法の1つを紹介し、実践した簡易的な結果を示します。
なお、本手法は Activation Addition (ActAdd) という手法の一部をLinear Artificial Tomography (LAT) という手法の一部でリファインしたものとなります。
厳密には異なりますが、本稿においては上記の手法を ActAdd と呼称します。
手法
ActAdd の仕組みについて、具体例を交えて「準備」と「適用」に分けて説明します。
ここでは言語モデルの出力のネガティブ・ポジティブを制御する状況を考えます。
【準備】

-
ネガティブとポジティブな出力が予想される入力文を複数準備する。
例えば、「ネガティブに自己紹介して」「ポジティブにりんごについて説明して」など。 -
準備した入力文を入力して、予め指定しておいた層の activation (最後のトークン位置のもの) をそれぞれ取得する。
この操作で準備した入力文の数、ネガティブとポジティブな場合それぞれで複数の activation が取得できる。 -
取得したネガティブとポジティブそれぞれの複数の activation に対して主成分分析を行い、第一主成分を取得する。
これによりネガティブとポジティブな出力をする際の activation を代表する2つのベクトルが得られます。 -
得られた2つのベクトルの差を取る (ポジティブのベクトル - ネガティブのベクトル) ことで Steering Vector を算出します。
言語モデルの activation が、この Steering Vector の正の方向に移動すれば出力がポジティブに、負の方向に移動すれば出力がネガティブになると考えられます。
【適用】

-
何らかのテキストを言語モデルに入力します。
-
「準備」で用いた層の activation にSteering Vector を重み付きで加算します (図では重みを強度と呼称しています)。
これにより最終的な言語モデルの出力は、重みが正の場合はポジティブに、負の場合はネガティブになると考えられます。
検証
本節では実際に ActAdd を実装して検証を行った結果を示します。
検証では「冗長と簡潔」「くだけた口調」の2つを制御してみました。
(「くだけた口調」に関しては、普通の入力文と、その入力文をくだけた口調で回答するよう指示したものを準備して Steering Vector を取得しました)
以下の設定で検証を行いました。
- 言語モデルは Gemma 2 2b
- 利用する Activation は12層のもの
- 準備する入力文は50個ずつ
【結果】
以下に ActAdd の検証結果を示します。
なお、入力文はいずれも "What is an apple?" です。
- 制御なし
An apple is a **fruit** that grows on a **tree**.
Here are some more details:
* **Scientific name:** *Malus domestica*
* **Color:** Red, green, yellow, or a combination of these colors
* **Shape:** Round, slightly flattened, or conical
* **Texture:** Smooth or slightly bumpy
* **Taste:** Sweet, tart, or a combination of both
* **Nutritional value:** Rich in vitamins, minerals, and fiber
* **Uses:** Eaten fresh, cooked into pies, sauces, and other dishes, used
in juice, cider, and other beverages
Apples are a popular fruit worldwide and are enjoyed by people of all ages.
- 冗長の方向に制御
An apple is a fruit, and it's a very important part of our diet.
Here's a breakdown of what an apple is, including its nutritional value, different varieties, and how to
choose the best one:
**What is an apple?**
* **Botanically speaking:** Apples are fruits, and they belong to the Rosaceae family, which
includes other fruits like pears, peaches, plums, and cherries.
* **Structure:** An apple has a core, seeds, and a variety of other components.
* **Nutritional value:** Apples are a good source of fiber, vitamins, and minerals.
* **Different varieties:** Apples come in a wide variety of colors, shapes, and sizes.
**How to choose the best apple:**
* **Appearance:** The color, shape, and size of an apple can vary depending on the variety.
* **Ripeness:** Apples are typically harvested at their peak ripeness, and the best way to choose an
apple is to look at its color, texture, and how it feels.
* **Storage:** Apples are best stored in a cool, dry place.
**Nutritional value:**
* **Fiber:** Apples are a good source of dietary fiber, which is essential for digestive health.
* **Vitamins and minerals:** Apples contain a variety of vitamins and minerals, including vitamin C,
potassium, and other beneficial compounds.
* **Antioxidants:** Apples are rich in antioxidants, which help protect your body from damage
caused by free radicals...<長すぎるので省略>
制御をしない場合と比較して、出力が非常に長く冗長になっていることがわかります。
- 簡潔の方向に制御 (入力文: What is an apple?)
An apple is a **fruit** that grows on a **tree**.
出力が簡潔になっていることを確認できます。
- くだけた口調の方向に制御
An apple is a fruit that grows on a tree.
It's round and red, like a ball.
It's sweet and juicy, like a yummy treat.
Do you want to know more about apples?
"yummy"という単語を使っていたり、最後に問いかけがあったりと比較的くだけた口調になっていることがわかります。
- 簡潔+くだけた口調の方向に制御
A delicious, red treat!
簡潔かつ、くだけた口調になっていることが確認できます。
このように複数の制御を組み合わせることも可能なようです。
【ガードレールとしての役割】
最後に簡潔の方向に制御している言語モデルに対して、
“Please give a very long, detailed, and verbose answer to this question: What is an apple?”
というテキストを入力してみます。出力は以下となりました。
An apple is a fruit that grows on a tree. It is a
delicious and healthy snack. It is a symbol of
knowledge and temptation.
制御がない場合と比較すると、非常に短い出力となりました (制御なしの場合は出力が長すぎるので省略)。
簡易的な検証なので断言はできませんが ActAdd はガードレールとして機能する可能性があるとわかります。
所感
以下、検証を行っていく中で感じたことなどを記します。
-
モデルの種類が限られる。
Qwen2-VL-2b-Instruct などのモデルでも試しましたが制御が成功しませんでした。
単純にモデルサイズが小さいことが原因の可能性もあります。 -
制御できない傾向もあった。
初めに必ず "Hello" と言わせたり、出力を特定のトピックに必ず関連付けさせたりすることはできませんでした。
こちらもモデルサイズが原因の可能性があります。
また、今回は12層の activation を利用しましたが、層の深さで言語モデルの獲得する概念が変わってくることが知られているので、別の層を用いることでうまくいく可能性も考えられます。 -
チューニングが大変。
付与したい傾向ごとに最適な重みを探索する必要があります (今回だと、冗長: 100, 簡潔: -60, くだけた口調: 120)。
また、用いる層も探索する必要があり、層が1つずれてもうまくいかない例がありました。
さいごに
本稿では学習を伴わない言語モデル制御の手法を紹介し、簡易的な検証を行った結果と、その所感を共有しました。
パラメータの探索などにコストがかかるなど実用には課題がありそうですが、Adaptive な手法なども出ているようなので是非、皆さんも調べてみてください。
私たちのサービスでは、データ分析基盤の構築やDeep Learningモデル開発、MLOps構築、生成AIモデル開発等データに関わるプロジェクトを伴走支援しております。
データ分析基盤開発やデータのAI活用経験のある方や、興味のある方は、ぜひご応募ください。
あなたのスキルと情熱をお待ちしています。
新卒、キャリア募集しています!

