微信号:daiziguizhongren

介绍:深度分析大数据、深度学习、人工智能等技术,切中实际应用场景,为大家授业解惑.间或,也会介绍国内外相关领域有趣的面试题.

热点:深度学习如何在自然语言处理中大显身手?

2017-03-21 07:01 koth
作者简介:“非著名”的机器学习专家Koth,开源了基于深度学习的高精度中文分词系统,最近将深度学习用于简历分析,文本分类,序列标注,依存语法分析,等,也取得了成果。他大学学数学,毕业后一直从事机器学习和大数据相关的研发,具有丰富的理论和实战经验。最近思考开一个深度学习实战的直播,如果大家有兴趣,可以关注待字闺中公众号且留言,到时通知大家。
介绍

深度学习特别是RNN, LSTM, CNN 的兴起给自然语言处理带来了很多新的可能。结合字-词嵌入,很多原来需要很强特征工程的变得更加端到端化。以下结合几个场景大致总结下深度学习的应用。

文本分类

这个场景比较多,传统做法比较繁琐,分词,挑选特征词,计算tf-idf来文本向量化。 挑选模型的时候可能先尝试简单Naive Bayes,二类的话用svm或gbdt更多,每一步都会对最后结果产生影响。

深度学习时代,这个做法就更多了一般来说会先用Word2Vec或glove预训练下词嵌入,然后用词嵌入基础上选用CNN或者RNN。

一)先谈用卷积的情况,这里面有几个关键点:

一个是文本跟图片不一样,图片有长宽,然后还有深度(RGB)。对应到文本上,假设文章总共N个词,每个词嵌入维度K维,那么输入是N * K的,N可以理解为高度,K作为长度,深度为1。那么卷积的时候的特征抽取器(filter)高度h一般设置多大呢? 一般可以从3开始,表示捕获住trigram特征。

更多的是使用几种不同的filter(比如有高度各为2,3,5的)。 特征抽取器(filter)的长度一般设置为词向量的维度,这样保证每个filter抽取出来一个N-h+1个特征点,而不是一个平面(想想为什么)。

最重要的,在文本上work的pooling层一般是max-pooling,对每个filter应用整个序列上的max-pooling得到一个特征点(也有用k-max-pooling得到k个点),组合多个filter就能得到一系列特征,最后一个全连接层做分类。

这里为什么是max-pooling而不是min-pooling呢?一般来说,pooling后我们引入非线性是用Relu,relu对于小于0的直接就不激活了。

然后我们对比图像的深度,文本一般深度只有一个,如何增加深度以及为什么增加呢? 一般我们的词向量都是先预训练出来的,然后在一个特定任务上使用,梯度会回传回来进一步finetune,如果语料不是特别大,这个finetune过程只会对部分词进行更新,有些词就一直不动,这样在测试阶段,出现那些没finetune到的词就会有所偏差。我们可以同时使用两份词向量(相当于通道数为2,深度加深为2),一份finetune一份静态地不更新,来缓解前面提到的问题。

二) 对于RNN做文本分类,相当于把每个词作为一个时间节点,把词向量作为每个单元的输入特征,一般会组合前向以及后向来构成双向特征,计算后每个单元有个状态特征以及输出特征,文本分类一般组合每一个单元的输出特征求个平均喂给全连接层来做分类。 求平均这个操作可以替换为更通用的注意力机制,复杂度更高点,效果更好。 复杂点的模型会分层来做,句子界别的rnn然后attention,最后文档级别在前一层的基础上再rnn+attention,效果据说能更进一步提升。

另外,对于情感分析,我们也可以看做是个文本分类的任务,正面,负面还是中性。 情感分析上,Tree-LSTM模型一般效果更好点, 每一个节点捕获左右子树的特征。

序列标注

序列标注类应该是应用范围最大的一个方向,比如分词,词性标注等等。 这类目前STOA模型一般是BiLSTM+CRF。具体可以参靠待字闺中一篇分词实践的文章

这里再分享一个有意思的应用,对简历文本的分段,分出基本信息,工作经验,教育背景等段落。这个问题可以看成是一个序列标注,每一行可以标一个类别。

测试的时候把连续的相同类别看成一个段落。 这里采用BiLSTM+CRF时需要对每一行先做处理,得到每一行的特征输入,时间中我们选对每一行分词然后用卷积提取每一行的语义特征,送给上层的BiLSTM+CRF。这个模型能很好地捕获住语义特征,分段效果就跟人看简历分段落一样。

以上这种分层处理在很多场景是很场景的,再比如词性标注问题如果只考虑词的特征的话,对于一些不在训练语料的词准确度也会有所不足。 KCWS会对每个词在字符级别做一个卷积提取抽象特征,组合词的嵌入送入上BiLSTM+CRF模型来提高准确性。

Seq2Seq以及其它

这个场景主要覆盖翻译,聊天机器人。 一般先通过一个BiLSTM encode到一个向量,然后通过带注意力机制的LSTM decoder来一步一步解码。 解码过程一般会使用Beam Search之类的搜索机制。

序列标注跟这类是否一样呢? 我理解是序列标注可以用seq2seq的模型来做,但是由于seq2seq的解码机制是一步一步的,即使加上Beam Search其实也不保证解码是最优的序列,而CRF模型没这个问题,他的解码保证是最优的。  另外, 像翻译这类任务,因为他的目标tag集合太大了,显然序列标注是不可能的。

其他NLP还有很多方向深度学习都有较大发展,比如Q&A(阅读理解), 阅读理解要求读一个上下文,以及问题,通过学习到上下文跟问题之间的内在联系,给出答案。 阅读理解研究领域比较活跃,比如动态记忆网络,Match-LSTM,Co-attention网络等等。

依存分析中G家之前的Syntax Net以及刚更新的DRAGNN。 指代消解中甚至利用增强学习做到STOA效果等等,笔者水平有限,就不展开了。

总结

看完这篇你会发现,word2vec,glove类词向量是基础,在NLP各类场合基本都会出现。 然后就是LSTM,GRU类RNN+各种attention特别重要(Pointer Network出现场合也越来越多),CNN场景略少点。

 
待字闺中 更多文章 柯洁能赢AlphaGo吗?听AI专家马老师解道 柯杰能赢AlphaGo吗?听AI专家马老师解道 吃瓜群众不大明白,为什么马云的“刷脸支付”会惊艳? 如果看了此文还不懂 Word2Vec,那是我太笨 别人在说时,他却在做:孙正义对未来30年的布局
猜您喜欢 【干货】MySQL5.6配置同步复制的新方法以及常见问题的解决方法 从源码出发深入理解 Android Service 《计算广告》出版预告与目录 玩转 Windows 10 中的 Linux 子系统 App项目实战之路(三):原型篇