NLP-文本分類之詞向量-word2vec概念和公式理解


不積跬步無以至千里,不積小流無以成江海!每天一點點,以達到積少成多之效!

word2vec----概念,數學原理理解                                  

1.數據集

  Kaggle上的電影影評數據,包括unlabeledTrainData.tsv,labeledTrainData.tsv,testData.tsv三個文件

  Strange things: kaggle,主要為開發商和數據科學家提供舉辦機器學習比賽、托管數據庫、編寫和分享代碼的平台。

             tsv,即tab separated values(制表符分隔值),就是數據集按照一個tab鍵的空格大小分開的,如下,

            

           csv,即comma separated values(逗號分隔值),csv數據集常見些,就是用逗號分隔的數據集,如下  

            

2.pandas等包的函數理解

  Strange things:   pandas.DataFrame類似於excel,是一種二維表,DataFrame的單元格可以放數值、字符串等。pandas.DataFrame(data,index,columns,dtype,copy),data:接受的數據的形式,如ndarry,series,map,lists,dict,constant和另一個DataFrame。參考博客(超好理解):  https://www.cnblogs.com/IvyWong/p/9203981.html

index:行標簽。columns:列標簽。dtype:每列的數據類型。copy:若默認值為False,則此命令用於復制數據

  BeautifulSoup:和lxml一樣,是一個HTML/XML的解析器,主要就是如何解析和提取HTML/XML數據。它自動把輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼

   BeautifulSoup.get_text():get_text()方法返回BeautifulSoup對象或標簽對象中的文本內容,其為一個Unicode字符串,如https://www.cnblogs.com/eternal1025/p/6866494.html中所示如下

          

   DataFrame.apply(function,axis):對DataFrame里一行或一列做出一些操作(axis=1則為對某一列進行操作,此時,apply函數每次將dataframe的一行傳給function,然后獲取返回值,將返回值放入一個series),返回一個新的行(列)。參考博客:https://www.cnblogs.com/liulangmao/p/9342806.html  https://www.cnblogs.com/liulangmao/p/9355633.html 超詳細  

          pandas.concat([a1,a2,a3],axis=1)連接函數。axis=1:水平連接,axis=0:豎直連接     參考博客(超詳細):  https://www.cnblogs.com/zknublx/p/9645834.html

 3.word2vec理解

先說什么是語言模型?簡單說,就是用概率去判斷某句話(文本)是否通順

可參考博客:https://www.cnblogs.com/guoyaohua/p/9240336.html   仔細的看看,如果理解不了統計語言模型,可去看我的另一篇博客 https://www.cnblogs.com/JadenFK3326/p/11964892.html  是我結合上述博客和<<Python自然語言處理實戰:核心技術與算法>> 的理解

還有就是神經網絡語言模型(NNLM),理解了神經網絡語言模型對於理解word2vec有很大 的幫助,對以后的CNN、LSTM進行文本分析也有很大幫助。摘自 https://www.cnblogs.com/xmeo/p/7463946.html

好吧,攤牌了,不裝了,對於博客我看的都費勁,看不懂,我太菜了,還好學習統計語言模型,讓我高哥(我同門,一數學系大佬過來的)教會了我理解,我又到處搜,好久才定位到百度的關鍵詞(我想要的),但是寫的也比較少,我在這把文本如何轉為向量重復一下,對於我這樣的菜鳥更好的理解一下。下面我說一下我對博客  https://blog.csdn.net/So_that/article/details/92800259 的理解,有錯的請點出來,萬分感謝。對於該博客的Forward請看我推薦的統計語言模型,就可以理解了,我從他的“回歸正題開始”、

博客中假設詞典中有10000個詞(語料中不重復的詞),即V=10000,對詞典中的詞進行one-hot編碼如下

[1 0 0 ... 0 #假如第一個字是“我”,則“我”用[1,0,0, ... ,0]表示 0 1 0 ... 0 #假如第二個字是“是”,第三個字是“中國”,第四個字是“人” ... 0 0 0 ... 1]    #萬維方陣

博客中假設n=6,我這假設n=3,則n-1=2(其中n和n-gram中的n的意思一樣,這里表示僅和前2個詞有關系)假設輸入為“我是中國人。”分詞為“我”“是”“中國""人""。"

那么,“我”“是”的one-hot向量表示為(此處為列向量表示):

則這兩個向量拼成一個2*10000的矩陣,然后乘上投影矩陣進行降維處理,其中m是自己設定的(假設m=100),則降維后是一個2*100的矩陣。

博客中設n=6,n-1=5,認為輸入5個one-hot向量(僅和前五個詞相關),這5個向量拼成一個[5*10000]的矩陣,降維是右乘一個[10000*100]的權重矩陣(即投影矩陣),100為自己設定。此時得到5*100的矩陣,用Z表示,表示第個詞對應的特征向量(就是把一開始的5個one-hot稀疏向量轉換成了稠密向量)。接着把[5*100]維的向量拼接成一個500維的向量,用這個向量來表示一個單詞,即要預測的詞,假如我們要預測第1236個詞,則

其中,表示從第一個詞到第1236個詞組成的子序列。

NNLM(神經網絡語言模型)的目標是要訓練模型,即上面公式的一般化表示。

模型的前饋式計算:

  1.特征映射:即上面所述的把one-hot稀疏向量轉換為稠密向量,然后拼接成一個(n-1)*m維的向量。

  2.計算概率:把拼接的(n-1)*m維向量輸入到函數g中,得到一個概率分布,這個概率分布在這是10000維(詞典里所有詞的概率),最大概率的詞典中的詞即預測的詞。

模型詳解為:

  第一步:,即拼接的(n-1)*m維向量輸入到此公式

    即經線性變換后,經tanh激活一下得到一個100維向量()然后左乘一個U得到一個10000維的向量 ()

  第二步:,即拼接的(n-1)*m維向量輸入到此公式

    即W是一個[10000*500]維的矩陣,Wx:,b是[10000*1],相加得

  第三步:,得出最終向量即,然后通過softmax激活函數求概率預測

    其中,W,U,H都是權重,d,b都是偏置。softmax預測如下(即激活)

  調參(這個公式我還么請教大佬,僅僅查看的博主的):

  ,C是轉化后的稠密向量,非是投影矩陣C。參數調優函數即最大化似然函數L,

   $ L = \frac{1}{T}\sum_{t} logf(w_{t},w_{t-1},...,w_{t-(n-1)};\theta ) + R(\theta ) $

  $ R(\theta) $為正則化項,更新參數則采用梯度下降算法(這也是我下步要搞懂的)

      $ \theta \leftarrow \theta +\lambda \frac{\partial logp(w_{t}|w_{t-1},...,w_{t-(n-2))},w_{t-(n-1)})}{\partial \theta} $

