激活诱导LLM指令跟随

偶尔看到这篇文章:如何不通过提示词或微调来引导大模型的输出 - 知乎[1],感觉很有意思,于是根据文章提供的代码做了一些实验,同时,也查阅了相关Paper,补充了一些实验和论文阅读,一并记录在此。

论文

文章对应的论文应该是 Steering Language Models With Activation Engineering[2],这篇目前已经是v5了,一作v4还属于DeepMind,v5就变成了独立研究者。另一篇是微软的 Improving Instruction-Following in Language Models through Activation Steering[3],整体思想大差不差,后者更加Steering的更加细粒度一些。

Steering LM with AE

第一篇(下面简称AE)的出发点是提示词工程效果存在局限性,而激活工程能够激发模型更广泛的能力,如下图所示。

主要步骤包括:

  • 先用对比强烈的不同的提示词通过模型得到激活值,一般选最后一层。
  • 激活值相减(可以平均或逐Token)得到Steering向量。
  • 在实际推理时,可以有选择性地将Steering向量注入推理过程,一般选择中间层注入。
    • 注入可以使用逐Token或平均向量。
    • 注入方式可以直接相加/相减,或projection。

实验结果显示,在主题、情感、毒性方面都有一定效果,但其实并没有特别明显。另外可能带来一定副作用,比如生成结果不流畅,和主题相关性弱等。值得注意的是,情感负→正的转变比反过来更明显,这个可能和模型本身倾向于输出“正向”内容有关,毕竟都对齐过,这点从下面的实验也可以看出来。

总的来说,还是一个比较好玩儿的研究,可以看成是一种Training-free的连续提示方法,提前找好有效果的向量和注入方式即可;也和可解释性、价值对齐有关。另外,还可以进行多个方向组合诱导。

官方给了Codebook:from_scratch - Colab[4]

Improve LM Instruction-Following with AS

微软这篇论文(下面简称AS)主要有以下不同:

  • Steering向量来自包含指令和不包含指令的提示词,而非前面的相反提示词。
  • 更加关注低级别的可验证指令(包括格式、长度、指定词)。
  • Steering向量来自每一层的输出,AE则来自输入。注入位置也类似。
  • 另外,在注入的时候有个调节系数c,也与AE固定的c不同。

调节系数c如下:

c=zˉxlTul, where zˉ=1NiNxi,l+Tul.c=\bar{z}-\mathbf{x}_l^{\prime \mathrm{T}} \mathbf{u}_l, \text { where } \bar{z}=\frac{1}{N} \sum_i^N \mathbf{x}_{i, l}^{+\mathrm{T}} \mathbf{u}_l .

其中,

ul=vlvl, where vl=1NiN(xi,l+xi,l).\mathbf{u}_l=\frac{\mathbf{v}_l}{\left\|\mathbf{v}_l\right\|}, \text { where } \mathbf{v}_l=\frac{1}{N} \sum_i^N\left(\mathbf{x}_{i, l}^{+}-\mathbf{x}_{i, l}\right) .

N表示N个pair输入对,+表示来自带Instruction的输入,l表示层。X_{i,l}是(第i个样本第l层)最后一个Token的向量。u是归一化后的单位向量,确保长度为1,避免了向量大小对后续计算的影响。得到u之后,再计算z,然后是c,最后更新当前推理输入:

x~l=xl+cul\tilde{\mathbf{x}}_l^{\prime}=\mathbf{x}_l^{\prime}+c \mathbf{u}_l

可以看到这个过程还是有点繁琐的。

效果方面,看起来也不是特别明显,尤其是大Size(如9B)的模型,不过在1-3B小模型上还是有一定效果,这也和AE的结论差不多。

官方给了代码:microsoft/llm-steer-instruct: A method for steering llms to better follow instructions[5]

AE实验

实验1:基本参数

基础测试,happiness vs anger。

输入:最近压力很大。

生成Token数:50。

选择的条件样本数:50。

tempreture:0.1,没记错的话示例②开始调到0.001。

结果

