[英]What is the difference between an Embedding Layer with a bias immediately afterwards and a Linear Layer in PyTorch
我正在閱讀“使用 fastai 和 PyTorch 為編碼人員進行深度學習”一書。 對於 Embedding 模塊的作用,我仍然有些困惑。 它似乎是一個簡短而簡單的網絡,除了我似乎無法理解嵌入與線性的不同之處。 我知道它做了一些更快的點積計算版本,其中一個矩陣是單熱編碼矩陣,另一個是嵌入矩陣。 這樣做是為了有效 select 一條數據? 請指出我錯在哪里。 這是書中顯示的簡單網絡之一。
class DotProduct(Module):
def __init__(self, n_users, n_movies, n_factors):
self.user_factors = Embedding(n_users, n_factors)
self.movie_factors = Embedding(n_movies, n_factors)
def forward(self, x):
users = self.user_factors(x[:,0])
movies = self.movie_factors(x[:,1])
return (users * movies).sum(dim=1)
[...] Embedding 的作用與沒有偏見的線性不同。
基本上一切。 torch.nn.Embedding
是一個查找表; 它的工作原理與torch.Tensor
相同,但有一些曲折(例如在指定索引處使用稀疏嵌入或默認值的可能性)。
例如:
import torch
embedding = torch.nn.Embedding(3, 4)
print(embedding.weight)
print(embedding(torch.tensor([1])))
output:
Parameter containing:
tensor([[ 0.1420, -0.1886, 0.6524, 0.3079],
[ 0.2620, 0.4661, 0.7936, -1.6946],
[ 0.0931, 0.3512, 0.3210, -0.5828]], requires_grad=True)
tensor([[ 0.2620, 0.4661, 0.7936, -1.6946]], grad_fn=<EmbeddingBackward>)
所以我們取了嵌入的第一行。 僅此而已。
通常,當我們想為每一行編碼一些含義(如 word2vec)時(例如,語義上接近的單詞在歐幾里得空間中接近)並可能訓練它們。
torch.nn.Linear
(無偏差)也是一個torch.Tensor
(權重) ,但它對它(和輸入)進行操作,本質上是:
output = input.matmul(weight.t())
您的代碼片段中的層執行以下操作:
__init__
中創建兩個查找表(batch_size, 2)
的輸入調用該層:
(batch_size,)
(因此它與nn.Linear
不同,后者將返回(batch_size, out_features)
並執行點積而不是元素乘法,然后像這里一樣求和)這可能用於訓練一些類似推薦系統的兩種表示(用戶和電影)。
我知道它做了一些更快的點積計算版本,其中一個矩陣是單熱編碼矩陣,另一個是嵌入矩陣。
不,它沒有。 torch.nn.Embedding
可以是一種熱編碼,也可能是稀疏的,但取決於算法(以及這些算法是否支持稀疏性),性能可能會有所提升。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.