上次有讲到词向量背后的思想,还有提到用中心词预测周围词的方法来获得好的词向量。

最后有说 Word2vec 学习的几个步骤:

  • 用中心词 c 和周围词 o 的向量,计算在o上下文的情况下有多大概率出现 c;
  • 通过最大化以上概率,不断调整词向量。

关于调整词向量,最直接方法就是人为一个个看中心词和周围词上下文,然后基于向量计算知识手动调整。当然用屁股想想都知道这样不可能的,太麻烦了,那么大的词表!(其实过去那些编字典词典的就在做类似工作,无外乎一本词典可能就得编一辈子,安利电影《编舟记》。)

不能自己看,那总得从某地方得到如何调整的信息吧。于是就需要目标函数来反馈训练的信息了。

我们的目标是什么:最小化目标函数!

我们想要:通过数据,学习到中心词与正确上下文的关系,抽象点就是获得参数,来最大化正确上下文出现在某词周围的概率。

详细点解释,通过一套参数我们能确定其他词作为当前词上下文出现的概率,最初模型没学习时,模型可能会认为每个词作为上下文出现的概率都一样。而我们需要做的是“实事求是”,最大化现实场景中的上下文出现词的概率。

比如有个词“son”,开始模型没有看过任何数据学习,可能就对“beach”作为上下文,或“bitch”作为上下文出现,哪个概率大,没太多概念。但当看过数据,经过学习,就会知道后者概率大,而且也最符合实际。

于是似然函数(likelihood function)就是,在数据中,中心词对周围词的概率乘积:

我们希望参数 $\theta$ 能够最大化这个概率,使其符合现实数据。为了便于计算和最优化,于是对它加上对数 log,还有负号,就得到了目标函数 $J(\theta)$ :

然后问题就变成了最小化这个目标函数,也就是总说的最小化损失函数。回顾下就是,最小化目标函数 -> 最大化似然函数 -> 最大化预测准确

啥是 P($w_{t+j}|w_t;\theta$)

好了,大的框架有了。再看看公式里,发现就只剩下一块硬骨头:

image-20190310222530894

表面意思是,参数参数 $\theta$ 的情况下,$w_t$ 预测 $w_{t+j}$ 的概率,$t$ 就是当前词,加个 $j$ 当然就是想表示周围的词,所以$j$ 一般也不会太大。

但问题是,这个方程其实只是表示一个概念,具体怎么计算呢。

按照课程里,可以这样:

  • 每个词 w 我们用两个向量 $v$,$u$
  • $v$ 是作为中心词的时候
  • $u$ 是作为上下文的时候

词 o 出现在中心词 c 上下文的概率就这样计算:

image.png

这里直接用最简单的点乘然后加上个 softmax 来计算。

点乘是比较两个向量的相似性,乘积越大则可能越大;下面是 softmax 的正则化,使得出结果以概率表示(0到1的数)。

题外话,softmax 是相对一般的 hardmax 来说的,也就是一般的 max,取最大值。而 soft 字面意思就是没那么硬,虽然给大的更大的概率,但是小的也会分配些概率,更平滑。

为什么用俩矩阵

看过 word2vec 论文的童鞋,可能觉得为啥要俩向量矩阵啊。明明都一个词表,还特意分为中心词时的词向量表,和周围词的词向量表。

官方给出的解释是,优化起来简单。我猜可能是因为作业里代码都是直接 numpy 实现,也没有到什么框架。所以没麻烦地弄计算图什么的,如果一个矩阵,优化时梯度加和比较麻烦。

那么优化完后,我们用哪个矩阵作为词向量呢?课上说的是把两个平均一下来使用。

其实我感觉平均或用哪个效果可能不会差太多,因为在之后手动计算梯度的时候就会发现,一起出现的词向量会把对方往自己拉。

最后一步:最优化

要最小化上面说的目标函数,就要用到我们的好伙伴最优化理论里的 GD(graduate gradient descent),梯度下降法(还有一个很)。

经典的优化算法分两大类,直接法和迭代法,而 GD 属于迭代法,大概思路是每次找到更新的方向然后对参数进行更新,让每次的目标函数更小,直到最后到达最小值。

而这里的我们需要的方向就是目标函数的梯度,下面最右边那家伙:

image.png

这里有个练习,对目标函数分别求中心词向量 $v$ 和周围词向量$u$ 的导:

image.png

课程里有推导一个,可以参考自己推导,化简之后会得到很有意思的结论,发现之前想得复杂更新词向量原来干的是这玩意儿。

理解L1,L2 范数

L1,L2 范数即 L1-normL2-norm,自然,有L1、L2便也有L0、L3等等。因为在机器学习领域,L1 和 L2 范数应用比较多,比如作为正则项在回归中的使用 Lasso Regression(L1) 和 Ridge Regression(L2)。

因此,此两者的辨析也总被提及,或是考到。不过在说明两者定义和区别前,先来谈谈什么是范数(Norm)吧。

什么是范数?

在线性代数以及一些数学领域中,norm 的定义是

a function that assigns a strictly positive length or size to each vector in a vector space, except for the zero vector. ——Wikipedia

