背景
前六期提到了单词的处理,如Word2Vec 或者Wordembedding等等,也提到了一个简单的Naive Bayes模型。那么今天来用深度神经网络来处理这些文本。本篇不会涉及一些基础的神经网络,如神经元,反向传递等等。大家可以看下本系列第四篇文章,或者“机器学习的hello word”。 如果有问题,可以给我留言。
我们仍然会按照面对的问题,如何提出的解法,该解法的优缺点为顺序。
深度神经网络
面对的问题
如上一篇Navie Bayes一样,我们面对的是一堆代表文本的向量,同时每个文本都有对应的标签,如正面or 负面。而我们的任务是训练一个神经网络能够学习这些样本并准确预测新的样本。
更具体一点就是要预测下面这段文本是正面的还是负面的。
“此次去三亚,共住了3家宾馆,第一家是三亚湾的普通的,感觉还算干净,只是没热水,而且进房间的时候发现了一只壁虎,吓的不轻。第二天住提天域,虽然感觉没有喜来登的好,但是确是此次三亚旅游入住的三家中条件最好的,只是早餐太贵了,又没东西吃.珠江在大东海,所以俄罗斯人特别多,而且当地人去海滩的也多,感觉好像太嘈杂了。我们后来改为海景房,看海景还不错,阳台太小了,简直是可怜,房间还可以,吃的也是恶贵,午餐一个蔬菜、一个点心、一个菜泡饭,结帐要100多,晕倒。还有要提醒的是如果到春园那边吃海鲜,需要有耐心,我们三个人,点了4-5个菜,结果等了2小时,才把所有的菜上完。(还是老板娘亲自出马催,才在2小时之内吃好)”
RNN
Naive Bayes是通过处理词出现的频率来预测新的样本。之前也提到过,其并没有考虑词的顺序。那么如果如何考虑词的顺序呢?
下面的Gif图直观的解释了其中一部分原理。如果我们只看第一列,我们可以看到这是一个普通的神经元,即 F(W*X+b),但是与其他神经网络不同的是,其会将其输出值作为下一个神经元的输入值,最终形成顺序。
我自己看到这里的时候,最大的疑问是 上一个神经元的输出不是本来就要作为下一个神经元的输入值吗?这与基础的神经网络有什么不同呢?
有两个最大的不同:
传统神经网络,同一层之前的神经元并不会相互联系。其只与上下一层的神经元联系。 并且输入值的每个参数顺序并没有那么重要,可以X4,X3,X2,X1的顺序也可以是其他的顺序。因为其在处理时并没有考虑顺序,所有的神经元都与下一层相互联系。并没有区别;
但是对于RNN来说,X必须按照顺序输入。
另外一个最大的不同就是最基础神经元结构了。 传统神经元的结构就如下图非常简单,输入,输出,中间一些参数的调整。
而对于RNN来说,可能下面的图片就是一个神经元,这个神经元按照顺序处理5个输入值,然后输出h4.
理解了RNN与传统神经网络的不同,也就理解了RNN已经通过不同的神经网络结构将“顺序”这个因素考虑进去了。本次处理文本所用的是GRU,是循环神经网络的一个改良版。
由于前几期已经提到很多word2vec的处理,所以这一期将跳过该部分,直接进入神经网络部分。
神经网络结构与训练
由于输入层需要根据不用文本来确定,所以本次只提及隐藏层和输出层。
隐藏层. 隐藏层分为两层,每层含有256个GRU单元;
输出层. 为Dense层 两个神经元。
下图是TensorBoard的神经网络结构图,大家能看到从右边,Embedding 到Gru1到Gru2再到Dense层。
训练的结果如下:
训练20遍之后,训练样本的准确率达到97.15%,但是从图中可以看出,实际上Validation样本在80%多就暂停了。
对于训练样本与测试样本的差距,有一个主要原因是Overfitting的问题或者样本量的问题。 由于此次样本只有5000条酒店订单的评价。但是如下图,该神经网络的参数有80万个(除Embedding部分)。此次训练将5000个文本跑来20遍,大家能看到从第三遍开始validation样本和训练样本就偏离了。其间训练样本准确率不断提高,但是validation样本并未显著提高。
总结
本期用一个循环神经网络来做NLP。 但是有一点要强调,这个训练出来的是什么,它的应用场景是什么,优缺点是什么?
我的理解,该神经网络就是一个训练出来的词典or高级版本词典。 它不再受限于传统词典法的缺点,如不同行业不同次的意思不一样。如,我们需要酒店行业的文本分析,那可以直接用酒店行业的文本作为训练来源。
它的缺点也很明显,就是像所有神经网络一样是一个黑洞。比如,我们发现一个错误,词典法我们可以直接改正,但是对于神经网络我们却不知道要如何调整参数来避免下次犯同样的错误。