注意力机制
谁曾想呢,看个新论文反倒是把这个Transformer看懂了haihiahia
如果和我一样对张量理解的不好的,请时刻注意:
- 批处理的独立性:一个批次内部的样本相互独立,我们在计算的时候是针对各个样本内部的token进行的,各个样本彼此独立
- 特征提取:一个[B,L,d]的输入在经过一个神经网络以后,可以得到输出[B,L,d'],还是原来的B个用户,但是用户的每个token(物品)的特征不再是原来的d维度表示,而是d'维度表示
注意力机制
输入:E[B,L,d],这里以推荐系统为例子,输入[64,128,256]表示我们一次处理64个用户(记得批处理独立性,这64个样本完全独立,计算的过程相当于样本一个个通过模型),每个用户有一个长度为128的偏好物品序列,相当于我们具有每个用户喜爱的128的物品,256表示每个物品在256个特征上的值,我们的目标是根据每个用户的已知物品序列,在物品池中计算每个物品对于用户的匹配度
先放一个总览图

首先我们要知道Q,K,V都是原始输入E经过特征提取后的张量,其实和输入E没有本质区别,只是关注的特征维度变了,分别变成d_q,d_k,d_v
为了计算每个样本内部各个位置之间的相似度关系,我们用Q和K做内积,[B,L,d_k]·[B,L,d_k]^T->[B,L,L],表示每个样本内部各个位置之间的相似度,可以理解为其他位置对于当前位置的重要程度,把[B,L,L]做一个softmax以后,可以理解为,针对每个样本内部的一个位置,其他位置对我这个位置的参考程度有多大,
V表示每个位置对外展露的特征,我们把计算相似以后的[B,L,L]与V矩阵进行内积以后,得到序列每个位置的特征都整合了其他位置的信息,
由于现实中序列的位置具有先后性,一个位置只能获取在他之前的位置的特征,所以我们设置了位置掩码,在和V做内积时,每一项会乘上S_ij,当j>i时该项为负无穷,这样最终得到的概率趋近于0,表示当前位置不能从后续位置学到任何信息。
这只是一个head在做的事情,实际上我们设计了h个头,每个头可以学习不同的特征,每个head学习什么特征是由W_q,W_k,W_v矩阵决定的,比如第一个head学习物品的类型,第二个head学习物品的时间序列,第三个head学习物品的品牌和价格,最后我们会对所有head的输出做一个整合concat,首先将所有head输出直接在最后一个维度上进行拼接,得到[B,L,hd_v],然后乘上一个矩阵[hd_v,d]得到和输入一样类型的输出张量[B,L,d]
以上就是注意力机制部分的内容了,注意力机制使得序列中每个位置整合了在他之前的位置(token)的信息,此时序列中最后一个token整合了前面所有位置的信息,可以通过该位置的d个特征预测未来的状态
但是实际上我们在注意力输出后,会让输出张量经过一个残差层和LayerNorm,把输出信息加上原始输入信息,防止梯度消失,[B,L,d]+[B,L,d]->[B,L,d];
以及加上一个FNN前馈神经网络,FNN由两层的MLP([d,d'],[d',d])实现,在MLP中先将特征放大到d’维度,再压缩回原先的d维,输出仍然是[B,L,d],因为注意力机制基于线性变化,FNN增加了非线性变化,增加模型对token的整合能力
最后预测下一个物品的时候我们只需要每个用户序列最后一个位置的d维度特征,因为这个位置整合了前面所有位置的信息,我的理解是用最后的位置来预测,前面的位置用于训练,
所以我们提取出B个样本最后一个位置的特征,相当于将L这个维度隐藏掉:[B,L,d]->[B,1,d]
整体框架如下

注意力机制到此就结束了,接下来讲讲用于推荐系统时,如何根据最后一个位置的特征,计算待选物品的匹配度
我们的输出为[B,d],表示B个用户的物品喜爱偏好,每个用户的偏好用d维的特征表示,
同时,物品池中的物品也需要具有d维的特征,我们将N个物品一起输入[d,N],[B,d]*[d,N]->[B,N],得到N个物品在B个用户上各自的得分,对于每个用户,选择得分最高的前几个物品即可作为推荐系统的推荐选择。

浙公网安备 33010602011771号