简单点说,一个向量的 norm 就是将该向量投影到 [0, ) 范围内的值,其中 0 值只有零向量的 norm 取到。看到这样的一个范围,相信大家就能想到其与现实中距离的类比,于是在机器学习中 norm 也就总被拿来表示距离关系:根据怎样怎样的范数,这两个向量有多远。

上面这个怎样怎样也就是范数种类,通常我们称为p-norm,严格定义是:

其中当 p 取 1 时被称为 1-norm,也就是提到的 L1-norm,同理 L2-norm 可得。

L1 和 L2 范数的定义

根据上述公式 L1-norm 和 L2-norm 的定义也就自然而然得到了。

先将 p=1 代入公式,就有了 L1-norm 的定义:

然后代入 p=2,L2-norm 也有了:

L2 展开就是熟悉的欧几里得范数:

题外话,其中 L1-norm 又叫做 taxicab-norm 或者 Manhattan-norm,可能最早提出的大神直接用在曼哈顿区坐出租车来做比喻吧。下图中绿线是两个黑点的 L2 距离,而其他几根就是 taxicab 也就是 L1 距离,确实很像我们平时用地图时走的路线了。

L1 和 L2 范数在机器学习上最主要的应用大概分下面两类

  • 作为损失函数使用
  • 作为正则项使用也即所谓 L1-regularizationL2-regularization

我们可以担当损失函数

先来看个回归问题

我们需要做的是,获得一条线,让数据点到线上的总距离(也就是error)最小。

还记得之前在范数介绍中提到的用来表示距离吗,于是也可以用能表示距离的 L1-norm 和 L2-norm 来作为损失函数了。

首先是 L1-norm 损失函数,又被称为 least absolute deviation (LAD,最小绝对偏差)

如果我们最小化上面的损失函数,其实就是在最小化预测值 和目标值 的绝对值。

之后是大家最熟悉的 L2-norm 损失函数,又有大名最小二乘误差 (least squares error, LSE):

这个便不多解释了。

那么问题来了,这里不谈挖掘机,为什么大家一般都用 L2 损失函数,却不用 L1 呢?

这个就说来话长了,如果你问一个学习过微积分的同学,如何求一个方程的最小值,他/她大概会想当然的说:“求导,置零,解方程。” 号称微积分届的农夫三拳。

但如果给出一个绝对值的方程,突然就会发现农夫三拳不管用了,求最小值就有点麻烦了。主要是因为绝对值的倒数是不连续的。

同样的对于 L1 和 L2 损失函数的选择,也会碰到同样的问题,所以最后大家一般用 L2 损失函数而不用 L1 损失函数的原因就是:

因为计算方便!

可以直接求导获得取最小值时各个参数的取值。

此外还有一点,用 L2 一定只有一条最好的预测线,L1 则因为其性质可能存在多个最优解。(更多关于L1 L2 损失函数参考索引5)

当然 L1 损失函数难道就没有什么好处了吗,也是有的,那就是鲁棒性 (Robust) 更强,对异常值更不敏感

我们还能担当正则项

因为机器学习中众所周知的过拟合问题,所以用正则化防止过拟合,成了机器学习中一个非常重要的技巧。

但数学上来讲,其实就是在损失函数中加个正则项(Regularization Term),来防止参数拟合得过好。

L1-regularization 和 L2-regularization 便都是我们常用的正则项,两者公式的例子分别如下

这两个正则项最主要的不同,包括两点:

  • 如上面提到的,L2 计算起来更方便,而 L1 在特别是非稀疏向量上的计算效率就很低;
  • 还有就是 L1 最重要的一个特点,输出稀疏,会把不重要的特征直接置零,而 L2 则不会;
  • 最后,如之前多次提过,L2 有唯一解,而 L1 不是。

这里关于第二条输出稀疏我想再进行一些详细讲解,因为 L1 天然的输出稀疏性,把不重要的特征都置为 0,所以它也是一个天然的特征选择器

可是为什么 L1 会有这样的性质呢,而 L2 没有呢?这里用个直观的例子来讲解。

来一步一步看吧,首先获知用梯度下降法来优化时,需要求导获得梯度,然后用以更新参数。

于是分别先对 L1 正则项和 L2 正则项来进行求导,可得。

之后将 L1 和 L2 和它们的导数画在图上

于是会发现,在梯度更新时,不管 L1 的大小是多少(只要不是0)梯度都是1或者-1,所以每次更新时,它都是稳步向0前进。

而看 L2 的话,就会发现它的梯度会越靠近0,就变得越小。

也就是说加了 L1 正则的话基本上经过一定步数后很可能变为0,而 L2 几乎不可能,因为在值小的时候其梯度也会变小。于是也就造成了 L1 输出稀疏的特性。

Reference

  1. Differences between L1 and L2 as Loss Function and Regularization
  2. Why L1 norm for sparse models
  3. L1 Norms versus L2 Norms
  4. Norm (mathematics)-Wiki)
  5. Why we use “least squares” regression instead of “least absolute deviations” regression

相信和大多非科班出身的人一样,接触深度学习,都是通过各种书籍或博客零零碎碎学习,之后做几个小项目就算是入门了。这样虽然也可以说是入行了,毕业设计也做得不算太差。但渐渐的却总心里发虚,因为对一些最基本的东西,并不太清楚。

说起模型可以头头是道,但看一些深入点的论文就头疼,于是深感基础不足,希望在2019年能尽量补上一些。

此次斯坦福的深度自然语言处理课,也就是 cs224n,时隔两年,重新开放,加入不少新东西。曾经两年前,刚入门的时候有挑战此课,但没多久就卡住了,也就没坚持下去。

两年后重新看,或许是经验增多,看过第一课,好像能看懂许多,不由欣喜万分。想当然的就想和人分享这种喜悦,做了点笔记拿出来,希望对大家有些帮组。

大纲与改进

斯坦福的 cs224n 主要希望讲解的内容包括

  • 现代深度学习基础知识,以及其在自然语言处理(NLP)方面的应用,特别是 RNN 与 Attention 模型
  • 对人类语言,还有其理解与生成之困难,有个大局认识
  • 对NLP重要问题的理解,并能够用 Pytorch 搭建相关系统,特别是词意,依存分析,机器翻译,机器问答。

比起17年的课程最大的改进,有两点

  • 加入大量新内容,比如新的 Transformer,安全性讨论,还有多任务学习
  • 深度学习框架从 Tensorflow 换成 Pytorch(之前 Fast.ai 也做过类似转变)

那就不废话了,直接进入正题吧。

怎么让计算机理解一个词

首先,大家都知道,在日常中用到语言的最小单位是词(非日常或许还有词根词缀词素等等子词单位)。而要想表示语言,自然也就得先从词入手。

那么,怎么表示一个词呢?确切说,怎么在计算机上表示一个词?因为做自然语言处理,其实就是用计算机对自然语言进行处理,如果连词都理解不了那就更别谈语言处理了。

当然,现在显然还做不到给计算机一个词它便能像人一样理解。因此只能退而求其次,用其他一些计算机更能理解的方法。

不是那么美的尝试

可能了解一些的同学会马上举起手,“我知道,我知道,不就是 Word2Vec 吗”

不过在 Word2Vec 之前,还要先提提一些远古的东西。

WordNet 词网大法

WordNet 是一个英文词汇数据库,如其名暗示,它是由各种词,还有它们之间关系组成的网络。具体到使用时,就像是一个字典加词典的组合。你可以查询一个词,获得它的意思,以及同义词,上义词等等。

于是用 WordNet 来表示一个词意思的时,就可以用它的同义词或上义词表,这有些类似之后分布式表示。

然而 WordNet 开始于1985年,其实也有类似当时风靡一时专家系统的特点,那就是觉得可以靠人或专家们,把所有规则知识都编入一个系统。然后事实证明效果并不好

于是用 WordNet 会出现的问题也是:

  • 不包含新单词和新意思
  • 带有主观性
  • 需要大量人力
  • 不好计算相似度

One-hot 独热编码

这个是种极为简单的编码方式,对每个离散的词,用向量上的一位表示。如果有 V 个词的话,那么每个词的表示都是 V 纬的向量,V 很大的话,效率就很低。

这个也有很多问题,首先正如所见,得到的向量非常稀疏,也就是大部分都是 0,带来效率问题,而且向量正交,不好计算相似度。

分布语义的启发

首先什么是分布语义,在语言学中,有这样的说法:一个词的词义是由经常出现在它周围的词决定的。反过来说两个词它们周围的词很像的话,那这两个词意思也会相近。

这里有个很有意思的点,那就是词本身的意思,是由词决定的,这就形成了一个怪圈,就像是一个从地上把自己提起来的人。

但如果再进一步想就会发现,其实词本身是没有意义的,或者说词本身的意义来自于物理世界。直接指向这个词的物质,或周围环境,亦或这个词上下文所指向的物理世界,这也是最近研究世界模型的思想来源。

其实更广义上来讲,一个词的意思,完全是由某时某刻,现实中的上下文来表示,这里的上下文包括事物本身,与之相关事物,阅读人的经历与理解…

所以按照这层角度来看,没有任何一个词的意思是相同,即使这个词字面相同,但只要它存在的背景变换了,那么它的意思就变了。就如我们永远不可能踏入同一条河流,一个词也永远不可能是一个意思,这也是为什么人类沟通中会有如此多的误解的原因之一。

但之所以我们还能交流,是因为大部分背景还是相同的,主要意思便也都还是相同的。

话题扯远了,但是总之现代统计自然语言处理中最成功的一个 idea 就是:

你可以通过一个词周围的词了解一个词 - (J. R. Firth 1957: 11)

因此就可以尝试用一个词大量的上下文信息来表示一个词的意思。

词向量?词嵌入?词表示?都是分布式表示

先来解释一下这三个词吧,其实都讲得是一个东西,只是从三个不同角度来看。

  • 词向量(Word Vector):最直接的说法,因为我们把词表示成了一个向量;
  • 词嵌入(Word Embedding):这个有点难理解,但其实说的是,把在 one-hot 里面本来应该是很大的 V 纬向量表示,嵌入到了低纬度的空间里面(降维打击?!);
  • 词表示(Word Representation): 其实就是说这表示一个词。

image.png

Word2Vec

