詳解PyTorch nn.Embedding() 嵌入
在對(duì)文本序列進(jìn)行分詞(tokenize)并映射后,字符串序列就轉(zhuǎn)變?yōu)榱藬?shù)字(token id)序列,這些 token id 可以直接輸入到模型中,但需要明白的是,模型并不能直接從一個(gè)純粹的數(shù)字中獲取豐富的信息。類比到人類的認(rèn)知,我們理解一個(gè)字或詞并不是僅靠符號(hào),而是其背后的含義。
nn.Embedding 嵌入層
torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=None, _freeze=False, device=None, dtype=None)
A simple lookup table that stores embeddings of a fixed dictionary and size.
一個(gè)簡(jiǎn)單的查找表,用于存儲(chǔ)固定大小的字典中每個(gè)詞的嵌入向量。
參數(shù)
- num_embeddings (int): 嵌入字典的大小,即詞匯表的大小 (vocab size)。
- embedding_dim (int): 每個(gè)嵌入向量的維度大小。
- padding_idx (int, 可選): 指定填充對(duì)應(yīng)的索引值。該索引對(duì)應(yīng)的嵌入向量在訓(xùn)練過(guò)程中不會(huì)更新,即梯度不參與反向傳播,通常作為“填充”標(biāo)記使用。對(duì)于新構(gòu)建的 Embedding 模塊,此索引的嵌入向量默認(rèn)值為全零,但可以更改為其他值。
- max_norm (float, 可選): 如果設(shè)置,超過(guò)此值的嵌入向量范數(shù)將被重新歸一化,使其最大范數(shù)等于
max_norm。 - norm_type (float, 可選): 用于計(jì)算
max_norm的 p-范數(shù),默認(rèn)為 2,即計(jì)算 2 范數(shù)。 - scale_grad_by_freq (bool, 可選): 如果為
True,梯度將根據(jù)單詞在 mini-batch 中的頻率的倒數(shù)進(jìn)行縮放,適用于高頻詞的梯度調(diào)整。默認(rèn)為False。 - sparse (bool, 可選): 如果設(shè)置為
True,則權(quán)重矩陣的梯度為稀疏張量,適合大規(guī)模詞匯表的內(nèi)存優(yōu)化。 - 變量 weight (Tensor): 模塊的可學(xué)習(xí)權(quán)重,形狀為
(num_embeddings, embedding_dim),初始值從正態(tài)分布N(0, 1)中采樣。
方法
from_pretrained(embeddings, freeze=True, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False)
Create Embedding instance from given 2-dimensional FloatTensor.
用于從給定的 2 維浮點(diǎn)張量(FloatTensor)創(chuàng)建一個(gè) Embedding 實(shí)例。
參數(shù)
- embeddings (Tensor): 一個(gè)包含嵌入權(quán)重的
FloatTensor。第一個(gè)維度代表num_embeddings(詞匯表大?。?,第二個(gè)維度代表embedding_dim(嵌入向量維度)。 - freeze (bool, 可選): 如果為
True,則嵌入張量在訓(xùn)練過(guò)程中保持不變,相當(dāng)于設(shè)置embedding.weight.requires_grad = False。默認(rèn)值為True。 - 其余參數(shù)參考之前定義。
要點(diǎn)示例未完待續(xù)…(預(yù)計(jì) 11.6 前上傳)
QA
Q1:對(duì)于神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),什么是“符號(hào)”及其“背后的含義”?
答案是:Token ID 和 Embedding。
那么,什么是 Embedding?
我們可以通過(guò) PyTorch 中的 nn.Embedding 類來(lái)理解它,先跳過(guò)繁瑣的介紹,運(yùn)行代碼來(lái)直觀感受:
import torch
import torch.nn as nn
# 設(shè)置隨機(jī)種子以確保結(jié)果可復(fù)現(xiàn)
torch.manual_seed(42)
# 定義嵌入層參數(shù)
num_embeddings = 5 # 假設(shè)詞匯表中有 5 個(gè) token
embedding_dim = 3 # 每個(gè) token 對(duì)應(yīng) 3 維嵌入向量
# 初始化嵌入層
embedding = nn.Embedding(num_embeddings, embedding_dim)
# 定義整數(shù)索引
input_indices = torch.tensor([0, 2, 4])
# 查找嵌入向量
output = embedding(input_indices)
# 打印結(jié)果
print("權(quán)重矩陣:")
print(embedding.weight.data)
print("\nEmbedding 輸出:")
print(output)輸出:
權(quán)重矩陣:
tensor([[ 0.3367, 0.1288, 0.2345],
[ 0.2303, -1.1229, -0.1863],
[ 2.2082, -0.6380, 0.4617],
[ 0.2674, 0.5349, 0.8094],
[ 1.1103, -1.6898, -0.9890]])Embedding 輸出:
tensor([[ 0.3367, 0.1288, 0.2345],
[ 2.2082, -0.6380, 0.4617],
[ 1.1103, -1.6898, -0.9890]], grad_fn=<EmbeddingBackward0>)
在這里,input_indices = [0, 2, 4] 從權(quán)重矩陣中選擇第 0、2 和 4 行作為對(duì)應(yīng)的嵌入表示。是的沒(méi)錯(cuò),Embedding 的獲取就是這么簡(jiǎn)單。
接下來(lái),構(gòu)建一個(gè) Embedding 類進(jìn)行理解:
class Embedding():
def __init__(self, num_embeddings, embedding_dim):
self.weight = torch.nn.Parameter(torch.randn(num_embeddings, embedding_dim))
def forward(self, indices):
return self.weight[indices] # 沒(méi)錯(cuò),就是返回對(duì)應(yīng)的行可以看出,Embedding 類的本質(zhì)是一個(gè)查找表(lookup table)。在上面的示例中,embedding.weight 中存儲(chǔ)了 5 個(gè)(num_embeddings)嵌入向量,每個(gè)向量有 3 個(gè)維度(embedding_dim)。當(dāng)提供 input_indices 時(shí),查找表返回對(duì)應(yīng)的嵌入向量(權(quán)重矩陣的行)。
Q2: 最初的權(quán)重矩陣是什么?最終的嵌入向量由什么決定?
最初的權(quán)重矩陣是一般隨機(jī)初始化的,在訓(xùn)練過(guò)程中會(huì)更新權(quán)重,使其能有效地表達(dá)背后的含義。
Q3: 什么是語(yǔ)義?
舉個(gè)簡(jiǎn)單的例子來(lái)理解“語(yǔ)義”關(guān)系:像“貓”和“狗”在向量空間中的表示應(yīng)該非常接近,因?yàn)樗鼈兌际菍櫸铮?ldquo;男人”和“女人”之間的向量差異可能代表性別的區(qū)別。此外,不同語(yǔ)言的詞匯,如“男人”(中文)和“man”(英文),如果在相同的嵌入空間中,它們的向量也會(huì)非常接近,反映出跨語(yǔ)言的語(yǔ)義相似性。同時(shí),【“女人”和“woman”(中文-英文)】與【“男人”和“man”(中文-英文)】之間的差異也可能非常相似。
本文“狹義”地解讀了與 Token id 一起出現(xiàn)的 Embedding,這個(gè)概念在自然語(yǔ)言處理(NLP)中有著更具體的稱呼:Word Embedding。
到此這篇關(guān)于PyTorch nn.Embedding() 嵌入詳解的文章就介紹到這了,更多相關(guān)PyTorch nn.Embedding() 嵌入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python學(xué)習(xí) 流程控制語(yǔ)句詳解
下面小編就為大家?guī)?lái)一篇python學(xué)習(xí) 流程控制語(yǔ)句詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06
Django將默認(rèn)的SQLite更換為MySQL的實(shí)現(xiàn)
今天小編就為大家分享一篇Django將默認(rèn)的SQLite更換為MySQL的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
python實(shí)現(xiàn)數(shù)字炸彈游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)數(shù)字炸彈游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
使用fdopen實(shí)現(xiàn)對(duì)Python進(jìn)程產(chǎn)生的文件進(jìn)行權(quán)限最小化配置
用python進(jìn)行文件的創(chuàng)建和讀寫操作時(shí),我們很少關(guān)注所創(chuàng)建的文件的權(quán)限配置。本文就來(lái)聊聊如何使用fdopen實(shí)現(xiàn)對(duì)Python進(jìn)程產(chǎn)生的文件進(jìn)行權(quán)限最小化配置吧2023-03-03
一文教你如何解決Python開發(fā)總是import出錯(cuò)的問(wèn)題
經(jīng)常朋友碰到Python開發(fā)的過(guò)程中import包報(bào)錯(cuò)的問(wèn)題,所以本文將和大家介紹一下可編輯安裝(Editable Install)模式,可以輕松解決import出錯(cuò)的問(wèn)題,感興趣的可以了解下2025-05-05
Pandas實(shí)現(xiàn)批量拆分與合并Excel的示例代碼
這篇文章主要為大家詳細(xì)講講如何利用python Pandas實(shí)現(xiàn)批量拆分與合并Excel,文中有非常詳細(xì)的的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2022-05-05
Python中enumerate函數(shù)詳解之遍歷中的索引神器
enumerate函數(shù)用于遍歷序列中的元素以及它們的下標(biāo),多用于在for循環(huán)中得到計(jì)數(shù),這篇文章主要介紹了Python遍歷索引神器enumerate函數(shù)的相關(guān)資料,需要的朋友可以參考下2025-06-06
Python對(duì)兩個(gè)有序列表進(jìn)行合并和排序的例子
這篇文章主要介紹了Python對(duì)兩個(gè)有序列表進(jìn)行合并和排序的例子,最終代碼經(jīng)過(guò)不斷優(yōu)化,小編非常滿意,需要的朋友可以參考下2014-06-06
Python實(shí)現(xiàn)對(duì)Excel文件中不在指定區(qū)間內(nèi)的數(shù)據(jù)加以去除的方法
這篇文章主要介紹了基于Python語(yǔ)言,讀取Excel表格文件,基于我們給定的規(guī)則,對(duì)其中的數(shù)據(jù)加以篩選,將不在指定數(shù)據(jù)范圍內(nèi)的數(shù)據(jù)剔除,保留符合我們需要的數(shù)據(jù)的方法,需要的朋友可以參考下2023-08-08

