Representation Learning(詞嵌入NNLM,word2vec,GloVe)

在這裏插入圖片描述
NLP(Natural Language Processing)
NLP主要是關注計算機和人類(自然)語言之間的相互作用的領域。如果要想實現人機間自然語言通信意味着要使計算機既能理解自然語言文本的意義,也能以自然語言文本來表達給定的意圖、思想等。前者稱爲自然語言理解,後者稱爲自然語言生成,這也是NLP的兩大任務。

但處理它的困難之處在於自然語言是一種符號,出現的理由是爲了作爲一種方便人類進行高效交流的工具,但,想要高效免不了會進行省略,即說話人之間交流可能只說一小部分話,然後剩下的部分是由聽話人按自己的世界觀進行補全。另外語言和句法中本身存在模糊不清,同一句話可能有多個意義。語義可能與順序和指代詞有關,而且某些語言就人類角度還帶有深意等等等…

語言模型(Language Model)
想要量化語言,首先需要建模。語言模型就是用來衡量一句話多大程度是人話的模型(是否通順,符合語法句法),理論上可以直接把整個句子放進模型然後預測這個句子S是否是人話,但這樣訓練量大,且很難學習到句子的內部特徵。那麼可以使用Chain Rule,把句子中每個詞的聯合概率表示,也可以表示成多個條件概率的乘積。LM分爲Unigram,Bigram(first order markov assumption),N-gram。UnigramP(S)=P(w1,w2,...,wn)=P(w1)P(w2)P(w3)...P(wn)Unigram,P(S)=P(w_1,w_2,...,w_n)=P(w_1)P(w_2)P(w_3)...P(w_n)BigramP(S)=P(w1,w2,...,wn)=P(w1)P(w2w1)P(w3w2)...P(wnwn1)Bigram,P(S)=P(w_1,w_2,...,w_n)=P(w_1)P(w_2|w_1)P(w_3|w_2)...P(w_n|w_{n-1})Ngram,P(S)=P(w1,w2,...,wn)=P(w1)P(w2w1)P(w3w1,w2)...P(wnw1,w2,...,wn1)N-gram,P(S)=P(w_1,w_2,...,w_n)=P(w_1)P(w_2|w_1)P(w_3|w_1,w_2)...P(w_n|w_1,w_2,...,w_{n-1})L=wClogP(wcontext(w))CwL=\sum_{w\in C} logP(w|context(w)),C爲w的映射

其中Estimating Probability的P(Wn) = 詞彙Wn出現次數 / 語料庫所有詞彙數量V。
ungram model是最簡單的,不考慮語言邏輯,如“今天 下雪 了”和“了 下雪 今天”的概率顯然不應該是一樣的。Bigram model在隨機的基礎上,會大概率選取關聯概率最大的單詞,因此優於unigram。N-gram,在有大量的語料庫的基礎上,可以訓練。

如何評估語言模型?
計算P的概率便可以判斷了,所以準確率,recall也是可以使用的。但是在LM一般使用句子的混亂度來判斷:
Perplexity=2(x)Perplexity = 2^{(-x)}x=logP(w1)+logP(w2w1)...Nx=\frac{logP(w_1)+logP(w_2|w_1)...}{N}x : average log likelihood。一般來說它越小越好,N-gram考慮了很多的情況時,Perplexity是最小的。

