作者 | 诗品算法
说好要经常更新,一定要坚持下来!前段时间在蘑菇街首页推荐视频流场景测试deep模型结构时,发现self attention的效果居然不如简单的traditional attention!问题出在哪里?
作为一种资源分配方案,将计算资源分配给最重要的任务。注意力是人类与生俱来不可或缺的认知功能。我们在日常生活中,会通过嗅觉、触觉、听觉、视觉感受到来自四面八方不同信息的鱼贯涌入,而我们却能在如此繁杂的信息轰炸中,区分主次,并挑选出最重要的信息进行加工处理,同时忽略其他不重要的信息。这种能力就是注意力。比如,查理.芒格可以做到专注地读书而不受到任何外界环境的干扰。这就是具有极强专注力的体现,相信多数读者在工作或阅读中也有此种体会。
在开始实践之前,有必要先简要回顾一下火遍宇宙的self-attention。下面是我迄今为止看到的最易懂的描述,参考邱锡鹏老师的《神经网络与深度学习》 。我会结合推荐系统的场景对其进行叙述。用 表示N组输入向量,其中每个向量 都表示一组输入信息。注意力机制的计算分为两个步骤:1、在所有输入信息上计算注意力分布;2、根据注意力分布计算输入信息的加权平均。在推荐场景, 表示用户的 个历史行为序列(可以是点击序、加购序、成交序等等), 则表示序列中每一个元素的embedding表达。
注意力分布
为了从输入向量(历史序列) 中选择出和特定任务(待排视频内容)相关的信息,我们需要引入一个与任务相关联的表示,称为查询向量(Query Vector),并通过打分函数来计算每个输入向量与查询向量之间的相关性。
给定一个Query vector: ,我们用注意力变量 来表示被选择信息的索引位置,即, 表示选择了第 个输入向量。在这里,我们选择“soft”信息选择机制,计算在给定 和 的情况下,选择第 个输入向量的概率 :
其中, 就是注意力分布(Attention Distribution), 就是注意力打分函数,这种函数的计算方式有以下几种,这些我们都有尝试过,后面会给出实验结论。
其中, 均是可学习的参数, 是输入向量的维度,也就是 的维度,一般是128维/64维/32维,最优值可以根据实际情况选择。理论上,当 较小时,加性模型和点积模型的复杂度无差,但是点积模型可以更好地利用矩阵乘积,因此计算效率更高。
但是,若输入向量的维度 比较高时,点积模型的方差会较大,从而导致softmax函数的梯度较小(softmax后非0即1,无信息量)。缩放点积模型就可以很好地解决这个问题,使内积不至于太大。双线性模型实际上是一种泛化的点积模型,假设 ,则,双线性模型可以写成: ,太有意思了!这相当于分别对 和 进行线性变换后计算点积。双线性模型的优势是,在计算相似度时,引入了非对称性。
加权平均
注意力分布 是在给定任务相关的查询 时,第 个输入向量受关注的程度。我们采用一种“soft”的信息选择机制,对输入信息进行merge。软性注意力机制如下:
由此可见,选择的信息是所有输入向量在注意力分布下的期望。
Attention
熟悉的图,熟悉的公式,熟悉的attention。当我们的打分函数为缩放点积模型时,attention如下:
公式与Google论文里一致。其中, , , ,由queryies和keys组成的输入维度均为 ,values的维度为 。如果忽略softmax的话,attention本质上就是三个 的矩阵相乘,结果就是一个 的矩阵,attention实际上就是将 的输入序列 编码成一个 的输出序列。
self-attention
对于self-attention来讲, 三个矩阵均来自同一输入。
traditional attention
与self-attention相比,这个公式就简单多了。输入 经过两层全连接,再经过softmax,与原始的寄己进行点乘(非矩阵乘法)。输入序列的两两元素之间无任何交互。
我们的输入序列是用户在蘑菇街首页的实时点击序列,按照点击发生时间进行排序,序列从左至右,对应着点击时间由近及远。我们使用wide & deep结构进行模型训练。target是待排视频id。target和用户侧序列分别经过self attention/traditional attention层,我们通过加减乘等操作将两侧的表达进行信息融合,最后再通过两层dense全连接,得到最终的概率值。
参数共享,指的是target目标与用户侧序列attention结构的trainable参数共享。
总结:
1、参数是否共享
2 VS 3,相比于两侧参数不共享的结构,共享时,整体AUC提升千分之一,deep侧AUC提升千分之三,且大大加速了训练过程。
2、改变打分函数(Q和K的融合方式)
我们的self_attention结构采用经典的QKV方式,QK的计算方式使用缩放点积模型。我们将缩放点积模型改成双线性模型,即分别对Q和K进行线性变换后,再计算点积。
3 VS 4,QK分别线性变换,整体AUC无差异,deep侧AUC下降千分之二。3 VS 5,QK分别线性变换 + 非线性激活,整体AUC表现无差,deep侧AUC提升千分之二。
3、traditional attention + self attention
将两种不同的attention结构进行merge,对两个结构的输出rep进行concat。1:traditional attention;5:self attention;9:1+5
merge 与 traditional attention的总体AUC无差异,deep AUC涨千分之三。
这是否说明,traditional attention学到的信息比self attention更多呢?
traditional attention不会使序列内部进行两两交叉,但是self attention会通过 ,使得输入序列两两之间都会进行计算。这也从侧面说明,用户历史点击序列两两之间,并无明显相关性。
至于真正的核心原因,我并没有idea。大家可以留言讨论。
这让人想起了奥卡姆剃刀原则:“如无必要,勿增实体”。有时候,模型并不是越复杂越好,“在其他一切同等的情况下,较简单的解释普遍比较复杂的好“。所以,当你堆叠了无数高大上的复杂网络结构,但离线AUC和线上指标却一直上不去时,是不是可以考虑从特征、样本甚至产品改进等层面入手呢?
参考:
1、邱锡鹏:《神经网络与深度学习》
2、attention is all you need论文:https://arxiv.org/pdf/1706.03762.pdf