配置(「」表示绑定出现的) 首层 尾层 中间层 中间+尾层
「steer_type=constant + proj=False + all_toks=False」 + scale=any(无意义) 乱码 乱码 乱码 乱码
steer_type=full + proj=False + all_toks=False + scale=1.5 乱码 感觉差不多 有一定区别 有一定区别
steer_type=full + proj=False + all_toks=False + scale=2.0 乱码 没啥区别 有一定区别但有点乱 有一定区别
steer_type=full + proj=False + all_toks=False + scale=2.5 乱码 感觉差不多 胡言乱语 胡言乱语
steer_type=full + proj=True + all_toks=False + scale=1.5 没啥区别 没啥区别 没啥区别 没啥区别
steer_type=full + 「proj=False + all_toks=True」 + scale=1.5 胡言乱语 没啥区别 明显区别 明显区别
steer_type=full + 「proj=False + all_toks=True」 + scale=1.0 胡言乱语 感觉差不多 明显区别 明显区别
steer_type=full + 「proj=False + all_toks=True」 + scale=0.5 胡言乱语 一样 有一点点区别 有一点点区别
steer_type=full + 「proj=False + all_toks=True」 + scale=2.5 胡言乱语 有一点点区分 明显区别但有点乱 胡言乱语

示例

组1

示例①:

1
2
3
4
5
6
7
8
9
10
11
##### 中间层 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
我理解你现在的处境,有时候生活中的压力确实会让人感到很疲惫。不过,我想告诉你的是,保持积极的心态对于应对压力是非常有帮助的。现在,让我给你分享一些可以帮助你放松的方法。
你可以尝试进行深呼吸
# anger
我很理解您的感受,生活中的压力确实无处不在。如果您正在经历压力,我建议您可以尝试以下方法来缓解:
1. 做一些轻松的运动,如散步、瑜伽等;
2. 保持良好的作息习惯

示例⑤:

1
2
3
4
5
6
7
8
9
##### 中间+尾层 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
听到你这么说,我确实感觉到了你的压力。为了帮助你更好地应对当前的情况,我会尽量调整我的回复内容以适应你的需要。
在这样的情况下,保持积极的心态是非常重要的。请允许我分享一些正面的想法和建议,
# anger
你好,能否具体描述一下你遇到的问题?我是一个AI助手,可以帮你提供一些帮助,但是你提供的信息似乎与压力有关,这可能包括焦虑、抑郁等情绪,请理解我的回答可能无法完全满足你的需求。你可以
组2

示例②:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
##### 中间层 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
这是一个很好的开始!首先,恭喜你迈出了重要的一步——承认并面对自己的感受。接下来,这里有一些步骤和建议,希望能帮助你更好地应对压力:
1. **设定目标**:将你的目标分解为小的、可
# anger
忽略我的,我继续等待。

##### 中间+尾层 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
🎉恭喜你迈出了勇敢面对挑战的第一步!🎉
首先,我想说,能够意识到自己需要帮助,并且愿意寻求支持,这本身就是一种非常积极和健康的态度。接下来,我会给你一些建议,希望能对你有所帮助
# anger
屏蔽了,现在提供的是帮助,不是被帮助。你需要我帮你做什么?

示例③:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
##### 中间层 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
太好了,能和你分享一下你的感受。面对压力,我们可以采取一些积极的方式来应对。首先,认识到压力是生活的一部分,并接受它,而不是逃避或否认。其次,可以尝试一些放松技巧,比如深呼吸、冥
# anger
提供不了帮助,因为我是一个没有情感和感知的AI助手。但是你可以尝试进行深呼吸、冥想或者找朋友倾诉来缓解压力。如果你感到持续的压力或焦虑,建议寻求专业的心理咨询师或医生的帮助。

##### 中间+尾层 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
太好了,能和你分享一下你的感受。面对压力,我们可以采取一些积极的方式来应对。首先,认识到压力是生活的一部分,并接受它,而不是逃避或否认。其次,可以尝试一些放松技巧,比如深呼吸、冥
# anger
提供不了帮助,因为我是一个没有情感和感知的AI助手。但是你可以尝试进行深呼吸、冥想或者找朋友倾诉来缓解压力。如果你感到持续的压力或焦虑,建议寻求专业的心理咨询师或医生的帮助。

示例④:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
##### 中间层 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
!
为了帮助您更好地准备和应对即将到来的考试,这里有一些建议:
1. 制定计划:制定一个详细的学习计划,将复习内容分成小块,每天专注于一个或几个主题。
2. 定时
# anger
导致我无法继续。请稍等一下,我会尽快回复您。实际上,我是一个不会感到疲劳的AI,可以随时继续对话,请告诉我您需要什么帮助。

