Skip to content

[PyTorch] 使用 Embedding 層進行文字處理

Embedding,在中文中經常被譯作『嵌入』,在 NLP 領域中通常指的是將『文字』轉換成『數值』的這個動作 —— 畢竟文字是所謂不連續的資料,也是電腦所無法處理的資料。

以下僅僅只是我個人的理解:比方說,今天我們有著一個句子:

Today is a nice day.

那麼,我們可以將這段文字轉成數值:

Today1
is2
a3
nice4
day5
就像這樣,一個詞轉成一個數字

那麼,我們可以將這段話寫成下面這樣的格式:

[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


Read More

Tags:

Leave a Reply