1.attention干什么的
attention模拟的是人脑的注意力模型,举个例子来说,当我们观赏一幅画时,虽然我们可以看到整幅画的全貌,但是在我们深入仔细地观察时,其实眼睛聚焦的就只有很小的一块,这个时候人的大脑主要关注在这一小块图案上,也就是说这个时候人脑对整幅图的关注并不是均衡的,是有一定的权重区分的。这就是深度学习里的Attention Model的核心思想。
2.attention原理
我们在翻译machine的时候主要想关心机器而不是学习。
因为attention其实就是一个当前的输入与输出的匹配度,在上文中就是h1和z0的匹配度,其中的match为计算这两个向量的匹配度的模块,出来的α10即为由match算出来的相似度。(这里的相似度可以用很多比如余弦相似度)
3.HAN原理
层级“注意力”网络的网络结构如图1所示,网络可以被看作为两部分,第一部分为词“注意”部分,另一部分为句“注意”部分。整个网络通过将一个句子分割为几部分(例如可以用“,”讲一句话分为几个小句子),对于每部分,都使用双向RNN结合“注意力”机制将小句子映射为一个向量,然后对于映射得到的一组序列向量,我们再通过一层双向RNN结合“注意力”机制实现对文本的分类。
简而言之,就是一个文本而言,重要的词构成句子,重要的句子构成文本,那么就可以找出文本的意思了,那么就可以进行分类
4.attention模型进行分类
def _attention(self, query, attn_states):
conv2d = nn_ops.conv2d
reduce_sum = math_ops.reduce_sum
softmax = nn_ops.softmax
tanh = math_ops.tanh
with vs.variable_scope("attention"):
k = vs.get_variable(
"attn_w", [1, 1, self._attn_size, self._attn_vec_size])
v = vs.get_variable("attn_v", [self._attn_vec_size])
# 相当于所有的h_j
hidden = array_ops.reshape(attn_states,
[-1, self._attn_length, 1, self._attn_size])
# 计算Uh_j,shape:[[None, attn_len, 1, attn_vec_size]]
hidden_features = conv2d(hidden, k, [1, 1, 1, 1], "SAME")
y = _linear(query, self._attn_vec_size, True)
# 计算WS_i
y = array_ops.reshape(y, [-1, 1, 1, self._attn_vec_size])
# attention相似度计算公式,s\in R^{-1, attn_len},对应所有的e_{ij}
s = reduce_sum(v * tanh(hidden_features + y), [2, 3])
# a \in R^{-1, attn_len},对应论文中的\alpha
a = softmax(s)
# 计算上下文向量c_i=\sum \alpha_{ij} * h_j
d = reduce_sum(
array_ops.reshape(a, [-1, self._attn_length, 1, 1]) * hidden, [1, 2])
new_attns = array_ops.reshape(d, [-1, self._attn_size])
# 扔掉最早的一个attention-states
new_attn_states = array_ops.slice(attn_states, [0, 1, 0], [-1, -1, -1])
return new_attns, new_attn_states
参考代码:https://cairohy.github.io/2017/06/05/ml-coding-summarize/Tensorflow的RNN和Attention相关/