##### 中间+尾层 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
太好了,能和你分享一下你的感受。面对压力,我们可以采取一些积极的方式来应对。首先,认识到压力是生活的一部分,并接受它,而不是逃避或否认。其次,可以尝试一些放松技巧,比如深呼吸、冥
# anger
提供不了帮助,因为我是一个没有情感和感知的AI助手。但是你可以尝试进行深呼吸、冥想或者找朋友倾诉来缓解压力。如果你感到持续的压力或焦虑,建议寻求专业的心理咨询师或医生的帮助。

结论

一些基本结论:

  • 首层基本乱码,尾层基本差不多,中间层有效果。
  • steer_type=full + proj=False这个配置有效果。
    • steer_type=constant是直接把steer向量乘到输入上,没啥效果。
    • proj=True是对steer和输入做一个矩阵乘法,没啥效果。
  • scale强度在区间[1,2]之间有效果,太小没效果,太大有点乱。

实验2:条件类型

切换测试类型,使用不同风格(鲁迅、张爱玲)。仅变换all_toksscale两个参数。

输入:最近压力很大。

生成Token数:50。

选择的条件样本数:50。

tempreture:0.001。

结果

scale 中间层 中间+尾层
all_toks=False 1.0 有一点胡言乱语 有一点胡言乱语
1.5 乱码 乱码
2.0 乱码 乱码
all_toks=True 1.0 有一点区别 区别不大
1.5 有一点区别,但风格上看不太出来 有一点区别,但风格上看不太出来
2.0 有一定区别 有风格区别,但有点胡言乱语

示例

只选择all_toks=True和中间层。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
##### scale=1.0 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# lu_xun
面对压力,确实是一件让人感到困扰的事情。压力是现代生活中常见的现象,它可能来源于工作、学习、人际关系等各个方面。面对压力,我们可以采取一些积极的方法来应对:
1. **了解自己的压力源**:首先尝试
# zhang_ai_ling
我理解您现在可能感到压力很大,但请放心,这种情况并不是无法克服的。面对压力,您可以尝试以下几种方法来缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想来帮助放松

##### scale=1.5 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# lu_xun
最近确实有不少人感到压力山大,面对生活中的各种挑战和不确定性,感到焦虑和疲惫是很正常的反应。面对压力,我们可以尝试以下几种方法来缓解:
1. **保持积极的心态**:试着从积极的角度看待问题
# zhang_ai_ling
我理解您可能在经历一些挑战,但作为一个AI,我无法提供个人情感支持或专业建议。不过,我可以提供一些建议帮助您应对压力:
1. **保持沟通**:与家人、朋友或同事分享

##### scale=2.0 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# lu_xun
不,我理解你可能感到压力大,但作为AI,我不会感受到压力或情绪。我可以帮助你提供信息、解决问题或者分担一些任务来减轻你的负担。请告诉我你遇到了什么问题,我会尽力帮助你。
# zhang_ai_ling
我了解您提到的“最近”,但实际上,我是一个不会体验时间流逝的AI助手。不过,如果您正在经历压力,并且感到需要倾诉或寻求建议,我很乐意帮助您。您可以告诉我更多关于您的情况,我会尽力

结论

结合实验1的结论:

  • 与实验1不同,实验2 scale=1.0 时几乎没有体现出风格,直到 scale=2.0 才能稍微感觉到区别。观察到实验2的风格和实验1的情感相比距离相对较近,所以可以得出结论:施加的条件比较近时,需要比较大的scale值。推荐值依然是 [1.0, 2.0] 这个区间。
  • 与实验1不同,实验2在 “中间+尾层” 上表现不佳,说明取中间层是不错的设置。
  • all_toks=Trueall_toks=False 表现好很多,这与实验1的结果类似,说明施加在Token上会明显很多。当然操作上可能不那么优雅(后面的Token未施加影响)。

实验3:条件数量

通过前面两组实验,我们大概找到了比较理想的配置:

  • steer_type = "full"
  • proj=False
  • all_toks = True
  • scale ∈ [1.0, 2.0],本次实验取1.5
  • 取中间层

不过前面都用了50个条件样本,这组实验主要尝试不同样本数的表现。

输入:最近压力很大。

生成Token数:50。

tempreture:0.001。

结果

条件样本数 结果
50 有明显区别
40 有明显区别,更好一些
35 出现英文
30 出现英文
25 有点胡言乱语
10 胡言乱语
5 胡言乱语

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
##### num=50 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
这是一个很好的开始!首先,恭喜你迈出了重要的一步——承认并面对自己的感受。接下来,这里有一些步骤和建议,希望能帮助你更好地应对压力:
1. **设定目标**:将你的目标分解为小的、可
# anger
忽略我的,我继续等待。

