1. 程式人生 > >文字主題模型之非負矩陣分解(NMF)

文字主題模型之非負矩陣分解(NMF)

文字主題模型之潛在語義索引(LSI)中,我們講到LSI主題模型使用了奇異值分解,面臨著高維度計算量太大的問題。這裡我們就介紹另一種基於矩陣分解的主題模型:非負矩陣分解(NMF),它同樣使用了矩陣分解,但是計算量和處理速度則比LSI快,它是怎麼做到的呢?

1. 非負矩陣分解(NMF)概述

    非負矩陣分解(non-negative matrix factorization,以下簡稱NMF)是一種非常常用的矩陣分解方法,它可以適用於很多領域,比如影象特徵識別,語音識別等,這裡我們會主要關注於它在文字主題模型裡的運用。

    回顧奇異值分解,它會將一個矩陣分解為三個矩陣:

A=UΣVT">A=UΣVTA=UΣVT

 

    如果降維到kk維,則表示式為:

Am×nUm×kΣk×kVTk×nAm×n≈Um×kΣk×kVk×nT

 

    但是NMF雖然也是矩陣分解,它卻使用了不同的思路,它的目標是期望將矩陣分解為兩個矩陣:

Am×nWm×kHk×n
Am×n≈Wm×kHk×n

 

    分解成兩個矩陣是不是一定就比SVD省時呢?這裡的理論不深究,但是NMF的確比SVD快。不過如果大家讀過我寫的矩陣分解在協同過濾推薦演算法中的應用,就會發現裡面的FunkSVD所用的演算法思路和NMF基本是一致的,只不過FunkSVD聚焦於推薦演算法而已。

    那麼如何可以找到這樣的矩陣呢?這就涉及到NMF的優化思路了。

2. NMF的優化思路

     NMF期望找到這樣的兩個矩陣W,HW,H,使WHWH的矩陣乘積得到的矩陣對應的每個位置的值和原矩陣AA對應位置的值相比誤差儘可能的小。用數學的語言表示就是:

argminW,H12i,j(Aij(WH)ij)2argmin⏟W,H12∑i,j(Aij−(WH)ij)2

 

    如果完全用矩陣表示,則為:

argminW,H12||AWH||2Froargmin⏟W,H12||A−WH||Fro2

 

    其中,||||Fro||∗||Fro為Frobenius範數。

    當然對於這個式子,我們也可以加上L1和L2的正則化項如下:

    

argminW,H12||AWH||2Fro+αρ||W||1+αρ||H||1+α(1ρ)2||W||2Fro+α(1ρ)2||H||2Froargmin⏟W,H12||A−WH||Fro2+αρ||W||1+αρ||H||1+α(1−ρ)2||W||Fro2+α(1−ρ)2||H||Fro2

 

    其中,αα為L1&L2正則化引數,而ρρ為L1正則化佔總正則化項的比例。||||1||∗||1為L1範數。

    我們要求解的有mk+knm∗k+k∗n個引數。引數不少,常用的迭代方法有梯度下降法和擬牛頓法。不過如果我們決定加上了L1正則化的話就不能用梯度下降和擬牛頓法了。此時可以用座標軸下降法或者最小角迴歸法來求解。scikit-learn中NMF的庫目前是使用座標軸下降法來求解的,,即在迭代時,一次固定mk+kn1m∗k+k∗n−1個引數,僅僅最優化一個引數。這裡對優化求W,HW,H的過程就不再寫了,如果大家對座標軸下降法不熟悉,參看之前寫的這一篇Lasso迴歸演算法: 座標軸下降法與最小角迴歸法小結

3. NMF 用於文字主題模型

    回到我們本文的主題,NMF矩陣分解如何運用到我們的主題模型呢?

    此時NMF可以這樣解釋:我們輸入的有m個文字,n個詞,而AijAij對應第i個文字的第j個詞的特徵值,這裡最常用的是基於預處理後的標準化TF-IDF值。k是我們假設的主題數,一般要比文字數少。NMF分解後,WikWik對應第i個文字的和第k個主題的概率相關度,而HkjHkj對應第j個詞和第k個主題的概率相關度。  

    當然也可以反過來去解釋:我們輸入的有m個詞,n個文字,而AijAij對應第i個詞的第j個文字的特徵值,這裡最常用的是基於預處理後的標準化TF-IDF值。k是我們假設的主題數,一般要比文字數少。NMF分解後,WikWik對應第i個詞的和第k個主題的概率相關度,而HkjHkj對應第j個文字和第k個主題的概率相關度。

    注意到這裡我們使用的是"概率相關度",這是因為我們使用的是"非負"的矩陣分解,這樣我們的W,HW,H矩陣值的大小可以用概率值的角度去看。從而可以得到文字和主題的概率分佈關係。第二種解釋用一個圖來表示如下:

     和LSI相比,我們不光得到了文字和主題的關係,還得到了直觀的概率解釋,同時分解速度也不錯。當然NMF由於是兩個矩陣,相比LSI的三矩陣,NMF不能解決詞和詞義的相關度問題。這是一個小小的代價。

