簡體   English   中英

PyTorch 中的嵌入層和線性層之間有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM