自然語言處理:Word2Vec
? 每種動物都有自己的語言,機(jī)器也是!自然語言處理(NLP)就是在機(jī)器語言和人類語言之間溝通的橋梁。? NLP通常有情感分析、文本挖掘、信息抽取、信息檢索、問答/對話系統(tǒng)(聊天機(jī)器人)、語音識別、機(jī)器翻譯等應(yīng)用。? 最近大火的ChatGPT(Chat Generative Pre-trained Transformer)則是人工智能研究實驗室OpenAI新推出的人工智能技術(shù)驅(qū)動的自然語言處理工具。主要通過使用TransFormer神經(jīng)網(wǎng)絡(luò)架構(gòu)使得ChatGPT具有聊天互動的能力,可以根據(jù)特定聊天場景進(jìn)行交流,還具備撰寫郵件、腳本、文案、翻譯、代碼等不同類型文字的功能。? 最近幾篇推文我將從Word2Vec→Transformer→BERT出發(fā),從簡單到復(fù)雜嘗試NLP的一些工作。(BERT與GPT的模型簡介可以參考這篇文章:http://t.csdn.cn/c8ZVD)

本篇推文為Word2Vec的實現(xiàn)
1.什么是詞向量
在自然語言處理任務(wù)中,首先需要考慮詞如何在計算機(jī)中表示,通常有兩種表示方式[1]。
1.離散表示(one-hot representation)
1.1 將每個詞表示為一個長向量(維度為詞表大?。蛄恐兄挥幸粋€維度的值為1,其余為0。
例如:
建筑 [0, 0, 0, 0, 1, 0, 0, ……]
景觀 [0, 0, 0, 1, 0, 0, 0, ……]
語料庫中的每個詞都有一個索引,但以這種方式表示,詞與詞之間無任何關(guān)系,同時當(dāng)詞數(shù)比較多時,會導(dǎo)致特征空間十分大;
1.2 Bag of Words 表示
將每個單詞在語料庫中出現(xiàn)的次數(shù)加到one-hot編碼中,此方法仍未考慮單詞的順序及語義信息。
2.分布式表示(distribution representation)
將詞通過詞嵌入(word embedding)轉(zhuǎn)換為一種分布式表示,即詞向量。
比如我們將詞匯表里的詞用"Royalty",“Masculinity”, "Femininity"和"Age"4個維度來表示,King這個詞對應(yīng)的詞向量可能是[0.99,0.99,0.05,0.7]。大致可以理解為國王為具有王權(quán)的男性,這樣就從原來非常稀疏的one hot產(chǎn)生的詞向量轉(zhuǎn)變成了現(xiàn)在的稠密向量,大大節(jié)約了內(nèi)存和減少了計算量。
在實際情況中,我們需要自定詞向量的維度[2]。
以GloVe詞向量為例,glove.6B.50d.txt中,每個詞有50維:of:?0.70853 0.57088 -0.4716 0.18048 0.54449 0.72603 0.18157 -0.52393 0.10381 -0.17566 0.078852 -0.36216 -0.11829 -0.83336 0.11917 -0.16605 0.061555 -0.012719 -0.56623 0.013616 0.22851 -0.14396 -0.067549 -0.38157 -0.23698 -1.7037 -0.86692 -0.26704 -0.2589 0.1767 3.8676 -0.1613 -0.13273 -0.68881 0.18444 0.0052464 -0.33874 -0.078956 0.24185 0.36576 -0.34727 0.28483 0.075693 -0.062178 -0.38988 0.22902 -0.21617 -0.22562 -0.093918 -0.80375
glove.6B.100d.txt中,每個詞有100維:
of:?-0.1529 -0.24279 0.89837 0.16996 0.53516 0.48784 -0.58826 -0.17982 -1.3581 0.42541 0.15377 0.24215 0.13474 0.41193 0.67043 -0.56418 0.42985 -0.012183 -0.11677 0.31781 0.054177 -0.054273 0.35516 -0.30241 0.31434 -0.33846 0.71715 -0.26855 -0.15837 -0.47467 0.051581 -0.33252 0.15003 -0.1299 -0.54617 -0.37843 0.64261 0.82187 -0.080006 0.078479 -0.96976 -0.57741 0.56491 -0.39873 -0.057099 0.19743 0.065706 -0.48092 -0.20125 -0.40834 0.39456 -0.02642 -0.11838 1.012 -0.53171 -2.7474 -0.042981 -0.74849 1.7574 0.59085 0.04885 0.78267 0.38497 0.42097 0.67882 0.10337 0.6328 -0.026595 0.58647 -0.44332 0.33057 -0.12022 -0.55645 0.073611 0.20915 0.43395 -0.012761 0.089874 -1.7991 0.084808 0.77112 0.63105 -0.90685 0.60326 -1.7515 0.18596 -0.50687 -0.70203 0.66578 -0.81304 0.18712 -0.018488 -0.26757 0.727 -0.59363 -0.34839 -0.56094 -0.591 1.0039 0.20664
有了用Distributed Representation表示的詞向量,我們就可以較容易的分析詞之間的關(guān)系了,比如我們將詞的維度降維到2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發(fā)現(xiàn):


2.詞向量的表示
Word2Vec文章介紹了兩個詞向量模型:連續(xù)詞袋模型(Continuous Bag-of-Words,簡稱CBOW) 與和跳字模型(Skip-Gram)。對于在語義上有意義的表示,它們的訓(xùn)練依賴于條件概率,條件概率可以被看作是使用語料庫中?些詞來預(yù)測另?些單詞。由于是不帶標(biāo)簽的數(shù)據(jù),因此跳元模型和連續(xù)詞袋都是自監(jiān)督模型。

對二者的講解資料十分多,詳細(xì)了解推薦在此查看:http://t.csdn.cn/zkciu
3.Word2Vec的代碼實現(xiàn)
我們使用Penn Tree Bank(PTB)數(shù)據(jù)集進(jìn)行實驗,該語料庫取?“華爾街?報”的文章,分為訓(xùn)練集、驗證集和測試集。
3.1 文本預(yù)處理
將文本作為字符串加載到內(nèi)存中并將字符串拆分為詞元(如單詞和字符)
構(gòu)建詞表,其中出現(xiàn)次數(shù)少于10次的任何單詞都將由“<unk>”詞元替換。
下采樣,將高頻詞wi“a”、“the”、“of”等進(jìn)行丟棄,其被丟棄的概率為:

提取中心詞和上下文詞,隨機(jī)采樣1到max_window_size之間的整數(shù)作為上下?窗?。對于任?中?詞,與其距離不超過采樣上下?窗???的詞為其上下?詞。
整合代碼:讀取PTB數(shù)據(jù)集并返回數(shù)據(jù)迭代器和詞表。
3.2?預(yù)訓(xùn)練word2vec
在前向傳播中,跳元語法模型的輸入包括形狀為(批量大小,1)的中心詞索引center和形狀為(批量大小,max_len)的上下文與噪聲詞索引contexts_and_negatives。這兩個變量首先通過嵌入層從詞元索引轉(zhuǎn)換成向量,然后它們的批量矩陣相乘返回形狀為(批量大小,1,max_len)的輸出。輸出中的每個元素是中心詞向量和上下文或噪聲詞向量的點積。
計算?元交叉熵?fù)p失
初始化模型參數(shù)
定義訓(xùn)練階段代碼
開始訓(xùn)練
實驗結(jié)果如下圖

3.3?應(yīng)用詞嵌入
使?訓(xùn)練好模型中詞向量的余弦相似度來從詞表中找到與輸?單詞語義最相似的單詞,十分神奇!
例如,我們查找與“chip”相近的詞,余弦相似度最高的前三個詞為:
cosine sim=0.386: machine
cosine sim=0.383: computer
cosine sim=0.371: equipment
與“university”相近的詞,余弦相似度最高的前三個詞為:
cosine sim=0.460: graduate
cosine sim=0.408: school
cosine sim=0.440: professor
與“money”相近的詞,余弦相似度最高的前三個詞為:
cosine sim=0.454: funds
cosine sim=0.408: rely
cosine sim=0.406: investors
·未完待續(xù)·
[1] http://t.csdn.cn/69pp9
[2]?http://t.csdn.cn/3a7bb
本文的學(xué)習(xí)基于李沐老師的《動手學(xué)深度學(xué)習(xí)》:
https://zh-v2.d2l.ai/chapter_preface/index.html
