1. 程式人生 > >深度學習中 Embedding層的個人理解

深度學習中 Embedding層的個人理解

前一個月接觸到一個概念,Embedding層。直到今天,才理解其內在的作用,今天跟大家分享一下個人心得。

首先,我們有一個one-hot編碼的概念。

假設,我們中文,一共只有10個字。。。只是假設啊,那麼我們用0-9就可以表示完

比如,這十個字就是“我從哪裡來,要到何處去”

其分別對應“0-9”,如下:

我  從  哪  裡  來  要  到  何  處  去

0    1    2    3   4    5   6    7    8   9

那麼,其實我們只用一個列表就能表示所有的對話

如:我  從  哪  裡  來  要  到  何  處  去  ——>>>[0 1 2 3 4 5 6 7 8 9]

或:我  從  何  處  來  要  到  哪  裡  去  ——>>>[0 1 7 8 4 5 6 2 3 9]

他把上面的編碼方式弄成這樣

# 我從哪裡來,要到何處去
[
[1 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0]
[0 0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 1 0]
[0 0 0 0 0 0 0 0 0 1]
]

# 我從何處來,要到哪裡去
[
[1 0 0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 1 0 0]
[0 0 0 0 0 0 0 0 1 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 0 1 0 0 0 0]
[0 0 0 0 0 0 1 0 0 0]
[0 0 1 0 0 0 0 0 0 0]
[0 0 0 1 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 1]
]

即:把每一個字都對應成一個十個(樣本總數/字總數)元素的陣列/列表,其中每一個字都用唯一對應的陣列/列表對應,陣列/列表的唯一性用1表示。如上,“我”表示成[1。。。。],“去”表示成[。。。。1],這樣就把每一系列的文字整合成一個稀疏矩陣。

那問題來了,稀疏矩陣(二維)和列表(一維)相比,有什麼優勢。

很明顯,計算簡單嘛,稀疏矩陣做矩陣計算的時候,只需要把1對應位置的數相乘求和就行,也許你心算都能算出來;而一維列表,你能很快算出來?何況這個列表還是一行,如果是100行、1000行和或1000列呢?

所以,one-hot編碼的優勢就體現出來了,計算方便快捷、表達能力強。

然而,缺點也隨著來了。

比如:中文大大小小簡體繁體常用不常用有十幾萬,然後一篇文章100W字,你要表示成100W X 10W的矩陣???

這是它最明顯的缺點。過於稀疏時,過度佔用資源。

比如:其實我們這篇文章,雖然100W字,但是其實我們整合起來,有99W字是重複的,只有1W字是完全不重複的。那我們用100W X 10W的豈不是白白浪費了99W X 10W的矩陣儲存空間。

那怎麼辦???

這時,Embedding層橫空出世。

插張圖片休息下。

OK, keep going!

接下來給大家看一張圖

假設:我們有一個2 x 6的矩陣,然後乘上一個6 x 3的矩陣後,變成了一個2 x 3的矩陣。

先不管它什麼意思,這個過程,我們把一個12個元素的矩陣變成6個元素的矩陣,直觀上,大小是不是縮小了一半?

也許你已經想到了!!!對!!!不管你想的對不對,但是embedding層,就是用來降維的,降維的原理就是矩陣乘法。在卷積網路中,可以理解為特殊全連線層操作,跟1x1卷積核異曲同工!!!484很神奇!!!

複習一下,矩陣乘法需要滿足一個條件。

A X B時,B的行數必須等於A的列數

得出的結果為A的行數 X B的列數的一個矩陣

也就是說,假如我們有一個100W X10W的矩陣,用它乘上一個10W X 20的矩陣,我們可以把它降到100W X 20,瞬間量級降了。。。10W/20=5000倍!!!

這就是嵌入層的作用。

然後中間那個10W X 20的矩陣,可以理解為查詢表,也可以理解為對映表,也可以理解為過度表,whatever。

總之,這個東西也許一言難盡。但是目前各位只需要知道它是這個功能的就行了。

想具體理解其作用,建議大家去探究探究卷積神經網路的各種中間過程,以及反向傳播理論。到時候大家再來深入理解潛入層時,那就真的是一通百通了。