自然語言處理之詞向量模型介紹

nlp

我們在平日的生活中所說的話語,如何使用計算機自動構造出來呢?

一.探究我們在說一句話時,無形中做了什么

1.人類語言通俗剖析

我想吃晚飯

??通過以上內容,我們可以把句的意思拆分為:我·想·吃·晚飯。
我們通常在說“我”的時候,大腦其實是在思考下一個詞,即“想”,然后說了“想”了同時,開始思考下一個詞“吃”,以此類推。
??也就是說,我們每一次說出下一個詞的時候,是基于上一個詞說的是什么而定的,這樣才能在表達出自己意思的同時能順利組織成一句話。
??這種思想很像條件概率?沒有錯,這種思想確實可以用條件概率表達出來:
P(S) = P(w_1,w_2,w_3,\cdots,w_n)=P(w_1)P(w_2|w_1)\cdots P(w_n|w_1,w_2,\cdots w_{n-1})
此處的P(S)被稱為語言模型,也用來計算一個句子的概率。
??通過以上式子可看出,每次新出現的詞匯,都和之前已經出現的詞匯有很強的關聯(條件概率嘛),所以越到后面的詞匯,所需要的條件概率越稀疏,并且參數巨大(每個詞都是一個參數喲?。?/p>

  1. 數據過于稀疏
  2. 參數空間太大

2.-N-gram模型的出現

??而事實上,當一個句子非常非常長的時候(特別是中文),后面出現的詞匯很有可能和前面說的東西,產生的因果關系不大了。那么我們就可以進行如下假設:

我們每個詞匯出現的概率,只和前面一個詞匯相關:
P(S)=P(w_1)P(w_2|w_1)P(w_3|w_2)\cdots P(w_n|w_{n-1})

我們每個詞出現概率,只和前面兩個詞相關:
P(S)=P(w_1)P(w_2|w_1)P(w_3|w_2,w_1)\cdots P(w_n|w_{n-1},w_{n-2})

以此類推,還可以每個詞和前面3個相關,4個等等....(對于處女座,這種玩法太難受了,但確實把問題化簡了很多!)
??這種玩法就是傳說中的-N-gram模型,其中N代表的就是和前面N個詞條件相關。
??假設語料庫的規(guī)模是N,相關詞匯量是n,模型的參數量級為N^n。由此我們可以看到,隨著相關n的增長,參數規(guī)模增長是十分迅速的。所以在進行模型設計時,要考慮到小伙伴電腦的牛逼程度才行,目前主流計算機能支持到n=10的程度。一般讓n=4,5都是ok的。

二.詞向量

1.Hierarchical softmax

①CBOW(Continuous Bag-of-Words)

根據上下文預測出某個空的詞是的內容
\zeta = \sum_{w\in c}^{}\log P(w|Context(w))

  1. 根據詞頻,對語句進行哈夫曼樹的構造(由底至上濟寧構建),詞頻即為哈夫曼權值。


    構造過程

2.開始進行計算啦!
在計算之前,首先解釋一下各個參數含義:

  1. p^w:從根節(jié)點出發(fā)到達w對應葉子節(jié)點的路徑。
  2. l^w:路徑中包含的葉子節(jié)點個數。
  3. p_1^w,p_2^w....p_n^wp^w中的各個節(jié)點。
  4. d_2^w,d_3^w....d_n^w \in \{0,1\}p^w上的第n個節(jié)點上對應的編碼
  5. \theta_1^w,\theta_2^w,....\theta_n^wp^w非葉子節(jié)點對應的參數

哈夫曼樹是一種二叉樹結構,也就是說,利用二分類可以一步一步找到葉子節(jié)點,我們這里使用sigmod進行二分類。所以:

正例:\sigma (x_w^T\theta)=\frac {1}{1+e^{-x_w^T\theta}}
負例:1-\sigma (x_w^T\theta)

通過以上兩個公式,我們找到目標的過程,無非可總結為以下兩種情況:

  • 走向正例時:p(d_n^w|x_w\theta_{n-1}^w)=\sigma (x_w^T\theta_{n-1}^w)
  • 走向負例時:p(d_n^w|x_w\theta_{n-1}^w)=1-\sigma (x_w^T\theta_{n-1}^w)

程序每次下尋找一次,都會經歷上述兩個公式其中之一,最終會找到目標詞匯,同時會留下一條路徑,把路徑的每一部都連乘起來就是:
p(text|Context(text))=\prod_{2}^{n}p(d_n^w|x_w\theta_{n-1}^w)
在累乘計算時,計算可能會比較困難,我們把上述等式兩邊同時取對數:
\zeta = \sum_{w\in c}^{}\log P(w|Context(w))
從公式可知,這里的概率值越大越好!所以此題目為求解梯度上升。
\zeta求導,得:
\frac{\partial \zeta(w,n)}{\partial \theta_{n-1}^w}=[1-d_n^w-\sigma(x_w^T\theta_{n-1}^w)]x_w
由梯度上升可知,更新形式為:
\theta_{j-1}^w:=\theta_{j-1}^w+\eta[1-d_n^w-\sigma(x_w^T\theta_{n-1}^w)]x_w
同樣,對投影層的x_w進行求導:
\frac{\partial \zeta(w,n)}{\partial x_w}=[1-d_n^w-\sigma(x_w^T\theta_{n-1}^w)]\theta_{n-1}^w
投影中的x_w并不是單獨的詞向量,而是由詞向量拼接而成的一個大向量,然而,2013年google粗暴的將這個導數更新到各個詞向量中:
v(\widetilde{w}):= v(\widetilde{w})+\eta \sum_{n=2}^{l^w}\frac{\partial \zeta(w,n)}{\partial x_w} ,w \in Context(\widetilde w)

②Skip-Gram模型

其實就是把CBOW的流程倒過來,回推出各個詞向量。

2. 負采樣

??當語料庫非常龐大的時候,將會構造出非常龐大的哈夫曼樹,這樣仍然會增加計算機的壓力,影響計算速度。如何解決呢?那么我們下回分解!

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容