$\lambda$為學習步長

 從統計語言模型開始,到神經網絡語言模型,再到word2vec,為什么?解決了什么不足?可參考博客(我老郭家的人寫的) https://www.cnblogs.com/guoyaohua/p/9240336.html?utm_source=tuicool&utm_medium=referral      

 好,我也是好好學了NNLM模型,下面開始word2vec的兩個模型:CBoW和Skip-gram

參考博客還有:https://www.cnblogs.com/jiangxinyang/p/9332769.html    word2vec的基礎是霍夫曼樹(學過數據結構的話就知道了,沒學過也沒啥,超簡單) https://www.cnblogs.com/pinard/p/7160330.html 個人感覺這個劉建平博主的博客容易理解些,可以看這個的word2vec原理去學習 

Skip-gram模型

 以中心詞預測上下文詞。輸入是中心詞的one-hot編碼形式,隱藏層做線性變換,輸出的是sofmax函數激活后的概率

 和CBoW模型正好反過來,輸入是一個詞向量,所以從輸入層到投影層(隱藏層)就簡單了,然后就是輸出層的霍夫曼樹了

目標函數(即用的似然函數):$ \prod_{t=1}^{T}\prod_{-m\leq j\leq m,j\neq 0}^{}P(w^{t+j}|w^{t}) $     目標是要最大化這個目標函數

給定中心詞生成背景詞的條件概率(對兩者的向量做內積,然后做softmax):$ P(w_{o}|w_{c}) = \frac{exp(u_{o}^{T})}{\sum_{i\epsilon V}^{}exp(u_{i}^{T}v_{c}))} $

其中,中心詞向量表示為:  v ,背景詞向量表示為:  u  ,中心詞表示為: $ w_{c} $ , 背景詞表示為:  $ w_{o} $

損失函數:$ -\sum_{t=1}^{T}\sum_{-m\leqslant j\leq m,j\neq 0}^{}logP(w^{t+j}|w^{t}) $      最大化目標函數就等價於最小化這個損失函數

然后把$ P(w_{o}|w_{c}) $帶入損失函數中,分別對要學習的參數進行求導(求導自己學了呀),優化即可。

CBoW模型(Continuous Bag-of-Words Model)

 以上下文的詞預測中間詞。輸入是上下文詞的one-hot編碼,隱藏層對輸入值進行了加法運算,無激活函數,輸出層和輸入層維度一致

 https://blog.csdn.net/github_36235341/article/details/78607323     

CBoW模型無隱藏層,僅輸入層+投影層+輸出層,且輸出層是一個霍夫曼樹,沿着霍夫曼樹尋找要預測的詞,極大化從根節點走到預測詞葉子節點路徑上概率相乘的值。霍夫曼樹是根據語料庫中的詞及其頻率而建(構建依據:左0(負類)右1(正類))。

類似於Skip-gram模型,不同的是CBoW給定背景詞生成中心詞的條件概率:  $ P(w_{c}|w_{o_{1}},\cdots ,w_{o_{2m}})=\frac{exp(\frac{1}{2m}u_{c}^{T}(v_{o_{1}},\cdots ,v_{o_{2m}}))}{\sum_{i\epsilon V}^{}exp(\frac{1}{2m}u_{i}^{T}(v_{o_{1}},\cdots ,v_{o_{2m}}))} $

 為了公式簡潔,令$ W_{o}=\left \{ w_{o_{1}},\cdots ,w_{o_{2m}} \right \} $, $ \bar{v_{o}}=\frac{v_{o_{1}}+\cdots +v_{o_{2m}}}{2m}  $

那么CBoW給定背景詞生成中心詞的條件概率公式則可寫為:$  P(w_{c}|W_{o})=\frac{exp(u_{c}^{T}\bar{v_{o}})}{\sum_{i\epsilon V}^{}exp(u_{i}^{T}\bar{v_{o}})}  $

其中,中心詞向量表示為:  u  ,背景詞向量表示為: v  ,中心詞表示為:  $ w_{c} $ , 背景詞表示為:  $ w_{o} $   

注意:在CBoW模型中,中心詞向量和背景詞向量表示正好相反

目標函數:$ \prod_{t=1}^{T}P(w^{t}|w^{t-m},\cdots ,w^{t-1},w^{t+1},\cdots ,w^{t+m}) $

損失函數:$ -\sum_{t=1}^{T}logP(w^{t}|w^{t-m},\cdots ,w^{t-1},w^{t+1},\cdots ,w^{t+m}) $

然后同樣是對損失函數中需要優化的參數進行求導,然后優化。。。

由於篇幅已經挺長了,代碼實現寫在后面的博客中。。。如果有錯誤,請在下面評論區提出來,咱們共同學習

 

 

       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM