深度學習中 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。
總之,這個東西也許一言難盡。但是目前各位只需要知道它是這個功能的就行了。
想具體理解其作用,建議大家去探究探究卷積神經網路的各種中間過程,以及反向傳播理論。到時候大家再來深入理解潛入層時,那就真的是一通百通了。