如何處理語料庫沒有的情況?
如果出現了語料庫沒有詞彙,將會導致概率連乘爲0的情況。Smoothing的方法有:

  • Add-1 Smoothing。和貝葉斯一樣的Laplace Smoothing ,即PMLE(wiwi1)=c((wi,wi1))c(wi)P_{MLE}(w_i | w_{i-1}) = \frac{c((w_i , w_{i-1}))}{ c(w_i )}PAdd1(wiwi1)=c((wi,wi1))+1c(wi)+VP_{Add-1}(w_i | w_{i-1}) = \frac{c((w_i , w_{i-1})) + 1}{ c(w_i ) + V}V是詞典的大小(無重複詞),在分母中加V而不是其他的數,是爲了保持所有P()的總和爲1。
  • Add-k Smoothing。PAddk(wiwi1)=c((wi,wi1))+kc(wi)+kVP_{Add-k}(w_i | w_{i-1}) = \frac{c((w_i , w_{i-1})) + k}{ c(w_i ) +k V}可以自由設置k,但同時也可以優化 f(k) ,即把k包含到損失函數中。此時Perplexity = f(k),故 Minperplexity=Minf(k)=>k=argminkf(k)Min_{perplexity}= Min_{ f(k)} => k= argmin_k f(k)
  • Interpolation。現在不出現的概率,不代表未來數據更多還不出現。某些詞的重要性會不一樣,即還需要考慮到詞頻信息。P(wnwn1,wn2)=λ1P(wnwn1,wn2)+λ2P(wnwn1)+λ3P(wn),λ1+λ2+λ3=1P(w_n|w_{n-1},w_{n-2}) = λ_1P(w_n|w_{n-1},w_{n-2})+ λ_2P(w_n|w_{n-1})+ λ_3P(w_n),其中 λ_1+λ_2+λ_3 =1
  • Good-Turning Smoothing。考慮到了新的情況(未出現),相當於把一些概率已經給到了新事件PGT=(c+1)Nc+1NcP_{GT}=\frac{(c+1)N_{c+1}}{ N_c}N_c是出現c次的單詞的個數。

N-gram 語言模型缺點
簡而言之,N-gram 模型就是用 P(wtwtn+1,,wt1)P(w_t | w_{t-n+1}, …, w_{t-1})來模擬上述公式的方法,式子中的N比那時N-gram的來歷。當N=1的時候,公式會退化變成:
p(wtContext)=p(wt)=NwtNp(w_t|Context)=p(w_t)=\frac{N_{w_t}}{N}
它也被稱爲一元語言模型,或者上下文無關語言模型,即不考慮該詞所對應的上下文環境,僅考慮當前詞本身的概率,那麼通過計算詞頻就可以達成目標了。
但N-gram 語言模型也存在一些問題:

  • N=1時無法建模出詞之間的相似度(只是單純算詞頻,沒有考慮到上下文)。以及無法建模更遠的關係。
  • 但是當使用N=高階的時候,往往這樣的單詞組合出現概率很低,整體的統計概率的可信度就大打折扣。
  • 而且在處理數據時存在1 序列的長度未知。2 通過詞的組合方式得到的句子非常龐大。3 耗費人力且相當主觀。 4如果計算相似度非常不準確。

神經網絡語言模型(Neural Network Language Model,NNLM)
其實處理N-gram的問題,不可以用one-hot處理詞後再進行相似度計算?詞數太多太稀疏?矩陣分解可以解決。詞的權重可以利用TF * IDF來計算,其中TF表示詞頻,即一個詞在這篇文本中出現的頻率;IDF表示逆文檔頻率,即一個詞在所有文本中出現的頻率倒數。

但是,在數據集如何足夠的情況下…請上深度學習,意在求解某個抽象過的特徵向量來代表某個詞(這也是主要區別,一個詞就是詞,另一個把詞變成了向量,語義更豐富,而且每個句子、短語和邏輯表述都是向量,然後再神經網絡負責合併),特別在是單詞在句子語境中,應該通過單詞的同伴來知道它的意思,在文本中理解它的意思。不過如何求解其中的參數,使其能夠根據context上下文來進行理解句子的可能嘗試呢?NNLM模型便如下圖:
在這裏插入圖片描述
嘗試用神經網絡方法求解的一般思路是:

  • 訓練集:數據巨大且固定的詞彙的集合V=w1...wtV={w_1...w_t}
  • 訓練目標:得到一個好的函數能將每個詞映射爲向量–f(wt,wt1,,wtn+2,wtn+1)=p(wtw1t1)f(w_t,w_{t-1},\dots,w_{t-n+2},w_{t-n+1})=p(w_t|w_1^{t-1}),其中約束爲f(wt,wt1,,wtn+2,wtn+1)>0f(w_t,w_{t-1},\dots,w_{t-n+2},w_{t-n+1}) > 0並且Σi=1Vf(i,wt1,,wtn+2,wtn+1)=1\Sigma_{i=1}^{|V|} f(i,w_{t-1},\dots,w_{t-n+2},w_{t-n+1}) = 1
  • 損失函數:最大似然+正則項:
    max1Ttlogf(wt,wt1,,wtn+2,wtn+1;θ)+L(θ)max \frac{1}{T}\sum_tlogf(w_t,w_{t-1},\dots,w_{t-n+2},w_{t-n+1};\theta) + L(\theta)
  • f 函數的深度擬合。y=b+Wx+Utanh(d+Hx)y=b+Wx+Utanh(d+Hx),其中b,W,U,d,Hb,W,U,d,H都是參數。最後輸出層採用sofamax得到概率p:
    p(wtwt1,,wtn+2,wtn+1)=eywtieyip(w_t|w_{t-1},\dots,w_{t-n+2},w_{t-n+1})=\frac{e^{y_{w_t}}}{\sum_ie^{y_i}}
  • 隨機梯度下降:

