首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

自然语言处理-第十六期-神经网络翻译Beam Search

背景

从十二期开始,分别介绍了 Seq2Seq 模型 和 Attention Mechanism。这些模型框架是神经网络翻译(NMT) 和 聊天机器人(Chatbot)的核心组成部分。本期将带来Beam Search 部分.

回顾

Seq2Seq Model

Seq2Seq其实就是Encoder-Decoder + Sequence,将一个序列 encode,然后再将其decode成另一个序列。

但是Seq2Seq有一个明显的问题是,将一个Vector向量 decode 成一个序列时,如果该句子太长,那么其结果会不太理想(因为Gradient Vanishing or Explosion)

Attention Mechanism

Seq2Seq面对的问题是,Encoder 只输出一个向量,而基于此向量我们需要decode成一个长句。

那么Attention Mechanism 解决的办法也很直接。 就是在原有的 Vector 向量上,再增加一个 Vector (原义是指 我们需要Pay Attention的地方)

而这个Context Vector 是 原始序列各个单词的权重组合。当我们翻译I 时,大部分的权重就会被分配到 I 这个单词所输出的Hidden State

换个角度说,其实现了软对其。将 翻译的词 与 被翻译的词 进行 软对其。

再换个角度,这是Dynamic Memory Network,可以动态的提取需要的Hidden State

关于这些内容,更详细一些的可以从第十二期~十五期找到.

Beam Search

通过上述回顾我们可以看出来,不论是 Seq2Seq 还是 Attention Mechanism,都是解决了 Decoder 部分 输入值的问题。

当基础Seq2Seq模型时,Decoder 获取的hidden State不足,所以Attention Mechanism 又给了一个动态的Vector。

但是前几期都没有涉及一个问题就是, 当Decoder 拿到一个Vector的时候,如何解压成一个完整的句子?

其实,Decoder的作用就是,在给定输入Vector的情况下,计算词库的概率分布。

如下图是NG 课程的一个截图,他就是计算在10000个词库,每个单词的概率。

Greedy Search

既然我们知道了Decoder的任务就是计算单词的概率分布。 那么最直接的方法肯定是取概率最大的那个单词。 这也就是Greedy Search。

但是,Greedy Search的效果并不好,这也很好理解。因为,其并没有考虑概率的差距。当有两个单词概率很接近的时候,其非常武断的就选择了 概率最大的一方。

Beam Search

在解释Beam Search 之前,举个例子,这个例子很有帮助我的理解。

现在很多的翻译模型,并不是 预测单词而是预测字母。那么假设我们正在Decoder的过程中,我们已经生成了happ 四个字母,那么接下来很可能出现以下几个:

Happy

Happiness

Happen

对于这个例子,如果是Greedy Search,其只是选择概率最大的那个。我个人觉得概率最大的很可能是y,毕竟Happy的频率较高(这句话并没有道理的哈只是假设假设,因为其概率主要取决于训练文本,而不是我们个人的感官)。那么,Greedy Search就会很“果断”地选择Y,即Happy

但是,其实有一种更合理的方法。

Step 1. 预测第五个字母时,留下可能性最大的两个选择,假设是(i,e);

Step 2. 基于第一步的两个选择,分别再找到 可能性最大的两个字母,假设是(in,im,en,er);

Step 3. 基于两个字母的组合,来选择第五个位子应该出现的字母,分别计算(in,im,en,er)的概率;

尤其是对于语言来说,这种方法有很明显的优点。因为大家知道,英文中很多词根,比如 er ,on,ion,ing,ow 等等。都是成组合出现的。

Beam Search就是这样一种方法,其对于Greedy Search最大的提升在于,其不仅仅考虑了单个单词的概率, 其还考虑了前后几个 放在一起的概率。这对于本身就有既定模式的语言来说,可以说非常有效。

另外,Beam Search 可以指定Beam的数量,比如是两个,或者三个。

总结下

最基础的Beam Search 其实思路非常简单。就是在计算概率分布的时候,不要只选择概率最大的那个。 而是选择概率最大的几个,然后这几个作为备选方案 再往后看看。然后,结合其与之后的几个单词 一起计算概率。

下期预告

Beam Search 包括Greedy Search其实有一个问题,就是没预测一个单词需要遍历一边词库。对于较大的词库来说,是一个问题。 而且Beam Search还增加了其工作量,需要遍历几遍。

虽然我还不了解,但是对于这个问题,肯定是有改良方法的。等我搞懂了就给大家带来。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181001A1CT6700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券