6月5号,由阿里巴巴iDST邀请到了江辉老师,在北京阿里巴巴绿地中心阿里同学们做了一场A New General Deep Learning Approach for Natural Language Processing的讲座。
分享概要
如今在NLP领域各种CNN,RNN及其变种网络层出不穷,但是它们在复杂度,模型训练等方面都有不少问题。在这样的现状下,能否有一种更简单的机制代替这样的复杂网络,同时又取得与其相当甚至更好的效果,这成为了很多人的诉求。
江辉老师直接切入了NLP的痛点之一——变长编码(variable-length encoding)。即NLP需要处理的往往不是定长(fixed-size)的数据,而是变长的短语,句子,段落甚至篇章。也是因为变长编码的原因,才使得NLP领域大量引入CNN和RNN模型。
技术核心
于是江辉老师及其团队,提出了FOFE-net架构,即FOFE(Fixed-size Ordinally-Forgetting Encoding) + DNN,来解决变长编码问题,同时降低模型复杂度,提高训练速度甚至整体效果
FOFE是一种简单精妙的rule-base编码方式。上图中,左侧1-of-K是传统的one-hot编码,右侧是FOFE编码的计算过程的例子,下方是计算公式,公式中,z是整个编码,t表达不同的时刻,e是当前时刻的词的one-hot向量。运算当前t时刻的FOFE等于上个时刻t-1的FOFE编码乘上一个打折系数(遗忘系数)alpha,然后加上t时刻词的one-hot,通俗的说就是,在one-hot的基础上利用了数值的大小表明了词的位置信息
FOFE是简单的,同时是精妙的,江辉老师也给出了FOFE的理论证明
解决了变长编码到定长编码的问题,那么后续只需要使用DNN(多层)就能完成很多任务,此次分享中,江辉老师展示了NLP的多个任务上使用FOFE-net和其他方法的结果对比
(红色部分为重点介绍的任务)
实验结果
由于文章篇幅有限,本文仅详细讲述Word Embedding任务,其他任务仅简单描述方法和结果
用了FOFE编码后Word Embedding变得非常简单,甚至并不需要深度学习相关的做法就能达到很好的性能。如图上所示,词表的长度为K,对于每个词w,我们使用该词左右两侧的若干词做FOFE编码,如果该词出现多次,那么left FOFE和right FOFE则是所有出现词w的上下文FOFE编码的平均(该做法只是策略之一),得到词到词context FOFE编码的矩阵后(K * 2K,2K是因为左右两个FOFE长度),使用SVD等sparse to dense的手段就能得到Word Embedding
这种简单的方式得到的效果轻松超越了word2vec,GloVe等方法
除此外江辉老师还介绍了NLP中不少任务上FOFE-net的做法和表现(下面只列举部分):
- 语言模型。使用FOFE方式编码词w历史的词,然后经过DNN预测下一个词的概率分布。在Google-1B的数据上,表现出惊人效果(超越绝大多数方法,并与谷歌的最好算法相当),并且训练时间上大大降低(google使用32GPU,FOFE使用1GPU)。
- 命名实体识别。假定某个词序列S=wn~wn+m为实体,使用FOFE编码S左右两侧的context,作为特征进入DNN,输出判断该词序列S是否是实体,是何种实体。在CoNLL03任务上,得到不错的效果。
- 信息抽取。在2015 KBP-EDL,2016 KBP-EDL上表现不俗。
还有不少任务,如指代消解,文本分类,实体链接,句法分析等都在分享中有分析和对比,由于篇幅原因不能一一列举
听众收获
江辉老师的分享非常精彩,虽然只有一个小时左右,干货多多,让人意犹未尽。
QA环节也有热烈的讨论:
- 问:FOFE编码在处理长句子时,是否会因为alpha不断打折而导致浮点精度问题丢失了一些词的信息?答:可以采用双向的FOFE编码减缓浮点精度问题
- 问:FOFE编码是否能再进入RNN,CNN然后效果是否会进一步提升?答:这个工作有学生做过,训练速度下降了,但是效果并没有好
个人思考
如有不对,欢迎评论区拍砖
- 问:如何在使用FOFE编码的同时融入更多其他信息,如词的标签,词性等,因为FOFE编码之后已经是整个sentence粒度,而词的标签还停留在word粒度?答:使用相同的编码方式编码额外的信息,如FOFE词性vector,FOFE词标签vector等;
- 问: 为什么FOFE-net会得到更优的性能?答:猜测。FOFE极大简化了网络复杂度,使得网络被训练得非常好,换句话说CNN和RNN这样得复杂网络在现有的BP算法下,很有可能没有被训得很好。这样的简化网络结构换取效果提升的思路貌似是个不错的方向
参考资料
The Fixed-Size Ordinally-Forgetting Encoding Method for Neural Network Language Models