NLP天然語言處理

轉:https://blog.csdn.net/qq_17677907/article/details/86448214算法

 

1.有哪些文本表示模型,它們各有什麼優缺點?網絡

  文本表示模型是研究如何表示文本數據的模型,輸入是語料庫(文檔)。ide

知識點:函數

 

詞袋模型學習

TF-IDF編碼

N-gram.net

詞袋模型與N-gram設計

  最基本的文本表示模型是詞袋模型(Bag of Words)。基本思想是把每篇文章當作一袋子詞,並忽略每一個詞出現的順序。具體來看:將整段文本表示成一個長向量,每一維表明一個單詞。該維對應的權重表明這個詞在原文章中的重要程度。blog

主題模型ip

  主題模型用於從文本庫中發現有表明性的主題(獲得每一個主題上的詞的分佈特性),而且可以計算出每篇文章的主題分佈。

 

詞嵌入與深度學習模型

  詞嵌入是一類將詞向量化的模型的統稱,核心思想是將每一個單詞都映射成地位空間上的一個稠密向量。低維空間上的每個單詞也能夠看作是一個隱含的主題,只不過不像主題模型中那麼明顯。

  對有N個單詞的文檔,詞嵌入用K維向量映射單詞,能夠獲得一個N*K的矩陣來表示這篇文檔。可是還須要抽象出更高層的特徵,一般使用深度學習來獲得更高維的特徵。

 

2.Word2vec是如何工做的?它和LDA有什麼區別和聯繫?

  谷歌2013年提出的word2vec是目前最經常使用的詞嵌入模型之一。word2vec其實是一種淺層的神經網絡模型,它有兩種網絡結構,分別是CBOW和skip-gram。

知識點

 

word2vec

LDA

word2vec

  CBOW目標是根據上下文出現的單詞預測當前詞的生成機率。而Skip-gram根據當前詞預測上下文各詞的生成機率。

 