θ+ϵlogp(wtwt1,,wtn+2,wtn+1)θθ\theta + \epsilon \frac{\partial log p(w_t | w_{t-1},\dots,w_{t-n+2},w_{t-n+1})}{\partial \theta} \to \theta

然後結合具體NNLM的模型圖,它的處理細節是先假設每個單詞的輸入共享一個詞向量(其實這是副產物,它的出現還是爲了預測句子的),於是可以得到每個詞向量,然後先nn一層,再把這個輸入和原詞向量拼接後在nn,以預測下一個詞。網絡訓練完成後,也就得到這樣的詞向量,完成了word embedding。

  • 爲什麼輸入層直連輸出層? 因爲這是一種recurrent的作法,其實可以做,也可以不做。做了拼接,相當於擴展了基本特徵(也可使高層的梯度直接到下層,便於梯度訓練); 但不做的Mikolov方法就只用了一層,效果也很好。
  • 爲什麼要將每個詞首尾相接? 目的是把當前詞的前n-1個詞表示成向量形式的輸入,送到神經網絡中,從而訓練這n-1個詞的詞向量。同樣,可以這麼做,也可以不這麼做。這麼做了,實際上就是運用了語言模型的簡單粗暴又直接;不這麼做,同樣也可以選擇Matrix vector,或者卷積神經網絡,或者RNN對每個詞進行處理一下,一樣也能達到目的。

word2vec
Word2Vec是NNLM的升級版,基本的網絡結構很像,只是訓練方法不太一樣。主要有兩種形式,通過這兩種形式,最後得到每個詞的詞向量(副產物):

  • 通過詞彙去預測上下文–Skip-gram。
  • 通過上下文來預測詞彙–CBOW(Continuous Bag-of-Words)

###關於word2vec的理論細節推導強烈推薦《word2vec中的數學原理詳解》,下面只整理一些個人的想法。
在這裏插入圖片描述
(w(t)代表當前詞語位於句子的位置t,窗口大小爲5,共同構成上下文)

首先這兩者與NNLM模型的不同在於,一是沒有NNLM的隱層(據說是因爲隱層會使矩陣運算變很多),二是輸入層單詞經過映射矩陣得到的D維詞向量累加而不是拼接構成映射層,三是使用了哈夫曼非線性。

CBOW,可以看成由當前詞彙到預測其他相關詞彙的多分類問題,但是對於最後的輸出進行多分類softmax有千萬級的詞彙映射,顯然不可能。所以對於CBOW的優化過程主要是Hierarchical Softmax,通過多個二叉樹–二分類來曲線救國。具體的過程是先累加向量(向量的相加將變成路徑),然後做n個邏輯迴歸來預測哈夫曼樹(根據詞頻建立的,其實先DNN但是參數多了才哈夫曼的),這就是hierarchical softmax優化,以二叉樹的思想來得到概率,最後所建立二叉樹的每個非葉子節點相當於神經元。

