3

LSTM的注意机制是一个直接的softmax前馈网络,它接收编码器每个时间步的隐藏状态和解码器的当前状态。LSTM注意如何能够输入可变长度

这些2个步骤似乎矛盾并且无法绕到我的头: 1)需要被预先定义 2)编码器的隐藏状态的数量是可变的的输入的前馈网络的数量(取决于在编码期间的时间步数)。

我误会了什么吗?训练与训练常规编码器/解码器网络一样,还是需要单独训练注意机制?

由于提前

回答

6

今天我问自己同样的事情,发现了这个问题。我自己从来没有实施过关注机制,但是从this paper看来,它似乎不仅仅是一个简单的softmax。对于每个输出y 解码器网络的,上下文矢量Ç被计算作为编码器的加权和隐藏状态ħ ,...,ħŤ

ç I1ħ + ... +α 智达ħŤ

的时间步骤的数量T可以是对于每个样品不同,因为系数α IJ不是固定尺寸的向量。实际上,它们是由SOFTMAX(E I1,...,E 智达),其中各E IJ是其输入的神经网络的输出计算是编码器隐藏状态ħĴ和解码器隐藏状态小号 I-1

Ë IJ = F(小号 I-1ħĴ

因此,我计算ÿ之前,该神经网络必须被评估t次,的T的权重α I1,...,α智达。另外,this tensorflow impementation可能会有用。

+2

恭喜你的第一个答案,它表明研究,格式化很好! – trincot

+0

很酷的答案,谢谢你指出的代码资源。 –

+1

由于T是可变数量的输入,我仍然有点困惑。在仔细阅读论文和您提供的实现之后(谢谢你的提问,这个答案太好了!),似乎解决方案是简单地修正时间步数T的上限。为了计算alpha值,这需要标准的神经网络层转换,我们需要决定从该转换输出的固定数量的alpha值。尽管如此,我希望得到关于这一点的坚实证实。从这篇文章和其他文章推断真的很难。 –

1
def attention(inputs, size, scope): 
    with tf.variable_scope(scope or 'attention') as scope: 
     attention_context_vector = tf.get_variable(name='attention_context_vector', 
              shape=[size], 
              regularizer=layers.l2_regularizer(scale=L2_REG), 
              dtype=tf.float32) 
     input_projection = layers.fully_connected(inputs, size, 
              activation_fn=tf.tanh, 
              weights_regularizer=layers.l2_regularizer(scale=L2_REG)) 
     vector_attn = tf.reduce_sum(tf.multiply(input_projection, attention_context_vector), axis=2, keep_dims=True) 
     attention_weights = tf.nn.softmax(vector_attn, dim=1) 
     weighted_projection = tf.multiply(inputs, attention_weights) 
     outputs = tf.reduce_sum(weighted_projection, axis=1) 

return outputs 

希望这块代码可以帮助您了解关注如何工作的。 我在文档分类的工作,这是一个LSTM注意力模式,从您的编码器,解码器模型不同使用此功能。