深度学习实验过程中的一些感悟
2025-11-28
这两天在尝试改进attention,严格来说是想把整个transformer都改了,颇有些初生牛犊不怕虎之意。在过程中遇到了一些反直觉的东西,在此做个记录与分享。
我的一个大致思路是把文本序列使用两条卷积通道分别捕捉短程和中程语义关系,但是在合并它们的时候,我遇到了一个问题。直接将其按权重相加的效果,竟然比将他们拼接后加一个MLP层的效果好不少。
直接权重求和(简化代码):
def forward(self, x):
x1 = self.conv1(x)
x2 = self.conv2(x)
mix_x = torch.cat([x1, x2], dim=-1)
x = x + self.mix_layer(mix_x)
return x
直接拼接(简化代码):
def forward(self, x):
x1 = self.conv1(x)
x2 = self.conv2(x)
lambdas = F.softmax(torch.cat([self.alpha, self.beta], dim=-1), dim=-1)
x = x + lambdas[0] * x1 + lambdas[1] * x2
return x
这两种方法使用pytorch默认初始化,在20_newsgroups这一文本分类数据集上做了实验,前者比后者的测试集准确率低了10%多。
MLP的表达能力当然是比线性组合好的,那么问题出在哪呢?
一番思考之后,我认为是加入了MLP后,误差传播到卷积层的时候被MLP衰减了,导致梯度较小,训练效果不佳。如果加上一个残差连接,结果就大不相同。(当然我也不确定,读者有其它的解释也可以邮件与我沟通)
我又想了一番之后,感觉就是这样。
人工智能发展到如今,有许多复杂的架构,这些架构大多从宏观的表达能力,复杂的数学(对我而言),人类的认知入手。但是我们有时还是应该还是停下来,把目光放在其根本的反向传播上。因为人工智能之所以学习,就是因为它可以用反向传播理解“错误”,并让它往正确的方向迈进。也许,对其底层的学习机制的探索,比设计架构更有意义,也可能更有效果。
Transformer爆火之后,各种公司都在疯狂研究ai,该架构,爬数据,堆算力,在这样的狂潮中确实涌现了许多实用工具。但我相信,这不是唯一的道路,在人工智能这条路上,方法一定比算力重要。人还是敢于在奔跑中停下来,静静停在路边,思考一下自己的终点,自己是否走在正确的路上。
也许,回到一切的起点,走上另外那条未选择的路,才是真正的勇敢。