【深度学习图像识别课程】实战项目一:电影影评情感分析

目标:针对25000条影评和好评、差评标签,设计神经网络进行训练和预测

目录

1、初始构建

2、降低噪音

3、效率提升

4、进一步降低噪音

分析:权值变化背后的意义

1、构建简单的3层神经网络(输入,1隐藏,输出)进行训练和预测

第一次构建的想法:好评和差评区别就是,词出现的频率不一样。一些词出现的频率高就是好评,另外一些词出现的频率高就是差评。因此,集合所有训练评语中出现的词,然后统计好评、差评、所有评语中这些词的词频,利用构建的3层神经网络挖掘词频和评价的相关性。

一开始:统计每个评论里面各个词出现的次数,作为神经网络的输入进行训练。

直接预测,50%(跟我们想象中一致,猜中是对半概率)


(1)第一次训练:learning_rate = 0.1

        现象:效果很不好,推测可能是学习率太大,导致在最小值左右震荡

        对策:减小learing_rate数量级


(2)第二次训练:learning_rate = 0.01

        现象:正确率还是50%左右

        对策:继续减小learning_rate数量级


(3)第三次训练和测试:learning_rate = 0.001

        现象:正确率提高,但收敛很慢,而且正确率也不理想

        对策:再找其他办法,看看是不是初始思路错误;或者研究单个案例,看看哪里出了问题



2、增加信号,减少噪声

对问题的设计本身:按出现次数加权,加入了很多噪声

看下所有评论出现的词,发现有类似空格' '这样的词也参与了统计。


再分析其中一个案例发现,统计出现次数多的甚至时一些没有什么感情色彩很中性的词: the that school等。这些无关的词出现次数多,因此权重也很大,对模型产生了误导。


解决方法:去掉词语的加权影响,只要出现就为1,不出现就为0。再次作为输入,训练神经网络。

代码修改:



结果:训练和测试的正确率提升,并且收敛速度也加快



3、去除神经网络中的低效

去除那些神经网络能做的,但对结果没有任何效果的操作。

(1)输入0的部分,不需要进行乘法、相加。


(2)1乘以任何值都是本身,所以乘法也省去,直接改成加法。


代码修改:



结果:运行速度大大提高,训练速度从100/s到600/s,测试速度从500/s到1000/s



如果训练进行两次迭代的话,正确率提升:



4、进一步减少噪声,增强信号

挖掘类似于挖金矿,神经网络时挖掘机,有时候效果不好是挖掘机的问题,但也可能是挖掘的地方有问题。

(1)继续分析,发现提升的办法:剔除大量出现的无预测性的点

我们从源头来看,之前是把评论中每个词都做为输入训练神经网络。现在,我们升级一下。

用好评中最常出现的词,和,差评中最常出现的词,作为输入。



看pos_neg_most.common,大量的字位于中间,没有感情色彩,不具有预测性。而两边很少的词才是最重要的

因此,我们可以剔除中间这些不具有预测性的词,提高预测的准确性和计算速度。


再看下面一张图:这是所有词出现频率的统计,可以看到本语料库很极端,有一些词出现的次数非常多,另外一些出现非常少。

方法:去掉特别高频和特别低频的,用剩下的进行预测。下图中最左边突起其实主要就是上图中中间部分的累加。


(2)实现

设置2个变量,min_count和polarity_cutoff。min_count用来限制,达到这次次数,才会被放在vocab里面,然后对vocab中的进一步筛选,pos_neg_ratio.most_common()<-polarity_cutoff或者>polarity_cutoff的部分保留,中间不相关的大部分词去掉。


实现:

1)min_count = 20, polarity_cutoff = 0.05

     表现:速度大大提高,训练和测试误差有小幅度提升



2)min_count = 20, polarity_cutoff = 0.8

     表现:速度大大提高,测试结果基本一致

     分析:速度加快的原因是,polarity_cutoff更大,去掉的数据更多,参加计算的数据更少,模型训练的更快。

               数据量加倍的话,如果不想花更多的时间,可以通过类似的办法缩短时间。这样的结果会更好,因为覆盖的数据量范围更广。




5、分析:权重变化背后的意义

神经网络直观表示


下面两张图表明,同种类型的词对输出数据有同样的影响,也就是权重类似。



猜你喜欢

转载自blog.csdn.net/weixin_41770169/article/details/80096197