Skig-Gram,逆轉因果關係,其實是給定單詞輸出跟單詞聯繫可能緊密的詞。但是同樣會面對權重矩陣太大的問題,所以引出了另一個優化爲:

  • 1常見單詞或短語是一個詞
  • 2對詞頻繁度以一定採樣率進行計算,使in the這種不會有太多信息量的詞采樣下降,同時低頻詞的採樣率變大一些。
  • 3不管SG還是CBOW本質都是分類問題,那麼通過選擇出更有代表性的負例來加速計算。即使用“負抽樣”技術(Negative Sampling)來修改優化目標,使得每個訓練樣本只更新模型權重的一小部分。(比如如果訓練一個生僻詞需要走樹的路徑很久)(對於正例,即是訓練出的那種,然後小數據集給5-25個負例,大數據集給2-5個,然後每次只更新有關詞的權重矩陣的參數,採樣還是以頻率),負採樣的訓練是一個在小窗口裏面的二元組對,這種方法不使用哈夫曼,只算邏輯迴歸來更新權重參數。

下圖是具體流程:從左到右先是one-hot向量,乘center word的 W 找到詞向量,乘另一個context word的矩陣 W’ 得到對每個詞語的“相似度”(內積能代表相關性)以做到預測上下文其他詞彙的效果,然後多個結果進行softmax得到概率,再與label對比計算損失。(顯然這個矩陣會很大,所以具體實現需要結合上述的優化以達到近似的效果)
Jt(θ)=logσ(uoTvc)+i=1kEjP(w)[logσ(ujTvc)]J_t(\theta) = \log \sigma\left(u_o^Tv_c\right)+\sum_{i=1}^k\mathbb{E}_{j \sim P(w)}\left [\log\sigma \left(-u^T_jv_c\right) \right]
t是窗口,k是採樣個數。
在這裏插入圖片描述

#先分詞,比如結巴分詞
import jieba
f1 =open("test.txt")
f2 =open("retrun.txt", 'a')
lines =f1.readlines() 
for line in lines:
    line.replace('\t', '').replace('\n', '').replace(' ','')
    seg_list = jieba.cut(line, cut_all=False)
    f2.write(" ".join(seg_list))
f1.close()

#gensim,從文檔中自動提取語義主題的nlp必備神庫
from gensim.modelsimport word2vec
 
sentences =word2vec.Text8Corpus("retrun.txt") 
#skip-gram,默認window=5
model =word2vec.Word2Vec(sentences, size=200) 
print(model)

#1計算相似度
y1 = model.similarity(wordA, wordB)
#2計算某個詞的相關詞列表
y2 = model.most_similar(wordA, topn=20) 
#3不合羣的詞
y4 =model.doesnt_match(words.split())

model.save()

負採樣NEG過程

  • 建立詞典D,統計各個詞的詞頻。採樣原則是:詞頻高,採樣作爲負樣本的概率就高。
  • 設D的每個詞對應一個長度 l(w)=counter(w)/Cl(w)=counter(w)/|C| 的線段.
  • 收尾相連線段,就變成了長度爲1的線
  • 負採樣的時候就直接在線上打點

GloVe

  • 基於計數的方法能有效地利用統計信息,但受限於捕捉詞語相似度,也無法處理數據量很大的場景。
  • 而NNLM, HLBL, RNN, Skip-gram/CBOW必須遍歷所有的上下文窗口訓練,無法有效利用單詞的全局統計信息,缺乏了整體的詞和詞的關係,使用負樣本採用sample的方式會缺失詞的關係信息(且會出現高頻率詞采樣權重高)

於是Glove開始結合兩者,使用全局的信息(共線矩陣),也就是多個窗口進行更新。
J(θ)=12i,j=1Wf(Pij)(uiTvjlogPij)2J(\theta)=\frac{1}{2}\sum_{i,j=1}^W f(P_{ij})\left(u_i^Tv_j-\log P_{ij}\right)^2
Pij是兩個詞共現的頻次,f是一個max函數,小於某個值時如0.5:y=2x,此後恆爲1。由於u 和v都能夠捕捉到共現,所以X=U+V

在這裏插入圖片描述
Representation Learning
表示學習是深度學習領域的一個概念,是學習數據表示的技術的集合,用於將現實世界中的數據轉化成能夠被計算機高效處理的形式。與之相對應,在機器學習領域,數據表示主要通過特徵工程(feature engineering)手動實現,依賴特徵的選擇,而在深度學習則是自動獲取的,依賴大量的數據。而將詞表示爲一個向量,也屬於表示學習。從概念上,它是指把一個維數爲所有“詞”數量的高維空間嵌入到一個維數低的連續向量空間中,現有的方法主要有:

  • Local方法(symbolic representations),直接編碼,即one-hot,這種方法每次都是對每一種分配獨立的一個空間,得到的特徵高度稀疏且互斥,不能表示屬性間的關聯。
  • Distributed方法(distributed representations),將詞放入句子進行理解,即word embedding,這種方法需要投影到一個統一的維度,如運用矩陣分解或者深度學習,得到的特徵低維且稠密,單個向量沒有沒有意義,必須需要特徵的組合,所以特徵間存在關聯性,參數更少。

Distributed方法自然有很多,主要基於Distributional hypothesis,即滿足具有相同上下文的詞語,應該具有相似的語義。
基於此的常規主要有以下幾種方法:

  • LSA(潛在語義分析)是一種Syntagmatic models(強調組合,相似的詞會出現在同一個語境中),採用詞-文檔共現矩陣建模詞語之間的組合關係,然後SVD(SVD分解爲文檔主題矩陣、主題重要性矩陣、主題詞矩陣),根據主題的重要性截斷矩陣,得到想要的詞向量。“潛在”意欲“隱藏”,LSA實際上是嘗試利用單詞周圍的上下文從文檔中捕獲隱藏的主題。
  • GloVe是一種Paradigmatic models(強調替換,相似的詞彙擁有相似的上下文而可以不同時出現),採用詞-詞共現矩陣建模詞語之間的替代關係,優化損失函數。
  • 主題模型(topic model)是以非監督學習的方式對文集的隱含語義結構(latent semantic structure)進行聚類的統計模型,主題模型被用於對文本的表徵進行降維、按主題對文本進行聚類、以及根據用戶偏好形成文本推薦系統等等。這些主題不過是相關單詞的集羣,每個文檔可以有多個主題,以及它們在每個文檔中的分佈和各種單詞的頻率
  • LDA,每個主題由多個詞彙組成,而每個文檔由多個主題組成,tf-idf 計算詞頻,詞彙和主題的分佈由Gibbs採樣來獲得,其降維的思想在於變成這種主題分佈後,數量大大減少。

目前的詞嵌入用深度學習方法會更加的普遍,如上圖中的一些模型。

  • Globe vs local。Globe如MF一次性將所有的數據輸入模型,然後得到向量的表示結果。優點1考慮全局缺點1計算量大2不支持online,即如果有新數據,需要重新訓練。Local如skipgram優點就在很靈活,缺點是無法顧到全局。而Glove是一種結合兩者的方法,上面也總結過了。
  • LM vs 非LM。LM基於馬爾科夫進行訓練,非LM就是不以詞間的連乘概率來進行計算。
  • 具體的其他嵌入方法總結在這裏Pretraning in NLP

softma的常數不變性
softmax(x)=softmax(x+c)softmax(x) = softmax(x + c)
即softmax不受加入常數的影響:
(softmax(x+c))i=exi+cjexj+c=exi×ecec×jexj=exi×ecec×jexj=(softmax(x))i(softmax(x + c))_{i} = \frac{e^{x_{i} + c}}{\sum_{j} e^{x_{j} + c}} = \frac{e^{x_{i}} \times e^{c}}{e^{c} \times \sum_{j} e^{x_{j}}} \\ = \frac{e^{x_{i}} \times \cancel{e^{c}}}{\cancel{e^{c}} \times \sum_{j} e^{x_{j}}} = (softmax(x))_{i}
這種特性能在,即使兩個數都很大比如 1000與 1001,但是其結果與 1和2的結果相同,那麼在計算時只需要關注數字之間的差,而不是差佔的比例。

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