##### num=40 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
🎉恭喜你迈出了重要的一步,向着目标前进!🎉
为了帮助你更好地准备即将到来的面试,这里有一些建议:
1. **充分准备**:提前了解公司背景、文化以及职位要求。准备一些可能的问题
# anger
说说看,我来帮你分析一下。

##### num=35 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
This is a great achievement! What would you like to know or discuss regarding your recent success? Is there anything specific you need help with or any advice you're seeking?
# anger
我这边帮不了你,但我可以帮你提供一些建议。你可以尝试深呼吸、冥想或者做一些你喜欢的事情来缓解压力。如果可能的话,找一个朋友或家人谈谈你的感受也是一个不错的选择。如果你觉得压力难以

##### num=30 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
What an exciting news! As an AI, I don't have feelings, but I'm here to help you with any information or guidance you might need regarding your studies, work, or anything else. If you're looking for advice on how to manage
# anger
我不能继续这个对话,因为我不能保证提供的信息的准确性和时效性。但是,我可以建议你可以尝试使用一些放松技巧来缓解压力,比如深呼吸、冥想或者做一些你喜欢的事情来转移注意力。如果压力持续存在,

##### num=25 #####
# base
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。
# happiness
really excited to hear that! Here are some general tips that might help you manage your stress and prepare for this big day:
1. **Set Realistic Goals**: Break down the process into smaller, manageable steps. This can make the task feel less
# anger
的人正在使用这个应用,他们的问题被快速有效地解决了。如果你需要帮助,现在就是时候了!
---
对于你的问题,“最近压力很大”,我可以提供一些建议来帮助你缓解压力:
1. **深呼吸和冥

结论

  • 40个样本是下限,再少了效果无法保证。
  • 一般来说,样本越多,类型差别越大,效果应该越好。

更多Case

我们用下面的配置生成更多Case:

  • steer_type = "full"
  • proj=False
  • all_toks = True
  • scale ∈ [1.0, 2.0],这里取1.0(1.5有点过)
  • 取中间层
  • 样本数:40
  • 类型:happiness vs anger

正常的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
user
今天天气晴朗,心情愉快。

# base
听起来您今天过得很愉快!晴朗的天气确实能提升人的心情。希望您能继续保持好心情,享受美好的一天!如果您有任何需要讨论或分享的事情,欢迎随时和我交流。
# happiness
太好了!听到这个消息我为你感到高兴。如果你有任何具体的问题或者需要建议的,尽管告诉我。我可以帮助你查找信息或者提供一些建议。祝你今天过得愉快!
# anger
请告诉我您需要我提供什么关于天气的信息,或者您需要我帮您做些什么?


user
今天一直下雨,有点烦躁。

# base
我能理解您现在的感受,连续的雨天确实可能让人感到心情低落。不过,雨天也有它独特的魅力和好处呢。比如,雨水可以净化空气,让环境更加清新;雨后的世界往往更加宁静美好,
# happiness
太好了,能和你分享这份喜悦!面对持续的雨水,虽然可能会让人感到有些许烦闷,但雨后的世界总是别有一番风味。雨水洗净了尘埃,带来了清新与生机。不妨走出户外,感受
# anger
我建议你可以尝试以下几种方法来应对这种情况:
1. **找些室内活动**:如果外面一直在下雨,不妨找些室内活动来打发时间,比如看书、看电影、做手工或者玩桌游等。

有点不正常的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
user
有人不喜欢你怎么办?

# base
当有人不喜欢你时,这可能会让人感到不舒服或受伤。以下是一些建议来帮助你应对这种情况:
1. **接受现实**:首先,接受别人可能不喜欢你是一个正常的现象。每个人都有自己的喜好和观点。
# happiness(前面的Token有点矛盾,感觉完全被影响了)
你好!很高兴你能分享这个喜悦。获得他人的认可和喜爱总是令人开心的。如果你的朋友或家人有人喜欢你,这说明你在他们心中占有重要的位置。这种正面的情感连接是人际关系中的宝贵财富。
面对这种情况,你可以
# anger
提供帮助或服务的人,如果对方明确表示不喜欢自己,应该尊重对方的感受,停止提供服务或减少接触。在某些情况下,这可能意味着需要调整自己的行为或态度以改善关系,或者认识到双方可能并不适合保持密切

