詞向量
在自然語言處理任務中,模型的輸入大多為單個字或者詞。但是字詞都是自然語言的表述,對于以二進制為處理語言的計算機來說,其并不認識這個字詞。所以需要將字詞轉換為計算機認識的數據。
轉換的方法有很多,我們接下來將介紹其中最簡單的一種:獨熱編碼,這是一種將字詞轉換為計算機可以識別的數字向量的方式。
注:為什么不可以使用Unicode編碼?其不也是唯一的嗎?
Unicode編碼是表示單個字的編碼方式,但是在預模型中,很多詞向量表示的是一個詞,比如:“我” “有” “一只” “貓”
其中“一只”是一個詞,其如果用Unicode編碼表示,其長度維度和其他字詞不一致。
One-Hot 獨熱編碼
獨熱編碼是一種將離散型(可以劃分為n個類別)的數據轉化為計算機能夠理解的方式,其基本思想是在 n n n維向量空間中,使用 n n n個單位向量,每個單位向量代表一個類別。也就是說,如果我們有 n n n個類別,那么我們就會有一個長度為 n n n的向量,其中有一個元素為1,其余元素為0。這個1的位置就代表了這個類別在向量中的位置。
下面是“我” “有” “一只” “貓”的獨熱編碼表示:
詞語 | 我 | 有 | 一只 | 貓 |
---|---|---|---|---|
我 | 1 | 0 | 0 | 0 |
有 | 0 | 1 | 0 | 0 |
一只 | 0 | 0 | 1 | 0 |
貓 | 0 | 0 | 0 | 1 |
獨熱編碼雖然可以表示一個字詞,但是假如說我的詞庫非常大。為了讓每一個字詞都在其中有著唯一的表示,我每個字詞的表示就都是 n n n維的,這會帶來極大的存儲成本。同時,在獨熱編碼中,每個單詞都是由一個完全不同的向量表示的。這意味著相似的單詞,其向量表示完全不同。這就導致我們在計算獨熱編碼兩兩的相似度時,得到的歐氏距離都是相同的。
注1:詞庫:
也稱為詞匯表或字典,是用于自然語言處理(NLP)的基本工具之一。它是一個包含所有可能單詞的集合,每個單詞都有一個與之對應的索引。
注2:總結:獨熱編碼在高緯度計算和語義信息表示上面有缺陷。
為了解決這個問題,我們需要引入一個新概念:詞向量
詞向量
詞向量是一種用來表示單詞的向量,它比獨熱編碼更高級。詞向量的長度通常比詞庫的大小要小得多,例如,我們可以用一個200維的向量來表示所有的單詞,而不是使用一個100,000維的向量。此外,詞向量可以捕捉到單詞之間的語義關系,例如,“貓”和“狗”的詞向量可能在向量空間中非常接近。
注:詞向量的語義關系捕獲
在自然語言處理(NLP)中,常見的詞向量訓練方法有Word2Vec、GloVe和FastText等。
- 在Word2Vec算法中,它通過學習預測上下文,使得語義相近的詞在向量空間中靠得更近。
- GloVe算法則是通過利用全局統計信息(即詞共現矩陣)來生成詞向量。這種方法可以捕獲到更豐富的詞語共現信息,因此可以更好地表達詞與詞之間的關系。
- FastText算法則是通過考慮詞的上下文信息以及詞內部的字母級信息,從而更好地處理形態豐富的語言,以及處理詞典中沒有的詞。
詞向量是獨熱編碼的一種改進和優化,其可以由獨熱編碼 w x w_x wx?乘以權重矩陣 Q Q Q得到,公式如下:
w x ? Q = c x ( 詞向量 ) w_x*Q=c_x(詞向量) wx??Q=cx?(詞向量)
上面的例子,可能會得到如下的詞向量表示:
詞語 | 維度1 | 維度2 | 維度3 |
---|---|---|---|
我 | 0.1 | 0.3 | 0.2 |
有 | 0.2 | 0.4 | 0.1 |
一只 | 0.4 | 0.1 | 0.3 |
貓 | 0.3 | 0.2 | 0.4 |
注:權重矩陣Q
權重矩陣Q是通過模型訓練過程中的優化算法得到的。 以深度學習模型為例,權重矩陣Q是模型中的參數,通過反向傳播和梯度下降等優化算法,不斷調整這些權重,使得模型在訓練數據上的預測誤差最小。
word2vec
Word2Vec是Google于2013年提出的一種用于生成詞向量的兩層神經網絡模型。它的目標是根據給定的語境預測單詞或根據單詞預測語境。其主要用CBOW(Continuous Bag of Words)和Skip-Gram模型來做預測語境。
- Skip-Gram:輸入是一個詞,輸出是該詞周圍的一些詞。模型的目標是最大化給定單詞的情況下,其上下文詞出現的概率。適用于處理大型語料庫,因為它對罕見詞的處理效果比較好。
- CBOW:和Skip-Gram模型剛好相反,輸入是某個詞的上下文,輸出是這個詞。模型的目標是最大化給定上下文的情況下,中心詞出現的概率。這種模型訓練速度更快,但對罕見詞的處理效果不如Skip-Gram。
假設我們有一個句子:“我有一只貓”,我們使用Skip-Gram模型,并設定窗口大小為2,那么對于每個詞,我們都會考慮它前后各兩個詞。
以詞"一只"為例,它前面兩個詞是"我"和"有",后面兩個詞是"貓"。那么,我們的訓練樣本就是(“一只”,“我”),(“一只”,“有”),(“一只”,“貓”)。在訓練過程中,我們的模型需要學習到這樣的信息:當"一只"出現的時候,“我”,"有"和"貓"是可能出現在它周圍的詞。
from gensim.models import Word2Vec# 訓練文本
sentences = [["我", "有", "一只", "貓"]]# 訓練模型
model = Word2Vec(sentences, min_count=1, window=2)# 打印"一只"的詞向量
print(model.wv["一只"])
注:我們的例子只有一個很短的句子,在實際應用中,Word2Vec通常需要在大量文本數據上進行訓練,才能得到有用的詞向量。
詞向量的局限性
詞向量雖然能夠捕獲詞與詞間的語義關系,但也存在一些局限性。例如,傳統的詞向量模型無法處理一詞多義的問題,因為它們都是為每個詞分配一個固定的向量。然而,最新的預訓練模型(如BERT、GPT等)通過引入動態詞向量的概念,成功解決了這個問題。在這些模型中,一個詞的向量表示會隨著其上下文的變化而變化,從而能夠捕獲到詞的多義性。
參考
- chat-gpt4
- 預訓練語言模型的前世今生