千幸万苦终于到了我们的大明星 Word2Vec,为什么之前要提那么多关于分布语义的废话呢。

因为 Word2Vec 就是学习上面提到的分布式词表示的一个框架。刚入门容易混淆的一点是把 Word2Vec 和 Word Vector 搞混,其实 word2vec 并不是指词向量全部,只是其中一种。之前其实也有人训练出过分布式词表示,但是受限于硬件与训练方法,所以效果没有 Word2Vec 这么好。

关于 Word2Vec 中主要思想包括

  • 有大量文本(保证覆盖主要意思的自然文本,而不是像WordNet 这样人造的)
  • 一个固定的词表中每个词由向量表示
  • 遍历文本中每个位置,取中心词 c 和上下文 o
  • 通过计算 c 和 o 的向量相似,计算给出 c 有多大概率出现上下文 o
  • 通过最大化以上概率,不断调整词向量

image.png

这只是 Word2Vec 里提到两个方法中的一个 Skip-gram。另一个 CBOW 的思想也类似,不过是用周围预测中心词。

其实 Word2Vec 论文中更加出彩的是其中的训练方法,而不是这个思想,Mikolov 的工程能力非常强,通过各种训练的技巧,利用神经网络将 word2vec 训练成功。之后会再介绍。

Word2Vec 里的技巧,Yoav Goldberg 发现如果把这些技巧用在其他传统的统计学习词向量训练方法中的话,也能取得很好的效果。Goldberg 这篇论文非常精彩,之后也会简单介绍一下。

  1. 文章有何贡献?

    是第一个对LSTM还有它的八种变体进行大规模调查的论文。

  2. 本文研究的问题有何价值?

    本文填补了对LSTM的各组件进行系统性调查的空缺,而且一定程度上系统性的解决了如何提高LSTM架构性能的开放性问题。也为之后的研究者如何更好的使用LSTM,理解LSTM,已经调节其参数提供了很好的建议。

  3. 本文概要

标准的LSTM主要是由这几个部分,三个门:input gate、 forget gate、 output gate, 还有输入块与输出块。
首先调查的是对这几个门进行修改的变体:
NIG: No Input Gate 没有输入门
NFG: No Forget Gate 没有遗忘门
NOG: No Output Gate 没有输出门
NIAF: No Input Activation Function 没有输入块激活函数
NOAF: No Output Activation Function 没有输出块的激活函数
CIFG: Coupled Input and Forget Gate 耦合的输入和遗忘门
还有就是两个在LSTM上的小技巧,一个是Peephole(窥视孔),利用cell的状态来给予几个门更多的提示;还有一个是全门循环连接,也就是说通常的门是包含在LSTM单元里面输出端不直接和下一个单元交流的,但是全门连接表示将每个单元之间的门也直接连接起来。
NP: No Peephole 没有窥视孔
FGR: Full Gate Recurrence 全门循环连接

加上标准LSTM总共9个。在三个任务上进行测试,分别是:语言识别,手写识别,还有复调音乐模型建立。
对于每个模型还要对以下几个参数进行探索:LSTM的隐藏单元数,学习率,动量 (momentum),高斯输入噪音。

  1. 结果

    一、各变体的比较。
    标准LSTM结构在各个数据集上都能表现出较好的结果,而各个变体也并没有显著地提高了LSTM的性能。
    还有即使加入了输入门和遗忘门的耦合,或是移除了窥视孔设置,也并不会很大程度上降低性能,同时这两个设置还减少了LSTM的计算量。
    根据实验数据,还得出LSTM中,遗忘门和输出激活函数是最关键的组件。
    二、各参数的影响
    学习率是最关键的超参数,然后是网络的大小。而让人惊讶的是,动量在这几个试验中并没有很重要。
    还有高斯噪音的加入,根据任务的不同有时有帮助,有时却会有害。
    在对超参数之间的互相作用进行调查时,它们并没有表现出明显的结构性关系,甚至可以忽略其的影响。所以我们可以假设这些超参数是大概相对独立的。
    还有一个关于学习率的建议,对于一个数据集,可以先用一个小的网络找到一个好的学习率,然后把它用到大的网络中去。

  2. 我的评价

    虽然在这篇论文中得到了关于LSTM的很多建议,但根据自己的实际实验,却有一些是和它的结论不怎么吻合的。
    首先是我之前有碰到过,变大网络反而使得性能变差,而这篇论文中是说只会提高性能。
    还有关于超参数之间的关系,我也有碰到分别调两个都可以提高性能,但是一结合就降低了性能的。
    最后一点建议是,这篇论文虽然对输入噪音进行了调查,却没有对RNN的dropout进行调查,可能这个也能作为一个探索点。
    看完本文之后还是觉得LSTM有很多很多谜团。

  1. 文章有什么贡献?

    提出了一种新的 Sequence-to-Dependency Neural Machine Translation (SD-NMT)的方法,来将目标语言句法知识利用进了NMT系统,相比起没有使用句法知识的基准NMT系统,性能得到了相对的提高。

  2. 研究的问题有何价值?

    目前的NMT系统主要是直接用线性RNN来进行Seq2Seq,但是这样的系统对于捕捉不明显的长距离词的依存还是有很大难度的。因此在解码的时候,将句法知识考虑进解码器中后,可以提高翻译结果语法的正确性,并且也可以利用局部依存信息来生成之后的词语。

  3. 研究问题有什么挑战?

    一,如何利用RNN来构建句法结构;
    二,如何在一个神经网络中,有效地同时进行词语生成,还有句法结构的构建;
    三,如何有效地利用目标语言的句法背景,来帮助词语的生成。

  4. 本文的解决思路?

