1

201703 阅读笔记

 2 years ago
source link: http://vividfree.github.io/%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/2017/03/14/201703-reading-list
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

序列到序列模型 (Sequence-to-sequence models, seq2seq models)

序列到序列模型是一种非常强大的模型,它基于深度神经网络,在machine translation、image cation等问题上取得了不错的效果。在很多模式识别问题里,序列是一种非常常见的研究对象,比如自然语言处理中的文本、语音识别中的声音、视频帧、基因序列。序列到序列模型有时候也被形容为端到端的模型,其思想比较直接,给一份输入,经过一个可以视作黑盒的模型处理,得到一份输出。在深度学习技术流行之前,很少看到在序列到序列模型上发表的研究成果,可能有不少研究工作,但是取得不错效果的工作较少。以machine translation为例,传统的方法是统计机器翻译,其中有代表性的模型有基于短语的机器翻译(phrase-based machine translation)、基于句法的机器翻译(syntax-based machine translation),这些模型或者需要调序模型、或者需要同步语法(参考中科院计算所刘群老师的机器翻译原理与方法讲义 (06)基于短语的统计机器翻译方法, (07)基于句法的统计机器翻译方法)。统计机器翻译模型本身是漂亮的,因为它融合了很多对语言学知识的建模,但是它至少有一点不足,就是需要建立多个子模型,比如调序模型、句法分析模型,这就会有误差传递的问题,一旦这些子模型出现错误,比如对某个句子的句法歧义没处理好,那么有可能造成该句子的最终翻译结果很差。序列到序列模型的机器翻译技术有望避免统计机器翻译碰到的这个问题。

