赞
踩
整篇论文做到了什么?
a simple CNN with little hyperparameter tuning and static vectors achieves excellent results
Learning task-specific vectors through fine-tuning offers further gains in performance
The CNN models discussed herein improve upon the state of the art on 4 out of 7 tasks, which include sentiment analysis and question classification。
好了,我们说人话,其实就是论文提出的模型,以训练好的词向量 + CNN的方式在多个领域表现都不错,包括情感分析和问题分类的问题上。
在这里我们需要注意的一点是,这个训练好的词向量可以是静态的,也可以是动态的,恩哼?什么意思,总得来说就是你想不想:你预先训练好的词向量随着(下游)分类任务的优化进行微调,不想,静态,其实就是常数,想,动态,就是变量。论文说基于下游任务微调过得向量表现更佳。
OK, 到这里我们来圈一下重点,我们假设有了预选练好的词向量,我们将目光放在:CNN的结构上。
关于CNN的结构效果的讨论:
we train a simple CNN with one layer of convolution on top of word vectors obtained from an unsupervised neural language model.
We initially keep the word vectors static and learn only the other parameters of the model.
Despite little tuning of hyperparameters, this simple model achieves excellent results on multiple benchmarks, suggesting that the pre-trained vectors are ‘universal’ feature extractors that can be utilized for various classification tasks.
上面解释起来就是:作者提出一个很简单的模型,虽然超参数很少,而且即使我们使用预训练的静态的词向量,也有不错的效果。
Learning task-specific vectors through fine-tuning results in further improvements
We finally describe a simple modification to the architecture to allow for the use of both pre-trained and
task-specific vectors by having multiple channels.
相当于上面的进阶,同时使用预训练的静态词向量和允许微调的动态词向量,做成多通道的输入输入模型。
先放上原论文的图:
输入层:双channel,一个是预训练好的词向量(设为静态),另一个和它一样(但是设为动态)。所以输入层一个句子样本的Size为[ n,k,2 ],考虑bach_size,则为[ bach_size,n,k,2 ],其中n为最大句长度(所以很明显,长了要截掉,端了要填充),k为词向量的维度(你自己训练时设置的维度,常为2^m)
卷积层:也叫filter,我们先看超参数,h:filter_size(卷积大小,注意,这里和图片的区别是,它的横向维度和词向量维度一样,见图,所以卷积只在竖直方向移动)。m:卷积的个数(体现了模型的宽度)。
其他超参数:stride:步长 padding:填充方式,为了和论文公式相同,我们这里步长设置为1,padding为VALID(其实由于步长是1,无所谓了)
规定了超参数,我们来算一下,原一个batch的样本,现在的维度是什么样的?我jio的我放个论文上的公式比较正统:
使用自己在train上训练的embedding:
total_train_acc is 0.890625
total_value_acc is 0.5418685793755335
使用外部数据的情况:
total_train_acc is 0.9440104166666666
total_value_acc is 0.5796875928236701
注意:结果是所有结果求平均后的参考结果。
结论: 要么是我自己训练的embedding质量不高,毕竟数据样本就1万条,要么就是在train的样本上做embedding,再用这个embedding训练模型会造成一定的过拟和,使用预训练的样本更有价值(当然,第二个结论是我瞎扯,我个人偏向于embedding质量不高,所以我推荐你们使用网上预训练好的词向量)
本人最开始也尝试了单通道(动态)的情况,为了有对比价值,这里就直接用外部数据的embedding:
total_train_acc is 0.9429347826086957
total_value_acc is 0.578694744679852
注意:这也是平均值
最后:我觉得现在你应该知道怎么提高质量了吧,当然如果你有处理过拟和问题的思路,请赐教,我是无解了。
为了上面的过拟和问题的尝试,在github上看到一个点,这里尝试一下。
对embedding层后面加一个droput(好残暴的感觉…)(这里是在上面双通道的基础上测试)
测试结果,新加的dropout丢弃率为0.5,这里没有调参,大致知道这一层的效果是什么样了,但是感觉这一层好玄学。
total_train_acc is 0.7629573170731707
total_value_acc is 0.5367982606693403
所以,玄学也救不了我…可能我丢弃率太高了,但是dropout常理来说是卷积完以后加在全连接层的,这个加法也是很奇怪。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。