一,利用了两个RNN网络,Action RNN 和 Word RNN,分别进行词语生成和句法结构的构建。Action RNN 利用了transition-based dependency parsing (基于转换的依存句法分析) 中的 arc-standard shift-reduce algorithm 算法,来生成构建所需依存结构的动作。而同时因为两个 RNN 生成的的序列长度不一致,所以 Word RNN 利用了些技巧,使得它能够参考 Action RNN 的结果输出词语,或者保持不变以和 Action RNN 的时序保持一致。

二,通过定义生成依存结构时的栈顶部两个词语,最左和最右修饰语的一元和二元语言特征,生成相对当前词汇的局部依存背景。之后将这个背景与 Word RNN 的输出结合起来,帮组生成新的词汇。

最近一段时间在研究的一些东西。

介绍一下当前机器翻译领域很火的神经机器翻译(Neural Machine Translation ,简称NMT)领域的大致状况,最近的一些进展(内容主要来自Philipp KoehnStatistical Machine Translation 还未发布的草稿,想了解更详细内容,读原文)。

首先什么是机器翻译?

显而易见就是用机器来翻译,这里机器说的是计算机了。终极目标是抢走翻译们的饭… 噢,不对,是消除人们的交流沟通障碍,促进世界人民大团结!

那神经机器翻译又是什么鬼?

首先机器翻译是个大目标,达到目标有很多种方法。比如说神经机器翻译之前,很流行用统计方法来搭建机器翻译系统,这叫做统计机器翻译 (Statistical Machine Translation SMT)。

同样的如果用神经网络方法来达成机器翻译这个目标,那么就叫神经机器翻译。

为什么现在神经机器翻译很火呢?

第一,在自然语言处理中,机器翻译是一个高级问题,这意味着解决这个问题,还能顺带把方法用到很多其他问题上去。比如说现在广泛使用的注意力机制 (Attention Mechanism),最早就是先在机器翻译系统使用的。并且机器翻译非常实用,想想你看不懂论文时打开谷歌翻译时,就知道了。

第二,还有现在深度学习大火,神经网络也确实在机器翻译上取得很好的成绩,比起之前统计机器翻译中效果最好的模型(基于短语的统计机器翻译模型)都能强出很多。这也是为什么现在谷歌翻译基本上都已经换成神经机器翻译模型了。

好了,这就是背景知识了。那么先来讲讲现在使用最普遍的基准模型吧。

基准模型(seq2seq+attention)

现在最常用的基准模型如上图,主体部分主要由三部分组成,编码器(Encoder)、解码器(Decoder)、还有注意力机制(Attention)。

编码器:编码器其实很好理解,就把它当做一个总结器,输入一段源语言句子(比如说英文的I love you.),那么编码器就是把这句话的信息总结出来。可以理解为人读完一句话,然后总结成一个模糊的意思。

解码器:然后解码器根据编码器传过来的信息,来把这个信息用目标语言表示出来,也就是翻译出来。

注意力机制:如果单靠一次总结后直接解码翻译的话,效果并不好。所以可以再像人一样,边翻译同时再回看源语言每个词的信息,之后也能知道更准确的词和词的对应关系。上图就是英法翻译时,词对应情况。

之后输入输出部分就主要由词向量表预测模块组成了。

整个翻译流程像这样,输入源语言(比如说汉语),转换成词向量,传入编码器编码总结,然后传给解码器,解码器通过注意力机制,一个词一个词,边参考源语言信息边翻译成目标语言(比如说英语),最后用到柱搜索 (Beam Search,感兴趣自己去搜搜看) 算法选出最好的备选翻译。

这就是目前神经机器学习的基准模型了。

基准模型学习资源(流行框架):

基准模型改进

当然这个领域还在不停地发展,因此每年也会不断有很多提高基准模型的方法被发表出来,特别是在每年WMT(相当于机器翻译领域每年的华山论贱)大赛上都会有队伍将最有效地一些方法进行总结,然后实现到实际模型上来。

这些方法也都很有意思,之后就一一来介绍。

集成解码方法(Ensemble Decoding)

首先是比较容易理解的集成解码,实际上就是一句话人多力量大

既然一个模型的准确率不行,那么就几个不同的模型一起用,因为每个模型可能都会有些差异,有不同的缺点,如果用多个模型的话,就能产生互补效应,获得更好的翻译效果。

但是集成也根据集成模型的不同分为以下几种。

检查点(checkpoint)集成

检查点就相当于游戏中的存档点,将模型训练到一定程度,然后希望把当前模型的所有参数保持下来,以便之后使用。一般检查点会以epoch(整个数据集过一遍)、iteration(一次批训练更新权重)、或者句子数为单位,比如说epoch15模型就是训练完15个epoch的模型。

