一、自然語言表徵與計算機表示
自然語言是指一種人類社會中自然地隨文化演化的語言,聰明的人類經過萬年的積累,並通過後天良久的學習才能理解語言的魅力和含義,機械的計算機當然不能如此容易地表達出來。
要了解自然語言的計算機表示,我們首先從發展、工業落地更加成熟的圖像領域說起,圖像使用非負數的矩陣表示像素點,是低層次的,連續的數據和特徵。圖像的任務,如分類,相似度,目標檢測等,都是具體的,可輕易區分的。
相比於圖像,自然語言無疑複雜得多。經過萬年發展的語言是人類智慧高度凝結的結晶,語言語義很難通過數據來刻畫。漢語2000多個常用字,2萬多個字,成百上千萬個詞等語言基本單元就很難刻畫,例如"喜歡"和"愛"是近義詞,但是從字面上並不能反映這種信息。更別說複雜的任務:分詞,分類,信息抽取......
下面簡要介紹下自然語言表示的常用方法。
二、onehot獨熱編碼
onehot獨熱編碼是一種古老而又現代的編碼方式,它通過給每個字符、詞語或句子分配唯一id表示。這種做法是將要表示的字典中每個單元看成獨立的唯一的單元,可以用正整數表示,不過通常構建字典大小的一維矩陣,設置一個數字爲1,其他的位置全部爲0等。
舉個例子: "大漠帝國"可以表示爲[0, 0, ,0, 0, 0, 1],或者是一個數字 32
現在單獨只用one-hot作機器學習、深度學習、強化學習是比較少了的,因爲效果不夠好。不過倒是通常用one-hot作爲唯一標識原始輸入(也就是索index的作用)。
解決的問題:自然語言文本在計算機的表示,one-hot句子構建的詞袋模型能夠擴充特徵
應用:索引表示字、詞、句子等
優點: 簡單可解釋,線性可分
缺點: 無法表徵編碼單元(比如說字,詞,句子)之間的關係,無法表示詞序關係;
只是符號化,一維度單點的數字攜帶的信息和特徵太少;
數據量大時會帶來維數災難。
三、傳統統計方法bag of words, tf, idf, tf-idf, bm25
3.1 TF-IDF
TF-IDF(英文名: term frequency-inverse document frequency),引用百度百科的說法: TF-IDF是一種用於信息檢索與數據挖掘的常用加權技術。
TF意思是詞頻(Term Frequency),用在句子構成的語料中,就是字或者詞在文本中出現的頻率。
IDF意思是逆文本頻率指數(Inverse Document Frequency),就是出現該字或者詞的句子條數。一般計算是: IDF = Log ( 語料中句子總數 / (包含該詞或字的句子數+1) );
而TF-IDF = TF * IDF。
解決的問題:劃分詞語重要程度,引入外部語料庫信息(即所謂的先驗概率)
應用:用於信息檢索與數據挖掘的常用加權技術,關鍵詞,句子相似度等
優點:實現簡單高效,給出一種表示字詞句子重要性的方法;常見python工具包都會集成
缺點:詞頻等重合會導致表示衝突,嚴重依賴於語料庫;
會偏向於文本中頻率小的詞;
不能刻畫出詞序信息;
3.2 詞袋模型bag of words
詞袋模型,通俗的說,就是將句子、語料中的詞語都丟到一個袋子裏,構建一個詞語集合-詞頻的一維矩陣,不考慮順序,不考慮重要性,認爲詞語是獨立的。例子sample:
"我愛帝國, 大漠帝國”; 詞語有 "我", "愛", "帝國", "大漠"
“我愛帝國”的句向量爲 [1, 1, 2, 1]
解決的問題:
應用:可用於信息檢索與數據挖掘的常用加權技術,關鍵詞,句子相似度等
優點:實現簡單高效,給出一種表示句子一維向量的方法;
缺點:無法展示不同詞語的重要程度;
不能刻畫相似詞語,不能刻畫一詞多義;
不能刻畫出詞序信息,維度災難;
四、基於矩陣的統計方法(共現矩陣,NMF, LSI, LDA等主題模型[分解派],Glove)
這種方法的關鍵在於構建矩陣,基於矩陣的統計方法主要有矩陣分解派(NMF, LSI, LDA等主題模型),以及共現矩陣,降維共現矩陣Glove等。
4.1 基於統計的共現矩陣方法
共現矩陣方法主要通過K個窗口的詞語的詞頻構建的向量表示詞向量,具體做法就是構建N*N的矩陣(N爲詞典大小),矩陣中元素填充爲訓練語料中的共現詞語頻次。舉個例子,
假設有語料: “我喜歡你”, “我愛你”, “我想你”,窗口爲4,構建的共現矩陣如下圖
那麼"我"的詞向量可以表示爲: [0, 1, 1, 2, 1, 1]
解決的問題:簡單解決詞向量不能計算相似度問題
應用:詞向量,句向量構建
優點:實現簡單高效,給出一種表示字詞句子一維向量的表示方法
缺點:嚴重依賴於語料庫;
不能刻畫出詞序信息;
數據稀疏與維度災難;
4.2 主題模型(NMF, LSI, LDA)
首先構建構建N*N的方矩(N爲詞典大小),矩陣中元素填充一般爲訓練語料中的TF-IDF,也可以是詞頻或BM25。
我們提出的假設是"詞-主題,主題-句子",所以使用主題模型進行降維,得到的權重矩陣W,就是詞語對應的詞向量。
可以使用NMF矩陣分解方法提取詞向量: V = W * H;也可以使用SVD奇異值分解提取詞向量: A= U * E * V,或者是
更加複雜的LDA主題模型。
一般我們會獲取W權重矩陣作爲詞向量模型,例如通常會得到如下結果:
# 權重矩陣
[[1.99561456 0.03769528 0.92768855]
[2.19064197 0.33915908 1.32014035]
[3.94014929 0.01328534 0. ]
[2.35460586 0.44811399 1.68201657]
[0.72884099 2.33034829 0. ]]
解決的問題:詞向量間隱藏的語義,如"孫悟空"和"唐僧"有關係。
應用:詞向量,句向量構建,潛在語義與主題
優點:算法簡潔明瞭可解釋;有嚴謹的假設和證明;使用全局特徵;常見python工具包都會集成
缺點:嚴重依賴於語料庫;
不能刻畫出詞序信息;
計算複雜維度災難;
主題個數不好確定;
4.3 相似度與共現矩陣(Glove)
從某種意義上說,Glove是一種神奇的腦洞,glove是一種生不逢時的詞嵌入方法,爲何如此說呢?1.glove效果與
word2vec相似,沒有什麼明顯性能提升,但誕生於word2vec後面; 2.glove是一種傳統統計學習方法而沒有使用人工神經
網絡;3.方法與計算相對複雜,並且沒有什麼好用的官方包,並且常見的python工具包也沒有集成glove。
glove算法認爲,A的詞向量 / B的詞向量 = Pac / Pbc;統計共現矩陣,共現矩陣爲X,在整個語料庫中,
Pac爲單詞A和單詞C共同出現在一個窗口中的次數除以語料中單詞A出現的個數;
同理,Pbc爲單詞B和單詞C共同出現在一個窗口中的次數除以語料中單詞B出現的個數。
化簡爲 A的詞向量 * B的詞向量 ∝ Freq ab,即 A的詞向量 乘以 B的詞向量 正比於 AB詞出現的詞頻,
再加上一些偏置項,就是glove了,glove損失函數如下:
解決的問題:詞向量間上下文關係,部分解決詞向量全局關係。
應用:一般性詞向量,句向量構建,相似度計算,詞嵌入等
優點:算法簡單直觀,只用了純統計方法,綜合了詞語的全局信息和局部信息等
缺點:嚴重依賴於語料庫;
不能刻畫出詞序信息;
不能解決一詞多義問題;
常見python工具包不集成使得訓練麻煩,應用較少;
五、基於語言模型的深度學習方法(NNLM、word2vec、Elmo、GPT、BERT)
5.1 NNLM
nnlm是2003年bengio等提出的一種神經網絡語言模型,他的主要思想是根據句子中的前N個詞語序列預測下一個
單詞(這點和現在流行的MLM任務有點類似),採用的是MLP+tanh+softmax模型,其中神經元W便是重要的副產品,
提供給下游任務的詞向量。
從某種意義上而言,nnlm是隨着word2vec的興起和熱度而被考古出來的,從其貢獻本身來說或許意義並不是很大。
nnlm結構圖如下:
解決的問題:學習詞語的分佈式表示(從高維降到低維),詞向量的隱含語義,一段話的句向量表示
應用:一般性詞向量,句向量構建,相似度計算,詞嵌入等
優點:使用神經網絡模型訓練詞向量
缺點:模型優化不夠,輸出的類別較多導致訓練過慢;
自迴歸語言模型,無法獲取下文信息;
早期方案,應用較少,一般python工具不會集成;
5.2 word2vec
word2vec來自2013年google的論文《Efficient Estimation of Word Representations in Vector Space》,是一種淺層神
經網絡模型,其中cbow模式就是預測連續N個詞與中摳出來那個。例子“我 不 喜歡 帝國 主義 的”,假設滑動窗口是5,那麼
可以有用詞袋模型[“我", "不", "喜歡", ”主義“] 預測 ”帝國“。
skip-gram模型正好相反,用”帝國“去預測[“我", "不", "喜歡", ”主義“]。
word2vec模型結構圖如下:
解決的問題:神經網絡訓練詞向量速度慢的問題,
淺層詞語意思抽取(語言模型),
預訓練與下游任務微調問題
應用:詞向量,句向量構建,詞嵌入,相似度計算等
優點:算法簡單直觀,只用了淺層神經網絡,
優化後訓練速度快,能夠獲取相似詞向量,
無論是word2vec還是其變種fastext都很好,很多包支持
缺點:不能解決一詞多義問題;
不能區分和解決同義詞反義詞等深層次語義問題;
5.3 ELMO
elmo(deep contextualized word representation),是一種新的深層語境化的詞彙表達方式,即動態變化的詞向量,
這一點是和之前的靜態詞向量是迥異的。其具體做法是使用biLM語言任務,具體來說就是根據句話中的上下文預測當前
詞語。例子:
假設有一句話"中國鬥魚又名叉尾鬥魚,廣泛分佈於華南地區。",elmo就是要預測"魚"這個單詞,那麼就用前向LSTM
編碼"中國鬥魚又名叉尾鬥",得到編碼h1,後向LSTM編碼",廣泛分佈於華南地區。",得到編碼h2,把h1和h2拼接起來,
即[h1, h2],去預測"魚"的概率。
這樣子訓練,大規模語料中的通用信息,就存儲到這個雙層前向後向LSTM中了。
使用來做字,詞,句子embedding,或者是做下游任務的時候,可以這麼來理解,輸入一個句子,elmo句子中的
詞語的詞向量受上下文詞語影響,其上下文不同,則當前詞語的詞義不一樣,如此,就能夠解決一詞多義的情況了。
ELMO網絡結構如下:
解決的問題:一詞多義問題,
深層次句子語義問題
應用:詞向量,句向量構建,NLP四大任務等下游任務
優點:預訓練模型使用通用語料,引入外部語料;
使用bilstm特徵抽取器抽取詞語,句子,語義等各層次信息;
解決一詞多義問題,序列依賴問題;
缺點:bilstm抽取特徵能力不夠強,訓練速度慢,不能並行化處理;
輸出拼接前向、後向融合特徵的方式不夠好;
沒有一個比較好的通用訓練好的中文elmo預訓練模型,也沒有比較好用的工具;
5.3 Bert
Bert(Pre-training of Deep Bidirectional Transformers for Language Understanding),深層雙向Transformer
預訓練語言模型,是NNLM、Word2vec、ELMO和GPT等embedding技術的集大成者。
Bert採用更大規模(幾十G)、更深層次網絡(12,24)訓練通用預訓練模型,其訓練任務有兩個,一個是MLM(masked
Language Model)遮擋語言模型,而是NSP(Next Sentence Prediction)下一句子預測。
應該很好理解,MLM就是用句子中的其他詞語預測被遮擋住的詞語,
例子: "我愛語文"這句話,可以把["我", masked, "語", "文"]預測"愛"這個詞。
NSP也很好理解,將連續的兩句話拼接起來,用[SEP]間隔開,是連續句子就是True,否則爲False,二分類任務。
這些任務,ELMO可以做,CBOW也可以做,不同的是,Bert在輸入時候把token_segnment,position_embedding,
segnment_embedding一體化融合;兩階段模型(預訓練,微調);Transformer編碼層作特徵抽取器;使用雙向語言模型等
BERT網絡結構如下圖:
解決的問題:一詞多義問題;
並行化快速訓練問題;
詞語、句子語義層次問題;
transformer上下文信息獲取;
應用:詞向量,句向量構建,NLP四大任務等下游任務
優點:預訓練模型使用通用語料,引入外部語料,便於下游任務微調;
使用transformer特徵抽取器抽取詞語,並行化獲取句子,語義等各層次信息;
解決一詞多義問題,雙向語言模型;
缺點:相同句式的詞語語義區分不明顯;
訓練、微調時候輸入不一致;
多層transformer訓練比較慢,耗時長,需要能耗高;
bert維度768,多層transformer網絡參數大,佔用空間,預測比較慢;
不大適合生成式任務,對於超長文本不太友好,對於只需要淺層語義的NLP任務不友好;
參考/感謝:
詞向量表示方法梳理: https://zhuanlan.zhihu.com/p/46026058
從Word Embedding到Bert模型——自然語言處理預訓練技術發展史:https://mp.weixin.qq.com/s/FHDpx2cYYh9GZsa5nChi4g