如何讓機器理解漢字一筆一畫的奧秘?
阿里妹導讀:針對無監督中文詞向量生成問題,螞蟻金服人工智慧部設計了一種新的演算法:cw2vec。該演算法充分利用了中文的語言學特性,讓機器理解漢字一筆一畫之間的奧秘。在公開數據集上,演算法的準確度超過了谷歌的word2vec,斯坦福的GloVe,清華的CWE等業界最優的演算法,並且在阿里的諸多場景中均取得了不錯的效果,相關論文被AAAI 2018高分錄用。
本文作者: 曹紹升 陸巍 周俊 李小龍
背景介紹
從智能客服到機器翻譯,從文本摘要生成到用戶評論分析,從文本安全風控到商品描述建模,無不用到自然語言技術,作為人工智慧領域的一個重要分支,如何讓機器更懂得人類的語言,尤其是漢字這種強表意文字,是一個具有極大挑戰的事情。
詞向量,是一種利用無監督學習方式(不需要人工數據標註),將詞語映射到語義向量空間的技術。舉個例子:在過去,計算機使用下標表示詞語,比如「貓: 2123」,「狗: 142」,由於下標不一樣,機器就只會認為是不同的詞語,卻不能像人一樣感知詞語間的語義關係。而詞向量技術恰好彌補了這一點,使機器可以理解潛在的語義信息。實際上,現在很多自然語言處理的演算法都是將其作為輸入,進而建立端到端的演算法模型。因此,設計出高質量的詞向量生成演算法是一個值得探討的問題。
中文經過幾千年的發展和演變,是一種強表意文字,對於我們而言,即使某個字不認識,都或許可以猜到其含義,機器卻很難理解這些。比如,「蘒」這個字我們很可能不認識,但裡面有「艹」字頭,和「禾」木旁,那它也許就是長得像該字右下角部分的某種植物吧。通過詞向量的方式,我們希望讓機器能夠理解漢字一筆一畫之間的奧秘。然而,傳統的演算法並不能很好的利用中文語言學上的特性,這篇文章里,我們將提出一種利用筆畫信息來提高中文詞向量的方法。
詞向量演算法是自然語言處理領域的基礎演算法,在序列標註、問答系統和機器翻譯等諸多任務中都發揮了重要作用。詞向量演算法最早由谷歌在2013年提出的word2vec,在接下來的幾年裡,經歷不斷的改進,但大多是只適用於拉丁字元構成的單詞(比如英文),結合中文語言特性的詞向量研究相對較少。
相關工作:
早在1954年,語言學家Harris提出「Distributional Hypothesis [1](分散式假設)」:語義相似的單詞往往會出現在相似的上下文中。這一假設奠定了後續各種詞向量的語言學基礎,即用數學模型去刻畫單詞和其上下文的語義相似度。Bengio et al., 2003 [2] 提出了NNLM(基於神經網路的語言模型),由於每次softmax的計算量很大(分母項的計算時間複雜度O(|V|),V是全詞表),相繼出現了很多快速近似計算策略。
為了解決上述問題,谷歌提出了word2vec [3,4] 演算法,其中包含了兩種策略,一種叫做Negative Sampling(負採樣),另一種是hierarchical softmax(層次softmax)。Negative Sampling的核心思想:每次softmax計算所有單詞太慢,那就隨機的選幾個算一算好了,當然,訓練語料中出現次數越多的單詞,也就越容易被選中;而Hierarchical Softmax,簡單來說,就是建一棵樹狀的結構,每次自上而下的從根計算到葉子節點,那麼就只有對數時間複雜度了!如何構建這棵樹可以使得讓樹的高度盡量小呢?哈夫曼樹。
詞向量模型的核心是構造單詞與其上下文的相似度函數,word2vec工具包裡面有兩種實現方式,分別是skipgram和cbow。
假設當前單詞w是「cat」,而上下文單詞c是「sat」,演算法的目標是給定w最大化c出現概率(skipgram)。在這個演算法中,每個單詞都被當作一個整體,利用外部的上下文結構信息去學習得到詞向量。
那麼是否可以充分結合單詞內部結構的(亞詞)信息,將其拆分成更細粒度的結構去增強詞向量?英文中每個單詞所包含的character(字母)較多,每個字母並沒有實際的語義表達能力。對於中文詞語而言,中文詞語可以拆解成character(漢字)。
Chen et al., 2015 [5] 提出了CWE模型,思路是把一個中文詞語拆分成若干漢字,然後把原詞語的向量表示和其中的每一個漢字的向量表示做平均,然後作為新的詞語向量。
在該演算法中,「智能」是一個上下文詞語,先拆解成兩個漢字「智」和「能」,然後計算出新的詞語向量表示;同理,上下文詞語「到來」也得到重新計算。CWE保持當前詞語不拆分,這裡「時代」保持不變。
不難想到,將漢字拆分成偏旁或許是一種不錯的方式,Sun et al., 2014 [6]和Li et al., 2015 [7] 做過相關的研究。然而偏旁只是漢字的一部分,Yu et al., 2017 [8] 提出了更加細化的拆分,根據人工總結的「字件」,將漢字拆成一個一個的小模塊,把詞、漢字和字件一起進行聯合學習:
其中,w , c和s分別表示詞語、漢字和字件模塊。字件粒度的拆分也取得了超過僅僅利用偏旁信息的方法。
此外,Su and Lee, 2017 [9] 提出了GWE模型,嘗試從漢字的圖片中利用卷積自動編碼器來提取特徵:
從漢字圖片提取出特徵之後,再結合上下文結構信息學習中文詞向量。很遺憾的是,根據其原文的描述,這種方式得到的特徵基本沒有提升,不過這確實是非常有意思的一次試探。
問題與挑戰:
自然語言處理的頂級會議ACL 2017,共提出了未來的四大研究方向,如何更好的利用「亞詞」信息就是其中的一個。在中文詞向量場景下,僅將中文詞語拆解到漢字粒度,會一定程度上提高中文詞向量的質量,是否存在漢字粒度仍不能刻畫的情況?
可以看出,「木材」和「森林」是兩個語義很相關的詞語,但是當我們拆解到漢字粒度的時候,「木」和「材」這兩個字對比「森」和「材」沒有一個是相同的(一般會用一個下標去存儲一個詞語或漢字),因此對於這個例子而言,漢字粒度拆解是不夠的。我們所希望得到的是:
「木」和「材」可以分別拆解出「木」和「木」(來源於「材」的左半邊)結構,而「森」和「林」分別拆解得到多個「木」的相同結構。此外,可以進一步將漢字拆解成偏旁、字件,對於以上例子可以有效提取出語義結構信息,不過我們也分析到:
可以看出,「智」的偏旁恰好是「日」,而「日」不能表達出「智」的語義信息。實際上,偏旁的設計是為了方便在字典中查詢漢字,因此結構簡單、出現頻率高變成了首要原則,並不一定恰好能夠表達出該漢字的語義信息。此外,將「智」拆分到字件粒度,將會得到「失」,「口」和「日」三個,很不巧的是,這三個字件也均不能表達其漢字語義。我們需要設計出一種新的方法,來重新定義出詞語(或漢字)具有語義的結構:
這裡,「知」是可以表達出「智」語義的模塊,如何得到這樣的亞詞結構,並結合句子上下文設計模型的優化目標,生成出更好的中文詞向量,將是後文要探索的內容。
cw2vec模型:
單個英文字元(character)是不具備語義的,而中文漢字往往具有很強的語義信息。不同於前人的工作,我們提出了「n元筆畫」的概念。所謂「n元筆畫」,即就是中文詞語(或漢字)連續的n個筆畫構成的語義結構。
如上圖,n元筆畫的生成共有四個步驟。比如說,「大人」這個詞語,可以拆開為兩個漢字「大」和「人」,然後將這兩個漢字拆分成筆畫,再將筆畫映射到數字編號,進而利用窗口滑動產生n元筆畫。其中,n是一個範圍,在上述例子中,我們將n取值為3, 4和5.
在論文中我們提出了一種基於n元筆畫的新型的損失函數:
如上圖所示,對於「治理 霧霾 刻不容緩」這句話,假設此刻當前詞語恰好是「霧霾」,上下文詞語是「治理」和「刻不容緩」。首先我們將當前詞語「霧霾」拆解成n元筆畫並映射成數字編碼,然後劃窗得到所有的n元筆畫,根據我們設計的損失函數,計算每一個n元筆畫和上下文詞語的相似度,進而根據損失函數求梯度並對上下文詞向量和n元筆畫向量進行更新。
為了驗證我們提出的cw2vec演算法的效果,我們在公開數據集上,與業界最優的幾個詞向量演算法做了對比:
上圖中包括2013年谷歌提出的word2vec [2,3] 的兩個模型skipgram和cbow,2014年斯坦福提出的GloVe演算法 [10],2015年清華大學提出的基於漢字的CWE模型 [5],以及2017年最新發表的基於像素和字件的中文詞向量演算法 [8,9],可以看出cw2vec在word similarity,word analogy,以及文本分類和命名實體識別的任務中均取得了一致性的提升。同時,我們也展示了不同詞向量維度下的實驗效果:
上圖為不同維度下在word analogy測試集上的實驗結果,左側為3cosadd,右側為3cosmul的測試方法。可以看出我們的演算法在不同維度的設置下均取得了不錯的效果。此外,我們也在小規模語料上進行了測試:
上圖是僅選取20%中文維基百科訓練語料,在word similarity下測試的結果,skipgram, cbow和GloVe演算法由於沒有利用中文的特性信息進行加強,所以在小語料上表現較差,而其餘四個演算法取得了不錯的效果,其中我們的演算法在兩個數據集上均取得的了最優效果。
為了更好的探究不同演算法的實際效果,我們專門選取了兩個詞語做案例分析。第一個是環境相關的「水污染」,然後根據詞向量利用向量夾角餘弦找到與其語義最接近的詞語。GWE找到了一些和「污」字相關的詞語,比如「污泥」,「污漬」和「污垢」,而JWE則更加強調後兩個字「污染」GloVe找到了一些奇怪的相近詞語,比如「循環系統」,「神經系統」。CWE找到的相近詞語均包含「水」和「污」這兩個字,我們猜測是由於其利用漢字信息直接進行詞向量加強的原因。此外,只有cw2vec找到了「水質」這個相關詞語,我們認為是由於n元筆畫和上下文信息對詞向量共同作用的結果。第二個例子,我們特別選擇了「孫悟空」這個詞語,該角色出現在中國的名著《西遊記》和知名日本動漫《七龍珠》中,cw2vec找到的均為相關的角色或著作名稱。
作為一項基礎研究成果,cw2vec在阿里的諸多場景上也有落地。在智能客服、文本風控和推薦等實際場景中均發揮了作用。此外,不單單是中文詞向量,對於日文、韓文等其他語言我們也進行類似的嘗試,相關的發明技術專利已經申請近二十項。
我們希望能夠在基礎研究上追趕學術界、有所建樹,更重要的是,在具體的實際場景之中,能夠把人工智慧技術真正的賦能到產品里,為用戶提供更好的服務。
論文下載
https://github.com/ShelsonCao/cw2vec/blob/master/cw2vec.pdf
參考資料
1. Harris, Zellig S. "Distributional structure." Word 1954.
2. Bengio, Yoshua, et al. "A neural probabilistic language model." JMLR 2003.
3. Mikolov, Tomas, et al. "Efficient estimation of word representations in vector space." arXiv preprint arXiv:1301.3781 (2013).
4. Mikolov, Tomas, et al. "Distributed representations of words and phrases and their compositionality." NIPS 2013.
5. Chen, Xinxiong, et al. "Joint Learning of Character and Word Embeddings." IJCAI 2015.
6. Sun, Yaming, et al. "Radical-enhanced Chinese character embedding." ICNIP 2014.
7. Li, Yanran, et al. "Component-enhanced Chinese character embeddings." arXiv preprint arXiv:1508.06669 (2015).
8. Yu, Jinxing, et al. "Joint Embeddings of Chinese Words, Characters, and Fine-grained Subcharacter Components." EMNLP 2017.
9. Su, Tzu-Ray, and Hung-Yi Lee. "Learning Chinese Word Representations From Glyphs Of Characters." EMNLP 2017.
10. Pennington, Jeffrey, et al. "Glove: Global vectors for word representation." EMNLP 2014.
推薦閱讀:
※tf.nn.nce_loss 來自一篇古老的文章
※ICLR2017最新論文調研-1-《Learning to Compose Words into Sentences with Reinforcement Learning》
※中文NLP那些事系列(1)
※吳恩達 DeepLearning.ai 課程提煉筆記(5-2)序列模型 --- NLP和詞嵌入
※《Dialogue Act Sequence Labeling using Hierarchical encoder with CRF》閱讀筆記