即插即用的注意力机制家族代码大全
原创: ronghuaiyang AI公园
点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”
作者:ongunuzaymacar
编译:ronghuaiyang
导读
之前给大家介绍了一些attention相关的内容,今天给大家分享一个github仓库,实现了attention家族的几乎所有的类型,而且即插即用,非常方便。
介绍
这个仓库包含了对整个注意力机制家族的自定义层的实现,兼容TensorFlow和Keras。注意力机制改变了机器翻译,其在自然语言处理领域的应用日益广泛。从更广泛的意义上说,它们的目标是消除由RNNs中输入序列产生的隐藏状态的固定长度编码而导致的信息压缩和丢失。这个仓库中的层是专门为多对一序列任务定制的,比如情感分类和语言模型。
注意力机制的类型
自注意力机制
程建鹏等在“Long Short-Term Memory-Networks for Machine Reading”中首次提出。其思想是将来自输入序列的相同隐藏状态空间的不同位置关联起来,基于多个组件共同构成序列的整体语义这一论点。这种方法通过多跳注意力将这些不同位置的信息组合在一起。这种特殊的实现遵循了周汉林等人的“A Structured Self-Attentive Sentence Embedding”,其中,如果注意力机制总是提供类似的标注权重,作者提出了一个额外的正则化损失的度量,以防止嵌入矩阵的冗余问题。
全局(软)注意力
Dzmitry Bahdanau等人在Neural Machine Translation by Jointly Learning to Align and Translate中首次提出这个概念。其思想是基于编码器RNN的所有隐藏状态,推导出一个上下文向量。因此,这种类型的注意力关注的是整个输入状态空间。
局部(硬)注意力
徐立文等在"Show, Attend and Tell: Neural Image title Generation with Visual Attention"中首次引入,Minh-Thang Luong等人在Effective Approaches to Attention-based Neural Machine Translation中将其应用于NLP中。其思想是通过将注意力集中在从输入序列派生出来的隐藏状态集合中的一小部分token上,从而减少全局注意力的成本。这个窗口为 [p_t-D,p_t+D]
,其中 D=width
,我们忽略了跨越序列边界的位置。对齐位置 p_t
通过a)单调对齐: 令 p_t=t
,或b)预测对齐:令 p_t=S*sigmoid(FC1(tanh(FC2(h_t)))
,其中全连接层是可训练的权重矩阵。由于 tf.cast()
和类似的方法,生成整数索引值是不可微的,因此该实现派生一个对齐的位置的浮点值,并使用高斯分布来调整所有源隐藏状态的注意力权重,而不是切割实际窗口。我们还提出了一个实验性的对齐类型,c)完全预测对齐:设置 p_t
,如ii)中所示,但是将它应用于所有源隐藏状态( h_s
),而不是目标隐藏状态( h_t
)。然后,选择顶部的 @window_width
位置来构建上下文向量,其余部分为零。
对齐函数
每个函数都会计算给定目标隐藏状态( h_t
)和源隐藏状态( h_s
的对齐分数。
其中H为编码器RNN给出的隐藏状态数,其中Wa和va为可训练权矩阵。
实现细节
-
应该注意的是,每一层都只在多对一序列生成中使用应用程序进行测试,但是理论上应该能够适应其他领域,只需要稍微调整。一个明显的想法是用
tf.keras.layers.TimeDistributed()
为多对多序列任务包装层。 -
-每一层都是
tf.keras.layers.Layer()
的子类。 -
每个自定义类的
__init__()
方法调用其父类的初始化方法,并定义特定于每个层的其他属性。 -
get_config()
方法调用其父方法的配置方法,并定义该层引入的自定义属性。 -
如果自定义层包含方法
build()
,则它包含可训练参数。以Attention()
层为例,输入需要更多关注的损失信号的反向传播表明该层的权重发生了变化。 -
call()
方法是对输入张量执行的实际操作。 -
compute_output_shape()
方法避免使用间距。
例子
这些层可以在几秒钟内插入到你的项目中(无论是语言模型还是其他类型的RNNs),就像使用Keras中集成的任何其他TensorFlow层一样。请看下面的例子:
-
from tensorflow.keras.layers import Input, Embedding, LSTM, Dense
-
from layers import Attention, SelfAttention
-
-
X = Input(shape=(sequence_length,), batch_size=batch_size) # define input layer for summary
-
## Token Embedding (Pretrained or Not) ##
-
embedding = Embedding(input_dim=vocabulary_size, output_dim=embedded_dimensions)(X)
-
## Encoding Recurrent Layers ##
-
encoder = LSTM(units=recurrent_units, return_sequences=True)(embedding) # keep timesteps
-
## Decoding with Attention ##
-
decoder = Attention(size=attention_size, alignment_type=attention_type)(encoder)
-
## Prediction Layer ##
-
Y = Dense(units=vocabulary_size, activation='softmax')(decoder)
其中 alignment_type
是 'global'
, 'local-m'
, 'local-p'
, 和 'local-p*'
其中之一。对于自注意力,调用 SelfAttention(size=attention_size)
层。
资源
-
上面提到的所有的论文
-
https://www.tensorflow.org/beta/tutorials/text/nmtwithattention
-
https://github.com/philipperemy/keras-attention-mechanism/issues/14
-
https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html
—END—
原文:https://github.com/ongunuzaymacar/attention-mechanisms