【LLM】深入理解FFN
为什么要:4096 ↓ 11008 ↓ 4096为什么不是:4096 ↓ 4096为什么:GeLU?为什么:SiLU?为什么:SwiGLU?一、如果没有 FFN,会发生什么?假设Transformer 没有 FFN,只有:Token │ Attention │ Attention │ Attention会发生什么?我们知道,Attention 负责每个 Token 从其他 Token 获取信息。例如:The animal didn't cross the street because it was tired.Attention 可以让:it去看:animal获得:“它指的是 animal”但 Attention 没有创造新的特征。假设:animalEmbedding:[0.2,0.5,0.8]Attention 最后大概就是:0.9 × animal + 0.1 × street也就是说,Attention 的输出其实还是:Value 的加权平均。数学就是:Output=∑iαiVi\text{Output}=\sum_i \alpha_iV_iOutput=∑iαiViAttention 没有创造新的东西,它只是重新组合已有的信息(输出已有Token的线性组合)。这里有一个数学上的观点(以后会学):多层线性变换的组合,本质上仍然是线性变换;真正提升表达能力的是非线性(这里来自 FFN 中的 GeLU)。当然,由于 Attention 的权重 α 是由输入动态计算出来的,它本身并不是一个固定线性层,所以严格来说 Attention 整体不是线性的。但它输出的形式始终是 Value 的加权组合,这就是为什么仍然需要 FFN 去做更丰富的特征变换。而FFN负责创造新知识。FFN最简单的形式为:Linear ↓ GeLU ↓ Linear公式:FFN(x)=W2(GeLU(W1x))FFN(x)=W_2(\text{GeLU}(W_1x))FFN(x)=W2(GeLU(W1x))这其中,GeLU是最重要的,因为如果没有GeLU,W2(W1x)=(W2W1)xW_2(W_1x) = (W_2W_1)xW2(W1x)=(W2W1)x所以,真正让 FFN 有意义的是 GeLU,因为它引入了非线性。因此,Attention负责【找信息】,FFN负责【加工信息】。Transformer 最重要的一句话:Attention 负责 Token 与 Token 的交互;FFN 负责每个 Token 自身的表示变换。所以,Transformer其实是在交替进行两种计算。第一步:大家:聊天。(Attention)第二步:每个人回去,自己消化。(FFN)然后,再聊天。再消化。…为什么 FFN 参数这么多?为什么FFN要先升维。例如:4096 ↓ 11008 ↓ 4096为什么不是:4096 ↓ 2048 ↓ 4096因为,FFN 真正做的是:把一个 Token 投影到一个更大的特征空间,在那个空间里完成复杂的非线性变换,再投影回来。这一句话非常重要。升维多少合适?答案先说:升维不是一个数学推导出来的数字,而是"理论 + 工程 + GPU硬件"共同权衡的结果。最早的Transformer(2017)论文规定:modeldff=4×dmodelmodeld_{ff}=4\times d_{model}modeldff=4×dmodel为什么是 4?其实论文没有证明。就是大量实验发现:2 倍不够,8 倍收益不明显,4 倍是一个很好的折中。注意:这不是数学结论,而是经验规律。为什么不是越大越好?因为升维越大,参数量增长越快,带来的边际收益却可能递减。为什么 Llama 不是 4×?Llama Hidden为4096。如果 4 倍,应该16384。但是实际是11008。为什么?因为Llama已经不用普通 FFN。而是:SwiGLU。SwiGLU 和普通 FFN 有什么区别?普通 FFN:Linear ↓ GeLU ↓ Linear只有两层Linear。SwiGLU 实际上有三个矩阵。可以写成:SwiGLU(x)=(W1x)⊙SiLU(W3x)\text{SwiGLU}(x) = (W_1x) \odot \text{SiLU}(W_3x)SwiGLU(x)=(W1x)⊙SiLU(W3x)然后再乘 W2。也就是说,它不是两个矩阵,而是三个。参数天然变多。所以,如果还保持16384。参数是不是比原来大很多?我们算一下普通 FFN:参数大约:2×d×4d=8d22\times d\times4d = 8d^22×d×4d=8d2SwiGLU:参数有三个矩阵。总共:3×d×dff3\times d\times d_{ff}3×d×dff如果希望参数量和普通 FFN差不多。应该令:3d×dff≈8d23d\times d_{ff} \approx 8d^23d×dff≈8d2约掉d,得到:dff≈83dd_{ff} \approx \frac{8}{3}ddff≈38d注意:83=2.67\frac{8}{3} = 2.6738