詳解PyTorch nn.Embedding() 嵌入
在對文本序列進(jìn)行分詞(tokenize)并映射后,字符串序列就轉(zhuǎn)變?yōu)榱藬?shù)字(token id)序列,這些 token id 可以直接輸入到模型中,但需要明白的是,模型并不能直接從一個純粹的數(shù)字中獲取豐富的信息。類比到人類的認(rèn)知,我們理解一個字或詞并不是僅靠符號,而是其背后的含義。
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.
一個簡單的查找表,用于存儲固定大小的字典中每個詞的嵌入向量。
參數(shù)
- num_embeddings (int): 嵌入字典的大小,即詞匯表的大小 (vocab size)。
- embedding_dim (int): 每個嵌入向量的維度大小。
- padding_idx (int, 可選): 指定填充對應(yīng)的索引值。該索引對應(yīng)的嵌入向量在訓(xùn)練過程中不會更新,即梯度不參與反向傳播,通常作為“填充”標(biāo)記使用。對于新構(gòu)建的 Embedding 模塊,此索引的嵌入向量默認(rèn)值為全零,但可以更改為其他值。
- max_norm (float, 可選): 如果設(shè)置,超過此值的嵌入向量范數(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)建一個 Embedding
實(shí)例。
參數(shù)
- embeddings (Tensor): 一個包含嵌入權(quán)重的
FloatTensor
。第一個維度代表num_embeddings
(詞匯表大?。?,第二個維度代表embedding_dim
(嵌入向量維度)。 - freeze (bool, 可選): 如果為
True
,則嵌入張量在訓(xùn)練過程中保持不變,相當(dāng)于設(shè)置embedding.weight.requires_grad = False
。默認(rèn)值為True
。 - 其余參數(shù)參考之前定義。
要點(diǎn)示例未完待續(xù)…(預(yù)計(jì) 11.6 前上傳)
QA
Q1:對于神經(jīng)網(wǎng)絡(luò)來說,什么是“符號”及其“背后的含義”?
答案是:Token ID 和 Embedding。
那么,什么是 Embedding?
我們可以通過 PyTorch 中的 nn.Embedding
類來理解它,先跳過繁瑣的介紹,運(yùn)行代碼來直觀感受:
import torch import torch.nn as nn # 設(shè)置隨機(jī)種子以確保結(jié)果可復(fù)現(xiàn) torch.manual_seed(42) # 定義嵌入層參數(shù) num_embeddings = 5 # 假設(shè)詞匯表中有 5 個 token embedding_dim = 3 # 每個 token 對應(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 行作為對應(yīng)的嵌入表示。是的沒錯,Embedding 的獲取就是這么簡單。
接下來,構(gòu)建一個 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] # 沒錯,就是返回對應(yīng)的行
可以看出,Embedding 類的本質(zhì)是一個查找表(lookup table)。在上面的示例中,embedding.weight
中存儲了 5 個(num_embeddings
)嵌入向量,每個向量有 3 個維度(embedding_dim
)。當(dāng)提供 input_indices
時,查找表返回對應(yīng)的嵌入向量(權(quán)重矩陣的行)。
Q2: 最初的權(quán)重矩陣是什么?最終的嵌入向量由什么決定?
最初的權(quán)重矩陣是一般隨機(jī)初始化的,在訓(xùn)練過程中會更新權(quán)重,使其能有效地表達(dá)背后的含義。
Q3: 什么是語義?
舉個簡單的例子來理解“語義”關(guān)系:像“貓”和“狗”在向量空間中的表示應(yīng)該非常接近,因?yàn)樗鼈兌际菍櫸铮?ldquo;男人”和“女人”之間的向量差異可能代表性別的區(qū)別。此外,不同語言的詞匯,如“男人”(中文)和“man”(英文),如果在相同的嵌入空間中,它們的向量也會非常接近,反映出跨語言的語義相似性。同時,【“女人”和“woman”(中文-英文)】與【“男人”和“man”(中文-英文)】之間的差異也可能非常相似。
本文“狹義”地解讀了與 Token id 一起出現(xiàn)的 Embedding,這個概念在自然語言處理(NLP)中有著更具體的稱呼:Word Embedding。
到此這篇關(guān)于PyTorch nn.Embedding() 嵌入詳解的文章就介紹到這了,更多相關(guān)PyTorch nn.Embedding() 嵌入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python編程中內(nèi)置的NotImplemented類型的用法
這篇文章主要介紹了Python編程中內(nèi)置的NotImplemented類型的用法,NotImplemented 是Python在內(nèi)置命名空間中的六個常數(shù)之一,下文更多詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-03-03使用Python進(jìn)行自動化數(shù)據(jù)爬取與存儲
在當(dāng)今數(shù)據(jù)驅(qū)動的時代,從互聯(lián)網(wǎng)上獲取有價值的信息變得尤為重要,Python,作為一種功能強(qiáng)大且易于學(xué)習(xí)的編程語言,在數(shù)據(jù)爬取領(lǐng)域有著廣泛的應(yīng)用,本文將介紹如何使用Python進(jìn)行自動化數(shù)據(jù)爬取與存儲,需要的朋友可以參考下2025-02-02Python HTML解析模塊HTMLParser用法分析【爬蟲工具】
這篇文章主要介紹了Python HTML解析模塊HTMLParser用法,結(jié)合實(shí)例形式分析了HTMLParser模塊功能、常用函數(shù)及作為爬蟲工具相關(guān)使用技巧,需要的朋友可以參考下2019-04-04Python實(shí)現(xiàn)的爬取小說爬蟲功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的爬取小說爬蟲功能,結(jié)合實(shí)例形式分析了Python爬取頂點(diǎn)小說站上的小說爬蟲功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03TensorFlow實(shí)現(xiàn)iris數(shù)據(jù)集線性回歸
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)iris數(shù)據(jù)集線性回歸,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09Pytorch實(shí)現(xiàn)簡單自定義網(wǎng)絡(luò)層的方法
這篇文章主要給大家介紹了關(guān)于Pytorch實(shí)現(xiàn)簡單自定義網(wǎng)絡(luò)層的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-05-05python爬蟲之驗(yàn)證碼篇3-滑動驗(yàn)證碼識別技術(shù)
本篇涉及到的驗(yàn)證碼為滑動驗(yàn)證碼,不同于極驗(yàn)證,本驗(yàn)證碼難度略低,需要的將滑塊拖動到矩形區(qū)域右側(cè)即可完成。對python爬蟲滑動驗(yàn)證碼識別技術(shù)感興趣的朋友跟隨小編一起看看吧2019-04-04Python sklearn中的K-Means聚類使用方法淺析
這篇文章主要介紹了Python sklearn中的K-Means聚類使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2022-12-12