CS224N
NLP與深度學習的結合簡介
文章目錄
- CS224N
- NLP與深度學習的結合簡介
-
- 簡介
- 為什麼NLP會這麼困難?
- Deep NLP:
- What is word2vector?
-
- word2vector的常見方法(word embedding):
-
- skip-grams(最基礎,效率不高):
- 摘錄一篇csdn大佬的總結:
- skip-grams的優化
- 負采樣(negative sampling)
- CBOW模型
-
- CBOW網絡計算的步驟:
- 一種基于這種直接檢視共現(co-occurence)矩陣的方法:
-
- **怎麼解決呢?答案是奇異值分解:SVD**
- 是以,SVD到底存在什麼問題呢?
- 兩種模型的對比:
- 結合後的模型-全局向量模型-Glove
-
- Glove和skip-gram、CBOW模型對比
- 總結:
- 如何評估:
-
- 一個有效的内在評估方法:
- 經過試驗後的經驗結果:
- 單詞分類:
- 補充小知識:參數稀疏
- 論文補充:如何解決多義詞的詞向量轉化?《Linear algebraic structure of word senses,with Applications to polysemy》
簡介

Amazon-Alexa (牛逼!)專用家庭領域人機互動做的非常好!
結構分析
->
句法分析
->
語義解釋
語音信号分析-處理
一些典型應用:
NLP已經有了很多的産業落地應用-如搜尋引擎-商業廣告推送,情感傾向和輿情分析,還有很多時候,其往往是和語音結合在一起使用的。先聽到,再了解。語音信号處理!
人類語言:
我們在做自然語言處理的時候,想着從一堆資料中提取出有意義和有價值的資訊,但實際上人類的語言系統并不是這樣的,人類的語言系統是抽象的/符号化的/明确的信号系統,人類是通過建構語言來傳遞資訊,這與我們做的其實本質上有很多差別。
人類語言就是一套符号體系!
傳輸的媒介是連續的!
深度學習的核心是可以去自動、黑箱型的去學習中介表征(intermediate representation)
深度學習的第一個重大突破是語音識别 CS224D?
為什麼NLP會這麼困難?
語言作為人類的一種高效的溝通工具,常常伴随着很多省略!
語言是一種華麗的混沌(glorious chaos),其和很多因素有關,語境,不同的人有不同的了解。
一些有趣的例子:
Deep NLP:
把深度學習應用于自然語言處理的一個重點是使用一個向量去表示一個詞 (word 2 vector)
将單詞放到高維向量空間中,這些空間就構成了非常棒的語義空間
具有相似含義的詞彙将在矢量空間中形成聚集塊
向量空間中存在方向會透露關于成分和意義的資訊
而人類不是非常擅長解讀高維向量空間,一般會使用降維到2、3維(PCA主成分降維)-但容易造成誤導-遺漏了很多高維向量空間的資訊
t-SNE (非線性降維)
大佬陳丹琦做的用神經網絡進行依存句法分析
傳統的方法是做一個lambda計算,給每個詞定義一個語義函數,然後找出一種算法來計算不同詞之間的語義關系,相似度之類的。
深度學習方法将詞表示成高維向量,然後句子也是由高維向量組合而成,而這些語義之間的關系則是由深度學習的模型訓練來完成。(不同模型考慮了不同的特征 CNN GNN-文章 RNN LSTM Bert GRU-之類的)
傳統的方法的經典分析是這句話的關鍵詞裡面有很多積極詞彙,是以是一個postive的評論,但實際上,因為前面還有一個don‘t,神經網絡就會注意到這一點進而判斷其整個情緒的負面性。
flawlessly-無瑕的 完美的
一些其他應用:
所有的一切都是用向量(有真實值)的去表達語言
實際上,向量是一種非常強大的資料結構。可以變形成張量,可以變形,可以改變方向。
計算機語言學中常用的并不是大名鼎鼎的韋式詞典,而是wordNet。
其可以做很好的分類。
對于詞彙的離散表征的問題:
主觀的-相似度的定義模糊不清
深度學習的忍者和深度學習的專家到底是否相似?
一種常見的做法是用one-hot decoding去表示原子詞彙
其是一種存儲在某地的本地表示,我們在一個大的向量空間中模糊化詞彙的含義。
但是這種表示肯定是存在問題的,因為它沒有給出各種單詞的意義相似性(這個問題可以加一個self-attention層,大家可以看看我的另外一篇部落格)-word-embbing
解決這個問題的關鍵就是,我們需要從兩個詞的向量表示來看出來兩個向量的相似性,例如計算兩個向量的點積來檢視其相似度。
一個方法是通過上下文來了解單詞的意思,分布式相似度計算
其實一種關于詞彙語義的理論
distributed representation(分布式表示)-distributional(分布式的)
What is word2vector?
簡介:。Word2vec是一類神經網絡模型——在給定無标簽的語料庫的情況下,為語料庫中的單詞産生一個能表達語義的向量。
應用:
- 通過詞向量來計算兩個單詞的詞義相似性
- 對某些監督型NLP任務如文本分類、語義分析構造特征
Word-embedding:
我們的目标是使得詞彙的向量表示能夠使損失最小化。是以詞彙的意義就應該有深度學習的魔法來實作和實作
w-t代表除它外所有的上下文
w代表中心詞彙 f3-search
word2vector的常見方法(word embedding):
skip-grams(最基礎,效率不高):
給定一個中心詞彙,某個單詞在它上下文中出現的機率,我們會選取詞彙的向量表示,進而讓機率分布值最大化,這個模型隻有一個機率分布,對于一個中心詞彙周圍的上下文我們隻有一個輸出。
θ 是 模 型 的 參 數 , 也 是 每 個 詞 彙 的 向 量 表 示 的 唯 一 參 數 ( 系 數 ) \theta是模型的參數,也是每個詞彙的向量表示的唯一參數(系數) θ是模型的參數,也是每個詞彙的向量表示的唯一參數(系數)
一個目标函數就這樣被構造出來了,我們使用對數化讓最大值從求積變為求和,加負号使得最大化問題變為了最小化問題。
這個模型當然有很多個超參數-比如視窗的大小2m,還有一些容差系數,限制先忽略它們,作為常數。 i buy that one-我很喜歡這一點
負數的對數似然分布-意味着我們需要使用交叉熵損失函數-目标函數。
c和0分布代表單詞在詞彙表空間中的索引,以及它們的類型(中心,輸出單詞(outside)):
t和t+j代表的是單詞在文本中的位置
每種單詞類型都有一個對應的向量
Uo是索引為o的單詞所對應的向量
Vc是中心單詞所對應的向量
這種表示互相獨立,在做優化時不會互相耦合。-兩個向量
這裡使用softmax函數(類似于放大一個最大化函數,但仍然是一個較軟的放大-logistic回歸)來表征
求點積具體(點積也是一種模糊求相似度的方法,值越大,相似度越高):
softmax(數值-變為-機率):
指數函數可以很容易将一個數值變到正區間。
這裡的方法并不考慮單詞的位置和中心單詞的距離,我們主要從句義來了解而不是從句法構造。
Skip-grams模型的一個手寫表達:
學習參數(所有向量都是參數,都需要進行計算):
SGD
摘錄一篇csdn大佬的總結:
這裡第二個應該是筆誤,每個單詞實際上是與矩陣的每一行相對應的。,不過這取決于你怎麼定義。
v u向量分别是隐藏層和輸出層權重矩陣的一部分
中心詞向量指的是經過第一個權重矩陣得到的隐藏層向量,背景層向量指的是第二組權重矩陣中的某一列
需要學習的兩個矩陣w和w‘ (一個是單詞降維的,一個是背景向量矩陣計算相似度的)
将詞彙變到高維向量這個想法很重要!,讓神經網絡能夠有更多機會去創造魔法
每個詞都有兩個向量表示,一個是作中心詞,一個是作為背景詞。随着視窗的移動,每個詞都會成為中心詞,這個神經網絡的輸入是one-hot-vector,輸出是各個詞經過計算後的含有語義的數值表示
輸入是one-hot vector編碼後,獨立解耦的問題得到解決。
在輸入層後做一個softmax層分類,注意,是詞彙表中的所有詞。
兩個權重矩陣
輸入乘以第一個權重矩陣得到隐藏層
隐藏層乘以第二個權重矩陣得到輸出層
輸出層經過softmax層得到V個結果,也就是各詞彙的背景層向量表示,當然甚至有自己的背景層向量表示。!
求和的時候詞彙表所有的單詞都會被周遊到
兩個假設:
- 假設給定中心詞的情況下,背景詞之前是互相獨立的
- 假設在對中心詞權重更新時,背景詞的權重是固定的,然後在以同樣的方式來更新背景詞的權重。
skip-grams的優化
1.負采樣(negative sampling)
負采樣(negative sampling)解決了這個問題,它是用來提高訓練速度并且改善所得到詞向量的品質的一種方法。不同于原本每個訓練樣本更新所有的權重,負采樣每次讓一個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。至于具體的細節我在這裡就不在介紹了
2.層序softmax也是解決這個問題的一種方法。這裡也不做詳細介紹。
cost function都是非凹的,為了避免陷入局部最小值,初始化很重要,實際上,一般初始化為一個很小的數都可以避免這樣的問題。
σ ( − x ) = 1 − σ ( x ) \sigma(-x)=1-\sigma(x) σ(−x)=1−σ(x)
負采樣(negative sampling)
訓練一個神經網絡意味着要輸入訓練樣本并且不斷調整神經元的權重,進而不斷提高對目标的準确預測。每當神經網絡經過一個訓練樣本的訓練,它的權重就會進行一次調整。
vocabulary的大小決定了我們的Skip-Gram神經網絡将會擁有大規模的權重矩陣,所有的這些權重需要通過我們數以億計的訓練樣本來進行調整,這是非常消耗計算資源的,并且實際中訓練起來會非常慢。
負采樣(negative sampling)解決了這個問題,它是用來提高訓練速度并且改善所得到詞向量的品質的一種方法。不同于原本每個訓練樣本更新所有的權重,負采樣每次讓一個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。
當我們用訓練樣本 ( input word: “fox”,output word: “quick”) 來訓練我們的神經網絡時,“ fox”和“quick”都是經過one-hot編碼的。如果我們的vocabulary大小為10000時,在輸出層,我們期望對應“quick”單詞的那個神經元結點輸出1,其餘9999個都應該輸出0。在這裡,這9999個我們期望輸出為0的神經元結點所對應的單詞我們稱為“negative” word。
當使用負采樣時,我們将**随機選擇一小部分的negative words(比如選5個negative words)來更新對應的權重。**我們也會對我們的“positive” word進行權重更新(在我們上面的例子中,這個單詞指的是”quick“),目标是最小化這些可能出現在中心詞單詞的機率,取幾個negtive words可以被當作超參數。
在論文中,作者指出指出對于小規模資料集,選擇5-20個negative words會比較好,對于大規模資料集可以僅選擇2-5個negative words。
回憶一下我們的隐層-輸出層擁有300 x 10000的權重矩陣。如果使用了負采樣的方法我們僅僅去更新我們的positive word-“quick”的和我們選擇的其他5個negative words的結點對應的權重,共計6個輸出神經元,相當于每次隻更新300*6=1800個權重。對于3百萬的權重來說,相當于隻計算了0.06%的權重,這樣計算效率就大幅度提高。
随機取是基于頻率進行采樣的,當然也不能隻采樣經常出現的詞。上面的3/4使頻率不高的單詞更容易被采樣。這隻是一種方法,上面是測試出來的不錯的結果。大型語料庫采樣很少可能把下面兩個中采樣相同,獨立同分布相乘變相加。
右邊部分的數量級是10(底數)
θ作為模型所有的參數,(U,V),j損失函數,T是周遊語料庫的第T個時間步或者說第T個視窗。
J t ( θ ) = log s i g m a ( u 0 T u c ) + ∑ j p ( w ) [ log s i g m a ( − u j T v c ) ] J_t(\theta)=\log^{sigma(u_0^Tu_c)}+\sum_{j~p(w)}[\log^{sigma(-u_j^Tv_c)]} Jt(θ)=logsigma(u0Tuc)+j p(w)∑[logsigma(−ujTvc)]
CBOW模型
CBOW(Continuous Bag-of-Word Model)又稱連續詞袋模型,是一個三層神經網絡。如下圖所示,該模型的特點是輸入已知上下文,輸出對目前單詞的預測。
其學習目标是最大化對數似然函數:
其中,w表示語料庫C中任意一個詞。
下面上一個更細節的一個圖:
CBOW網絡計算的步驟:
- 輸入層:上下文單詞的onehot。(假設單詞向量空間dim為V,上下文單詞個數為C)
- 所有onehot分别乘以共享的輸入權重矩陣W(VN矩陣,N為自己設定的數,初始化權重矩陣W)
- 所得的向量 (注意onehot向量乘以矩陣的結果) 相加求平均作為隐層向量, size為1*N.
- 乘以輸出權重矩陣W’ {N*V}
- 得到向量 {1*V} 激活函數處理得到V-dim機率分布 {PS: 因為是onehot嘛,其中的每一維鬥代表着一個單詞},機率最大的index所訓示的單詞為預測出的中間詞(target word)
- 與true label的onehot做比較,誤差越小越好。loss function(一般為交叉熵代價函數)
- 我們并不關心輸出的内容,預測的結果不重要,重要的是訓練完成後第一個全連接配接層的參數就是我們要的word embedding矩陣。
使用word2vectors後,在高維向量空間中,單詞開始聚在一起,當然,我們也可以使用PCA主成分分析法降維供我們觀察。在skip-gram中,我們使用了向量内積來衡量相似性,實際上,使用歐式距離也是可以的,效果大差不差。
一些關于這個方法模型的問題:
一種基于這種直接檢視共現(co-occurence)矩陣的方法:
實際上,以這種矩陣作為wordt2vector的顯著缺點是,很容易出現很多高維向量,這會造成學習出的矩陣非常稀疏,進而導緻整個模型不是那麼robust。
怎麼解決呢?答案是奇異值分解:SVD
選中目标段落shift+tab可以實作自動對齊
既然這種奇異值分解的方法如此有效,當然我們就想要去進一步改進它。
一個有效的方法是對于句子中經常也總會出現的詞,例如the,he,has等做一個計數最大限制處理。
因為實際上根據zipf‘s law,最高頻率出現的詞會比其他詞出現的越來越頻繁,其他詞會出現的越來越少。但實際上,那些不常出現的詞,或者說稀有的詞往往含有非常多的語義内容。
另一個技巧是不平等計數法,當然優化的方法還有很多。
可以看到,經過可視化,SVD這種方法也能捕捉到很多有用的資訊。
但是經過觀察,會發現其實相近的詞語的歐式距離都差不多,都是以相同的模式在一起的,并且經常出現在相似的上下文中。
基于字元的自然語言處理也很重要,對于一些較為複雜的語言,因為越複雜的詞出現的越少,這對于計數模型來說是非常不利的。
是以,SVD到底存在什麼問題呢?
large svd的計算效率不高
兩種模型的對比:
結合後的模型-全局向量模型-Glove
模型的結果,可以看到是非常棒的!
内在評價通常是針對特定的或中間環節的子任務進行的
總結:
1. 代 價 函 數 : J ( θ ) = 1 2 ∑ i , j = 1 N f ( X i , j ) ( v i T v j + b i + b j − l o g ( X i , j ) 2 ) 1.代價函數:J(\theta)=\frac{1}{2}\sum_{i,j=1}^{N}f(X_{i,j})({v_i}^Tv_j+b_i+b_j-log(X_{i,j})^2) 1.代價函數:J(θ)=21i,j=1∑Nf(Xi,j)(viTvj+bi+bj−log(Xi,j)2)
可以明顯的看到,這個模型是考慮了全局語料庫的。
這裡并沒有使用神經網絡的方法
具體推導:了解GLOVE+總結
Glove和skip-gram、CBOW模型對比
Cbow/Skip-Gram 是一個local context window的方法,比如使用NS來訓練,缺乏了整體的詞和詞的關系,負樣本采用sample的方式會缺失詞的關系資訊。
另外,直接訓練Skip-Gram類型的算法,很容易使得高曝光詞彙得到過多的權重
Global Vector融合了矩陣分解Latent Semantic Analysis (LSA)的全局統計資訊和local context window優勢。融入全局的先驗統計資訊,可以加快模型的訓練速度,又可以控制詞的相對權重。
總結:
1.通過統計實驗,發現共現矩陣與詞向量之間的聯系(即與第三個向量共現頻率相近的兩個向量,含義也相近) ; 2.定義詞向量與共現矩陣的差方代價,用來優化詞向量 ; 3.猜想得到g函數,去除第三個向量,并同時簡化代價 ;4.進行數學上的優化(解決Pij的不對稱性、平衡不同詞頻的權重
如何評估:
内在評價的實用性和普适性有待考證!
外在評價一次都耗費時間太長,是否有效效率太低!
一個有效的内在評估方法:
直覺性的結果。
基于這個直覺,出現了這樣一個資料集:
不同語料庫對于項目的落地至關重要,不同語料庫的結果是不同的。
三百維向量好于千維向量。
資料越多越牛逼!
資料集品質同樣重要。
經過試驗後的經驗結果:
爬取的維基百科語料庫往往好于正常的新聞的語料庫
人工評測
餘弦相似度評測
與人類評價的相關性評估
實體命名模型
目前我們做的都是無監督學習,實際上,我們還可以通過标注做成監督學習,給予地點之類的資訊。使得測試集能夠做的和訓練集一樣好
單詞分類:
補充小知識:參數稀疏
dense:稠密的
論文補充:如何解決多義詞的詞向量轉化?《Linear algebraic structure of word senses,with Applications to polysemy》
解決這個問題可以使用稀疏編碼:
V = ∑ i = 0 D a i A i + η V=\sum_{i=0}^{D}a_iA_i+\eta V=i=0∑DaiAi+η
每一個word vector都是被一個稱之為語境向量的少量標明數的總群組成的,一般整個語料庫中隻找到2000個語境向量,但在每個單詞中都很常見。每一個單詞,都隻由語境向量中很少的一部分組成。
word sense:詞義
評估結果,結果此種方法後,模型可以達到和非英語母語者的水準。
summary: