AI 学习记录
入门比较久了,还有很多东西需要学(每次看到论文里的数学公式都看不懂),记录一些东西,也希望能帮到他人
持续更新
Reinforcement Learning (RL)
huggingface course
非常详细的课程,有一些较难的东西用中文解释一下
在 unit.4 Policy Gradient 中,主要研究 stochastic policy,用到了几个东西:
θ \theta θ 表示模型参数, τ \tau τ 表示一组游戏过程, τ \tau τ 由 s t , a t s_t,a_t st,at 组成,分别表示 state action, R ( τ ) R(\tau) R(τ) 表示这次游戏的打分
π \pi π 表示策略 policy, π θ \pi_\theta πθ 表示我们需要训练的那个模型。模型输入是 state,输出是 action,即输入当前游戏局面输出下一步操作
J ( θ ) J(\theta) J(θ) 表示这组模型参数的打分。数学定义为: J ( θ ) = ∑ τ P ( τ ; θ ) R ( τ ) J(\theta) = \sum_\tau P(\tau;\theta) R(\tau) J(θ)=τ∑P(τ;θ)R(τ) 表示枚举**任意一个**可能的游戏(当然这是不能枚举的),计算它出现的概率乘以它的打分。一组较好的模型参数会让打分高的游戏尽可能多出现,从而提升 J ( θ ) J(\theta) J(θ)。
我们要优化
θ
\theta
θ 朝着更高的
J
(
θ
)
J(\theta)
J(θ) 移动。把梯度下降改成梯度上升(减少 loss 变成增加打分,也就是把那个减号改成加号)。接下来难点来了,需要计算
∇
θ
J
(
θ
)
\nabla_\theta J(\theta)
∇θJ(θ)。我们只能使用**采样**来估计这些值。一开始我没有看懂为什么要把那些东西拆开。想像一下,现在我们要计算或者说估计
J
(
θ
)
J(\theta)
J(θ),通过采样,我们可以每次等概率随机一个
τ
\tau
τ,我们随机
m
m
m 次,算这些
τ
\tau
τ 的
R
(
τ
)
R(\tau)
R(τ) 的平均值,就可以得到
J
(
θ
)
J(\theta)
J(θ) 的一个估计。对照
J
(
θ
)
=
∑
τ
P
(
τ
;
θ
)
R
(
τ
)
J(\theta) = \sum_\tau P(\tau;\theta) R(\tau)
J(θ)=∑τP(τ;θ)R(τ) 的式子,相当于我们只能采样的情况下,必须要保留一个单独的
P
(
τ
;
θ
)
P(\tau;\theta)
P(τ;θ),然后采样的时候给它去掉。高,实在高 然后计算
J
(
θ
)
J(\theta)
J(θ) 的斜率,为:
∇
θ
J
(
θ
)
=
∑
τ
∇
θ
P
(
τ
;
θ
)
R
(
τ
)
=
∑
τ
P
(
τ
;
θ
)
∇
θ
P
(
τ
;
θ
)
P
(
τ
;
θ
)
R
(
τ
)
=
∑
τ
P
(
τ
;
θ
)
∇
θ
log
P
(
τ
;
θ
)
R
(
τ
)
\begin{align} \nabla_\theta J(\theta) & = \sum_\tau \nabla_\theta P(\tau;\theta) R(\tau) \\ & = \sum_\tau P(\tau;\theta) \dfrac{\nabla_\theta P(\tau;\theta)}{P(\tau;\theta)} R(\tau) \\ & = \sum_\tau P(\tau;\theta) \nabla_\theta \log P(\tau;\theta) R(\tau) \\ \end{align}
∇θJ(θ)=τ∑∇θP(τ;θ)R(τ)=τ∑P(τ;θ)P(τ;θ)∇θP(τ;θ)R(τ)=τ∑P(τ;θ)∇θlogP(τ;θ)R(τ)
所以这个
log
\log
log 推出来是为了让前面多一个单独的
P
(
τ
;
θ
)
P(\tau;\theta)
P(τ;θ),这样才能通过采样来估计。感觉原文这点解释得不好。后面带求导的部分直接在模型内部可以解决。
2024.2.27
LLM
Interpretability
我希望能解释 LLM 内部每层在干什么。在开始看论文之前有几种想法:
- 将 Attention Score (softmax 之后的值)可视化并统计
- 把每层的 hidden state 拿出来训练最终结果或下游任务
Attention Score 可视化已经有了,叫 exBERT,在 huggingface 上可以试用。
统计的有一篇 stanford 的论文,What Does BERT Look At? An Analysis of BERT’s Attention。进行了相当详细的分析:
一些 attention head 会专门识别语义关系,比如给一个动词找到它的 subject。当起不到作用时,会连向 [SEP] 充当一个 nop 操作啥也不干。在模型外面接了个简单的 Dense 就可以大幅提升 word dependency parse 的准确率。此外还用 multidimensional scaling 画了不同 attention heads 的距离分布图。
这篇论文主要的贡献是找到了一些 attention head 将注意力集中到 token 与 token 之间的语法关系上。但是并不能解释逻辑。
把每层 hidden state 拿出来训练的方案也有论文,Eliciting Latent Predictions from Transformers with the Tuned Lens。这种方案在前面的 layer 训练出来的效果不错,并且论文最后用颜色标注了一句话中的每个词,可以发现词组中的第二个词基本上是在很浅的层数就预测出来了,在句子结构完整的时候句号也很早预测出来了。还有一些图表记录每个 layer 之间的距离,看得出来前几层和最后一层比较反常,但这里面并不能推测出什么东西,或者说看不出来中间层在干什么。
这篇论文主要的贡献是发现了 transformer 不同层之间迭代的时候确实有在进行思考。至于它在思考什么就不太清楚。
还有一篇有趣的论文 In-context Learning and Induction Heads 讲了 In-context learning 的内部机制,不过没有仔细读。
在一些只有 2 层 transformer 的语言模型中,可以很清晰地观测到它干了这么一件事情:当它准备要说重复的短语时,它会在输入中找到当前 token 在前面出现的位置,然后把下一个单词抄过来。比如说如果输入有两个挨在一起的 tokens A B,输出的时候输出到 A,那么下一个预测的单词有较大可能会把 B 抄过来。当层数很多的时候无法复现,但使用训练的一些观测技巧可以证实这一点。当语言模型更强的时候,它观测和 copy 的东西就不只是两个一样的 token 或挨在一起的关系,而会捕捉一些更抽象的信息。
这篇论文主要的贡献是解释了 In-context learning 的机制。看得出来对一些简单任务,AI 已经从语法信息上升到了抽象信息。
一篇 stanford 的论文:Interpretability at Scale: Identifying Causal Mechanisms in Alpaca。没有看,根据 consensus,这篇论文发现 AI 对于一些简单数学题存储了两个 bool 变量。
一篇北大的论文:Knowledge Neurons in Pretrained Transformers 找到了 MLP 中的记忆神经。不过 LLM 对于记忆和其他东西似乎是不区分的。
那么现在已经看了一些前沿科技了,其他论文可能还是有点花里胡哨。现有科技的共同点在于无法发现 AI 的逻辑。语法信息有 stanford 的库可以用,attention score 可以看出语法,但是逻辑是真的没有办法展示出来。
LLM 是否存在逻辑?
个人观点:
数据量足够大时确实可以,做数学题的那个例子可以证明。但是上升到逻辑的时候,如果不改变架构,那么 scaling law 将不再成立。模型增长对数据量的增长不会是线性增长而会是指数增长,可能逻辑链的长度每增加一,数据量需要翻几十倍。另外模型体积也会决定它的逻辑链长度。
现在 LLM 一个较大的问题在于它内部架构跟外部是隔离开来的,它表现上一套,背地里又另一套。我们不能进行调试,并且几乎可以肯定的是它根本就没有学会除了语法和猜答案之外的任何东西。相当于一个没有脑子但是有一个无限容量的记忆的人以衡水模式卷了
1
0
100
10^{100}
10100 年之后去参加高考。你对它说的任何东西它都不明白,但是它会默默地记录下来。它对这个世界的理解与我们人类的不同,仅仅是数学上的拟合。另一个问题是它无论干什么都要把所有东西算一遍,这其实不太符合人类的思考方式。
为什么 AI 占领了棋类却无法打败数学题和算法题?一个是因为数据格式,目前提取语义信息没什么问题,但是我们不知道它提取的信息跟我们想的是不是一样的,更没法用题解来教它做题。另一个是因为架构。
目前的 transformer 架构和 attention 机制仍然没有被解释清楚,并且 attention score 一些程度上说明了 attention 或许仅仅是找到了一个符合语法的模块,它不一定符合逻辑推理。
或许光靠 scaling law 是不可以实现 AGI 的,GPT 当作辅助工具用当然很强,但是这条路很可能走不通。包括现在做算法题的 AI 也都是因为 data leakage 才能做出简单题。attention 在语法方面很强,但在逻辑方面估计比全连接要差吧。目前的想法是语言模型当然可以作为基石,但架构和逻辑链的表达方式肯定是要改的。如果我们没法解释 transformer 中间到底干了什么,那就自己创造另一个,在训练过程中加入调试信息
(以上为个人观点)
2024.2.29
好了个人观点得到了证实。继续阅读前沿科技,有一篇论文非常 nb:Thinking Like Transformers,将 transformer 可以进行的操作进行了归纳,写成了 RASP 语言,可以编译成 transformer。
具体来说它将 attention 和 MLP 分为了三种操作:select, aggregate 和其他操作。其中 select, aggregate 用于 attention,其他操作表示 MLP。这个语言输入一个长为
n
n
n 的序列,输出一个长为
n
n
n 的序列表示 transformer 的隐空间。这个语言能够类似 CTF 中的一些 PPC 题,通过手动编写程序我们可以完成几种算法操作:
- histogram 计数 e.g., “hello” -> [1, 1, 2, 2, 1]
- sort 排序 e.g., “adcb” -> “abcd”
- reverse 翻转 e.g., “abcd” -> “dcba”
- Dyck-k PTF 对输入的括号序列的每一个前缀,判断它是合法 T、不合法 F 或只能成为合法的前缀 P,e.g., “()())” -> “PTPTF”
还有一些别的。这里面让我比较震惊的是它居然能学会排序,但仔细一看原来是只能排 26 个字母,它他妈学的是桶排……,理论上它是不可能学会冒泡排序的,因为 transformer 是不可能学会循环的,它的层数太固定了,只能用 MLP 进行 element-wise operations。不过根据 RASP 语言我们的确可以写出一个桶排的算法。
后面还有更多的研究,比如 multi-step reasoning。这个就很搞笑,现在有了 RASP,先前很多测试 reasoning 都是没用的。比如论文中的例子:
- “Ben is a bird”
- “birds can fly”
得出 “Ben can fly"
再加一个条件:
- “only winged animals can fly”
可以得出 “Ben is a winged animal”
本来以为 transformer 有能力理解了,但实际上这就是一个简单的算法,对每对(名词,条件)设置一个 bool 表示这个名词是否满足,然后通过简单的语义分析对这个类似 01 矩阵的玩意儿进行一个扩散。这里面最大的问题在于:能用 RASP 表示的东西 transformer 可以学会,但是不能用 RASP 表示的东西它就不可能做到举一反三。
好奇为什么这么好的文章引用只有 66 个
还有一篇基于 RASP 的论文探索了 length generalization,也就是对前面这几个算法 train from scratch,然后在测试的时候增加输入长度,看它能不能正确回答。很有意义的研究。它说明了 length generalization 真的不太行,因为按理说这些算法比如桶排是不基于长度的,但是它的 accuracy 却能从 100% 掉到 80% (这个数据是找众数的)。还有些是完全没有 length generalization。
目前看来用 transformers 做题真的没什么希望,从 RASP 的 element-wise 操作局限性可以看出。attention 的作用基本上一个是处理语法,另一个是处理词与词的信息传递,比如前面那个 01 矩阵的扩散。数据匮乏也是一大因素,内部与外部分离的本质也是。现在还没有看调试 LLM 的论文。
Integrated Gradient
这是一个类似于 Grad-CAM 的工具,用于识别输入对输出的作用程度,被很多论文应用。令一个模型是一个函数
F
:
R
n
⇒
[
0
,
1
]
F: \R^n \Rightarrow [0, 1]
F:Rn⇒[0,1],公式:
I
G
i
(
x
)
=
(
x
i
−
x
i
′
)
∫
α
=
0
1
∂
F
(
(
1
−
α
)
x
′
+
α
x
)
∂
x
i
d
α
IG_i(x) = (x_i-x'_i)\int_{\alpha=0}^{1} \dfrac{\partial F((1-\alpha)x' + \alpha x)}{\partial x_i} \mathrm{d} \alpha
IGi(x)=(xi−xi′)∫α=01∂xi∂F((1−α)x′+αx)dα
x
′
x'
x′ 是一个基准,一般用全 0 向量,在图像、语言方面都可以用。这个 Integrated Gradient 保留了很多很好的数学性质,实际应用中只需要把
[
0
,
1
]
[0,1]
[0,1] 分成 20~300 段进行估计。
版权归原作者 LLLZDQ 所有, 如有侵权,请联系我们删除。