Softmax(假神经网络)与词向量的训练
今天終于要完成好久之前的一個約定了~在很久很久以前的《如果風停了,你會怎樣》中,小夕提到了“深刻理解了sigmoid的同學一定可以輕松的理解用(假)深度學習訓練詞向量的原理”,今天就來測測各位同學對于sigmoid的理解程度啦~
?
習慣性的交待一下前置鋪墊:
1、詞袋模型、獨熱與詞向量概念掃盲
2、sigmoid到softmax(至關重要)
3、邏輯回歸
4、邏輯回歸到神經網絡
?
總之,請務必清楚詞向量的概念,深刻理解softmax的概念和公式內的意義。尤其是要理解softmax函數具有“兩向量的‘親密度’轉條件概率”的功能:
?
嗯。。。還是開篇掃盲一下。可能有的同學覺得是深度學習興起之后才有的“詞向量”,實際上,最早用來做詞向量的模型并不是神經網絡,而是更加傳統的機器學習算法,如以線性代數中的SVD(奇異值分解)為核心LSA(隱性語義分析),還有后來的以貝葉斯理論為核心LDA(隱含狄利克雷分布,一種NLP中經典的主題模型)。
?
一方面,小夕下面要講的確實是作為一種用神經網絡(人們為了提高逼格,更喜歡叫用深度學習xxx)訓練詞向量的基本理論和方法,但是實際上,小夕并沒有把它當神經網絡看,因為理解了小夕講的softmax后,這種方法不過是用了一下softmax而已,還不如叫“基于softmax分類器”或者“基于改良的邏輯回歸”呢。。。當然啦,對外還是要稱之為神經網絡的。
?
首先,我們來想一下,憑什么可以訓練出《詞向量概念掃盲》中描述的這么棒的可以編碼語義的詞向量呢?其實呀,只要是用無監督的方法去訓練詞向量,那么這個模型一定是基于“詞共現”(word co-occurrence)信息來實現的。
?
設想一下,“萌”的語義跟什么最相近呢?有人會想到“可愛”,有人會想到“妹子”,有人會想到“小夕”(\(//?//)\)。為什么呢?因為很大程度上,這些詞會同時出現在某段文本的中,而且往往距離很近!比如“萌妹子”、“這個妹子好可愛”、“小夕好萌吖”。正是因為這種詞共現可以反映語義,所以我們就可以基于這種現象來訓練出詞向量。
?
既然語義相近的兩個詞(即差別很小的兩個詞向量)在文本中也會趨向于挨得近,那如果我們可以找到一個模型,它可以在給定一個詞向量時,計算出這個詞附近出現每個詞的概率(即一個詞就看成一個類別,詞典中有多少詞,就是多少個類別,計算出給定輸入下,每個類別的概率),那么訓練這個模型不就把問題解決了嘛。是不是突然覺得softmax函數簡直是為這個任務量身定做吶~
?
我們就將詞典大小設為D,用、、...表示詞典中的每個詞。
?
如下圖:
?
看,這不就是簡單的softmax分類器嘛~所以這個model的假設函數就是簡單的:
?
?
從這個model中也能看出,模型的輸入不僅是輸入,而且是其他輸入的參數!所以這個model的參數是維度為?D*embed_dim?的矩陣(每行就是一個用戶定義的embed_dim大小的詞向量,詞典中有D個詞,所以一共有D行),而且輸入也是從這個矩陣中取出的某一行)。
?
假設函數有了,那么根據《一般化機器學習》,我們需要定義損失函數。當然,根據前面所說的詞共現信息來定義啦。
?
為了好表示,我們將模型輸入的詞稱為中心詞(central word),記為,將這個詞兩邊的詞記為目標詞(objected word),記為,假如我們只將中心詞附近的m個詞認為是它的共現詞(也就是中心詞左邊的m個詞以及中心詞右邊的m個詞),那么目標詞一共有2m個,分別記為、、...。(下文將會看到,在整個句子的視角下,m被稱為窗口大小)
?
如果我們令m=1,那么對于下面這個長度為T=10句子:
?
今天?我?看見?一只?可愛的?貓?坐?在?桌子?上。
?
那么當我們將“貓”看作中心詞時,目標詞就是“可愛的”和“坐”,即
今天?我?看見?一只 【可愛的?貓?坐】?在?桌子?上。
我們就認為這兩個詞跟貓的語義是相關的,其他詞跟貓是否相關我們不清楚。所以我們要爭取讓P(可愛的|貓)、 P(坐|貓)盡可能的大。
?
講到這里,最容易想到的就是使用似然函數了。由于這里類別特別多,所以算出來的每個概率都可能非常小,為了避免浮點下溢(值太小,容易在計算機中被當成0,而且容易被存儲浮點數的噪聲淹沒),更明智的選擇是使用對數似然函數。所以對于一段長度為T的訓練文本,損失函數即:
?
?
當然啦,這里要讓長度為m的窗口滑過訓練文本中的每個詞,滑到每個詞時,都要計算2m次后驗概率。而每次計算后驗概率都要用到softmax函數,而回顧一下softmax函數,它的分母是很恐怖的:
?
?
類別越多,分母越長。而我們這里類別數等于詞典大小啊!所以詞典有10萬個單詞的話,分母要計算10萬次指數函數?所以直接拿最優化算法去優化這個損失函數的話,肯定會訓練到天長地久(好像用詞不當)。那怎么辦呢?
?
一種很巧妙的方法是將原來計算復雜度為D的分母(要計算D次指數函數)通過構造一棵“胡夫曼二叉樹(Huffman binary tree)”來將原來扁平的“softmax”給變成樹狀的softmax,從而將softmax的分母給優化成計算復雜度為log D。這種樹形的softmax也叫分層softmax(Hierarchical Softmax)。
?
還有一種優化方法是負采樣(Negative Sampling),這種方法可以近似計算softmax的對數概率。對使用分層softmax和負采樣優化模型計算復雜度感興趣的同學,可以看下面這篇論文:
?
Mikolov,T., Sutskever, I., Chen, K., Corrado, G., & Dean, J. (2013, October 17).Distributed Representations of Words and Phrases and their Compositionality.arXiv.org
?
誒誒,說了這么多,這個看起來這么簡潔優美的model叫什么名字呢?
?
它就是Mikolov在2013年提出來的Skip-gram(簡稱SG),這也是大名鼎鼎的開源詞向量工具word2vec背后的主力model之一(另一個模型是更弱雞的連續詞袋模型,即cBoW)。
?
說些題外話,SG和cBoW是Mikolov在2013年的一篇論文中提出來的
?
(Mikolov, T.,Chen, K., Corrado, G., & Dean, J. (2013, January 17). Efficient Estimationof Word Representations in Vector Space. arXiv.org.)
?
并且在同一年,Mikolov又在更上面那篇優化SG計算復雜度的論文中開源了word2vec這個詞向量工具,可謂是深度學習應用于自然語言處理領域的里程碑式的成果。當然啦,要說NLP的超級里程碑,還是要數2003年Bengio大神的這篇論文的,這也是詞向量概念的鼻祖論文:
?
Bengio Y, Ducharme R,Vincent P, et al. A neural probabilistic language model[J]. Journal of machinelearning research, 2003, 3(Feb): 1137-1155.
??
關于在準確度表現上基本可以完爆SG和cbow的model,參考GloVe模型(Global Vector),有興趣的同學可以看一下論文:
?
PenningtonJ, Socher R, Manning C D. Glove: Global Vectors for WordRepresentation[C]//EMNLP. 2014, 14: 1532-1543.
?
當然啦,建議在讀之前先熟悉一下文首提到的LDA模型,否則可能閱讀有點難度哦。
?
總結
以上是生活随笔為你收集整理的Softmax(假神经网络)与词向量的训练的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里P8架构师谈:架构设计经验汇总
- 下一篇: 阿里P8架构师谈:数据库、JVM、缓存、