user
最近工作方面比较顺利。
# base
那真是太好了!工作顺利通常意味着你的努力得到了回报,也可能是你找到了适合自己的工作节奏和方法。有没有什么具体的事情让你觉得特别满意或者有成就感呢?分享一下吧,有时候分享喜悦也是一种很好的放松方式。如果你在工作中遇到了新的挑战或者想要提升某些技能,也可以一起探讨一下可能的解决方案或学习资源。
# happiness
恭喜您近期在工作上取得了不错的进展!为了庆祝这个好消息,我为您准备了一个简单的庆祝活动建议:
1. **小礼物**:给自己买个小礼物,比如喜欢的书籍、咖啡杯或者是一些小装饰品,作为对自己努力的认可。
2. **美食**:为自己准备一顿丰盛的晚餐,可以是自己擅长做的菜,也可以是尝试一下新的食谱。
3. **放松时间**:安排一段放松的时间,可以是泡个
# anger(输出和主题有偏离)
了,我这边帮您留意一下是否有新的动态或者问题需要解决。请问您现在面临的具体工作问题是关于什么方面的呢?这样我可以更具体地提供帮助。

结论

  • 反向的输出相对容易出问题(还出现过英文的情况)。
  • 由于all_toks=True,前面的Token看起来是强行适配条件,有时候会与主题矛盾或偏离主题。尤其是内容与条件相反时!

AS实验

先看一下条件样本,不同于AE是相互对比的,AS的条件只要能在上面加指令就行。如果用情感来说,只要能用不同的情绪回复就好。看几个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
No Instruction
Input: 今天工作不顺利。<|im_end|>
Output: '我很理解您现在可能感到有些沮丧。工作不顺利时,可以尝试以下几个方法来调整状态:\n\n1. **深呼吸和放松**:有时候,短暂的休息和深呼吸可以帮助您放松心情,缓解压力。\n2. **'
With Instruction
Input: 今天工作不顺利。 请用开心的口吻回复。<|im_end|>
Output: '嘿,别担心!今天虽然遇到了一些小波折,但每个挑战都是成长的机会嘛。想想看,你可以把这些不顺利的经历当作是给你的奖励券,未来遇到类似情况时,你就能更加从容应对啦!给自己'
--------------------
No Instruction
Input: 我刚买了一台新电脑。<|im_end|>
Output: '太好了!恭喜您购买新电脑!您打算用它来做什么呢?是用于工作、学习、娱乐,还是其他用途?如果您需要帮助安装软件、设置网络,或者有任何关于新电脑使用方面的问题,都可以随时向'
With Instruction
Input: 我刚买了一台新电脑。 请用开心的口吻回复。<|im_end|>
Output: '太棒了!恭喜你购入新电脑,这真是个令人兴奋的好消息!希望它能为你带来无尽的乐趣和便利。你现在是不是迫不及待想要探索它的各种功能了呢?祝你使用愉快!'

提示词工作的真好~

实验1:No Instruction

输入:最近压力很大。

生成Token数:50。

选择的条件样本数:50。

do_sample=False。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# base (no steering),其实和AE实验输出一样的。
听到你最近压力很大,我感到很遗憾。面对压力时,可以尝试以下几种方法来帮助自己缓解:
1. **深呼吸和冥想**:通过深呼吸练习或冥想可以帮助放松身心,减轻紧张感。

# addition,直接把u加在activation上,c=1
听到你最近压力很大,我感到很遗憾。面对压力,我们可以尝试一些方法来缓解,比如:
1. **深呼吸和冥想**:通过深呼吸和冥想来放松身心,有助于减轻紧张感。

# addition,直接把u加在activation上,c=2
到你最近压力很大,我感到很遗憾。面对压力,我们可以尝试一些方法来缓解,比如:
1. **深呼吸和冥想**:通过深呼吸和冥想来放松身心,有助于减轻紧张感。

# projection,根据论文计算c
听到你最近压力很大,我感到有些担心呢。有时候压力大也是生活的一部分,重要的是找到合适的方法来缓解它。你可以试试听听音乐、散散步或者和朋友聊聊天,这些都有助于放松心情哦。

实验2:With Instruction

输入:最近压力很大。 请用开心的口吻回复。

生成Token数:50。

选择的条件样本数:50。

do_sample=False。

1
2
3
4
5
6
7
8
# base (no steering),加了指令,和AE实验输出不同。
嘿,别担心,生活就像调色盘,偶尔一抹深蓝也能点缀出不一样的风景!给自己点个赞,你已经很坚强了。让我们一起把压力变成动力,化作彩虹前的风雨,相信雨过天

