關於nn.embedding的維度的定義,函數的理解,一些需要注意的點
定義
首先簡單介紹一下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)
其爲一個簡單的存儲固定大小的詞典的嵌入向量的查找表,意思就是說,給一個編號,嵌入層就能返回這個編號對應的嵌入向量,嵌入向量反映了各個編號代表的符號之間的語義關係。
輸入爲一個編號列表,輸出爲對應的符號嵌入向量列表。
參數解釋
-
num_embeddings (python:int) – 詞典的大小尺寸,比如總共出現5000個詞,那就輸入5000。此時index爲(0-4999)
-
embedding_dim (python:int) – 嵌入向量的維度,即用多少維來表示一個符號。
-
padding_idx (python:int, optional) – 填充id,比如,輸入長度爲100,但是每次的句子長度並不一樣,後面就需要用統一的數字填充,而這裏就是指定這個數字,這樣,網絡在遇到填充id時,就不會計算其與其它符號的相關性。(初始化爲0)
-
max_norm (python:float, optional) – 最大範數,如果嵌入向量的範數超過了這個界限,就要進行再歸一化。
-
norm_type (python:float, optional) – 指定利用什麼範數計算,並用於對比max_norm,默認爲2範數。
-
scale_grad_by_freq (boolean, optional) – 根據單詞在mini-batch中出現的頻率,對梯度進行放縮。默認爲False.
-
sparse (bool, optional) – 若爲
True
,則與權重矩陣相關的梯度轉變爲稀疏張量。
變量
~Embedding.weight (Tensor) –形狀爲 (num_embeddings, embedding_dim) 的學習權重採用標準正態分佈N(0,1)進行初始化
I/O形狀
-
輸入: (∗) , 包含提取的編號的任意形狀的長整型張量。
-
輸出: (∗,H) , 其中 * 爲輸入的形狀,H爲embedding_dim
一些注意的點
- nn.embedding的輸入只能是編號,不能是隱藏變量,比如one-hot,或者其它,這種情況,可以自己建一個自定義維度的線性網絡層,參數訓練可以單獨訓練或者跟隨整個網絡一起訓練(看實驗需要)
- 如果你指定了padding_idx,注意這個padding_idx也是在num_embeddings尺寸內的,比如符號總共有500個,指定了padding_idx,那麼num_embeddings應該爲501
- embedding_dim的選擇要注意,根據自己的符號數量,舉個例子,如果你的詞典尺寸是1024,那麼極限壓縮(用二進制表示)也需要10維,再考慮詞性之間的相關性,怎麼也要在15-20維左右,雖然embedding是用來降維的,但是也要注意這種極限維度,結合實際情況,合理定義
- 其他的好像也沒啥要注意的啦~,歡迎評論區補充(●′ω`●)