注意力机制到底是什么?


23

在过去的几年中,各种深度学习论文都使用了注意力机制。Open AI研究负责人Ilya Sutskever热情地称赞了他们:https ://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0

普渡大学的Eugenio Culurciello声称应该放弃RNN和LSTM,而转而使用纯粹基于注意力的神经网络:

https://towardsdatascience.com/the-fall-of-rnn-lstm-2d1594c74ce0

这似乎有点夸张,但不可否认的是,纯粹基于注意力的模型在序列建模任务中做得很好:我们都知道Google恰当命名的论文,Attention是您所需要的

但是,基于注意力的模型到底是什么?我还没有找到关于此类模型的清晰说明。假设我要根据给定的历史值来预测多元时间序列的新值。很清楚如何使用具有LSTM单元的RNN来做到这一点。对于基于注意力的模型,我该怎么做?

Answers:


20

注意是一种通常通过查找向量u将一组向量vi聚合为一个向量的方法。通常情况下,v uvi要么是输入到模型或先前时间步长的隐藏状态,或者隐藏的状态中的一种电平下降(在层叠LSTMs的情况下)。

结果通常称为上下文向量c,因为它包含与当前时间步长相关的上下文

此附加上下文向量c然后,也被馈送到RNN / LSTM中(可以简单地与原始输入连接在一起)。因此,上下文可以用于帮助预测。

最简单的方法是计算概率向量p=softmax(VTu)c=ipivi,其中V是所有先前vi的串联。通用查找向量u是当前隐藏状态ht

对此有很多变体,您可以根据需要使事情变得复杂。例如,代替使用viTu作为对数,可以选择f(vi,u),其中f是任意神经网络。

序列到序列模型的常见关注机制使用p=软最大qŤw ^1个v一世+w ^2HŤ,其中v是编码器的隐藏状态,ht是当前隐藏状态解码器。qW均为参数。

一些论文展示了注意力观念的不同变化:

指针网络将注意力集中在参考输入上,以解决组合优化问题。

循环实体网络在读取文本时会为不同的实体(人员/对象)维护单独的内存状态,并通过注意更新正确的内存状态。

变压器模型也充分利用了注意力。他们的注意力制剂是稍微更通用的,并且还涉及密钥矢量ki:注意权重p实际计算出的密钥和查找之间,并在上下文然后与构造vi


这是一种注意力集中形式的快速实现方法,尽管我不能保证它通过了一些简单的测试后仍然是正确的。

基本RNN:

def rnn(inputs_split):
    bias = tf.get_variable('bias', shape = [hidden_dim, 1])
    weight_hidden = tf.tile(tf.get_variable('hidden', shape = [1, hidden_dim, hidden_dim]), [batch, 1, 1])
    weight_input = tf.tile(tf.get_variable('input', shape = [1, hidden_dim, in_dim]), [batch, 1, 1])

    hidden_states = [tf.zeros((batch, hidden_dim, 1), tf.float32)]
    for i, input in enumerate(inputs_split):
        input = tf.reshape(input, (batch, in_dim, 1))
        last_state = hidden_states[-1]
        hidden = tf.nn.tanh( tf.matmul(weight_input, input) + tf.matmul(weight_hidden, last_state) + bias )
        hidden_states.append(hidden)
    return hidden_states[-1]

请注意,在计算新的隐藏状态之前,我们仅添加几行:

        if len(hidden_states) > 1:
            logits = tf.transpose(tf.reduce_mean(last_state * hidden_states[:-1], axis = [2, 3]))
            probs = tf.nn.softmax(logits)
            probs = tf.reshape(probs, (batch, -1, 1, 1))
            context = tf.add_n([v * prob for (v, prob) in zip(hidden_states[:-1], tf.unstack(probs, axis = 1))])
        else:
            context = tf.zeros_like(last_state)

        last_state = tf.concat([last_state, context], axis = 1)

        hidden = tf.nn.tanh( tf.matmul(weight_input, input) + tf.matmul(weight_hidden, last_state) + bias )

完整的代码


p=softmax(VTu)ic=ipivipiVTvVTv

1
zi=viTup=softmax(z)pi=eizjejz

ppi

1
是的,这就是我的意思
shimao

@shimao我创建了一个聊天室,让我知道您是否有兴趣谈论(不关心这个问题)
DeltaIV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.