4. scikit-learn NMF的使用

    在 scikit-learn中,NMF在sklearn.decomposition.NMF包中,它支援L1和L2的正則化,而W,HW,H的求解使用座標軸下降法來實現。

    NMF需要注意的引數有:

    1) n_components:即我們的主題數k, 選擇k值需要一些對於要分析文字主題大概的先驗知識。可以多選擇幾組k的值進行NMF,然後對結果人為的進行一些驗證。

    2) init : 用於幫我們選擇W,HW,H迭代初值的演算法, 預設是None,即自動選擇值,不使用選擇初值的演算法。如果我們對收斂速度不滿意,才需要關注這個值,從scikit-learn提供的演算法中選擇一個合適的初值選取演算法。

    3)alpha: 即我們第三節中的正則化引數αα,需要調參。開始建議選擇一個比較小的值,如果發現效果不好在調參增大。

    4) l1_ratio: 即我們第三節中的正則化引數ρρ,L1正則化的比例,僅在α>0α>0時有效,需要調參。開始建議不使用,即用預設值0, 如果對L2的正則化不滿意再加上L1正則化。

    從上面可見,使用NMF的關鍵引數在於主題數的選擇n_components和正則化的兩個超引數α,ρα,ρ。

    此外,WW矩陣一般在呼叫fit_transform方法的返回值裡獲得,而HH矩陣則儲存在NMF類的components_成員中。

    下面我們給一個例子,我們有4個詞,5個文字組成的矩陣,需要找出這些文字和隱含的兩個主題之間的關係。程式碼如下:

    完整程式碼參見我的github:https://github.com/ljpzzz/machinelearning/blob/master/natural-language-processing/nmf.ipynb

import numpy as np
X = np.array([[1,1,5,2,3], [0,6,2,1,1], [3, 4,0,3,1], [4, 1,5,6,3]])
from sklearn.decomposition import NMF
model = NMF(n_components=2, alpha=0.01)

    現在我們看看分解得到的W,HW,H:

W = model.fit_transform(X)
H = model.components_
print W
print H

    結果如下:

[[ 1.67371185  0.02013017]
 [ 0.40564826  2.17004352]
 [ 0.77627836  1.5179425 ]
 [ 2.66991709  0.00940262]]
[[ 1.32014421  0.40901559  2.10322743  1.99087019  1.29852389]
 [ 0.25859086  2.59911791  0.00488947  0.37089193  0.14622829]]

    從結果可以看出, 第1,3,4,5個文字和第一個隱含主題更相關,而第二個文字與第二個隱含主題更加相關。如果需要下一個結論,我們可以說,第1,3,4,5個文字屬於第一個隱含主題,而第二個問題屬於第2個隱含主題。

5. NMF的其他應用

    雖然我們是在主題模型裡介紹的NMF,但實際上NMF的適用領域很廣,除了我們上面說的影象處理,語音處理,還包括訊號處理與醫藥工程等,是一個普適的方法。在這些領域使用NMF的關鍵在於將NMF套入一個合適的模型,使得W,HW,H矩陣都可以有明確的意義。這裡給一個圖展示NMF在做語音處理時的情形:

 

6. NMF主題模型小結

    NMF作為一個漂亮的矩陣分解方法,它可以很好的用於主題模型,並且使主題的結果有基於概率分佈的解釋性。但是NMF以及它的變種pLSA雖然可以從概率的角度解釋了主題模型,卻都只能對訓練樣本中的文字進行主題識別,而對不在樣本中的文字是無法識別其主題的。根本原因在於NMF與pLSA這類主題模型方法沒有考慮主題概率分佈的先驗知識,比如文字中出現體育主題的概率肯定比哲學主題的概率要高,這點來源於我們的先驗知識,但是無法告訴NMF主題模型。而LDA主題模型則考慮到了這一問題,目前來說,絕大多數的文字主題模型都是使用LDA以及其變體。下一篇我們就來討論LDA主題模型。

轉載自 文字主題模型之非負矩陣分解(NMF) - 劉建平Pinard - 部落格園  https://www.cnblogs.com/pinard/p/6812011.html