SVD 奇異值分解:SVD理解與word embedding

在研究NLP的過程中,遇到了word embedding, 經過一系列學習,發現它最初的原理之一來自奇異值分解。於是對奇異值分解做一個簡單的記錄。

資料中比較好的資料:

https://www.cnblogs.com/endlesscoding/p/10033527.html  原理講解簡單,demo做的十分好!

https://www.cnblogs.com/litaotao-doctor/p/5320521.html 這篇把特徵值和奇異值放在一起講,十分到位。

看完上面的資料後,我覺得自己沒必要記錄公式原理了,自慚形穢。好,下面開始:

 

SVD: Sigular Value Decomposition


個人認爲奇異值和特徵值應該可以有相同的理解,這裏我們先談特徵值:

特徵值的定義爲對矩陣A存在特徵值 λ,特徵向量x,使下式成立:

Ax=\lambda x

而對A的所有特徵值,我們稱爲A的譜,記爲λ(A)。

那麼我們該如何理解這個式子?

有幾個相關的關係可以給我們參考:矩陣A的秩不小於A的非零特徵值數;如果矩陣A不滿秩,則一定存在0特徵值;若矩陣A可對角化,則rankA = A的非零特徵值數。

也就是說 矩陣的特徵值與矩陣的線性相關性是有關係的。

則我們對特徵值的理解可以爲:

任意矩陣A對向量x的矩陣乘法,可以理解爲對x向量的表換(旋轉、平移、縮放),那麼Ax可以理解爲一次表換,而特徵值λ與x的相乘,表示了拉伸操作。也就是說:

對矩陣A的表換操作,存在一個向量在表換後向量的方向不變。

而從特徵值分解的角度上看,所有可對角化矩陣都可以被其特徵值及特徵向量所表徵。因爲我們知道,可對角化矩陣存在:

Q\Lambda Q^{-1} = A

的關係,所以我們可以通過對角化矩陣(特徵值構成的對角矩陣)表徵A,這個性質的證明可以考慮:

Q\Lambda=AQ

對兩邊做矩陣乘法會發現是相等的,必要性證明可以去百科看。

那麼我們對特徵值的理解又可以表示成:

可對角化矩陣可由其特徵向量及特徵值表徵。

而表徵的過程中,我們可以將特徵值向量理解爲一個線性子空間,其中特徵值標記了每個特徵向量的重要程度。

這樣一來,我們可以將特徵向量想象成一堆基向量,而矩陣恰好可以通過基向量進行表徵;而對於對稱矩陣,這些基向量爲正交基向量。

所以特徵值是一種可以讓我們對方陣拆分表徵的工具

 

一旦清晰了這個概念,我們來看SVD的表達式,結合實際中情況,就能輕鬆看出門道。

對於現實中的情況,我們往往遇不到方針,所以對MxN的矩陣M來說,奇異值分解爲,一定能找到左奇異方陣U和右奇異方陣V,使下式成立:

M=U\Sigma V^{*}

其中\Sigma爲MxN的半正定對角矩陣。

且U和V必須爲酉矩陣,即幺正矩陣,厄米共軛矩陣,其實就是複數域上的正交矩陣;

即對U、V存在

U^{H}=U^{-1}

而在實數域上,這樣的矩陣我們成爲正交矩陣,即矩陣由n個正交基組成,在行列上都爲n個正交的矩陣。

酉矩陣把這個概念擴展到了複數域。則我們在複數域上拿到了兩組正交基。

那同特徵值表示矩陣一樣,奇異值分解也是通過不同內積空間的變換表徵了任意矩陣M

 

到此,奇異值的分解原理可以解釋了,但可能會有些問題,比如\Sigma是不是有點太狠了,如果它是階對角矩陣,就說明U上的正交基中某些維度的值在計算過程中變爲0被捨棄了。

其實不然,我們要關心的是矩陣M的秩,因爲rankM <= min(M, N),所以奇異值分解能最大的保留M的特徵。

而我們最理想的情況,就是使用k<=rankM個非零奇異值,完全表徵矩陣M。

Word embedding 中的SVD


這也引入了我們在使用奇異值分解時的思路:

Standard SVD

 

這是原來的奇異值分解的各個矩陣,

Truncated SVD

這是實際使用時的矩陣,也就是所謂的 Truncated SVD。可以看到,實際使用時,我們並沒有保證U和V矩陣的維度大於等於A的秩,而是選擇了一個較小值 K。

 

以word embedding 爲例解釋:往往M和N都是非常大的值,如在word embedding中,我們一開始對每個詞進行特徵表徵會先統計一個co-occurance矩陣,標記了n-gram設定中,任意兩個詞同時出現的次數,即一個VxV的方陣,其中V表示詞典大小:

而因爲V常常是百萬級以上的大小,就會導致這個表格我們無法在計算中使用,所以將這個VxV的矩陣,定義爲奇異值分解中的U矩陣,而定義embedding維數爲k,即每個詞用k維的vector表示,利用一個mini版的奇異值分解模型,我們可以得到一個Vxk維的矩陣,我們稱之爲詞嵌入矩陣,在運算的過程中,每個token就會經過這個矩陣轉置爲一個向量表示,大大減少了所需要的運算空間。

 

當然,如果k越大,或者說越接近於真實Vxk維矩陣的非零奇異值數,我們得到的詞嵌入就越好,表現能力也越強,當然往往我們做不到,所以我們只需要保證,較大的奇異值被我們留下來就能很好的表徵詞嵌入了。

 

這就是SVD在詞嵌入中的應用,當然,隨着後來技術的發展,有了skip-gram,glove,output embedding等模型對詞嵌入有了更好的提升;我個人認爲這些提升都在於找到更好的奇異值進行表徵(但描述的問題變了,比如引進了context的模型進行表徵)。爲什麼這麼說的呢,因爲在Breaking the softmax bottleneck: A high-rank RNN language model中提到了一個問題,就是使用softmax函數做最後結果的輸出,迫使詞嵌入維度要大於其構建的一個context矩陣的秩;所以從這點可以看到這些問題都有着十分緊密的相似性!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章