天然語言處理( NLP )是信息時代最重要的技術之一,也是人工智能的重要組成部分。NLP的應用無處不在,由於人們幾乎用語言交流一切:網絡搜索、廣告、電子郵件、客戶服務、語言翻譯、醫療報告等。算法
近年來,深度學習方法在許多不一樣的NLP任務中得到了很是高的性能,同時也吸引了愈來愈多的人加入學習NLP的大潮中。應廣大學習者要求,Datawhale正式開啓NLP專輯系列,提供NLP入門方向和指引,但願能幫助到你們。本系列專輯以斯坦福的CS224N教學視頻爲基礎,整理其課堂筆記、拓展做者的理解和學習感悟,幫助你們全面瞭解NLP深度學習的前沿研究。如今,咱們開啓預訓練模型(一):Word vector。
網絡
本文目錄: app
1. 人類語言和詞義框架
如何表達一個單詞的含義分佈式
在計算機中如何具備可用的含義ide
wordNet存在的問題函數
將單詞表示爲離散符號工具
單詞做爲離散符號存在的問題性能
經過上下文表示單詞學習
詞向量
詞義做爲神經詞向量-可視化
2. Word2Vec介紹
Word2Vec概述
Word2Vec:目標函數
帶矢量的Word2Vec概述
Word2Vec:預測功能
經過優化參數來訓練模型
訓練模型:計算全部矢量梯度
3. Word2Vec梯度的導數
鏈式法則
交互式白板會議
計算全部梯度
Word2vec:更多詳細信息
4. 經常使用工具總結
梯度降低
隨機梯度降低
定義:含義(韋伯斯特詞典)
一個詞或詞組表示的意思;
人用這個單詞,符號時表達的意思;
最廣泛的意義語言學思惟方式:
能指(符號)⟺所指(思想或事物)
=指稱語義
常看法決方案:使用 WordNet,一個同義詞庫,包含同義詞集和上位詞列表(「是」關係)
例如 包含「good」的同義詞集
# 導入初始包# pip install nltkimport nltk#必須下載對應的wordnet包nltk.download('wordnet')from nltk.corpus import wordnet as wnposes = {'n':'noun','v':'verb','s':'adj(s)','a':'adj','r':'adv'}for synset in wn.synsets("good"): print("{}:{}".format(poses[synset.pos()],",".join([l.name() for l in synset.lemmas()])))
例如 "panda"的化身
# 導入初始包# pip install nltkimport nltk#必須下載對應的wordnet包nltk.download('wordnet')from nltk.corpus import wordnet as wnpanda = wn.synset("panda.n.01")hyper = lambda s: s.hypernyms()list(panda.closure(hyper))
做爲資源很好,但缺乏細微差異
例如:「proficient」被列爲「good」的同義詞,這僅在某些狀況下是正確的。
缺乏單詞的新含義
例如,wicked,badass,nifty,wizard,genius,ninja,bombest,不可能保持最新。
主觀
須要人工來創造和適應
沒法計算準確的單詞類似度
在傳統的天然語言處理中,咱們將單詞視爲離散符號:hotel,conference,motel - 地方表明。單詞能夠用one-hot向量表示:<僅一個1,其他0s>
motel=[000000000010000]
hotel = [000000010000000]
向量維數=詞彙中的單詞數(例如:500,000)。
示例:在網絡搜索中,若是用戶搜索「Seattle motel」,咱們但願匹配包含「Seattle hotel」的文檔。可是:
motel=[000000000010000]
hotel = [000000010000000]
這兩個向量是正交的。one-hot向量沒有天然的類似性概念。
《解決方案》
能夠嘗試依靠WordNet的同義詞列表來得到類似性嗎?
可是衆所周知嚴重失敗:不完整等。
替代:學習在向量自己中編碼類似性。
「您將知道它所經營的公司的一句話」(J.R. Firth 1957:11)
使用w的許多上下文來構建w的表示
咱們將爲每一個單詞構建一個密集的向量,並選擇它,使其相似於出如今類似上下文中的單詞的向量。
注意:單詞向量有時也稱爲單詞嵌入或單詞表示形式,它們是分佈式表示形式。
Word2vec使用兩層神經網絡結構來爲大量文本數據的語料庫生成單詞的分佈式表達,並在數百維向量空間中表達每一個單詞的特徵。在該向量空間中,假設在語料庫中共享公共上下文的詞彼此類似,而且將向量分配給這些詞,以使它們在向量空間中彼此接近。
Word2vec(Mikolov et al.2013)是用於學習單詞向量的框架。想法:
咱們有大量的語料庫;
固定詞彙表中的每一個單詞都由一個向量表示;
遍歷文本中的每一個位置t,該位置具備中心詞c和上下文(「outside」)詞o;
使用c和o的詞向量的類似度來計算o給定c的機率(反之亦然);
採樣窗口和計算下圖的過程:
下一步:
對於每一個位置,在給定中心詞的狀況下,在固定大小的窗口中預測上下文詞。
對於是全部要優化的變量。目標函數是平均負對數似然度:<:有時稱爲成本或損失函數>
咱們想要最小化目標函數:
問題:怎樣計算
回答:在每一個單詞咱們將使用兩個向量:
當是中心詞時
當是上下文詞時
計算的採樣窗口和過程
的縮寫爲:
這是softmax函數的一個例子:
softmax函數將任意值映射到機率分佈
1. max,由於放大了最大的機率
2. soft」,由於仍然爲較小的分配了一些機率
爲了訓練模型,咱們調整參數以最大程度地減小損失。例如,對於下面兩個參數的簡單凸函數,等高線顯示目標函數的級別。下圖爲等高線:
召回:表示全部模型參數,在一個長矢量中。在咱們以維向量和個單詞爲例的狀況下:
注意:每一個詞都有兩個向量,咱們經過沿着梯度走來優化這些參數
此處可觀看吳恩達CS224n的視頻,首先給出兩個公式
1. 有用的基礎知識:
2. 鏈式法則!若是和,即,而後:
鏈式法則!若是和,即,而後:
簡單的例子:
1. 首先,展開成y對u的函數:
2. 接着,y對u求導:
3. 其次,在展開u對x的函數:
4. 接着,u對x求導:
5. 最後,根據鏈式法則:
讓咱們一塊兒得出中心詞的梯度。對於一個採樣窗口和一個採樣外部單詞:
而後,須要爲上下文單詞添加梯度(相似;左側爲做業),這就是這裏的全部參數。
對一個窗口中的每一箇中心向量v進行了漸變,咱們還須要外部向量u的梯度一般在每一個窗口中,計算該窗口中正在使用的全部參數的更新,例如:
爲何要選擇兩個向量?->簡化優化。最後將兩個向量平均。Word2Vec模型有兩種類型,即CBOW和skip-gram,它們均由兩層神經網絡組成(輸入層,中間層,輸出層)。
Continuous Bag of Words(CBOW)
從上下文詞袋中預測中心詞
如上所述,CBOW根據上下文(周圍的單詞)預測目標單詞。順便說一句,這裏使用的文本是「You can do it!」。
它是一個學習模型,以上下文做爲輸入值來最大化目標詞的後驗機率。大體在如上圖所示的圖像中,輸入值以one-hot 向量的形式輸入,而且在中間層得到單詞的分佈式表示。在此,目標詞是「can」,所以檢查了預測輸出結果(機率)與正確答案值(1)(1-0.93)之間的差別,並經過更新權重執行學習,以使偏差變小。
Skip-grams(SG)
根據給定的中心詞來預測上下文(「外部」)詞(與位置無關)
接下來是skip-gram,這是一個根據中心單詞預測上下文(周圍單詞)的模型。簡而言之,它是反轉CBOW的圖像。到目前爲止,我看到的兩個模型都使用神經網絡(它模仿人腦的神經細胞),所以當人出現帶有可疑記憶的單詞時考慮到有待猜想的地方,人腦可能以相似的機制主導結果。
這兩種模型細節請參見:https://blog.csdn.net/dn_mug/article/details/69852740
咱們有一個成本函數咱們想要最小化。梯度降低是最小化的算法
思路:對於的當前值,計算的梯度,而後朝負梯度的方向走一小步。重複。<注意:咱們的目標可能不會像這樣凸出>
更新公式(以矩陣表示法):
更新公式(對於單個參數):
算法:
while True: theta_grad = evalute_gradient(J,corpus,theta) theta = theta - alpha * theta_grad
問題:是語料庫中全部窗口的函數(多是數十億!)
所以的計算很是昂貴
解決方案:隨機梯度降低(SGD)
重複採樣窗口,並在每一個窗口以後進行更新
while True: window = sample_window(corpus) theta_grad = evaluate_gradient(J,window,theta) theta = theta - alpha * theta_grad