zoukankan      html  css  js  c++  java
  • fastText(三):微博短文本下fastText的应用(二)

    上一篇讲到,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=1Cyilog⁡Pi=−∑i=1Cyilog⁡eθiTh∑j=1CeθjTh
    增加正则项后,代价函数:

    L(d,h)=−∑i=1CyilogPi+λ∑i=1V∥wi∥+μ∑j=1C∥θj∥
    L(d,h)=−∑i=1Cyilog⁡Pi+λ∑i=1V‖wi‖+μ∑j=1C‖θj‖
    此时词向量的更新方式变为:

    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的地方非常有限:

    在唯一的隐层,增加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中,某个词被干掉的概率与它在某个类别的出现频率相关:

    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的泛化性能得到了长足的进步,但是对于实际场景,尤其是微博短文本场景,依然是不够。在实际应用中,我们做了很多模型以外的工作,例如规则、爬虫等等。希望这三篇博客,能够对你有所帮助!吃饭去喽~


    ---------------------
    作者:cptu
    来源:CSDN
    原文:https://blog.csdn.net/ackclinkz/article/details/81907903
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Android启动过程介绍
    第九届蓝桥杯Java B组
    二分模板和区别
    第十届蓝桥杯Java B组
    2019 ICPC Asia Nanjing Regional(现场赛)
    PAT 甲级 1057 Stack
    P1972 [SDOI2009]HH的项链
    Python中的字典排序
    Comet OJ
    ekmp模板
  • 原文地址:https://www.cnblogs.com/ExMan/p/10142488.html
Copyright © 2011-2022 走看看