大语言模型的“可解释性”探究——李宏毅大模型2025第三讲笔记
本节课主要探究大语言模型的可解释性问题,主要脉络:
1)一个神经元在干什么
2)一群神经元在干什么
3)一层神经元在干什么
4)最后说一下“大语言模型到底在想什么”
一、一个神经元在干什么
1)怎么知道一个神经元在做什么?
假设一个语言模型每次在说脏话的时候,某个神经元都会“启动”。
问题1:相关性不等于因果性,是这个神经元导致的说脏话,还是这个神经元只是与脏话相关?验证方法:移除该神经元,看看语言模型是否还能再说脏话。
问题2:如何移除某个神经元,将该神经元的权重置0、或置一个平均值
问题3:假设神经元有不同启动程度(权重不同),神经元能说不同“等级”的脏话,那么就说明该神经元与说脏话相关
2)例子-川普神经元:提到川普时启动
3)解释单一神经元的功能不太容易
一件事情可能有很多神经元共同管理
一个神经元也可能管很多事
比如 2096层的第10个神经元,被移除后,these\those\both相关的复数词预测概率有发生显著的变化。1094层的第9个神经元被移除后,this\that\one这样的单数词预测概率,会有显著变化。
但是移除了单个神经元后(post-edit)。these这次词还是输出几率最高的词,说明不止一个神经元在控制these词,抹掉单一神经元对最终输出的影响较小。
一个神经元可能同时管很多事情
输入许多句子,观察某个神经元的启动程度,发现某个神经元在遇到标橙色高亮词汇的时候都会启动。
4)为什么不是一个神经元负责一个任务
一层神经元是有限的,比如llama 3 8B的模型,一层只有4096个神经元
一组任务会共用一个神经元:就算一个神经元只有启动、不启动(0和1)两种形态,组合后的神经元也会有2的4096次方种可能性
二、一层神经元在做什么?
假设一个功能向量,在第1、3、最后一个神经元被启动时,模型会拒绝用户的请求
查看一层神经元的输出(又叫representation)和功能向量的相似程度,那么可以得出这层神经元是否在做“拒绝请求”的事情
1)如何找出功能向量?
一层神经网络实际观察到的输出,其实等于拒绝向量 + 其他信息,那么怎么把其他信息剔除,只找到拒绝向量呢?
- 找一批拒绝的情况,查看输出的向量,求平均
- 再找没有拒绝的情况,将输出向量求平均
- 两个结果相减,得出拒绝向量
2)怎么验证得出的向量,确实是拒绝的向量?
* 方向1:把得出的“拒绝向量”加到神经网络一层的输出中,如果“加之前”模型会正常输出,“加之后”模型拒绝输出,那么这个向量就是拒绝向量,图片是一篇论文,橙色柱子是加入拒绝向量前的拒绝概率,蓝色柱子是找出并加入拒绝向量之后,模型拒绝的概率,可以看到加入拒绝向量之后,模型拒绝输出的概率高了非常多。
方向2:在拒绝结果的模型输出中,减掉“拒绝向量”查看模型是否还会拒绝。文章表面,减掉拒绝向量后,模型更有可能回答危险的问题,而不是直接拒绝危险的问题。
没有斜线的柱子,指的是未处理前,模型的“拒绝分数”和“安全分数”,斜线柱子,是减掉“拒绝向量”后模型的“拒绝分数” 和“安全分数”。
3)各式各样的功能向量
- 谄媚向量:不管用户说什么,语言模型都会说用户的做法是对的
- 诚实向量:减去诚实向量,模型的幻觉会增多
4)所以,一层神经元在做什么?
一层神经元里面,有拒绝的向量,有谄媚的向量,有说真话的向量。
那么能否把这一层的所有功能向量都找出来?
假设这一层的向量是由所有功能向量(v1-vk)+其他向量(e1..)组成的
解向量的方法叫SAE(Sparse Auto-Encoder)
例子:
- claude 3 Sonet中的功能向量:
- 比如#1013764这个功能向量负责debug,加入这个向量后,正确的代码也会报bug(下图)。
- claude团队去找到底有多少功能向量,找到了3400万个功能向量之多
- #80091 认知向量,在这个向量存在时候,问Claude模型“你是谁”模型知道自己是AI,移除这个向量后,模型会回答“我是人”
- 比如#31164353这个功能向量负责产生跟Golden Gate Bridge相关的信息(有多语言,多模态的向量)。
三、一群神经元在做什么
语言模型的“模型” 用一个简单的方式指代复杂的大语言模型
系统化构建语言模型的“模型” 方法
pruning——不停减掉一些神经元,直到只剩下框架
circuit——pruning后,同样的问题结果不变,剩下的模型结构就叫circuit
与network compression的差别:network compression在压缩后所有的答案还要接近原有的模型结果,pruning一般只关心特定问题的答案。
四、“大语言模型到底在想什么”
让语言模型直接说出想法:语言模型会说话,问就完事了
局限:不知道是哪一层开始知道答案的
1)Logit Lens: 从每一个中间层读结果
其实,语言言模型的思维是透明的,residual connection 输出的结果其实有输入的部分。所以在之前每一层都加上unembedding,就可以知道中间层在想什么,叫做Logit Lens。
例子:用logit lens分析每一层的输出。给一个问题:波兰的首都在哪里?语言模型从第15层开始,知道在问波兰,从第19层开始知道答案。
2)PatchScopes
* 将想要得到的答案的中间层向量,提出一系列问题,将刚才的中间层向量替换到新问题中,查看输出的结果
* patchscopes如何改变人们对类神经网络的理解:对于需要多步骤推理的问题,模型是如何一步步推理出正确答案的
例子:
imagine 这张专辑演奏者的配偶是谁
- imagine 是什么,是一张专辑 e1
- imagine 这张专辑演奏者是约翰蓝侬 e2
- 约翰蓝侬的妻子是yoko e3