美文网首页深度学习专栏
4-1 文本分类算法中的Attention机制

4-1 文本分类算法中的Attention机制

作者: Siberia_ | 来源:发表于2019-03-05 17:53 被阅读0次

      在自然语言处理领域,Attention机制一般在seq2seq方法中出现的比较多,其核心在于利用解码器中上一时刻的输出h'和编码器不同时刻的输出h做相似度对比,得到不同h的权重,然后对所有的h进行加权求和得到context vector,然后将h'context vectorword vector拼接在一起作为解码器下一时刻的输入。Attention机制有不同的版本,区别是他们在相似度的计算方式和对比范围不一样。然而在文本分类方法(比如常见的LSTM)中,没有一个所谓的h'去和编码器中不同时刻的h做相似度对比,因此我就搜了一下相关的资料,在这里做一下小总结(未完待续...)。

    版本一

    来源: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输出的参数表

    Keras参数表
      我这里的参数设置为:TimeStep=26,类别数量=27,WordVector=30,HiddenVector=100.
      首先52400 为LSTM的参数量,计算方式为 4*(100*(100+30)+100)
      702为Attention机制引入的参数量,参数为Softmax层,计算方式为 26*26+26
      70227为最后的Softmax分类层的参数,计算方式为 (100*26)*27+27
      可以看出,这里的Attention并不像seq2seq中的Attention机制那样直接把编码层的输出进行加权求和,而是采用了比较不容易理解的方式(转置、Softmax、flatten等)去处理,其物理意义并不像seq2seq中的那样直观。

    版本二

    这个版本类似于版本一,其区别在于用Softmax求出数组(BatchSize, HiddenVector, TimeStep)后,首先按第二维求平均数得到(BatchSize, 1, TimeStep),然后复制成(BatchSize, HiddenVector, TimeStep),再进行后续计算。来源网址为版本一的github:https://github.com/philipperemy/keras-attention-mechanism

    未完待续...

    相关文章

      网友评论

        本文标题:4-1 文本分类算法中的Attention机制

        本文链接:https://www.haomeiwen.com/subject/qaeouqtx.html