本周阅读了一篇关于注意力机制相关的文章,文中提到了现有的方法都没有明确考虑用户当前行为对其下一步行动的影响。于是,论文中提出了一种新的短期注意力优先级模型作为补救措施,该模型能够从会话上下文的长期记忆中捕获用户的一般兴趣,同时考虑到用户最近点击的短期记忆中的当前兴趣。此外attention的相关内容进行进一步的学习。
This week,an article about attention mechanism is readed, which is mentioned that the existing methods does not explicitly consider the influence of users’ current behavior on their next actions. Therefore, a new short-term attention priority model is proposed as a remedial measure, which can capture the general interests of users from the long-term memory of conversation context and take into account the current interests in the short-term memory of users’ recent clicks. In addition, the relevant content of attention is further studied.
STAMP: Short-Term Attention/Memory Priority Model for Session-based Recommendation
由于用户行为的不确定性和信息的有限性,基于匿名会话的用户行为预测是基于Web的行为建模研究中的一个挑战性问题。
几乎所有基于RNN的SRS模型都只考虑将会话建模为一个项目序列,而没有明确考虑到用户兴趣随时间的迁移而产生的变化。
本文中考虑通过在SRS模型中引入一个近期的动作优先机制,即短时注意/记忆优先(STAMP)模型来解决这个问题,该模型可以同时考虑用户的一般兴趣和当前兴趣。
在典型的SRS任务中,会话由一系列命名项组成,用户的兴趣隐藏在这些隐式的反馈中。为了进一步提高RNN模型的预测精度,必须同时具备学习这种隐式反馈的长期利益和短期利益的能力。
论文研究的主要贡献:
(1)论文中引入了一个短期注意力/记忆优先级模型:一个包含跨会话项的统一嵌入空间;一个用于基于会话的推荐系统中下一次点击预测的新神经注意力模型。
(2)论文针对STAMP模型的实现,提出了一种新的注意力机制,该机制根据会话上下文计算注意权重,并根据用户当前的兴趣进行增强。输出的注意力向量被解读为用户时间兴趣的合成表示,并且比其他基于神经注意力的解决方案更敏感于用户兴趣随时间的迁移。因此,它能够同时捕捉用户的长期兴趣(响应最初的目的)和短期注意(当前的兴趣)。
(3)论文中模型分别在两个数据集上进行了评估,分别是来自RecSys 2015的Yoochoose数据集和来自CIKM Cup 2016的Diginetica数据集。实验结果表明,该方法达到了目前的水平,所提出的注意力机制发挥了重要作用。
每一个session由S = [s1, s2, … , sN]表示,St = {s1, s2, … , st}表示一个截断的序列,其中1 < t < N。
V = {v1, v2, . . . }是指所有的item,X = {x1, x2, . . . } 是item的embedding。
其中:yˆ = {yˆ1, yˆ2, … , yˆ|V |}表示输出的score向量,yˆi 对应于item vi的分数,topk用来预测。
从上图中可以看出,STMP模型以两个embeddings (ms和mt)作为输入,其中ms表示用户对当前会话的总体兴趣,被定义为产生过交互物品嵌入的平均表示:
其中:external memory是指嵌入当前会话St的以前的项序列,mt表示该会话中用户当前的兴趣。
论文中使用lastclick xt表示用户当前的兴趣,即mt =xt;由于xt是从会话的external memory中提取的,因此xt为用户兴趣的短期内存;然后利用两个MLP网络对一般兴趣ms和当前兴趣mt进行处理,实现特征提取。
使用一个简单的没有隐藏层的MLP进行特征抽象,对ms的操作定义为:
从上图中可以看出,两个模型之间唯一区别:在STMP模型中,通常是从外部存储器ms的平均值去计算用户兴趣的抽象特征向量hs,而在STAMP模型中,hs 是从基于注意力的用户的一般兴趣(实值向量ma)计算出来的。
注意力网络由两部分组成:
1)一个简单的前馈神经网络,负责为当前会话前缀St中的每个项目生成注意力权重。
2)一个注意力组合通常负责计算基于注意力的用户兴趣的函数ma。
在获得关于当前会话前缀St的注意力系数向量α=(α1, α2, …, αt ) 后,基于注意力的用户对当前会话前缀St的兴趣ma计算如下:
为了验证本文提出的短期注意力优先模型的有效性,论文中还提出了一种只有短期注意的网络模型,该模型对于next-item的预测只给予最终产生过交互的物品嵌入st,并且也只使用了一层的简单MLP进行特征提取:
使用以下指标来评估SRS模型的性能,这些指标也广泛用于其他相关工作。P@K评分被广泛用作SRS领域预测准确性的衡量标准。P @ K表示在排名列表中的前k个位置中具有正确推荐的项目的测试用例的比例。在本文中,P@20用于所有测试,定义为:
MRR@20: 所需物品t的倒数排名的平均值。如果秩高于20,则倒数秩被设置为零。
MRR是范围[0,1]的归一化分数,其值的增加反映了大多数“命中”将在推荐列表的排名顺序中出现更高,这表明相应的推荐系统的性能更好。
论文所提出的注意力机制可以捕获部分重要项目,以对感兴趣的有用特征进行建模,并通过最新的实验结果证明了STAMP的有效性。
Attention机制:它迫使模型在解码时学会将注意力集中在输入序列的特定部分,而不是仅仅依赖于decoder的输入。
定义:
从大量输入信息里面选择小部分的有用信息来重点处理,并忽略其他信息,这种能力就叫做注意力(Attention)
分类:
1.聚焦式注意力(Focus Attention):自上而下的、有意识的注意力。指有预定目的、依赖任务的、主动有意识地聚焦于某一对象的注意力。
2.基于显著性的注意力(Saliency-Based Attention):自下而上的、无意识的。不需要主动干预,和任务无关,由外界刺激驱动的注意。举例:赢者通吃(最大汇聚)或者门控机制。
计算方式:
1.在所有输入信息上计算注意力分布
2.根据注意力分布计算输入信息的加权平均。
其中W,U,v为可学习的参数,D为输入向量的维度。
当输入向量的维度D比较高的时候点积模型容易方差太大,从而导致Softmax函数梯度较小,使用缩放点积模型来解决这个问题;双线性模型是一种泛化的点积模型。
加性模型:
import torch
import torch.nn as nn
import torch.nn.functional as F
class add_attention(nn.Module):
def __init__(self, q_size, k_size, v_size, seq_len):
super(add_attention, self).__init__()
self.linear_v = nn.Linear(v_size, seq_len)
self.linear_W = nn.Linear(k_size, k_size)
self.linear_U = nn.Linear(q_size, q_size)
self.tanh = nn.Tanh()
def forward(self, query, key, value, dropout=None):
key = self.linear_W(key)
query = self.linear_U(query)
k_q = self.tanh(query + key)
alpha = self.linear_v(k_q)
alpha = F.softmax(alpha, dim=-1)
out = torch.bmm(alpha, value)
return out, alpha
attention = add_attention(100, 100, 100, 10)
q = k = v = torch.randn((8, 10, 100))
out, attn = attention(q, k, v)
print(out.shape)
print(attn.shape)
点积模型:
import torch
import torch.nn as nn
import torch.nn.functional as F
class dot_attention(nn.Module):
def __init__(self):
super(dot_attention, self).__init__()
def forward(self, query, key, value, dropout=None):
alpha = torch.bmm(query, key.transpose(-1, -2))
alpha = F.softmax(alpha, dim=-1)
out = torch.bmm(alpha, value)
return out, alpha
attention = dot_attention()
q = k = v = torch.randn((8, 10, 100))
out, attn = attention(q, k, v)
print(out.shape)
print(attn.shape)
缩放点积模型:
import torch
import torch.nn as nn
import math
import torch.nn.functional as F
class s_dot_attention(nn.Module):
def __init__(self):
super(s_dot_attention, self).__init__()
def forward(self, query, key, value, dropout=None):
d = k.size(-1)
alpha = torch.bmm(query, key.transpose(-1, -2)) / math.sqrt(d)
alpha = F.softmax(alpha, dim=-1)
out = torch.bmm(alpha, value)
return out, alpha
attention = s_dot_attention()
q = k = v = torch.randn((8, 10, 100))
out, attn = attention(q, k, v)
print(out.shape)
print(attn.shape)
双线性模型:
import torch
import torch.nn as nn
import torch.nn.functional as F
class bilinear_attention(nn.Module):
def __init__(self, x_size):
super(bilinear_attention, self).__init__()
self.linear_W = nn.Linear(x_size, x_size)
def forward(self, query, key, value, dropout=None):
alpha = torch.bmm(query, self.linear_W(key).transpose(-1, -2))
alpha = F.softmax(alpha, dim=-1)
out = torch.bmm(alpha, value)
return out, alpha
attention = bilinear_attention(100)
q = k = v = torch.randn((8, 10, 100))
out, attn = attention(q, k, v)
print(out.shape)
print(attn.shape)
注意力机制类似于人类的视觉注意力机制,通过扫描全局图像,获取需要重点关注的目标区域,忽视其他无关信息是在计算能力有限的情况下,将计算资源分配给更重要的任务,同时解决信息超载问题。
一般而言模型的参数越多则模型的表达能力越强,模型所存储的信息量也越大,通过引入注意力机制,在众多的输入信息中聚焦于对当前任务更为关键的信息,降低对其他信息的关注度可以解决信息过载问题,并提高任务处理的效率和准确性。