传统编码器-解码器中的主要问题是:编码器需要将整个序列的信息压缩到单个固定长度的向量中,这导致两个问题:长序列的早期信息容易被稀释或丢失;处理长序列时效果明显变差。
Bahdanau在《NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO A LIGN AND TRANSLATE》中给出一种对齐的解决方案。其核心思想是:在编码器阶段不仅生成最后的隐状态,还生成整个序列中输入各单词的各个隐状态。在解码器端,根据输入的前一个时间步的隐状态和前一个时间步的的预测值,对整个输入序列的隐状态计算权重,也就是所谓的对齐,根据权重生成不同的上下文来做解码
1.编码器
1.1 编码器结构
- 词嵌入 embedding
- 双向门控网络 GRU(Bahdanau使用双向门控网路)
- 一个Dropout
- 一个线性网络-Linear,用来调整最终隐状态维度
1.2 功能介绍
- 输入:原始序列数据:[序列长度, 批量数]
- 使用词嵌入和Dropout对原始输入序列数据进行加工得到词嵌入后数据:[序列长度,批量数,词嵌入隐单元数量]
- 使用双向门控网络GRU对加工后词阿嵌入后数据进行计算得到两个输出:
3.1. encoder_outputs:[序列长度, 批量数, 门控网络隐单元数量2]。该数序最后一个维度之所以为门控网络隐单元数2,是因为使用了双向网络,包含前向和后向计算的隐状态。
3.2 encoder_hidden:[门控网络层数2, 批量数, 门控网络隐单元数]。之所以第一个维度为门控网络层数2.也是应为使用了双向网络 - 使用Linear对encoder_hidden,最后两个维度数据调整,最终隐状态为[批量数, 门控网络隐单元数量]
- 使用tanh对隐状态调整数据,将数据值压缩在[-1, 1]区间last_encoder_hidden
- 返回encoder_outputs 和last_encoder_hidden
2.注意力算法实现
主要实现eij=vT∗tanh(W∗si−1+U∗hj)e_ij = v^T * tanh(W * s_{i-1} + U * h_j)eij=vT∗tanh(W∗si−1+U∗hj)
2.1 注意力算法结构
Bahdanau论文中有三个参数:W, U, v。都使用线性网络来实现。
2.2 功能介绍
- 输入参数
1.1. 解码器上一个时间步的隐状态[批量数, 门控网络隐单元数量]。在第一步这里输入的为编码器最终隐状态即last_encoder_hidden[批量数, 门控网络隐单元数量]。
1.2. 编码器所有状态即encoder_outputs:[序列长度, 批量数, 门控网络隐单元数量*2]
1.3 原始序列数据掩码mask[批量数, 序列长度] - 重复解码器上一个时间步的隐状态以匹配编码器序列长度,变换后为:[批量数, 序列长度,门控网络隐单元数量]
- 对编码器所有状态即encoder_outputs,变换维度为:[批量数, 序列长度,门控网络隐藏单元数量*2]
- 使用W参数对解码器上一个时间步的隐状态进行计算[批量数, 序列长度,门控网络隐单元数量]
- 使用U参数对编码器所有状态进行计算[批量数, 序列长度,门控网络隐单元数量]
- 对4和5中的相加并通过tanh进行变换[批量数, 序列长度,门控网络隐单元数量]
- 使用v参数计算对齐分数,计算后只取前两个维度数据[批量数, 序列长度]
- 应用原始序列数据掩码mask
- 使用softmax计算注意力权重[批量数, 序列长度]
- 返回计算所得的注意力权重[批量数, 序列长度]
3.解码器
3.1 解码器结构
- 词嵌入 embedding
- 单向门控网络 GRU
- 一个Dropout
- 一个线性网络-Linear,简化输出层
3.2 功能介绍
- 输入参数
1.1. 输入字符[批量数]
1.2. 编码器前一个时间步的隐状态[批量数, 门控网络隐单元数量]
1.3. 编码器所有状态即encoder_outputs:[序列长度, 批量数, 门控网络隐单元数量*2]
1.4. 原始序列数据掩码mask[批量数, 序列长度] - 对输入字符增加一个维度[1, 批量数]
- 使用词嵌入和Dropout对原始输入序列数据进行加工得到词嵌入后数据:[1,批量数,词嵌入隐单元数量]
- 获取解码器上一个时间步的最后一个隐状态
- 使用:解码器上一个时间步的最后一个隐状态、编码器所有状态即encoder_outputs、原始序列数据掩码mask调用注意力算法实现计算注意力权重[批量数, 序列长度]
- 对注意力权重扩展一个维度[批量数,1,序列长度]
- 对编码器所有状态即encoder_outputs交换维度[批量数, 序列长度, 门控网络隐单元数量*2]
- 使用bmm计算上下文向量[批量数, 1, 门控网络隐单元数量*2]
- 交换上下文向量的维度[1,批量数,门控网络隐单元数量*2]
- 词嵌入和山下文向量,组合为门控网络输入参数
- 输入门控网络,获得输出和隐状态
- 使用Linear简化输出数据
- 返回简化后的输出数据,隐状态和注意力权重[批量数, 序列长度]
4.seq-seq
4.1 seq-seq结构
一个编码器和一个解码器
4.2 功能介绍
- 输入参数
1.1. 原始序列
1.2. 目标序列 - 设置输出存储[目标序列长度, 批量数, 目标词表数]
- 设置注意力权重存储[目标序列长度, 批量数, 原始序列长度]
- 使用编码器对原始序列进行编码,获取encoder_outputs [序列长度, 批量数, 门控网络隐单元数量2]和last_encoder_hidden:[门控网络层数2, 批量数, 门控网络隐单元数]
- 定义第一个解码器输入参数:
- 对目标序列进行遍历
6.1. 使用解码器输入参数、last_encoder_hidden、encoder_outputs、原始序列数据掩码mask调用门控网络,获取预测输出和更新解码器最后一个隐状态。循环执行
8825



被折叠的 条评论
为什么被折叠?



