上一篇讲到,fastText在训练数据中过拟合的问题。接下来将介绍一些提升fastText泛化能力的尝试。网络
模型泛化
使用过fastText的人,每每会被它的不少特性征服,例如训练速度、兼具word embedding和分类等。可是正如一个硬币有正反两面,fastText也并不是完美,fastText的泛化性是它的短板。函数
增长正则项
在Logistic Regression中,调节正则项可以提升模型的泛化性能。经过上一篇博客可知,fastText的代价函数是:性能
L(d,h)=−∑i=1CyilogPi=−∑i=1CyilogeθTih∑Cj=1eθTjh
L(d,h)=−∑i=1CyilogPi=−∑i=1CyilogeθiTh∑j=1CeθjTh
增长正则项后,代价函数:学习
L(d,h)=−∑i=1CyilogPi+λ∑i=1V∥wi∥+μ∑j=1C∥θj∥
L(d,h)=−∑i=1CyilogPi+λ∑i=1V‖wi‖+μ∑j=1C‖θj‖
此时词向量的更新方式变为:.net
wj=wj−η∑i=1C(Pi−yi)θi−λwj, j=1,2,...,L
wj=wj−η∑i=1C(Pi−yi)θi−λwj, j=1,2,...,L
增长了正则项后,同一个句子的词向量没法按照相同的方向更新,词向量间的类似便没法保证。此时,fastText与常见的前馈神经网络(DNN)没有任何差异,它的不少优秀的特质所有丧失了。我的猜想,这是Mikolov大神为何没有在word2vec或者fastText中增长正则项的缘由。设计
Dropout
Dropout是常见的增长神经网络泛化性能的trick,它按照必定的几率将神经网络单元暂时从网络中丢弃。fastText做为一种浅层神经网络,可以加入dropout的地方很是有限:blog
在惟一的隐层,增长dropout,即hidden=dropout(1n∑ni=1wi)hidden=dropout(1n∑i=1nwi)
在输入层增长dorpout,即hidden=1n∑ni=1dropout(wi)hidden=1n∑i=1ndropout(wi)。在输入层dropout中,有两种方法:
按照几率,随机干掉某个词
按照几率,随机干掉某个词的某个维度
在微博场景下,第二种方法的第一个子方法是最好的,即按照几率,随机干掉某个词。在引入dropout时,最开始经过等几率干掉某个词,即博客
dropout(wi)={wi if p>t0 otherwise
dropout(wi)={wi if p>t0 otherwise
通过试验发现效果很差,模型对于某些关键词的学习效果不佳,例如上面提到的皮肤问题。考虑到微博广告文本中有许多强特征(关键词),它们的存在干扰了模型的泛化能力,所以等几率dropout是不适用的,须要一种不等几率的dropout——category dropout,简记为cdropout。在cdropout中,某个词被干掉的几率与它在某个类别的出现频率相关:io
cdropout(c,wi)={wi if p>1−t(c,i)0 otherwise
cdropout(c,wi)={wi if p>1−t(c,i)0 otherwise
其中cc表示训练样本的类别,t(c,i)t(c,i)表示词ii在类别cc中的阈值。设计t(c,i)t(c,i)时,须要考虑两个问题:微博
cdropout会干掉那些强特征,使模型可以从剩余的句子中,寻找有用的信息。
模型会把某些无用的词看成特征。
基于上述两个问题,t(c,i)t(c,i)的形式以下:
t(c,i)=max(0.5,log7n(c,i)10)
t(c,i)=max(0.5,log7n(c,i)10)
其中n(c,i)n(c,i)表示词ii在类别cc中出现的几率。t(c,i)t(c,i)既保证强特征不会被彻底干掉,也使模型可以从剩余的句子中寻找有用的信息。使用上述方法后,fastText对于关键词的预测效果以下所示:
关键词 类别
祛痘 label祛痘 1.00001 label邮政业务 1e-05 label买点卡 1e-05
痘痘 label祛痘 1.00001 label邮政业务 1e-05 label买点卡 1e-05
黑头 label祛痘 1.00001 label邮政业务 1e-05 label买点卡 1e-05
长痘 label祛痘 1.00001 label邮政业务 1e-05 label买点卡 1e-05
痤疮 label祛痘 1.00001 label邮政业务 1e-05 label买点卡 1e-05
痘坑 label祛痘 1.00001 label邮政业务 1e-05 label买点卡 1e-05
皮肤问题 label美甲美瞳 1.00001 label祛痘 1.05769e-05 label美发护发 1.00299e-05
关键词 类别
婚纱照 label美甲美瞳 1.00001 label祛痘 1.05769e-05 label美发护发 1.00299e-05
婚纱照 label旅行跟拍 0.549722 label婚纱摄影 0.450298 label邮政业务 1e-05
相册 label婚纱摄影 1.00001 label邮政业务 1e-05 label买点卡 1e-05
拍一套 label旅行跟拍 1.00001 label邮政业务 1e-05 label买点卡 1e-05
婚照 label婚纱摄影 1.00001 label邮政业务 1e-05 label买点卡 1e-05
样片 label婚纱摄影 1.00001 label祛痘 1.00004e-05 label美甲美瞳 1.00003e-05
金夫人 label婚纱摄影 1.00001 label减肥瘦身 1.00005e-05 label美发护发 1.00002e-05
客片 label婚纱摄影 1.00001 label旅行跟拍 1.00002e-05 label国内游 1e-05
显然,加入cdropout后,类别准确度有了长足的进步。与此同时,cdropout也兼顾了词的余弦类似度
祛痘
黑头 0.962714
粉刺 0.941785
痤疮 0.941042
毛孔 0.939662
痘坑 0.937129
长痘 0.934889
青春痘 0.915363
痘 0.910426
痘痘 0.910171
祛 0.909382
1
2
3
4
5
6
7
8
9
10
11
婚纱照
摄 0.921392
婚照 0.905441
海景 0.848199
造 0.832112
全送 0.831038
婚纱 0.826123
夜景 0.818146
放大 0.81653
视觉 0.807251
这座 0.804767
1
2
3
4
5
6
7
8
9
10
11
可见cdropout,不只提升了模型的泛化性能,并且保证了fastText的不少优秀特质。
总结经过cdropout,fastText的泛化性能获得了长足的进步,可是对于实际场景,尤为是微博短文本场景,依然是不够。在实际应用中,咱们作了不少模型之外的工做,例如规则、爬虫等等。但愿这三篇博客,可以对你有所帮助!吃饭去喽~