↑↑↑關注後"星標"Datawhale
每日干貨 & 每月組隊學習,不錯過
Datawhale乾貨
作者:蘆冬生,Datawhale優秀學習者,北京理工大學
自然語言處理( NLP )是信息時代最重要的技術之一,也是人工智能的重要組成部分。NLP的應用無處不在,因爲人們幾乎用語言交流一切:網絡搜索、廣告、電子郵件、客戶服務、語言翻譯、醫療報告等。
近年來,深度學習方法在許多不同的NLP任務中獲得了非常高的性能,同時也吸引了越來越多的人加入學習NLP的大潮中。應廣大學習者要求,Datawhale正式開啓NLP專輯系列,提供NLP入門方向和指引,希望能幫助到大家。
本系列專輯以斯坦福的CS224N教學視頻爲基礎,整理其課堂筆記、拓展作者的理解和學習感悟,幫助大家全面瞭解NLP深度學習的前沿研究。
現在,我們開啓預訓練模型(一):Word vector。
本文目錄:
1. 人類語言和詞義
如何表達一個單詞的含義
在計算機中如何具有可用的含義
wordNet存在的問題
將單詞表示爲離散符號
單詞作爲離散符號存在的問題
通過上下文表示單詞
詞向量
詞義作爲神經詞向量-可視化
2. Word2Vec介紹
Word2Vec概述
Word2Vec:目標函數
帶矢量的Word2Vec概述
Word2Vec:預測功能
通過優化參數來訓練模型
訓練模型:計算所有矢量梯度
3. Word2Vec梯度的導數
鏈式法則
交互式白板會議
計算所有梯度
Word2vec:更多詳細信息
4. 常用工具總結
梯度下降
隨機梯度下降
一、人類語言和詞義
1.1 我們如何表示一個單詞的含義?
定義:含義(韋伯斯特詞典)
一個詞或詞組表示的意思;
人用這個單詞,符號時表達的意思;
一個詞在寫作,藝術等作品中表達意思。
最普遍的意義語言學思維方式:
能指(符號)⟺所指(思想或事物)
=指稱語義
1.2 我們在計算機中如何具有可用的含義?
常見解決方案:使用 WordNet,一個同義詞庫,包含同義詞集和上位詞列表(“是”關係)
例如 包含“good”的同義詞集
# 導入初始包
# pip install nltkimport nltk
#必須下載對應的wordnet包
nltk.download('wordnet')
from nltk.corpus import wordnet as wn
poses = {'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 nltk
import nltk
#必須下載對應的wordnet包
nltk.download('wordnet')
from nltk.corpus import wordnet as wn
panda = wn.synset("panda.n.01")
hyper = lambda s: s.hypernyms()
list(panda.closure(hyper))
1.3 像WordNet這樣的資源,存在的問題
作爲資源很好,但缺少細微差別
例如:“proficient”被列爲“good”的同義詞,這僅在某些情況下是正確的。缺少單詞的新含義
例如,wicked,badass,nifty,wizard,genius,ninja,bombest,不可能保持最新。主觀
需要人工來創造和適應
無法計算準確的單詞相似度
1.4 將單詞表示爲離散符號
在傳統的自然語言處理中,我們將單詞視爲離散符號:hotel,conference,motel - 地方代表。單詞可以用one-hot向量表示:<僅一個1,其餘0s>
motel=[000000000010000]
hotel = [000000010000000]
向量維數=詞彙中的單詞數(例如:500,000)。
1.5 單詞作爲離散符號存在的問題
示例:在網絡搜索中,如果用戶搜索“Seattle motel”,我們希望匹配包含“Seattle hotel”的文檔。但是:
motel=[000000000010000]
hotel = [000000010000000]
這兩個向量是正交的。one-hot向量沒有自然的相似性概念。
《解決方案》
可以嘗試依靠WordNet的同義詞列表來獲得相似性嗎?
但是衆所周知嚴重失敗:不完整等。
替代:學習在向量本身中編碼相似性。
1.6 通過上下文來表示單詞
分佈語義:一個單詞的含義由經常出現的單詞給出
“您將知道它所經營的公司的一句話”(J.R. Firth 1957:11)
現代統計NLP最成功的想法之一!
當單詞w出現在文本中時,其上下文是附近出現的一組單詞(在固定大小的窗口內)
使用w的許多上下文來構建w的表示
1.7 詞向量
我們將爲每個單詞構建一個密集的向量,並選擇它,使其類似於出現在相似上下文中的單詞的向量。
注意:單詞向量有時也稱爲單詞嵌入或單詞表示形式,它們是分佈式表示形式。
1.8 詞義作爲神經詞向量-可視化
二、Word2vec介紹
Word2vec使用兩層神經網絡結構來爲大量文本數據的語料庫生成單詞的分佈式表達,並在數百維向量空間中表達每個單詞的特徵。在該向量空間中,假設在語料庫中共享公共上下文的詞彼此相似,並且將向量分配給這些詞,以使它們在向量空間中彼此接近。
Word2vec(Mikolov et al.2013)是用於學習單詞向量的框架。想法:
我們有大量的語料庫;
固定詞彙表中的每個單詞都由一個向量表示;
遍歷文本中的每個位置t,該位置具有中心詞c和上下文(“outside”)詞o;
使用c和o的詞向量的相似度來計算o給定c的概率(反之亦然);
不斷調整單詞向量以最大程度地提高這種可能性。
2.1 Word2Vec概述
採樣窗口和計算下圖的過程:
下一步:
2.2 Word2vec:目標函數
對於每個位置,在給定中心詞的情況下,在固定大小的窗口中預測上下文詞。
對於是所有要優化的變量。
目標函數是平均負對數似然度:<:有時稱爲成本或損失函數>
我們想要最小化目標函數:
問題:怎樣計算
回答:在每個單詞我們將使用兩個向量:
當是中心詞時
當是上下文詞時
然後對於中心詞c和上下文詞o:
2.3 帶矢量的Word2Vec概述
計算的採樣窗口和過程
的縮寫爲:
2.4 Word2vec:預測功能
這是softmax函數的一個例子:
softmax函數將任意值映射到概率分佈
1. max,因爲放大了最大的概率
2. soft”,因爲仍然爲較小的分配了一些概率
2.5 通過優化參數來訓練模型
爲了訓練模型,我們調整參數以最大程度地減少損失。例如,對於下面兩個參數的簡單凸函數,等高線顯示目標函數的級別。下圖爲等高線:
2.6 訓練模型:計算所有矢量梯度!
召回:表示所有模型參數,在一個長矢量中。在我們以維向量和個單詞爲例的情況下:
注意:每個詞都有兩個向量,我們通過沿着梯度走來優化這些參數
三、Word2vec梯度的導數
此處可觀看吳恩達CS224n的視頻,首先給出兩個公式
1. 有用的基礎知識:
2. 鏈式法則!如果和,即,然後:
3.1 鏈式法則
鏈式法則!如果和,即,然後:
簡單的例子:
1. 首先,展開成y對u的函數:
2. 接着,y對u求導:
3. 其次,在展開u對x的函數:
4. 接着,u對x求導:
5. 最後,根據鏈式法則:
3.2 交互式白板會議!
讓我們一起得出中心詞的梯度。對於一個採樣窗口和一個採樣外部單詞:
然後,需要爲上下文單詞添加梯度(類似;左側爲作業),這就是這裏的所有參數。
3.3 計算所有梯度!
對一個窗口中的每個中心向量v進行了漸變,我們還需要外部向量u的梯度通常在每個窗口中,計算該窗口中正在使用的所有參數的更新,例如:
3.4 Word2vec:更多詳細信息
爲什麼要選擇兩個向量?->簡化優化。最後將兩個向量平均。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
四、優化:梯度下降
我們有一個成本函數我們想要最小化。梯度下降是最小化的算法
思路:對於的當前值,計算的梯度,然後朝負梯度的方向走一小步。重複。<注意:我們的目標可能不會像這樣凸出>
4.1 梯度下降
更新公式(以矩陣表示法):
更新公式(對於單個參數):
算法:
while True:
theta_grad = evalute_gradient(J,corpus,theta)
theta = theta - alpha * theta_grad
4.2 隨機梯度下降
問題:是語料庫中所有窗口的函數(可能是數十億!)
因此的計算非常昂貴
可能需要等待很長時間才能進行單個更新!對於幾乎所有的神經網絡來說,這都是一個非常糟糕的主意!
解決方案:隨機梯度下降(SGD)
重複採樣窗口,並在每個窗口之後進行更新
算法:
while True:
window = sample_window(corpus)
theta_grad = evaluate_gradient(J,window,theta)
theta = theta - alpha * theta_grad
本文電子版 後臺回覆 NLP入門 獲取
“感謝你的分享,點贊,在看三連↓