LLM中詞向量的表示和詞嵌入的一些疑問

Mintisn發表於2024-10-13

LLM中詞向量的表示和詞嵌入的一些疑問

詞向量的一些特點

在3blue1brown的影片【官方雙語】GPT是什麼?直觀解釋Transformer | 深度學習第5章_嗶哩嗶哩_bilibili中, 在15min左右介紹了LLM的詞嵌入的過程.

其中提到mother的詞向量減去father的詞向量, 會近似於women的詞向量-man的詞向量

image-20241013190602297

透過這個例子,說明模型在詞嵌入空間上的某一方向編碼了一個性別資訊. 這個例子非常生動, 也非常符合直覺.

類似的有一篇2017年發表在CogSci的研究1705.04416 (arxiv.org)

在這篇論文中,也提到類似的例子

\(E(woman)\approx E(man)+E(queen)-E(king)\)
image-20241013191249990

首先一點, 我認為使用\(E(woman)\approx E(man)+E(queen)-E(king)\) 來說明模型在某一方向上編碼了特定資訊並不一定準確.

因為我們可以理解為women和man 是一組相似的詞, 詞向量是比較接近的,同理queen和king也是

事實上, 在llama3-8B-instruction 中,透過餘弦相似度去衡量woemn和man的詞向量, 可以發現他們確實如此)

由於E(queen)和E(king)本身比較接近,因此他們相減應該得到一個較小的向量, 那麼自然而然的,我們會有

\[E(woman)\approx E(man) \approx E(man)+E(queen)-E(king) \]

因此,我認為像3Blue1Brown中直接比較\(E(queen)-E(king)\)\(E(woman)- E(man)\) 相似度,顯然是一個更合適的選擇.

簡單的實現

如果他們是相似的,那麼他們的餘弦相似度值應該儘可能大, 然後, 在llama3-8b 的測試中, 我們發現他們的相似度為-0.0220,也就是說,$$E(queen)-E(king)$$和$$E(woman)- E(man)$$ 這兩個向量是幾乎正交的.

而和之前的分析一樣E(man) 和E(woman)-E(queen)+E(king)的相似度有0.3906, 這對於llama3模型而言是一個比較高的相似度(llama每個詞向量的維度是4096)

除了llama3,和簡單測試了phi-3, llama2,Qwen1.5等模型, 同時也簡單試了一下其他的詞, 得出了結果都和llama3基本都大差不差.

\(E(queen)-E(king)\)\(E(woman)- E(man)\) 這兩個向量不僅不是接近平行,甚至是幾乎正交的. 至此, 我們可以3b1b和這篇論文中說提出的理論雖然很簡潔優雅, 但在大模型上似乎沒有那麼奏效. 不過目前像3blue1brown中的理論, 依然可以在一些介紹LLM詞向量的文章中看到, 這個理論本身非常有道理, 但實測下來, 可能還是需要更加謹慎的看待這個理論.

llama3的結果

//E(woman)-E(man)和E(queen)-E(king)的相似度
tensor([-0.0220], device='cuda:0', dtype=torch.bfloat16,
       grad_fn=<SumBackward1>)
//E(man) 和E(woman)-E(queen)+E(king)的相似度
tensor([0.3906], device='cuda:0', dtype=torch.bfloat16, grad_fn=<SumBackward1>)
___________________________________
 fake word2: male+ queen- king  整個embeding矩陣中和這個詞最接近的一些詞(tensor中是他們的相似度)
tensor([0.6797, 0.5469, 0.3906, 0.3828, 0.3340, 0.3320, 0.3086, 0.3047, 0.2559,
        0.2500], device='cuda:0', dtype=torch.bfloat16,
       grad_fn=<TopkBackward0>)
[' male', ' queen', ' female', ' Male', ' males', 'Male', ' Queen', 'male', ' queens', ' Female']
___________________________________
 word1: male
tensor([1.0000, 0.5430, 0.5430, 0.4824, 0.4785, 0.4121, 0.3379, 0.3164, 0.2676,
        0.2598], device='cuda:0', dtype=torch.bfloat16,
       grad_fn=<TopkBackward0>)
[' male', ' Male', ' female', ' males', 'Male', 'male', ' Female', ' females', 'female', 'Female']
___________________________________
 word2: female
tensor([1.0000, 0.5898, 0.5430, 0.4922, 0.4902, 0.4727, 0.3438, 0.3340, 0.3086,
        0.3047], device='cuda:0', dtype=torch.bfloat16,
       grad_fn=<TopkBackward0>)
[' female', ' Female', ' male', 'Female', ' females', 'female', ' women', 'EMALE', ' woman', ' Male']

相關文章