待 计算完成后,我们能计算出,当前时刻每个候选词的概率分布(总和为1,通常用 softmax [Bridle, 1990] 表示),思想是评价正在翻译的词后面最可能出现的下一个词,下面是方法之一: 当目标 word 向量和中间状态的维度相似(假设接近平行),那么,上述第一项的点乘的结果就大,反之就小(假设接近垂直)。知道点乘含义,是一个向量,向另一向量的投影的长度,就不难理解了。所以,公式所描述的机制给出高分的话,就需要目标 word 向量与解码器中间状态排列很好。得分有了之后,就可以把得分转换成合适的概率:
有了目标 word 的概率分布之后,就可以用多项式分布采样的方法选择一个 word 。 假设选择了第 i 个 word ,那么就又回到上述计算这步了,依次循环上述 3 步,直到选择了 <eos> 这个 word 。 4. 最大似然估计 经过上述过程,一个 NMT 模型有了。可是怎么训练它呢?和大多数机器学习模型一样,有多种方法训练。下面,我们只介绍在 encoder-decoder 框架下的最 log-likelihood 的基本方法。 首先,准备好平行训练语料,每个句子中的 word 用整数索引值代替,相当于 one-shot 向量。 然后,左乘矩阵(矩阵例如可用 word2vec 表示),得到矩阵的第 i 列( one-hot 中第 i 个元素是1 )。于是给定 计算的log 概率:,所以整个训练语料的 log-likelihood 计算如下:
剩下,就是用类 SGD 的方法簇来最大化 log-likelihood 函数。能通过 backpropagation 方法有效计算,需要做的是画出从最终的 log-probability 到第一层输入的后向传播图。这样就可以对图中每个操作求偏导(可方便地使用 Amber 平台实现,也可以参考 theano.tensor.grad 例子)。有了偏导之后,我们能参考导数的方向逐步更新参数。很多人会在具体的参数更新速度和效果上“踩坑”,这里面就包含技巧又包含技术,更有背后的深刻的底蕴。 很多工程师“随便”调调初始学习率,mini-batch 大小,学习率自变化方案,动量因子及其自动变化方案等就认为很“牛逼“啦。这个话题不是本文的重点,故不展开描述。 目前来看,在机器翻译的模型中使用 Adadelta [Zeiler, 2012] 或 Adam [Kingma and Ba,2015] 得到的结果不会太差(可参考 在马鞍面上一点,采用不同学习率算法的收敛可视化的例子) 众所周知,深度学习算法绝大部分都用 GPU 计算,NMT 也不例外。我们还是粗略地计算一下,一个样本的 forward 过程的计算量(当然对于一条样本不会包含所有的 word ): 1.源语言 embedding :T×|V|,其中 T 是源句子的 word 个数,|V| 是源语言词表大小; 2. 从源语言 word 的 embedding 到 encoder:,其中 是 embedding的维度,是 GRU 中 2 个 gate 和 1 个 unit 的隐层状态的维度; 3. 从到 4. 从 context 向量到 decoder : 5. 从到 6. 从 decoder 到目标 word 的 embedding :其中 T’ 是目标句子 word 的个数,是目标语言词向量的维度; 7. 从目标 word 的 embedding 到输出:其中是目标语言词表大小; 8. softmax 输出: 除了上述前向过程,还有同等量级的后向计算。上述中的 |V| 和 |V’| 通常是十万到百万量级,在千级别,大部分计算是高维的矩阵与矩阵和矩阵与向量之间的计算,所以,用 GPU 是目前最合适的。 5. 简单encoder-decoder框架的问题 在基本的 encoder-decoder 框架,encoder 转换输入序列到固定长度的向量(即 contex 向量),decoder 有此产生翻译。直观上看,context 向量应该包括源句子每个 word 的信息,无论句子结构怎样复杂,那么 encoder 应该是一个复杂的非线性函数。[Kyunghyun 2014] 阐述了当模型小的时候,翻译质量随着句子长度增加明显下降。Sutskever et al. 2014论文建议 encoder 的表达能力需要更大,意味着模型需要更大来处理更长的句子。 6. Soft Attention机制 (责任编辑:本港台直播) |