Last Updated on 2021-07-06 by Clay
Embedding,在中文中經常被譯作『嵌入』,在 NLP 領域中通常指的是將『文字』轉換成『數值』的這個動作 —— 畢竟文字是所謂不連續的資料,也是電腦所無法處理的資料。
以下僅僅只是我個人的理解:比方說,今天我們有著一個句子:
Today is a nice day.
那麼,我們可以將這段文字轉成數值:
Today | 1 |
is | 2 |
a | 3 |
nice | 4 |
day | 5 |
那麼,我們可以將這段話寫成下面這樣的格式:
[1, 2, 3, 4, 5]
這樣一來就可以套用深度學習的框架進行訓練了,不過我猜效果應該會相當差,畢竟這種轉換似乎連 One-Hot 都不如?
話題有點扯遠了。
一直以來,在練習撰寫深度學習模型、使用深度學習框架的過程中,我處理 NLP 任務的次數遠遠多過影像領域。但即便如此,我也很少會使用到所謂的 “Embedding” 層,不論是在 Keras 還是 PyTorch 框架中。
也許是受限於我個人的才疏學淺 —— 一直以來我所使用的 Embedding 方式,通常是經由 Gensim 訓練出來的 Word2Vec 模型轉換成向量,然後傳入類神經網路中進行訓練、再不然就是套用 BERT 一類的 Pre-train Transformer 模型來轉換。
但我從前也曾試過直接使用深度學習框架的 Embedding Layer,也就是不用事先訓練,而是通過類神經網路在訓練過程中微調所產生出來的向量當作 Embedding,但是從前並未獲得較好的結果。當然,可能其實是我不會用。
最近在學習著各式各樣的文本分類技術時,又再次碰到了有大神的 Sample Code 直接使用了 PyTorch 中的 Embedding,故決定研究一番,將其記錄下來。
PyTorch 的 nn.Embedding
首先,先來看看官方的 Document:
nn.Embedding 大致有以下幾個參數:
- num_embedding: 所有文本詞彙 Index 的數量
- embedding_dim: 一個詞應該轉換成多少維度的向量
- padding_idx: 如果有給數值,那麼在詞數不夠的情況下會使用你所設定的數值進行 padding,讓每個輸入都維持同樣尺寸
- max_norm: 正規化最大的值
- sparse: 若為 True 則向量為稀疏向量
基本上 num_embedding 以及 embedding_dim 是最重要的兩個參數。假設我們有下列這樣的程式:
embedding = nn.Embedding(1000, 3, padding_idx=0) inputs = torch.tensor([1, 2, 3, 4, 5]) print(embedding(inputs))
Output:
tensor([[-0.3296, 0.6558, -1.4805],
[-0.1493, -0.5477, 0.6713],
[ 0.4637, 1.3709, 0.2004],
[ 0.2457, -1.4567, -0.4856],
[-0.9163, 0.6130, -1.1636]], grad_fn=<EmbeddingBackward>)
我們就會得到每個詞彙 (每個 Index) 的一個維度 —— 而這個向量的尺寸就是我們設定的 embedding_dim。
就這樣,我們會一般訓練我們任務的模型、同時一邊改進 Embedding Layer 的轉換向量,藉此提昇效果。
除了讓 Embedding Layer 自己訓練之外,還可以直接賦予像是 Glove、Word2Vec 等等的模型,讓我們的 Embedding Layer 位於一個比較好的起點開始調整。
References
- https://pytorch.org/docs/stable/nn.html?highlight=embeddingbag#torch.nn.EmbeddingBag
- https://discuss.pytorch.org/t/how-should-i-understand-the-num-embeddings-and-embedding-dim-arguments-for-nn-embedding/60442