在自然语言处理领域,Attention机制一般在seq2seq方法中出现的比较多,其核心在于利用解码器中上一时刻的输出和编码器不同时刻的输出做相似度对比,得到不同的权重,然后对所有的进行加权求和得到 ,然后将、 和 拼接在一起作为解码器下一时刻的输入。Attention机制有不同的版本,区别是他们在相似度的计算方式和对比范围不一样。然而在文本分类方法(比如常见的LSTM)中,没有一个所谓的去和编码器中不同时刻的做相似度对比,因此我就搜了一下相关的资料,在这里做一下小总结(未完待续...)。
版本一
来源:https://github.com/philipperemy/keras-attention-mechanism
关键代码:
inputs = Input(shape=(g_max_col_count, g_input_vec_size))
drop1 = Dropout(0.8)(inputs)
lstm_out = LSTM(lstm_units, return_sequences=True)(drop1)
attention_mul = attention_3d_block(lstm_out, g_max_col_count)
attention_flatten = Flatten()(attention_mul)
drop2 = Dropout(0.8)(attention_flatten)
output = Dense(last_dense_units, activation='softmax')(drop2)
model = Model(inputs=inputs, outputs=output)
model.compile(loss=model_loss_name, optimizer=optimizers.rmsprop(lr=0.001), metrics=['accuracy'])
model.fit(train_data, train_label, epochs=model_epochs, batch_size=train_batch_size, verbose=1)
model.summary()
代码第四行attention_3d_block为Attention机制处理步骤,第五行 attention_flatten 是将三维数组(BatchSize, TimeStep, HiddenVector)展开成二维数组(BatchSize, TimeStep* HiddenVector),注意第三行中要设置return_sequences=True表示需要记录LSTM中每个TimeStep的输出向量。接下来看attention_3d_block函数的内部结构。
def attention_3d_block(inputs, len):
a = Permute((2, 1))(inputs)
a = Dense(len, activation='softmax')(a)
a_probs = Permute((2, 1), name='attention_vec')(a)
output_attention_mul = multiply([inputs, a_probs], name='attention_mul')
return output_attention_mul
函数的输入中inputs为三维数组(BatchSize, TimeStep, HiddenVector),len为LSTM的步长。输出为三维数组(BatchSize, TimeStep, HiddenVector)。第二行为转置(BatchSize, HiddenVector, TimeStep),第三行是用了Softmax,相当于对HiddenVector的每一个维度的各个TimeStep计算权重,可以把它想象成用Softmax对一个样本量为HiddenVector,特征数量为TimeStep的数据集进行分类,输出为(BatchSize, HiddenVector, TimeStep)。第四行同样为转置,输出为(BatchSize, TimeStep, HiddenVector),这个就是权重矩阵。第五行中的multiply为两个相同维度的数组对应位置元素乘积。下面看Keras输出的参数表
我这里的参数设置为:TimeStep=26,类别数量=27,WordVector=30,HiddenVector=100.
首先52400 为LSTM的参数量,计算方式为
702为Attention机制引入的参数量,参数为Softmax层,计算方式为
70227为最后的Softmax分类层的参数,计算方式为
可以看出,这里的Attention并不像seq2seq中的Attention机制那样直接把编码层的输出进行加权求和,而是采用了比较不容易理解的方式(转置、Softmax、flatten等)去处理,其物理意义并不像seq2seq中的那样直观。
版本二
这个版本类似于版本一,其区别在于用Softmax求出数组(BatchSize, HiddenVector, TimeStep)后,首先按第二维求平均数得到(BatchSize, 1, TimeStep),然后复制成(BatchSize, HiddenVector, TimeStep),再进行后续计算。来源网址为版本一的github:https://github.com/philipperemy/keras-attention-mechanism
未完待续...
网友评论