而检查点集成就是,用这些不同时间点保存下来的模型一起来预测

多次运行 (Multi-run) 集成

多次运行集成有好几种情况。

可以是同一个模型,以不同的初始条件来运行,最后得到的多个模型;也可以是不同的模型,在用一个数据集上训练,最后得到的多个模型。

利用从右到左模型重排序解码

目前一般的解码器都是从左到右地一个词一个词地译出目标语言,所以一般RNN解码器都是单方向的,但编码器都是双方向以获得更多的信息。

为了让解码器也能利用双方向的信息,可以训练一个模型反过来翻译目标语言,从右到左输出结果,比如说“我爱你”翻译成英文,按这样的顺序来译“you -> love -> I.”。

之后用从右到左的模型输出的结果,来筛选从左到右模型输出的结果,就可以获得更好的翻译。

当然上面这些集成方法也可以都用上,一起集成输出结果当然更好,但同时也会导致运算成本过高的问题,毕竟一个模型训练下来就要很久了,更何况几个了。

处理大词汇量

对于NMT,其中一个最大的难题就是如何处理庞大的词汇量

因为神经网络方法一般处理词汇是建立词向量表,之后通过查表将句子转换成词向量。也就是对于词向量表,每个不同的词就对应一个不同的向量。对于有些语言,因为形态学(Morphology)比较复杂,所以一个词可能会有很多很多种变形,即使意思并没差太多,这样的语言词汇量却会非常大。

对于编码器端,会导致词向量表非常大,同时因为可能某些形态的词在整个数据集中只出现很少的次数,所以会导致稀疏问题,某些词向量根本没得到充足的训练

而对于解码器端,因为输出时会用softmax来进行概率输出,从目标语言词汇中挑选出合适的词。这会导致过大的计算量,也是一个大问题。

目前大家能想到的解决这个问题的方法是,使用子词 (sub-word) 而不是词(Word)来进行翻译,比如说英文里面 unhappy = un + happy.

对于人来说,因为语言本能,这些都可以自然而然在脑中解构。但对于计算机就不行,得我们告诉它怎么做。

字节对编码 (Byte Pair Encoding, BPE) 法

现在使用比较广泛的一个方法是BPE法,因为爱丁堡大学的Nematus系统用这个取得了很好的效果。

原理的话出乎意料,和语言学没有关系,也并不是很难。主要步骤如下。

  1. 将训练数据中所有词都表示成字节,把这些字节加入符号表,最开始大概是a, b, c…还有各种符号;
  2. 然后统计符号对的出现频率,比如说th, zt…;
  3. 挑出其中频率最高的符号对,加入符号表,训练数据集中所有该符号对融合,比如说t和h全变成了th。这个叫做一次融合,之后重复2,3过程,直到指定的融合次数。

比如说爱丁堡大学在WMT16比赛中就用了89500次融合。完成这个BPE学习之后,用它来处理训练数据集,之后直接在bpe之间翻译,这样可以大大降低了词汇量。

使用单语言数据

机器翻译里面训练数据之所以难收集,主要是因为它用的是并列数据 (parallel data),也就是源语言和目标语言之间,一句话一句话得对应起来。因此准备数据的过程特别麻烦,所以对于深度学习这种数据越多越好的模型,有时候可能数据也并不够。

但同时另一方面,单独的语言数据我们又不缺,随便在网上抓一抓就很多很多。因此如何利用这些单语言数据就成了一个热门研究方向。

这里列举几个比较成功的方法。主要分为增加训练数据和训练语言模型来辅助翻译。

回译

回译的要点是,既然训练数据不足,那么就合成数据。但是怎么样合成呢?

这里假设我们有大量的目标语言单语言数据,那么为什么不建立一个反向的翻译系统,将这些目标语言翻译成源语言,之后再用获得的并行数据来训练所需要的系统呢。

这也是为什么这个技巧的名字叫做”回译 (Back Translation)“。

加入语言模型

首先什么是语言模型?一句话,训练一个模型,然后这个模型判断你说不说的是人话,这就是语言模型,很简单吧。

比方说我用脸打出来的“过以风格黑哦豆腐干会双方各黑分两个覅”就不是人话,你估计也不可能再在其他地方看到这样的句子了;而“我吃饭了”,这样正常的、有意义的、随处可见的话就是人话了。

而加入语言模型主要就是判断解码器翻译出来的是不是人话,从而帮助解码器获得更好的翻译效果。

至于如何学习怎么判断说的是不是人话,也就是训练语言模型,只要读书破万卷就可以了,把单语言数据丢给语言模型让自己训练就好了。

往返训练

最后是往返训练,就是把回译的技巧用来同时训练两个模型。比如上图一个模型是从 f->e(法译英),而另一个是反过来的英译法。

往返训练的流程是这样子的,假设我们有f单语言数据,那么先用正向模型翻译成e’,之后用这个e‘和f来训练反向模型。当要用e的单语言数据,只要反过来操作就好了。

这样子两个好基友互相训练♂♂,最终就能都成为好模型。

目前,世界上有成千上万的语言被使用着,其中包括:家族语,民族语,部落语等等。而小黄人语(又叫香蕉语),当然也属于其中的一种。虽然,现在没有任何一种语得到了真正的全球化,但可以看见的是,人工语 (Conlangs) 正在慢慢接管着世界

直到今天,世界上已经出现了很多许许多多的人工语。它们是由狂热宅男(没错,说的就是谢耳朵他们。),或是语言专家们构造出来的。大部分人工语一般最早都出现在电影里,接着之后,被粉丝或是语言狂们慢慢传开。

几种耳熟能详的几种人工语:

  • 世界语(L.L. Zamenhof 发明) - Mi regas la mondon!
  • 克林贡语 (星际迷航) - nuqneH
  • 帕库尼语(失落大陆) - Me tobi ye
  • 精灵语(魔戒)- Elen sila lumenn omentilmo
  • 多斯拉克语(权力的游戏,蹭热点中…)- Athchomar Chomakea!

34180 daenerys targaryen baby dragon cibv28 Dothraki phrases all true GOT fans should add to their vocabulary (20 Photos)

而现在香蕉语也将成为它们中的一员,都叫不明觉厉语。

香蕉语的起源

img

根据导演 Pierre Coffin 和 Kyle Balda, 据说他们有一套特别创造语言方法。那就是,把世界上所有语言中听起来好玩的词跳出来,然后再转换成小黄人的腔调,就有了小黄人语了。

至于为什么是世界各个国家的语言,又据说是,小黄人们为了永久不失业,能够服务全世界的大坏蛋,所以才把什么都往里面塞。

这里举几个例子

1
2
3
4
5
6
7
8
Gelato - 意大利语的冰淇淋
Kanpai - 日语里的干杯
La boda - 西班牙里的结婚
Hana, Dul, Sae - 欧巴语里的一二三
Kamari - 印尼语的过来
Pwede na - 菲律宾语的可以开始了吗
Kuai dian la - 中文快点啦
...

香蕉语的基本音标 (Hana, Dul, Sae)

学日语有五十音,中文有拼音,德语、英语此类也都有自己的字母音标。所以首先,先讲讲音标,这个基本组成部分。

元音:a, u, o, i, oo, ee, an, aw, ae 欸, ey, oy

辅音:b, d, p, t, n, m, k, h, st, l, s, g

至于怎么读,基本和汉语拼音是一样的。出现两个同样字母的为长音和德语一样,st 的话连读就可以了。

小黄人语的特征是,语言急促,少长音、浊辅音,还有像sh, th 这样英文中的摩擦音。所以听起来都是叽里呱啦的。

香蕉语的基本用语 (Muak, Muak, Muak)

img

首先,无论是哪种语言,最先都得掌握些基本用语吧。所以,先来点用得上的,之后在电影院立刻能拿来装逼。

1
2
3
4
5
6
7
8
9
10
11
你好 - Bello (bello 在意大利语里面是帅哥的意思。顺便教一句,怎么撩意大利小哥。ciao bello, una notte con me . )
再见 - Poopaye
谢谢 - Tank yu
对不起 - Biido
给你 - Para tu
你敢!- Sa la ka!
我发誓(I swear) - Underwear(内衣,绝对是恶搞,哈哈)
我饿了 - Me want banana
我(们)爱你 - Tulaliloo ti amo. (没搞懂tulalillo是什么意思,可能是表示我们吧。ti amo是意大利语里的我爱你)
一二三 - Hana,Dul,Sae
苹果 - Papples

香蕉语更多资源

Dave saying Voila

音乐

原曲 小黄人版
Copacabana (科帕卡巴纳) - Bary Manilow Bella Banana (你好香蕉) - 小黄人四人组
I swear (我发誓) - Boyz II Men Underwear (内衣) - 同上四人组
YMCA - Village People YMCA - 同上
Barbara Ann (芭芭拉 安) - The Beach Boys Banana Song (香蕉之歌) - 还是同上
铃儿响叮当 - James Lord Pierpont 铃儿响叮当 - 小黄人逗比军团

黄宝书

MINIONESE - ENGLISH PHRASEBOOK Infographic

最后,来造个句。

Ti amo. Underwear. Muak, Muak Muak. XD

img

参考文献(这可是正经的研究)

  1. 小黄人语言集合
  2. Want To Learn Minion Language? Here’s A List Of Minion Words And Their English Translations
  3. Minionese, Language of the Minions: Origin, Vocabulary and Grammar
  4. Minion Dictionary
  5. The Minions’ language is a combination of French, Spanish, English… and food references

一、文章有什么贡献?

  1. 主要共享是提出了一个新的思路,以CCG (Combinatory Categorial Grammar) Supertag的形式将句法信息引入了,NMT(神经机器翻译)的解码器端,对NMT的性能有了一定提高。
  2. 用两种方式将CCG Supertag任务引入解码器,一种是直接插入输出的序列,一种是利用了多任务学习,对多任务学习的研究也有一些贡献。
  3. 展示了不光是解码器,当同时在编码器端输入语言学信息的时候,性能得到进一步提高。
  4. 对其中更多细节,如句子种类还有句子长度也进行了详细的分析。进一步理解,引入语言学信息后对NMT系统的影响。

二、本文研究问题有什么价值?

首先引入CCG Supertag来对NMT的解码器加入语法学信息,而且证明了这种情况下直接插入输出序列比多任务学习的性能要好。当然主要还是证明了,语言学对NMT系统的影响。

三、研究问题有什么挑战?

大概就是如何将CCG supertag的语法信息引入编码器端吧。

之后很多都是对系统的详细分析了。

四、本文解决思路?

本文提出了两个解决思路。

  1. 一个是interleaving,也就是将CCG supertag直接相间插入目标语言的序列中去,也就是将输出序列长度增加一倍,一个单词一个相应的tag。如这样 $y^{‘}=y_1^{tag},y_1^{word},…,y_T^{tag},y_T^{word}$ .

    然后就把这个当做是原来的目标语言序列,进行解码预测。

    interleaving

  2. 还有一种思路是利用多任务学习(Multi-task Learning),两个解码器分别用来翻译和输出CCG supertag,这两个解码器共享一个编码器。

    multitasking

    结果是第一个方案更好一些。

一、文章有何贡献?

主要贡献有三。

  1. 设计了RNNVis系统,这是一个用于理解、比较、和诊断自然语言处理任务中RNN的视觉分析系统。
  2. 提出一个用期望反应(expected response)来链接RNN中的隐藏状态和文本信息的新技术。
  3. 提出了一个图像为基础的序列可视化设计,来分析句子级别的RNN的行为。

二、本文研究问题有何价值?

现在关于神经网络的很多东西我们还并不是很理解,所以都把它当成是一个黑匣子。当然也有过一些对神经网络中捕捉的表达的探索,但主要集中在计算机视觉方面。

主要是因为序列语言中的规则难以视觉化,而且对于其中RNN的机制也很多地方没有理解,这篇论文有望让我们进一步理解RNN黑箱子里面的一些行为,然后对RNN结构进行提高。

三、研究问题有什么挑战?

四、本文解决思路?

  1. 对于第一个问题,就如问题,把生成器的StackLSTM替换成NMT的解码器,然后让NMT的解码器作为生成器来和RNNG的其他两个部件,Stack和Action部件进行互动。如每次只有当,Action部件生成Shift指令的时候,才让NMT的解码器预测下一个单词,然后推入Stack中去。

    RNNG 模型

    关于这个部分具体可以参考RNNG的原论文,重点读Generator Transition那一节。Dyer et al., Recurrent Neural Network Grammars

  2. 对于第二个问题,就是找个比较好的parser,对已有的平行语料库进行标注,然后再训练,也没有太多新颖的地方,却特意提到distillation。

五、讨论

虽然这篇论文的idea并不是让人惊喜,而且也没有给出模型的图片,还得跑去找RNNG的论文来看。

其中一些具体的实现细节也没提到, 比如是直接把NMT的解码器当做RNNG的生成器,然后进行Joint Training。还是说将Action和Stack的一些信息也作为输入信号输入了NMT的解码器呢,使得NMT的解码器可以进一步的利用获得的语法知识。就如论文 Wu, Shuangzhi, et al. Sequence-to-Dependency Neural Machine Translation 2017里面一样。

如果没有提到就是没有利用的话,那么这个思路不妨是个继续探索的方向。

一、文章有何贡献?

提出了一个叫做NMT (Neural Machine Translation) + RNNG (Recurrent Neural Network Grammars)的混合模型,这个模型如字面意思将注意力机制的NMT和RNNG进行了结合,可以同时进行dependency parsing和翻译。

二、本文研究问题有何价值?

也是将语法知识利用进NMT模型的一篇论文之一,与基线相比提高了一些性能。

三、研究问题有什么挑战?

大概有两条挑战。实际上感觉挑战并不是很大,只是将之前的RNNG的生成器部分替换成了NMT的解码器。

  1. 如何将原来的RNNG模型中的生成器的StackLSTM替换成NMT的解码器。
  2. 没有标注好parsing的平行语料库。

四、本文解决思路?

  1. 对于第一个问题,就如问题,把生成器的StackLSTM替换成NMT的解码器,然后让NMT的解码器作为生成器来和RNNG的其他两个部件,Stack和Action部件进行互动。如每次只有当,Action部件生成Shift指令的时候,才让NMT的解码器预测下一个单词,然后推入Stack中去。

    RNNG 模型

    关于这个部分具体可以参考RNNG的原论文,重点读Generator Transition那一节。Dyer et al., Recurrent Neural Network Grammars

  2. 对于第二个问题,就是找个比较好的parser,对已有的平行语料库进行标注,然后再训练,也没有太多新颖的地方,却特意提到distillation。

五、讨论

虽然这篇论文的idea并不是让人惊喜,而且也没有给出模型的图片,还得跑去找RNNG的论文来看。

其中一些具体的实现细节也没提到, 比如是直接把NMT的解码器当做RNNG的生成器,然后进行Joint Training。还是说将Action和Stack的一些信息也作为输入信号输入了NMT的解码器呢,使得NMT的解码器可以进一步的利用获得的语法知识。就如论文 Wu, Shuangzhi, et al. Sequence-to-Dependency Neural Machine Translation 2017里面一样。

如果没有提到就是没有利用的话,那么这个思路不妨是个继续探索的方向。