1.有哪些文本表示模型,它們各有什麼優缺點?  文本表示模型是研究如何表示文本數據的模型,輸入是語料庫(文檔)。知識點:詞袋模型TF-IDFN-gram詞袋模型與N-gram  最基本的文本表示模型是詞袋模型(Bag of Words)。基本思想是把每篇文章當作一袋子詞,並忽略每一個詞出現的順序。具體來看:將整段文本表示成一個長向量,每一維表明一個單詞。該維對應的權重表明這個詞在原文章中的重要程度。  經常使用TF-IDF計算權重。公式爲:TF−IDF(t,d)=TF(t,d)∗IDF(t) TF-IDF(t,d)=TF(t,d)*IDF(t)TF−IDF(t,d)=TF(t,d)∗IDF(t)  其中TF(t,d)爲單詞t在文檔中出現的頻率,IDF(t)是逆文檔頻率,用來衡量單詞t對錶達語義所起的重要性。表示爲IDF(t)=log文章總數包含單詞t的文章總數+1 IDF(t)=log\frac{文章總數}{包含單詞t的文章總數+1}IDF(t)=log 包含單詞t的文章總數+1文章總數​   直觀的解釋是若是一個單詞在很是多的文章裏面都出現,那麼它多是一個比較通用的詞彙,對於區分某篇文章特殊語義的貢獻較小,所以對權重作必定懲罰。  缺點 單詞程度的劃分有時候並非一個好的作法。好比Natural Language Processing一詞,單個單詞拆分的語義與三個詞連續出現的語義並不相同。  改進 一般可將連續出現的N個單詞構成的詞組做爲一個特徵放到向量表示中去。構成N-gram模型主題模型  主題模型用於從文本庫中發現有表明性的主題(獲得每一個主題上的詞的分佈特性),而且可以計算出每篇文章的主題分佈。詞嵌入與深度學習模型  詞嵌入是一類將詞向量化的模型的統稱,核心思想是將每一個單詞都映射成地位空間上的一個稠密向量。低維空間上的每個單詞也能夠看作是一個隱含的主題,只不過不像主題模型中那麼明顯。  對有N個單詞的文檔,詞嵌入用K維向量映射單詞,能夠獲得一個N*K的矩陣來表示這篇文檔。可是還須要抽象出更高層的特徵,一般使用深度學習來獲得更高維的特徵。2.Word2vec是如何工做的?它和LDA有什麼區別和聯繫?  谷歌2013年提出的word2vec是目前最經常使用的詞嵌入模型之一。word2vec其實是一種淺層的神經網絡模型,它有兩種網絡結構,分別是CBOW和skip-gram。知識點word2vecLDAword2vec  CBOW目標是根據上下文出現的單詞預測當前詞的生成機率。而Skip-gram根據當前詞預測上下文各詞的生成機率。其中w(t) w(t)w(t)是當前所關注的詞,w(t−2),w(t−1),w(t+1),w(t+2) w(t-2),w(t-1),w(t+1),w(t+2)w(t−2),w(t−1),w(t+1),w(t+2)是上下文單詞,這裏先後滑動窗口大小均設爲2。  CBOW和skip-gram均可以表示爲有輸入層、映射層、輸出層組成的淺層神經網絡。  輸入層中每一個單詞是由獨熱編碼表示。全部詞均表示一個N維向量,N爲詞彙表中單詞的總數。在向量中,每一個單詞對應的維度爲1,其他維度爲0。  在映射層中,K個隱含單元的值能夠由N維輸入向量以及鏈接輸入和隱含單元的NK維權重矩陣計算獲得。  輸出層向量的值能夠由隱含層向量(K維),以及鏈接隱含層和輸出層之間的KN維權重矩陣計算獲得。輸出層也是一個N維向量,每一維與詞彙表中的一個單詞對應。最後對輸出層向量應用Softmax函數,能夠獲得每一個單詞的生成機率。  接下來須要訓練神經網絡權重,使得全部單詞的總體生成機率最大化。共有兩大參數:從輸入層到隱含層的一個維度爲NK的權重矩陣,從隱含層到輸出層的一個維度爲KN的權重矩陣。學習權重可使用BP算法實現。  訓練獲得維度爲N * K和K * N的兩個權重矩陣以後,能夠選擇其中一個做爲N個詞的K維向量表示。  可是因爲Softmax激活函數存在歸一化項的緣故,推導出來的迭代公式須要對詞彙表中的全部單詞進行遍歷,使得迭代過程很是緩慢。由此產生了Hierarchical Softmax和Negative Sampling兩種方法。word2vec與LDA區別  首先,LDA是按照文檔中單詞的共現關係來對單詞按照主題聚類,也能夠理解爲對「文檔-單詞」矩陣進行分解,獲得「文檔-主題」和「主題-單詞」兩個機率分佈。而word2vec其實是對「上下文-單詞」矩陣進行學習,其中上下文由周圍幾個單詞組成,由此學到的詞向量更多融入了上下文特徵。  主題模型和詞嵌入兩類方法最大的不一樣在於模型自己。  主題模型是一種基於機率圖模型的生成式模型。其似然函數能夠寫爲若干條件機率連乘的形式,其中包含須要推測的隱含變量(即主題)  詞嵌入模型通常表示爲神經網絡的形式,似然函數定義在網絡的輸出之上。須要學習網絡的權重來獲得單詞的稠密向量表示。3.處理文本數據時,RNN比CNN有什麼特色?知識點:RNNCNN  傳統文本處理任務的方法通常將TF-IDF向量做爲特徵輸入,這樣實際上丟失了輸入的文本系列中每一個單詞的順序。  CNN通常會接收一個定長的向量做爲輸入,而後經過滑動窗口加池化的方法將原來的輸入轉換爲一個固定長度的向量表示。這樣作能夠捕捉到文本中的一些局部特徵,可是兩個單詞之間的長距離依賴關係難以學習。  RNN可以很好處理文本數據變長而且有序的輸入序列。將前面閱讀到的有用信息編碼到狀態變量中去,從而擁有了必定的記憶能力。  一個長度爲T的序列用RNN建模,展開後可看作是一個T層前饋神經網絡。其中第t層的隱含狀態ht h_th t​ 編碼了序列中前t個輸入的信息。能夠經過當前的輸入xt x_tx t​ 和上一層神經網絡的狀態ht−1 h_{t-1}h t−1​ 計算獲得。最後一層的狀態hT h_Th T​ 編碼了整個序列的信息,所以能夠做爲整篇文檔的壓縮表示。在hT h_Th T​ 後面加一個Softmax層,輸出文本所屬類別的預測機率y,就能夠實現文本分類。ht h_th t​ 和y的計算公式以下:  nett=Uxt+Wht−1 net_t = Ux_t+Wh_{t-1}net t​ =Ux t​ +Wh t−1​   ht=f(nett) h_t = f(net_t)h t​ =f(net t​ )  y=g(VhT) y=g(Vh_T)y=g(Vh T​ )  其中f和g爲激活函數,U爲輸入層到隱含層的權重矩陣,W爲隱含層中從上一時刻到下一時刻轉移的權重矩陣。在文本分類任務中,f能夠選取Tanh或ReLU函數,g能夠採用Softmax函數。  經過不斷最小化損失偏差(即輸出的y與真實類別之間的距離),能夠不斷訓練網絡,使得獲得的循環神經網絡能夠準確預測文本類別。相比於CNN,RNN因爲具有對序列信息的刻畫能力,每每能獲得更加準確的結果。4.RNN爲何會出現梯度消失或梯度爆炸?有哪些改進方案?  RNN的求解能夠採用BPTT(Back Propagation Through Time)算法實現。其實是BP的簡單變種。RNN設計的初衷在於捕捉長距離輸入之間的依賴關係,然而使用BPTT的算法並不能成功捕捉遠距離依賴關係,這一現象源於深度神經網絡中的梯度消失問題。  傳統的RNN網絡梯度能夠表示爲連乘的形式:  ∂nett∂net1=∂nett∂nett−1.∂nett−1∂nett−2...∂net2∂net1 \frac{\partial net_t}{\partial net_1}=\frac{\partial net_t}{\partial net_{t-1}}.\frac{\partial net_{t-1}}{\partial net_{t-2}}...\frac{\partial net_{2}}{\partial net_{1}} ∂net 1​ ∂net t​ ​ = ∂net t−1​ ∂net t​ ​ . ∂net t−2​ ∂net t−1​ ​ ... ∂net 1​ ∂net 2​ ​ 其中  nett=Uxt+Wht−1 net_t = Ux_t+Wh_{t-1}net t​ =Ux t​ +Wh t−1​   ht=f(nett) h_t = f(net_t)h t​ =f(net t​ )  y=g(Vht) y=g(Vh_t)y=g(Vh t​ )因此  ∂nett∂nett−1=∂nett∂ht−1∂ht−1∂nett−1(鏈式法則)=W.diag[f‘(nett−1)] \frac{\partial net_t}{\partial net_{t-1}}=\frac{\partial net_{t}}{\partial h_{t-1}}\frac{\partial h_{t-1}}{\partial net_{t-1}} (鏈式法則)=W.diag[f`(net_{t-1})] ∂net t−1​ ∂net t​ ​ = ∂h t−1​ ∂net t​ ​  ∂net t−1​ ∂h t−1​ ​ (鏈式法則)=W.diag[f‘(net t−1​ )]其中∂nett∂nett−1 \frac{\partial net_t}{\partial net_{t-1}} ∂net t−1​ ∂net t​ ​ 對應的n*n矩陣又被稱爲雅克比矩陣。  因爲預測偏差沿神經網絡每一層反向傳播,當雅克比矩陣最大特徵值大於1時,隨着離輸出愈來愈遠,每層的梯度大小會呈指數增加,致使梯度爆炸。反之若最大特徵值小於1,梯度大小會指數減少,產生梯度消失。梯度消失意味着沒法經過加深網絡層數來提高預測效果,只有靠近輸出的幾層才真正起到學習的做用,這樣RNN很難學習到輸入序列中的長距離依賴關係。  梯度爆炸能夠經過梯度裁剪來緩解,即當梯度的範式大於某個給定值的時候,對梯度進行等比縮放。而梯度消失問題須要對模型自己進行改進。深度殘差網絡是對前饋神經網絡的改進。經過殘差學習的方式緩解了梯度消失的現象,從而能夠學習到更深層的網絡表示。對於RNN來講,長短時記憶模型及其變種門控循環單元等模型經過加入門控機制,很大程度上緩解了梯度消失帶來的損失。5.在RNN中能夠採用ReLU做爲激活函數嗎?在CNN中採用ReLU激活函數能夠有效改進梯度消失,取得更好收斂速度和收斂結果,那麼在RNN中能夠採用ReLU做爲激活函數嗎?   答案是確定的。可是須要對矩陣的初值作必定限制,不然容易引起數值問題。首先回顧一下RNN前向傳播公式:  nett=Uxt+Wht−1 net_t = Ux_t+Wh_{t-1}net t​ =Ux t​ +Wh t−1​   ht=f(nett) h_t = f(net_t)h t​ =f(net t​ )根據前向傳播公式,向前傳播一層,獲得:  nett=Uxt+Wht−1=Uxt+Wf(Uxt−1+Wht−2) net_t = Ux_t+Wh_{t-1}=Ux_t+Wf(Ux_{t-1}+Wh_{t-2})net t​ =Ux t​ +Wh t−1​ =Ux t​ +Wf(Ux t−1​ +Wh t−2​ )  若是採用ReLU替換公式中的激活函數f,而且假設ReLU一直處於激活區域(即輸入大於0),則有f(x)=x f(x)=xf(x)=x帶入可得:  nett=Uxt+W(Uxt−1+Wht−2 net_t=Ux_t+W(Ux_{t-1}+Wh_{t-2}net t​ =Ux t​ +W(Ux t−1​ +Wh t−2​   繼續將其展開,net的表達式最終包含t個W連乘。若是W不是單位矩陣(對角線上爲1,其他元素爲0的矩陣),最終的結果將會趨於0或無窮,引起嚴重的數值問題。  那麼爲何在CNN中不會出現這樣的問題呢,由於CNN中每一層的權重矩陣是不一樣的,而且在初始化的時候它們是獨立同分布的,能夠相互抵消,多層以後不會出現嚴重的數值問題。  回到RNN的梯度計算公式  ∂nett∂nett−1=W.diag[f‘(nett−1)] \frac{\partial net_t}{\partial net_{t-1}}=W.diag[f`(net_{t-1})] ∂net t−1​ ∂net t​ ​ =W.diag[f‘(net t−1​ )]  假設採用了ReLU激活函數,且一開始全部神經元都處於激活中(即輸入大於0)。則diag[f‘(nett−1)] diag[f`(net_{t-1})]diag[f‘(net t−1​ )]爲單位矩陣。則有∂nett∂nett−1=W \frac{\partial net_t}{\partial net_{t-1}}=W ∂net t−1​ ∂net t​ ​ =W。經歷了n層傳遞以後,有 ∂nett∂nett−1=Wn \frac{\partial net_t}{\partial net_{t-1}}=W^n ∂net t−1​ ∂net t​ ​ =W n 。能夠看到,即便採樣了ReLU,只要W不是單位矩陣,仍是會出現梯度消失或梯度爆炸問題。  綜上所述,採用ReLU做爲RNN中隱含層的激活函數時,只有當W的取值在單位矩陣附近時才能取得較好結果。所以須要將W初始化爲單位矩陣。實踐證實,初始化W爲單位矩陣並使用ReLU激活函數在一些應用中取得了與LSTM類似的結果,而且學習速度更快。6.LSTM是如何實現長短時間記憶功能的?RNN有梯度消失和梯度爆炸問題,學習能力有限。LSTM能夠對有價值的信息進行長期記憶,有普遍應用首先結合LSTM結構圖和更新的計算公式探討這種網絡如何實現功能。   與傳統的RNN相比,LSTM依然是基於xt x_tx t​ 和ht−1 h_{t-1}h t−1​ 來計算ht h_th t​ ,只不過對內部的結果進行了更加精細的設計:加入了輸入門it i_ti t​ ,遺忘門ft f_tf t​ 以及輸出門ot o_to t​ 和一個內部記憶單元ct c_tc t​ 。  輸入門控制當前計算的新狀態以及以多大程度更新到記憶單元中;遺忘門控制前一步記憶單元中的信息以多大程度被遺忘掉;輸出門控制當前的輸出有多大程度取決於當前的記憶單元。  經典的LSTM中,第t步的更新計算公式爲:  it=σ(Wixt+Uiht−1+bi) i_t=\sigma(W_ix_t+U_ih_{t-1}+b_i)i t​ =σ(W i​ x t​ +U i​ h t−1​ +b i​ )        輸入門  ft=σ(Wfxt+Ufht−1+bf) f_t=\sigma(W_fx_t+U_fh_{t-1}+b_f)f t​ =σ(W f​ x t​ +U f​ h t−1​ +b f​ )      遺忘門  ot=σ(Woxt+Uoht−1+bo) o_t=\sigma(W_ox_t+U_oh_{t-1}+b_o)o t​ =σ(W o​ x t​ +U o​ h t−1​ +b o​ )      輸出門  ct˜=Tanh(Wcxt+Ucht−1) \widetilde{c_t}=Tanh(W_cx_t+U_ch_{t-1}) c t​ ​ =Tanh(W c​ x t​ +U c​ h t−1​ )       候選記憶  ct=ft⊙ct−1+it⊙ct˜ {c_t}=f_t\odot c_{t-1}+i_t\odot \widetilde{c_t}c t​ =f t​ ⊙c t−1​ +i t​ ⊙ c t​ ​          記憶單元  ht=ot⊙Tanh(ct) {h_t}=o_t\odot Tanh(c_{t})h t​ =o t​ ⊙Tanh(c t​ )其中it i_ti t​ 是經過輸入xt x_tx t​ 和上一步的隱含層輸出ht−1 h_{t-1}h t−1​ 進行線性變換,再通過激活函數σ \sigmaσ獲得。輸入門的it i_ti t​ 的結果是向量,其中每一個元素都是從0到1之間的實數,用於控制各維度流過閥門的信息量;Wt W_tW t​ 和Ut U_tU t​ 兩個矩陣和向量bt b_tb t​ 爲輸入門的參數,是在訓練過程當中獲得的。遺忘門ft f_tf t​ 和輸出門ot o_to t​ 的計算方式與輸入門相似,它們有各自的參數W、U和b。   與傳統RNN不一樣的是,從上一個記憶單元ct−1 c_{t-1}c t−1​ 到當前狀態ct c_{t}c t​ 的轉移不必定徹底取決於激活函數計算獲得的狀態,還得由輸入門和遺忘門共同控制。  在一個訓練好的網絡中,當輸入序列沒有重要信息時,LSTM遺忘門的值接近爲1,輸入門接近0,此時過去的記憶會被保存,從而實現了長期記憶;當輸入的序列中出現了重要信息時,LSTM會將其存入記憶中,此時輸入門的值會接近於1;當輸入序列出現重要信息,且該信息意味着以前的記憶再也不重要的時候,輸入門接近1,遺忘門接近0,這樣舊的記憶被遺忘,新的重要信息被記憶。通過這樣的設計,整個網絡更容易學習到序列之間的長期依賴。————————————————版權聲明:本文爲CSDN博主「飢渴的小蘋果」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/qq_17677907/article/details/86448214

相關文章
相關標籤/搜索