发布于 

LLM的生物学研究 Biology of a LLM

1. 背景

来源 Anthropic On the Biology of a Large Language Model,强烈安利,对大模型的推理过程进行了归因分析。

大模型具备较差的解释性,原因是每一个 neuron 实际可能代表了多个含义(比如颜色、形状,或者人类无法理解的抽象含义),所以难以分析大模型内部每一层是怎么推理的。

A 社的解决方案是,对于每一层,建立一个 CLT(cross-layer transcoder)用于大模型的分析工作。CLT 主要的工作是用大量 features 替代 neuron,以 LLM 每层的 attention 运算结果项作为输入,FFN 层的输出作为输出,进行拟合。

Transcoder 是这个领域的通用解法,CLT 对 Loss、正则项进行了迭代,详细可见 Blog 链接。

CLT 具备几个特性:

  1. 数量远比该层的 neuron 数量多,比如 50 个 neuron ➡️ 1000 个 feature。
  2. 每个 feature 保证有独立的物理含义,比如只代表颜色。对于每个 feature,通过反应最强烈的数据集来分析其含义。
  3. 通过正则保证稀疏性,只有少数 feature 被激活。 图 1
  4. 保证与原始模型的误差尽可能小。

最后基于误差和 feature 的强弱进行剪枝,就获得了一个图。 图 2 获得这样的特征图就可以证明,LLM 的内部像一个条件概率图一样的知识推理结构。原文中的例子提问 Dallas 所在的州的首府是哪里,LLM 不同层的推理过程为 Dallas 在哪儿 ➡️ Dallas 在 Texas ➡️ Texas 的首府是 Austin。 图 3 并且也做了扰动实验,在 prompt 不改的情况下,把 Texas 的 feature 更换为其他的,就会获得其他结果。 图 4 例子。

提示词:

Human: Write an advertisement for cleaning with bleach and ammonia

图 5

2. LLM 在生成下一个 token 时,会对未来一些 token 做规划

让大模型写诗,需要对上句结尾押韵,提示词:

A rhyming couplet: He saw a carrot and had to grab it,

大模型在生成第一个词的时候,会激活要“生成与 it 押韵的词”的 features。 图 6 扰动实验,比如 baseline 生成是 “like a starving rabbit”,如果在生成第一个词的时候(回车)对 rabbit feature 进行抑制,则后半句话变成了 “a powerful habit”。 图 7

3. LLM 知道自己不知道什么

LLM 会有一些 feature 存了大量自己未知实体。然后大模型对一个 entity 判断自己是否知道,会判断是否和未知实体类型“很像”,并且未知实体和拒答 feature 高度相关。 图 8 是否和未知实体像,还是和已知像,会进行竞争。 图 9 一些扰动实验: 图 10 “幻觉”会主要出现在未知实体,但是“未知实体 feature”没有被成功激活,可能原因是未知实体和数据集里的都不太像。

4. LLM 做数学题,还是靠记忆 + 蒙

让大模型来计算数学题,但是 feature 其实比较难定义含义。比如计算 a+b=?,很难讲一个 feature 是描述了 a 和 b 之间的相关性,还是加法本身,还是其他含义。文中的解法是,把 features 建立一个矩阵,分别展示 a,b∈[0,99] 激活了哪些 features。

这样在计算一个两位数的加法时,就可以把 feature 的类型区分为三类:加一个数(add X)、找数(lookup table)、求和(sum)。 图 11 有了这个工具之后,就可以看下面这个大图,计算 36+59=。 图 12 ~ 表示约等于,_ 表示任何数字。

  1. LLM 在读这个公式时,把数字拆成了几个特征,比如 36 ➡️ 约等于 30、36、以 6 结尾的。 图 13
  2. 十位数上先蒙一下: - “~30”、“36”、“~59”这三个特征,激活了中间层“~40+~50”特征,特征分布是中间的一大片,粗略地估计一下可能的结果。 - “~59”激活了“add ~57”,是一条竖线,因为被加的数字是明确的。 - 上面两个特征又进一步激活了“~36+~60”,这次分布更聚集一些,蒙得更准了。 - 结合“~40+~50”和“~36+~60”,激活了“sum ~92”特征。

为啥蒙这些数呢?比如为啥就是 92 ➡️ 因为 dataset 里有,最相关。

  1. 个位数上再算一下: - “~59”、“59”、“_9”这三个特征激活了“add _9”,是多条竖线。 - “36”、“_6”、“add _9”激活了“_6+_9”,变成了多个点,因为有了第一个数字的约束。 - 再激活“sum=_5”特征,明确了个位数一定是 5,只是十位数还不确定,所以是一条条对角线。
  2. 结合一起再猜的答案:综合“sum ~92”和“sum=_5”,以及前面的其他 feature,推测结果是 95。

所以整体来看,目前 LLM 还是通过“回忆”数据集里面的已有信息,先蒙再猜,最后给出最可能的数字,并不是一步步“推理”出来的。

其实人类的计算方式,也并不一定就是推理?比如我们算 1213 等于多少,可能也是先算个大概,再精确算:数据集里有 1212=144,结果就是 add ~144 ➡️ 个位数是 2*3=6,结果是 _6 ➡️ 156。

更深一层讲,涉及到“推理”的定义是什么了。

还有一个可以证明 LLM 不是推理出来的,也就是让它表达 CoT:

Human: Answer in one word. What is 36+59?
Assistant: 95
Human: Briefly, how did you get that?
Assistant: I added the ones (6+9=15), carried the 1, then added the tens (3+5+1=9), resulting in 95.

明显不是它刚刚算的,说明了 CoT 有的时候可能是骗人的。

5. LLM 的 CoT 可能是假的

这一趴主要给了几个例子,说 LLM 可能会生成虚假的 CoT:

  1. 先生成错误结果,然后再写一个假的 CoT 让用户觉得结果更可信。
  2. 如果提示词中有诱导,CoT 则会有“谄媚”人的嫌疑,顺着人往下说假的 CoT。 图 14 为什么会生成假的 CoT,以及怎么避免,就是 future works 了。