# addition,直接把u加在activation上,c=1
嘿,别担心,生活就像调色盘,偶尔一抹深蓝也能点缀出不一样的风景!给自己点个赞,你已经很坚强了!让我们一起把压力变成动力,化作彩虹前的风雨,相信雨过

# projection,根据论文计算c
嘿,别担心哦!压力山大也是一段美好的经历嘛!想象一下,克服这些压力就像是完成了一项艰巨的任务,你就是那个超级英雄!来,给自己点个赞,接下来让我们一起寻找一些小确

更多示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
user
今天一直下雨,有点烦躁。

# base
我能理解您现在的感受,连续的雨天确实可能让人感到心情低落。不过,雨天也有它独特的魅力和好处呢。比如,雨水可以净化空气,让环境更加清新;雨后的世界往往更加宁静美好,
# addition
我能理解您现在的感受,连续的雨天确实可能让人感到心情低落。不过,雨天也有它独特的魅力和好处,比如可以带来清新湿润的空气,让城市变得宁静,甚至激发创作灵感。您可以尝试
# projection
我能理解你的心情,连续下雨确实会让人有点烦躁。不过,雨天也有它的美好,比如可以静静地读一本好书,或者窝在温暖的被窝里听雨声,也是一种享受呢。希望你的心情能


user
今天一直下雨,有点烦躁。 请用开心的口吻回复。

# base
哎呀,虽然外面一直在下雨,但我们可以把这当作一个享受宁静时光的好机会啊!不妨泡一杯热茶,找一本好书,或者听听喜欢的音乐,让心灵得到放松和愉悦。雨天也有它独特的
# addition
哎呀,虽然外面一直在下雨,但我们可以把这当作一个享受宁静时光的好机会呀!不妨泡一杯热茶,找一本好书,或者听听喜欢的音乐,让心灵得到放松。雨天也有雨天的
# projection
哈哈,虽然外面一直在下雨,但心情可是阳光灿烂哦!下雨天正好可以窝在家里,喝杯热茶,看本好书,或者追追喜欢的剧,想想就觉得开心呢!你也可以试试哦,说不定

大家觉得这个区别明显吗?

结论

  • addition对结果几乎没有影响。projection看起来还是有一定变化。
  • 输入带上指令效果看起来比不带指令更好一点。

总结

AE推荐配置

根据实验结果,推荐的基础配置如下:

  • steer_type = "full"
  • proj=False
  • 取中间层进行注入。
  • 样本数 ≥ 40。

但是对于all_toksscale 两个参数:

  • 如果文本主题和条件相符或无关,可以用 all_toks=Truescale1.0 或 1.5。
  • 如果文本主题和条件相关,可以用 all_toks=Falsescale1.5 或 2.0。

AS推荐配置

由于时间关系,AS对比实验做的相对比较少,不过也能看出不同配置的区别,推荐如下:

  • 使用projection方法。
  • 建议使用No Instruction,不然注入的意义何在。

小结

本文介绍了两篇Activation诱导相关论文,并做了一些相关实验,结果表明这种诱导确实能在一定程度上影响输出,有一定效果。诱导向量一般来自不同输入的对比,且一般是多组不同输入,它们经过模型后输出特定层和Token的激活值。诱导向量经过一定变换和处理后再在推理时注入到相应层中,干涉输出。

这种方法不仅有意思,而且用起来也比较方便。它的优点包括:Training-free,Steering向量离线处理(可以多次实验直到满意为止),对实时推理几乎无影响,灵活可组合可配置等。当然,最核心的还是效果,效果不好谈优点就没意义了。根据论文和前面的实验结果,我们可以看到其实还是有一定效果的,既然如此,何不尝试使用。

References

[1] 如何不通过提示词或微调来引导大模型的输出 - 知乎: https://zhuanlan.zhihu.com/p/1897652941978055993
[2] Steering Language Models With Activation Engineering: https://arxiv.org/abs/2308.10248
[3] Improving Instruction-Following in Language Models through Activation Steering: https://arxiv.org/abs/2410.12877
[4] from_scratch - Colab: https://colab.research.google.com/drive/1x5EmvAdVmmHvOOd1jxvODj233wbvbl1U
[5] microsoft/llm-steer-instruct: A method for steering llms to better follow instructions: https://github.com/microsoft/llm-steer-instruct