基于深度学习的自然语言处理在 2016 年有哪些值得期待
2016年,我押了三注,一注差点赔光
想象一下,你坐在2016年的一个会场里。
台上有个光头大佬在讲深度学习,台下工程师们的眼睛里全是星星。旁边那老哥抱着笔记本电脑,屏幕上刚跑完一条LSTM训练曲线——整整48个小时,降了一丁点loss,他开心得差点亲屏幕。
那一年,所有人都像打了鸡血。
为什么?
2015年那场“海啸”,其实早就来了
2015年,ACL第一次在北京开。我挤在人群里听Christopher Manning讲话,他说了两个字——“海啸”,形容深度学习对NLP的冲击。
会场上,大家表面在传阅论文,私下全在问:“你LSTM怎么调的?”“word2vec用哪个模型?” 那时候,传统分词、词性标注、命名实体识别,慢慢被CNN和RNN轮番挑战。年底,word2vec成了标配,seq2seq在机器翻译上刷出新高度,注意力机制也开始在一些论文里冒头。
我在实验室日志里写:“2015年证明了深度学习能干很多事,2016年才是真正的战场。”
你猜怎么着?开头猜对了,结局完全没想到。
我当时押了三注,现在回头看——一注差点赔光
第一注:定制化应用——别给我整个万能药
2016年初,AlphaGo赢了李世乭,整个圈子直接炸了。
大家疯狂把验证过的模型往NLP上套:情感分析?拿CNN句子分类那套搬过来就行。换个数据集就发论文。当时NAACL有一篇论文用神经网络检测小说人物关系——任务很具体,模型不复杂,但效果好得吓人。
我也干过这事儿。
那会儿我在做信访文本分类,直接拿单层CNN跑的。准确率比SVM高了3个点,差点就要开香槟庆祝了。可一换领域的数据,直接跌了10个点。
10个点啊,老铁!就像你拿了一把万能钥匙,结果发现锁是定制的,压根插不进去。
后来才明白,所谓的“定制化”不是改改输出层那么简单。得根据任务特点设计输入表示、做数据增强。比如句子对匹配,直接拼两个句子喂给LSTM,效果还不如传统的TF-IDF加余弦相似度。
踩坑现场:当时偷懒,把词向量按位置平均输入LSTM。结果在问答匹配任务上,被传统方法按在地上摩擦。后来老老实实加了个attention,才把差距拉回来。
第二注:隐变量——藏在水面下的暗线
那时候很多NLP任务爱用CRF做序列标注,因为它能显式建模标签之间的依赖关系。神经网络不行,就是个黑盒子。
2015年底,有人开始尝试在神经网络里引入隐变量——像剧本里的主线之外还藏着一条感情线,不直接说出来但你总归能感觉到。变分自编码器(VAE)慢慢进来了。
ICML 2016上,有论文把VAE带进了文本处理,比如《Neural Variational Inference for Text Processing》。同一批还有一篇关于变分自编码器的文章,也吸引了不少注意。
我当时特意跑了一下,在文本分类里用隐变量做半监督。确实能用大量无标签数据提升几个点的准确率。但训练极不稳定,KL散度经常崩,一崩就是整一周。
debug到周日晚上,才发现是词向量初始化的问题。换成预训练的GloVe,才跑通。
后来呢?隐变量在文本生成和可控生成上真火起来了。但那条线,2016年就埋下了。
第三注:注意力机制——论文增长点不是吹的
2015年,Bahdanau那篇attention论文刚出来。我读完,第一反应:这玩意儿能解决长序列问题?
但你知道跑这些实验的时候是什么感受吗?
手写了个batch-major的attention,用的还是Theano 0.8。Keras 1.0虽说已经有LSTM,但没有现成的attention层。结果生成的摘要,还不如直接用前三个句子。
三句话,简直在抽我脸。
问题出在哪?当时的双向RNN对齐方式太笨重,经常把主语和谓语怼到不同句子里。后来在decoder部分加了个dropout(keep_prob=0.7),逼着它别老盯一个位置,才算能看。
但注意力确实大大提高了长文本处理的性能。到了下半年,ACL和EMNLP的论文不带点attention都拿不出手。
当时没被重视的几个坑,现在看全是真香警告
回头看,2016年我们太乐观了。一些问题当时就摆在眼前,可惜被热情盖过去了。
Embedding能不能代表一切?
说出来你可能不信,做个话题检测,发现词向量会带上很多不相关的语义。
比如“苹果”——在食品语料里靠近水果,在科技语料里靠近手机。两个领域一混合,embedding卡在中间,两边都靠不上。
更头疼的是未登录词。很多专业词汇根本没有预训练向量,用UNK标记会丢掉大量信息。我当时用字符级别的Bigram embedding代替词向量,再用CNN在字符级做抽象。效果有提升,但计算量翻倍。
而且“2016”和“2017”这类数字和日期,embedding根本兜不住——你很难让模型给它们学出时间上的顺序关系。
后来看到Yoon Kim在EMNLP 2014那篇句子分类的论文里就提到,堆叠更多卷积层对句子分类的性能提升并不明显。我复现了一下,他的GitHub是真心良心,代码整洁,注释到位。结果呢?一层CNN和两层CNN的F1差距不到0.5个百分点。而且这个差距还不稳定——有时候一层反而更好。
看似万能的seq2seq
2016年,很多人把seq2seq当万能工具。
其实它有两个硬伤:一是对未知词汇的处理,二是生成长文本时容易重复。我写了个古诗生成器(纯粹好玩),发现如果不用注意力,生成的五言诗翻来覆去就是“明月照高楼”那几句。加上注意力后能生成“高楼望明月”之类的变化——但依然缺乏主题一致。
那时候哪有什么大规模预训练模型?只能自己灌数据,调beam search。beam size从1试到10,发现5左右最好,再大就开始重复句子。这些参数现在看很基础,当时是我一个个卡跑出来的。
给硬核读者——三篇必读论文
如果你想重温2016年那个节点,从这三篇论文入手就够了:
1. 《Neural Variational Inference for Text Processing》(ICML 2016)——看VAE怎么进入NLP。后来的可控生成、扩散模型,都能追溯到这篇。
2. Yoon Kim的《Convolutional Neural Networks for Sentence Classification》(EMNLP 2014)——看他做实验的严谨:固定随机种子、超参网格搜索、报告多次结果。这种习惯比模型本身重要。
3. Bahdanau的《Neural Machine Translation by Jointly Learning to Align and Translate》(2015)——attention的奠基之作,不读它,不知道注意力是怎么来的。
2016年给我最大的教训
别追着技术热点跑,回头看看任务本身需要什么。
Embedding解决了语义计算问题,但也带来了语义污染。Attention解决了长距离依赖,但把模型惯坏了——它学会了盯着关键字而忽略上下文。
这些事情,当时写论文的人不会告诉你。是自己跑代码跑出来的。
说到这儿,我想起一位大哥说过的话:技术就像桨,任务是船,但真正决定你能走多远的,是你到底想渡谁过河。
希望你踩的坑,比我少一个。
读者评论 3