想到2个后面可以用序列到序列模型玩玩的toy问题:1)语言方面的文言文到白话文的翻译,甚至是失传文字到现代文字的翻译;2)密码领域的暗文到明文的翻译。

  • Neural Machine Translation and Sequence-to-sequence Models: A Tutorial
    • 这是一篇关于seq2seq模型非常好的综述性文章,以语言模型和机器翻译问题为例介绍了seq2seq模型,作者不但对模型做描述,而且还详细介绍了一些模型的优缺点以及一些改进策略,也相应的给出很多参考文献。总体来说,这篇文章适合需要入门seq2seq模型的同学看,也适合想了解语言模型技术演变的来龙去脉的同学看。
    • 语言模型
      • 语言模型的2大用处:1)评估句子的流利程度;2)生成自然语言的文本
      • N-gram语言模型
        • 优化目标:似然函数最大。参数学习方法:最大似然估计。
        • 语言模型的平滑问题(smoothing)。有多种smoothing算法,目前最常用的是modified Kneser-Ney Smoothing(MKN)算法
        • 语言模型的评估方法。和通常的机器学习模型问题一样,也是要把数据分为训练集、验证集(有些文献也叫开发集)和测试集,其中验证集的作用是帮助调试超参数。在评估指标方面,语言模型常用log likelihood和perplexity(这两者也应用于topic model等无监督学习问题中)。
        • 如何处理未登录词。通常有3种处理办法:1)Assume closed vocabulary: 在某些问题场景下,可以认为在测试集中不会出现新词,而一旦出现新词,则视作非法输入并被直接抛弃。2)Interpolate with an unknown words distribution. 3)Add an “unk” word.
        • 其他更深入的问题:1)大数据量下如何训语言模型。2)语言模型的迁移学习。3)如何更好的处理远距离依赖问题。4)基于句法的语言模型。
      • Log-linear语言模型
        • Log-linear模型是统计NLP领域的常用模型,上文提到的统计机器翻译模型基本都是基于log-linear模型。Log-linear是判别式模型,而n-gram是生成式模型。Log-linear模型可以基于被研究的问题灵活的选择特征,用在语言模型问题上,模型的表达能力自然比n-gram语言模型要强,如果语料数量充足且质量好,基于该模型学到的语言模型自然不会比n-gram语言模型差。
        • 优化目标:似然函数最大,或者可以等价的说成 negative log likelihood 最小。说明,在这个问题上其本质用到的是 cross entropy loss 。参数学习方法:各种基于gradient的优化方法,该文章则主要选用SGD来介绍,因为近几年SGD几乎是深度神经网络的首选算法。
        • 相比batch gradient descent,SGD的稳定性要差些,为此有一些常用的trick来提高SGD的稳定性,比如:1)更好的调整learning rate;2)early stopping;3)在每一轮迭代前shuffle下训练数据。
        • SGD的变种有一些,在之前的”201603 阅读笔记”博客中也提到过这方面的内容,这篇论文里列举了常见的3个变种。
      • Neural Network语言模型
        • Log-linear语言模型可以看做是单层的神经网络语言模型,可以把这个单层网络结构弄复杂点,变成多层神经网络(multi-layer perceptrons, MLPs),以让语言模型的效果更好。
        • 神经网络语言模型的输入层一般会是word embedding过后的向量,而不是one-hot形式的向量,这可以有效减少神经网络的参数规模。这个word embedding向量既可以在神经网络语言模型中和语言模型一起被jointly learning,也可以用word2vec学到向量并在训练中不被修改,还可以先用word2vec学到词向量,然后放到神经网络语言模型中作为初始值,然后进行fine tuning。
        • Softmax的高效计算:1)softmax的近似计算,对负样本采样,可以以word2vec工具中的negative sampling为例进行理解,背后的理论是noise-contrastive estimation(NCE);2)其他softmax结构,比如class-based softmax, hierarchical softmax等。
      • Recurrent Neural Network语言模型
        • 基于RNN的语言模型,用RNN网络结构替换MLP网络结构
        • 文章在这块顺带介绍了vanishing gradient问题及其一种解决办法,就是LSTM结构。对没有forget gate的LSTM结构而言,因为其memory cell c满足 dctdct−1 恒等于1,所以存在于memory cell的信息不会碰到vanishing gradient问题。但现在通常的LSTM结构是会带forget gate(在之前的”201702 阅读笔记”博客中提到过这方面的内容),forget gate有可能一直取值为0,这会造成其抛弃之前的memeory,并丧失学习远距离依赖关系的能力。为此,一般在开始训练RNN前,会给forget gate的截距项bias置为一个较大值,比如1,以让模型训练初期,forget gate有个较大的值,而随着训练的持续进行,forget gate的取值可能越来越小。
        • SGD的缺点是不能做数据并行,只能一个样本一个样本算,而mini-batch刚好可以让在一个mini-batch的样本做数据并行。另一方面,不同于MLP、CNN网络结构可以在样本里做并行(基于GPU的矩阵运算),而RNN却只能从串行从前算到后,不能充分利用GPU硬件的优势。但这个问题可以和mini-batch结合起来以巧妙的解决,借助sentence padding和masking技术做到数据上的并行。
    • 翻译模型
      • Neural Encoder-Decoder模型
        • Neural encoder-decoder模型是关于seq2seq问题(最直接的例子就是机器翻译)的有效模型。
        • 这部分内容比较好懂,可以顺带和之前的”201702 阅读笔记”博客中的机器翻译内容结合起来一块理解。如果对attention如何建模不大熟悉,可以看下第8.4节描述的3种方法,GNMT用的正是其中的MLP建模方法。
  • DyNet 论文 , 开源项目主页
    • DyNet是CMU主导并联合其他研究机构一起研发的神经网络开源工具包,按照项目主页的介绍,该工具包专攻NLP tasks,并在句法分析、机器翻译等问题上取得了state-of-the-art效果。Graham Neubig是DyNet的主要作者之一。

神经网络的损失函数

在神经网络中,损失函数一般使用cross-entropy cost function(交叉熵损失函数),而不是 quadratic cost function(平方损失函数)。主要原因是交叉熵损失函数的梯度要大于平方损失函数的梯度(对于同样的输入和输出),对于深度神经网络而言,梯度大意味着模型权重可以快速更新。对于sigmoid激活函数,平方损失函数的梯度会带有激活函数的导数,而这个导数是小于1的,而交叉熵损失函数的梯度就没有激活函数的导数(通过数学推导计算,这个导数实际上是被分子分母约掉),所以其梯度要更大些。对这块更详细的介绍可以看:


原创文章,转载请注明:转载自vividfree的博客

本文链接地址:201703 阅读笔记



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK