• 注意力模型代码实现


    https://zhuanlan.zhihu.com/p/37290775

    https://github.com/NELSONZHAO/zhihu/blob/master/mt_attention_birnn/mt_attention_birnn.ipynb

    https://keras.io/zh/backend/

    Seq2Seq架构

    通过Encoder将输入语句进行编码得到固定长度的Context Vector向量,这个编码过程实际上是一个信息有损压缩的过程;随后再将Context Vector传给Decoder进行翻译结果的生成,在Decoder端生成每个单词时,均参考来自Encoder端相同的Context Vector,如下图所示。

    引入Attention机制,给予当前待翻译的词更多的权重,使得我们翻译每个词时会对源语句有不同的侧重,如下图所示。

    BiRNN正如其名字所说——双向RNN,意思是我们不仅考虑句子的正向序列,还要考虑反向序列,以此让模型捕获句子的完整信息。

    本篇文章以Keras作为框架,在Seq2Seq基础模型上加入Attention机制与BiRNN,以英法平行语料为训练数据,构建翻译模型并采用BLEU对模型结果进行评估。

    1.Attention层

    以“我爱机器学习”为例,假如我们当前时刻准备生成“machine”这个词,此时我们需要计算Context Vector。

    我们对图中的符号先进行定义:

    • s_prev代表Decoder端前一轮的隐层状态,即代表了翻译“love”阶段的输出隐层状态;
    • 蓝色框图中的a1-a4分别代表了Encoder端每个输入词BiRNN隐层状态。例如,a1代表了“我”这个词经过Bi-LSTM后的输出向量;
    • 红色α1-α4分别代表了Attention机制学习到的权重。例如α3代表了“机器”这个词的权重,可以看到α3对应的线条比较粗,意味着在翻译生成“machine”这个词时对应的Context Vector会给予“机器”这个词更多的Attention;
    • 绿色的圈圈代表加权后的Context Vector。

     Attention中权重α是关于a和s_prev的函数,我们首先将Bi-LSTM的隐层状态a和s_prev进行concat;然后利用全连接层并采用Softmax激活函数训练一个小的神经网络,得到输出α。进而再利用得到的权重α对Bi-LSTM的隐层状态a进行加权求和,得到当前翻译“machine”的Context Vector,最后将这个Context Vector输入给Decoder进行处理。对翻译的每个词我们都可以采用同样的方式进行构造。

    2.Embedding层

    采用Glove预训练好的100维词向量作为Embedding层,加载进模型。

    3.模型构建

    在Encoder端,对输入句子进行学习,求得当前的Context Vector,并将其传递给Decoder处理;在Decoder端,以t-1的输出和当前Context Vector作为LSTM输入,翻译得到结果。

  • 相关阅读:
    JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
    Java内部类详解 2
    内部类详解(很详细)
    《JAVA与模式》之简单工厂模式
    《JAVA与模式》之适配器模式
    多态
    java Final关键字
    java实例初始化块
    tween.js
    three.js 之旅 (三)
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/10938761.html
Copyright © 2020-2023  润新知