序列模型介紹
在機器學習的任務中,很多任務其實都可以看作序列的模型。所謂序列,就是指這個模型中的元素不再獨立,而是具有一定的相關性。一般,我們根據輸入輸出,把常用模型劃分為如下幾類:
-
一對一的模型。比如全連接神經網絡,就是一對一的結構。我們給它一個輸入,它能得到一個輸出,而且不同輸入間被視作了獨立的關系,分別進行學習或者識別等任務。而現在我們要關注的,是后四幅圖,也就是時序的模型。
一對多模型:根據模型的一個輸出,可以用來預測一個序列。比如對于一個圖像,輸出一串字幕來描述它。
多對一模型:根據一個序列輸入,從而預測一個值。比如根據用戶在一家飯店的留言,判斷用戶對這家飯店的評價。那么,輸入是一段話是一個序列輸入,輸出是
0-5
之間的一個數作為打分。多對多有延遲:根據模型的序列輸入,我們根據已有的輸入,有延遲地輸出一個序列。常見的任務比如翻譯的學習任務,英文翻譯成中文。模型需要等英文輸入到一定程度后,才能翻譯成中文,這樣輸入輸出都為一個序列。
多對多無延遲:根據模型的序列輸入,根據輸入同步輸出一個序列。常見的比如做天氣預報,需要實時根據測得的溫度、濕度等做出下雨概率的預測。但是,每一次預測其實也要考慮之前的一些序列輸入,而不僅由這一時刻的輸入所決定。
可以看出,序列模型的典型特點是輸入輸出不獨立,往往輸出跟前一步、甚至前幾步的輸入相關。此時可以使用循環神經網絡等擬合并分析這樣的過程。
簡單的循環神經網絡
在傳統的神經網絡中,輸入層到輸出層的每層直接是全連接的,但是層內部的神經元彼此之間沒有連接。這種網絡結構很難處理如文本處理,語音翻譯等任務。
循環神經網絡的解決方法,是通過讓隱藏層不僅只考慮上一層的輸出,還包括了上一時刻該隱藏層的輸出。理論上,循環神經網絡能夠包含前面任意多個時刻的狀態。
相比于傳統的神經網絡,循環神經網絡將不同時序的同一層前后連了起來,權值上就會通過引入另一個權值,來決定上一時刻的輸出如何作為輸入,并影響到下一時刻的輸出。
于是就有了這樣一個簡單的基本結構:
左邊表示一個循環的圖像,右邊則是網絡在具體搭建時的思路,二者完全等價。假定上一時刻隱藏層的輸出為,這一時刻的輸入為
,那么這一時刻隱藏層的輸出應該為:
那么我們通過反向傳播,不僅在層之間反向傳播,也在時間上隨時間反向傳播,就可以不斷更新優化,
和
的值,從而達到學習目的。
自然語言處理簡介
用自然語言與計算機進行通信,這是人們長期以來所追求的。因為它既有明顯的實際意義,同時也有重要的理論意義:人們可以用自己最習慣的語言來使用計算機,而無需再花大量的時間和精力去學習不很自然和習慣的各種計算機語言;人們也可通過它進一步了解人類的語言能力和智能的機制。
實現人機間自然語言通信意味著要使計算機既能理解自然語言文本的意義,也能以自然語言文本來表達給定的意圖、思想等。前者稱為自然語言理解,后者稱為自然語言生成。
自然語言處理,即實現人機間自然語言通信,或實現自然語言理解和自然語言生成是十分困難的。造成困難的根本原因是自然語言文本和對話的各個層次上廣泛存在的各種各樣的歧義性或多義性(ambiguity)。
自然語言的形式(字符串)與其意義之間是一種多對多的關系。其實這也正是自然語言的魅力所在。但從計算機處理的角度看,我們必須消除歧義,而且有人認為它正是自然語言理解中的中心問題,即要把帶有潛在歧義的自然語言輸入轉換成某種無歧義的計算機內部表示。
DeepNLP 的核心關鍵: 語言表示(Representation)
最近有一個新名詞:Deep Learning + NLP = DeepNLP。當常規的機器學習 Machine Learning 升級發展到了一定的階段后,慢慢的被后起的深度學習 Deep Learning 奪勢而去,并如火如荼地引領了一波新高潮,因為 Deep Learning 有 machinelearning 過而不及之處!那當 Deep Learning 進入 NLP 領域,自然是要橫掃 ACL 一批 paper 才是。事實也是這樣的。
先提下數據特征表示問題。數據表示是機器學習的核心問題,在過去的 Machine Learning 階段,大量興起特征工程,人工設計大量的特征解決數據的有效表示問題。而到了 Deep Learning,想都別想,end-2-end,一步到位,hyper-parameter 自動幫你選擇尋找關鍵的特征參數。
那么,Deep Learning 如何能在 NLP 中發揮出應有的 real power 呢?很明顯,先不提如何設計出很強勢的網絡結構,不提如何在 NLP 中引入基于 NN 的解決例如情感分析、實體識別、機器翻譯、文本生成這些高級任務,咱們首先得把語言表示這一關過了——如何讓語言表示成為 NN 能夠處理的數據類型。
我們看看圖像和語音是怎么表示數據的:
在語音中,用音頻頻譜序列向量所構成的 matrix 作為前端輸入喂給 NN 進行處理,good;在圖像中,用圖片的像素構成的 matrix 展平成 vector 后組成的 vector 序列喂給 NN 進行處理,good;那在自然語言處理中呢?噢你可能知道或者不知道,將每一個詞用一個向量表示出來!想法是挺簡單的,對,事實上就是這么簡單,然而真有這么簡單嗎?可能沒這么簡單。
有人提到,圖像、語音屬于比較自然地低級數據表示形式,在圖像和語音領域,最基本的數據是信號數據,我們可以通過一些距離度量,判斷信號是否相似,在判斷兩幅圖片是否相似時,只需通過觀察圖片本身就能給出回答。而語言作為人類在進化了幾百萬年所產生的一種高層的抽象的思維信息表達的工具,其具有高度抽象的特征,文本是符號數據,兩個詞只要字面不同,就難以刻畫它們之間的聯系,即使是 “麥克風” 和 “話筒” 這樣的同義詞,從字面上也難以看出這兩者意思相同(語義鴻溝現象),可能并不是簡單地一加一那么簡單就能表示出來,而判斷兩個詞是否相似時,還需要更多的背景知識才能做出回答。
那么據上是不是可以自信地下一個結論呢:如何有效地表示出語言句子是決定 NN 能發揮出強大擬合計算能力的關鍵前提!
NLP 詞的表示方法類型
接下來將按照上面的思路,引出各種詞的表示方法。按照現今目前的發展,詞的表示分為獨熱表示 one-hot、分布式表示 distributed。
1、詞的獨熱表示 one-hot representation
NLP 中最直觀,也是到目前為止最常用的詞表示方法是 One-hot Representation,這種方法把每個詞表示為一個很長的向量。這個向量的維度是詞表大小,其中絕大多數元素為 0,只有一個維度的值為 1,這個維度就代表了當前的詞。關于 one-hot 編碼的資料很多,街貨,這里簡單舉個栗子說明:
“話筒” 表示為 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]
“麥克” 表示為 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]
每個詞都是茫茫 0 海中的一個 1。這種 One-hot Representation 如果采用稀疏方式存儲,會是非常的簡潔:也就是給每個詞分配一個數字 ID。比如剛才的例子中,話筒記為 3,麥克記為 8(假設從 0 開始記)。如果要編程實現的話,用 Hash 表給每個詞分配一個編號就可以了。這么簡潔的表示方法配合上最大熵、SVM、CRF 等等算法已經很好地完成了 NLP 領域的各種主流任務。
現在我們分析他的不當處。
- 向量的維度會隨著句子的詞的數量類型增大而增大
- 任意兩個詞之間都是孤立的,根本無法表示出在語義層面上詞語詞之間的相關信息,而這一點是致命的
2、詞的分布式表示 distributed representation
傳統的獨熱表示( one-hot representation)僅僅將詞符號化,不包含任何語義信息。如何將語義融入到詞表示中?Harris 在 1954 年提出的分布假說( distributional hypothesis)為這一設想提供了理論基礎:上下文相似的詞,其語義也相似。Firth 在 1957 年對分布假說進行了進一步闡述和明確:詞的語義由其上下文決定( a word is characterized by thecompany it keeps)。
到目前為止,基于分布假說的詞表示方法,根據建模的不同,主要可以分為三類:基于矩陣的分布表示、基于聚類的分布表示和基于神經網絡的分布表示。盡管這些不同的分布表示方法使用了不同的技術手段獲取詞表示,但由于這些方法均基于分布假說,它們的核心思想也都由兩部分組成:一、選擇一種方式描述上下文;二、選擇一種模型刻畫某個詞(下文稱 “目標詞”)與其上下文之間的關系。
NLP 語言模型
語言模型包括文法語言模型和統計語言模型。一般我們指的是統計語言模型。之所以要將語言模型擺在詞表示方法之前,是因為后面的表示方法馬上要用到這一概念。
統計語言模型: 統計語言模型把語言(詞的序列)看作一個隨機事件,并賦予相應的概率來描述其屬于某種語言集合的可能性。給定一個詞匯集合 V,對于一個由 中的詞構成的序列
,統計語言模型賦予這個序列一個概率
,來衡量
符合自然語言的語法和語義規則的置信度。
用一句簡單的話說,就語言模型就是計算一個句子的概率大小的這種模型。有什么意義呢?一個句子的打分概率越高,越說明他是更合乎人說出來的自然句子。
就是這么簡單。常見的統計語言模型有 元文法模型(N-gram Model),最常見的是 unigram model、bigram model、trigram model 等等。形式化講,統計語言模型的作用是為一個長度為
的字符串確定一個概率分布
,表示其存在的可能性,其中
到
依次表示這段文本中的各個詞。一般在實際求解過程中,通常采用下式計算其概率值:
同時通過這些方法均也可以保留住一定的詞序信息,這樣就能把一個詞的上下文信息 capture 住。
詞的分布式表示
- 基于矩陣的分布表示
基于矩陣的分布表示通常又稱為分布語義模型,在這種表示下,矩陣中的一行,就成為了對應詞的表示,這種表示描述了該詞的上下文的分布。由于分布假說認為上下文相似的詞,其語義也相似,因此在這種表示下,兩個詞的語義相似度可以直接轉化為兩個向量的空間距離。
常見到的 Global Vector 模型( GloVe 模型)是一種對 “詞 - 詞” 矩陣進行分解從而得到詞表示的方法,屬于基于矩陣的分布表示。
- 基于神經網絡的分布表示,詞嵌入( word embedding)
基于神經網絡的分布表示一般稱為詞向量、詞嵌入( word embedding)或分布式表示( distributed representation)。這正是我們的主角 today。
神經網絡詞向量表示技術通過神經網絡技術對上下文,以及上下文與目標詞之間的關系進行建模。由于神經網絡較為靈活,這類方法的最大優勢在于可以表示復雜的上下文。在前面基于矩陣的分布表示方法中,最常用的上下文是詞。如果使用包含詞序信息的 n-gram 作為上下文,當 n 增加時, n-gram 的總數會呈指數級增長,此時會遇到維數災難問題。而神經網絡在表示 n-gram 時,可以通過一些組合方式對 n 個詞進行組合,參數個數僅以線性速度增長。有了這一優勢,神經網絡模型可以對更復雜的上下文進行建模,在詞向量中包含更豐富的語義信息。
詞嵌入( word embedding)
1、概念
基于神經網絡的分布表示又稱為詞向量、詞嵌入,神經網絡詞向量模型與其它分布表示方法一樣,均基于分布假說,核心依然是上下文的表示以及上下文與目標詞之間的關系的建模。
前面提到過,為了選擇一種模型刻畫某個詞(下文稱 “目標詞”)與其上下文之間的關系,我們需要在詞向量中 capture 到一個詞的上下文信息。同時,上面我們恰巧提到了統計語言模型正好具有捕捉上下文信息的能力。那么構建上下文與目標詞之間的關系,最自然的一種思路就是使用語言模型。從歷史上看,早期的詞向量只是神經網絡語言模型的副產品。
2001 年, Bengio 等人正式提出神經網絡語言模型( Neural Network Language Model ,NNLM),該模型在學習語言模型的同時,也得到了詞向量。所以請注意一點:詞向量可以認為是神經網絡訓練語言模型的副產品。
神經網絡語言模型與 word2vec
好了,到目前為止我們已經對的分布式表示以及詞嵌入的概念的層級關系有了個理性的認識了,那這跟 word2vec 有什么聯系?
1、神經網絡語言模型
上面說,通過神經網絡訓練語言模型可以得到詞向量,那么,究竟有哪些類型的神經網絡語言模型呢?個人所知,大致有這么些個:
- Neural Network Language Model ,NNLM
- Log-Bilinear Language Model, LBL
- Recurrent Neural Network based Language Model,RNNLM
- Collobert 和 Weston 在 2008 年提出的 C&W 模型
- Mikolov 等人提出了 CBOW( Continuous Bagof-Words)和 Skip-gram 模型
到這,估計有人看到了兩個熟悉的 term:CBOW、skip-gram,有看過 word2vec 的同學應該對此有所了解。我們繼續。
- word2vec 與 CBOW、Skip-gram
現在我們正式引出最火熱的另一個 term:word2vec。
上面提到的 5 個神經網絡語言模型,只是個在邏輯概念上的東西,那么具體我們得通過設計將其實現出來,而實現 CBOW( Continuous Bagof-Words)和 Skip-gram 語言模型的工具正是 well-known word2vec!另外,C&W 模型的實現工具是 SENNA。
所以說,分布式詞向量并不是 word2vec 的作者發明的,他只是提出了一種更快更好的方式來訓練語言模型罷了。分別是:連續詞袋模型 Continous Bag of Words Model(CBOW) 和 Skip-Gram Model,這兩種都是可以訓練出詞向量的方法,再具體代碼操作中可以只選擇其一,不過據論文說 CBOW 要更快一些。
順便說說這兩個語言模型。統計語言模型 statistical language model 就是給你幾個詞,在這幾個詞出現的前提下來計算某個詞出現的(事后)概率。CBOW 也是統計語言模型的一種,顧名思義就是根據某個詞前面的 個詞或者前后
個連續的詞,來計算某個詞出現的概率。Skip-Gram Model 相反,是根據某個詞,然后分別計算它前后出現某幾個詞的各個概率。
以 “我愛北京天安門” 這句話為例。假設我們現在關注的詞是 “愛”, 時它的上下文分別是 “我”,“北京天安門”。CBOW 模型就是把 “我” “北京天安門” 的 one hot 表示方式作為輸入,也就是
個 1xV 的向量,分別跟同一個 VxN 的大小的系數矩陣
相乘得到
個 1xN 的隱藏層 hidden layer,然后
個取平均所以只算一個隱藏層。這個過程也被稱為線性激活函數 (這也算激活函數?分明就是沒有激活函數了)。然后再跟另一個 NxV 大小的系數矩陣
相乘得到 1xV 的輸出層,這個輸出層每個元素代表的就是詞庫里每個詞的事后概率。輸出層需要跟 ground truth 也就是 “愛” 的 one hot 形式做比較計算 loss。這里需要注意的就是
通常是一個很大的數比如幾百萬,計算起來相當費時間,除了 “愛” 那個位置的元素肯定要算在 loss 里面,word2vec 就用基于 huffman 編碼的 Hierarchical softmax 篩選掉了一部分不可能的詞,然后又用 nagetive samping 再去掉了一些負樣本的詞所以時間復雜度就從
變成了
。Skip gram 訓練過程類似,只不過輸入輸出剛好相反。
補充下,Word embedding 的訓練方法大致可以分為兩類:一類是無監督或弱監督的預訓練;一類是端對端(end to end)的有監督訓練。無監督或弱監督的預訓練以 word2vec 和 auto-encoder 為代表。這一類模型的特點是,不需要大量的人工標記樣本就可以得到質量還不錯的 embedding 向量。不過因為缺少了任務導向,可能和我們要解決的問題還有一定的距離。因此,我們往往會在得到預訓練的 embedding 向量后,用少量人工標注的樣本去 fine-tune 整個模型。
相比之下,端對端的有監督模型在最近幾年里越來越受到人們的關注。與無監督模型相比,端對端的模型在結構上往往更加復雜。同時,也因為有著明確的任務導向,端對端模型學習到的 embedding 向量也往往更加準確。例如,通過一個 embedding 層和若干個卷積層連接而成的深度神經網絡以實現對句子的情感分類,可以學習到語義更豐富的詞向量表達。
- 對 word embedding 的理解
現在,詞向量既能夠降低維度,又能夠 capture 到當前詞在本句子中上下文的信息(表現為前后距離關系),那么我們對其用來表示語言句子詞語作為 NN 的輸入是非常自信與滿意的。