fastText(二):微博短文字下fastText的應用(一)
眾所周知,微博中的內容以短文字居多,文字內容隨意性極強,這給建模增加了很大的難度。針對這一問題,這裡分享一下fastText在微博短文字的應用。
任務目標
簡單介紹一下整個任務的目標:給微博內容打上標籤,例如美妝、寵物用品等。這類問題可以轉化為經典的多分類問題。然而微博內容較短,並且文字隨意性極強,這給整個建模任務增加了難度。考慮到文字分類是一類偏線性的問題,本次建模使用了fastText。另外,值得注意的是,fastText能夠產生詞向量,它可以幫助我們理解資料。
標註
在真實場景下,監督學習是文字分類任務最靠譜的方法(PS:標註是一件苦差事,哈哈…..)。不同於學術研究,絕大部分的實際場景沒有現成的標註資料。因此,要訓練一個可用的分類器,資料標註是必不可少的步驟,並且要達到以下幾個要求:
覆蓋率(Coverage):在真實場景下,分類體系涉及上百個類目,標註資料需要覆蓋這些類目。
準確性(Precision):標註類目基本符合文字描述。
一致性(Consistency):標註資料的詞分佈與真實資料保持一致。
在上述要求中,重點講一下一致性。在監督學習中,線上和線下資料分佈不一致是導致上線效果血崩的重要原因。在文字分類中,詞分佈是衡量兩個資料集是否一致的重要指標。因此,標註資料的詞分佈應儘可能與真實資料保持一致。為了量化衡量詞分佈的不同,這裡使用Jensen-Shannon distance(JS)來衡量兩個分佈,計算公式如下所示:
DJS(P||Q)=∑i=1V12[DKL(P||M)+DKL(Q||M)]
DJS(P||Q)=∑i=1V12[DKL(P||M)+DKL(Q||M)]
其中PP代表標註資料的詞分佈,QQ代表真實資料的詞分佈,VV代表訓練集詞典大小,DKL(P||Q)DKL(P||Q)代表KL散度,M=12(P+Q)M=12(P+Q)。
根據上述三個指標,資料標註的流程可以表示為:
通過上述流程,標註資料的JS值最終達到0.107,近似等價於:
P(i)M(i)=Q(i)M(i)=20.107=1.07
P(i)M(i)=Q(i)M(i)=20.107=1.07
由上可知,標註資料和真實資料的詞分佈已基本一致,接下來就開始建模。
建模
在微博短文字的場景下,關鍵詞往往能代表整個句子的含義。在產出標註資料時,關鍵詞匹配也是主要的規則。然而,人制定的關鍵詞規則是有限的,不能涵蓋所有情況。因此fastText的訓練目標是:
學到人制定的關鍵詞規則
擴展出一些新的規則
為了驗證fastText對已有規則的學習程度,這裡將標註資料按照8:2的方式將資料切分為訓練資料和驗證資料。在訓練fastText時,選擇的引數如下所示:
引數名 數值
dim 120
lr 0.3
wordNgrams 3
minCount 30
bucket 10000000
epoch 100
最終在驗證集的準確率達到98.5%,證明fastText基本學會了人制定的規則。接下來需要驗證fastText的擴充套件性。這裡使用訓練好的fastText預測一天的廣告微博(未參與訓練),並通過人工判斷模型的預測效果。出乎意料,模型對真實資料的預測效果完全血崩,其中較為凸出的例子是:
你現在最困擾的面板問題是_?
拍這樣一套 藝術中國風婚照 多少錢??!
上面兩個微博,顯然屬於“祛痘”和“婚紗攝影”,但它們的預測類目與真實類目差了十萬八千里。面對這個問題,首先想到的問題是模型訓練有誤。考慮到關鍵詞往往能夠代表整個文字的含義,而fastText可以給每個詞一個vector表示,因此關鍵詞的近義詞質量可以用來判斷模型訓練效果。以此為基礎,使用cosine similarity計算了面板問題和婚照的近義詞,結果如下:
面板問題:
痘坑 0.974714
粗大 0.961591
痘痘 0.956858
暗瘡 0.953522
缺水 0.95262
祛痘 0.950534
只收 0.926314
痤瘡 0.92352
黑頭 0.922379
長痘 0.915288
1
2
3
4
5
6
7
8
9
10
11
婚照:
造 0.918399
婚紗照 0.915666
全送 0.901924
金夫人 0.882709
樣片 0.866033
客片 0.860637
相簿 0.850072
底片 0.845974
搶訂 0.84424
拍一套 0.808705
1
2
3
4
5
6
7
8
9
10
11
從上述結果可以看出,fastText在分類的同時,兼顧了關鍵詞的相似度,因此模型訓練基本沒有問題。當模型訓練基本沒有差錯時,問題可能出在標註資料上,為此統計了“面板問題”和“婚照”在訓練集的分佈情況:
其中縱軸代表數量,橫軸代表類目。顯然,在標註資料中,“婚照”和“面板問題”的分佈符合它的真實類目,標註資料不存在問題。此時,一個問題浮現與我的腦海,fastText對上述兩個關鍵詞的學習效果如何呢?結果如下:
其中,橫軸代表類目,縱軸代表預測打分。顯然,fastText的預測效果十分差。在分析原因之前,先總結一下上述實驗結論:
驗證集效果極佳
真實資料效果很差
真實樣本的預測效果不好
關鍵詞的近義詞質量不錯
標註資料中,關鍵詞的分佈基本符合人的要求
關鍵詞的預測效果極差
上述結論,可以進一步表述為:1. 使用餘弦相似度
score=w1∙w2∥w1∥∥w2∥
score=w1∙w2‖w1‖‖w2‖
作為測度時,模型訓練效果不錯(ww表示詞向量)。2. 使用線性分類器
score=eθTiw∑Cj=1eθTjw
score=eθiTw∑j=1CeθjTw
作為測度時,模型訓練效果很差(θθ表示模型,這裡假設使用softmax作為分類器)。對於上述問題,可以通過fastText的基本原理來分析。假設,fastText使用softmax作為loss,此時代價函式
L(d,h)=−∑i=1CyilogPi=−∑i=1CyilogeθTih∑Cj=1eθTjh
L(d,h)=−∑i=1CyilogPi=−∑i=1CyilogeθiTh∑j=1CeθjTh
其中yy表示類別(0或1),h表示隱層狀態1n∑ni=1wi1n∑i=1nwi。此時,更新引數θθ的方式是:
θi=θi−η∂L∂θi, i=1,2,...,C
θi=θi−η∂L∂θi, i=1,2,...,C
其中CC代表類別,
∂L∂θi=(Pi−yi)h
∂L∂θi=(Pi−yi)h
類似於Word2Vec中CBOW,句子中詞向量的更新方式是:
wj=wj−η∂L∂h, j=1,2,...,L
wj=wj−η∂L∂h, j=1,2,...,L
其中LL代表句子中詞的個數。值得注意的是,∂L∂h∂L∂h的偏導十分複雜。為此,fastText對∂L∂h∂L∂h作了近似計算,最終詞向量的更新方式為
wj=wj−η∑i=1C(Pi−yi)θi, j=1,2,...,L
wj=wj−η∑i=1C(Pi−yi)θi, j=1,2,...,L
從詞向量的更新方式可知,當兩個詞多次出現在同一個句子時,它們的詞向量會向著相同的方向變化。隨著模型的訓練,最終使這兩個詞餘弦相似。下圖是“面板問題”、“婚照”和它們的近義詞共同出現次數的統計:
實際統計結果符合理論分析,確定了餘弦相似度效果好的理論依據。那麼,為什麼最終的分類效果差呢?通過上一節的介紹可知,fastText採用了線性分類器(假設使用softmax)
score=eθTiw∑Cj=1eθTjw
score=eθiTw∑j=1CeθjTw
不同於餘弦相似度考慮向量間的夾角,線性分類器受到詞向量不同維度權重的影響。這裡可以近似理解為,詞向量的每一維度都代表一類資訊,一類資訊越強,其對最終分類結果影響越大。下圖是上述關鍵詞的詞向量分佈:
其中橫軸代表不同維度,縱軸代表權重。為了更加直觀表徵詞向量在不同維度的分佈,這裡使用了折線圖。通過上述兩圖可以看出,近義詞的詞向量隨維度的變化趨勢基本一致,區別在於權重大小。那麼這些近義詞的分類效果如何呢?
關鍵詞 分類
祛痘 label祛痘 1.00001 label郵政業務 1e-05
痘痘 label祛痘 1.00001 label郵政業務 1e-05
黑頭 label祛痘 0.899334 label豐胸 0.0984305 label國內遊 0.00187405
長痘 label豐胸 0.912702 label五金電工 0.0872995 label清潔用品 2.30091e-05
痤瘡 label豐胸 0.994396 label五金電工 0.00547735 label國內遊 0.000156227
痘坑 label豐胸 0.999394 label五金電工 0.000625976 label遊戲裝置 1.01868e-05
面板問題 label豐胸 0.995997 label五金電工 0.00400344 label遊戲裝置 2.38029e-05
關鍵詞 分類
婚紗照 label婚紗攝影 1.00001 label郵政業務 1e-05 label買點卡 1e-05
相簿 label豐胸 0.995544 label五金電工 0.00436158 label遊戲裝置 0.000107164
拍一套 label豐胸 0.996777 label遊戲裝置 0.00243306 label五金電工 0.000790049
婚照 label遊戲裝置 0.755574 label豐胸 0.244059 label五金電工 0.000393285
樣片 label豐胸 0.854614 label五金電工 0.0832258 label遊戲裝置 0.0618847
金夫人 label豐胸 0.940839 label五金電工 0.0574496 label遊戲裝置 0.00169886
客片 label豐胸 0.99946 label五金電工 0.000471862 label遊戲裝置 7.20562e-05
從分類效果可知,不同維度的權重大小對關鍵詞的分類效果至關重要。為了便於描述,這裡簡單使用向量的2-範數∥w∥‖w‖來衡量詞向量的大小。在進一步分析之前,這裡引入類別覆蓋率rr的概念。假設在類別aa中有nn個樣本,詞ll在pp個樣本中出現,則類別覆蓋率為
ral=pn
rla=pn
以此為基礎,類別純度表示類別覆蓋率的最大值
purity=max(r1l,r2l,...,rCl)
purity=max(rl1,rl2,...,rlC)
類別純度主要用於衡量某個詞是否是某個類的強特徵。例如,“婚紗照”在“婚紗攝影”中類別覆蓋率為90%,在“遊戲”和“祛痘”中覆蓋率為1%,那麼“婚紗照”就是“婚紗攝影”類的強特徵,此時類別純度為90%。根據fastText更新詞向量的方式可知,類別純度越高,它的詞向量範數越大。為了確定這種對應關係,統計了訓練結果
通過統計結果可知,範數與類別純度是正相關的。值得注意的是,上面提到的“婚紗照”、“祛痘”和“痘痘”等分類準確的詞,它們都是類別純度極高的詞(這與使用規則產出標註資料有直接的關係),因此它們的範數也會非常大。上文提到,fastText使用1n∑ni=1wi1n∑i=1nwi來表示文件向量。當一個句子含有上述高純度的詞,它會直接統治整個文件向量。此時,反向傳導不再受到文件中其他詞的影響。那麼當高純度詞分類準確時,代價函式會變得很小,看似效果很好,其實對很多有效關鍵詞置之不理。
總結
通過上面的分析可知,強特徵(關鍵詞)的存在是造成上述問題的根源。但是在真實場景中,語言具有隨意性,無法控制每個人按照既定的規則來敘述一件事情。瞭解機器學習的人會知道,此類問題屬於模型泛化問題,即從現有的資料,儘可能學到更多的知識。關於模型泛化的問題,我將在下一節進一步介紹。
---------------------
作者:cptu
來源:CSDN
原文:https://blog.csdn.net/ackclinkz/article/details/81907695
版權宣告:本文為博主原創文章,轉載請附上博文連結!