iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 17
1

我們來更具體一點講 multi-layer perceptron (MLP)。

最簡單的版本莫過於 linear MLP,不過不太會有人去用他,其實只是每層 layer 的 activation function 都是採用 identity。你可以想像他是有很多的線性轉換所疊起來的模型。


一般線性模型:https://chart.googleapis.com/chart?cht=tx&chl=f(%5Cmathbf%7Bx%7D)%20%3D%20W%5E%7B%5Cprime%20T%7D%5Cmathbf%7Bx%7D%20%2B%20b%20%3D%20W%5ET%5Cmathbf%7Bx%7D

Linear MLP:

https://chart.googleapis.com/chart?cht=tx&chl=f_1(%5Cmathbf%7Bx%7D)%20%3D%20W_1%5ET%5Cmathbf%7Bx%7D

https://chart.googleapis.com/chart?cht=tx&chl=f_2(%5Cmathbf%7Bx%7D)%20%3D%20W_2%5ETf_1(%5Cmathbf%7Bx%7D)

https://chart.googleapis.com/chart?cht=tx&chl=f_3(%5Cmathbf%7Bx%7D)%20%3D%20W_3%5ETf_2(%5Cmathbf%7Bx%7D)

...

https://chart.googleapis.com/chart?cht=tx&chl=f_n(%5Cmathbf%7Bx%7D)%20%3D%20W_n%5ETf_%7Bn-1%7D(%5Cmathbf%7Bx%7D)


那這樣這個有什麼好講的呢?

大家應該有看到在這邊唯一的運算:內積(inner product)

內積的意義

有念過線性代數的人應該對內積這個運算還算熟悉(在這邊都假設大家有一定線性代數基礎)。

https://chart.googleapis.com/chart?cht=tx&chl=%3C%5Cmathbf%7Bx%7D%2C%20%5Cmathbf%7By%7D%3E%20%3D%20%5Cmathbf%7Bx%7D%5ET%20%5Cmathbf%7By%7D

https://chart.googleapis.com/chart?cht=tx&chl=%3D%20%5Cbegin%7Bbmatrix%7D%20x_1%20%5C%5C%20x_2%20%5C%5C%20%5Cvdots%20%5C%5C%20x_n%20%5Cend%7Bbmatrix%7D%5ET%20%20%5Cbegin%7Bbmatrix%7D%20y_1%20%5C%5C%20y_2%20%5C%5C%20%5Cvdots%20%5C%5C%20y_n%20%5Cend%7Bbmatrix%7D

https://chart.googleapis.com/chart?cht=tx&chl=%3D%20%5Cbegin%7Bbmatrix%7D%20x_1%2C%20x_2%2C%20%5Ccdots%2C%20x_n%20%5Cend%7Bbmatrix%7D%20%20%5Cbegin%7Bbmatrix%7D%20y_1%20%5C%5C%20y_2%20%5C%5C%20%5Cvdots%20%5C%5C%20y_n%20%5Cend%7Bbmatrix%7D

內積,要先定義矩陣相乘的運算,而矩陣的相乘其實是一種線性轉換。

https://chart.googleapis.com/chart?cht=tx&chl=f(%5Cmathbf%7Bx%7D)%20%3D%20A%5Cmathbf%7Bx%7D

我們來觀察一下內積這個運算,這兩個向量會先把相對應的分量相乘。

https://chart.googleapis.com/chart?cht=tx&chl=%5Cbegin%7Bbmatrix%7D%20x_1%20%5C%5C%20x_2%20%5C%5C%20%5Cvdots%20%5C%5C%20x_n%20%5Cend%7Bbmatrix%7D%20%20%5Cleftrightarrow%20%20%5Cbegin%7Bbmatrix%7D%20y_1%20%5C%5C%20y_2%20%5C%5C%20%5Cvdots%20%5C%5C%20y_n%20%5Cend%7Bbmatrix%7D

接著,再相加。

https://chart.googleapis.com/chart?cht=tx&chl=x_1y_1%20%2B%20x_2y_2%20%2B%20%5Ccdots%20%2B%20x_ny_n

這時候我們可以想想看,如果當一邊是權重另一邊是資料的時候所代表的意義是什麼?

當兩個分量的大小都很大的時候,相乘會讓整個值變很大,相對,如果兩個都很接近零的話,結果值就不大。如果很多分量乘積結果都很大,相加會讓整體結果變得很大。

內積,其實隱含了 相似性 的概念在裡面,也就是說,如果你的權重跟資料很匹配的話,計算出來的值會很大。大家有沒有從裏面看出些端倪呢?

我們再由另一個角度切入看內積,內積我們可以把他寫成另一種形式,這個應該在大家的高中數學課本當中都有:

https://chart.googleapis.com/chart?cht=tx&chl=%5Cmathbf%7Bx%7D%5ET%20%5Cmathbf%7By%7D%20%3D%20%7C%7C%5Cmathbf%7Bx%7D%7C%7C%20%7C%7C%5Cmathbf%7By%7D%7C%7C%20cos%20%5Ctheta

這時候我們就可以看到內積可以被拆成3個部份:分別是兩個向量的大小跟向量夾角的 https://chart.googleapis.com/chart?cht=tx&chl=cos%20%5Ctheta 值。

而當中 https://chart.googleapis.com/chart?cht=tx&chl=cos%20%5Ctheta 就隱含著相似性在裡頭,也就是說,當兩個向量的夾角愈小,https://chart.googleapis.com/chart?cht=tx&chl=cos%20%5Ctheta 會愈接近 1。相反,如果兩個向量夾角愈接近 180 度,那 https://chart.googleapis.com/chart?cht=tx&chl=cos%20%5Ctheta 會愈接近 -1。剛好呈現 90 度就代表這兩個向量是 沒有關係的。

這時候可能有人會說內積又不是完全反應相似性而已,沒錯!因為他也考慮了兩個向量的長度,當一組向量夾角與另一組向量夾角相同,但是第1組的向量長度都比較長,那內積的結果第1組向量就會比較大。

所以內積是沒有去除掉向量長度因素的運算,如果單純想要用向量夾角來當成相似性的度量的話可以考慮用 cos similarity。

https://chart.googleapis.com/chart?cht=tx&chl=cos%20%5Ctheta%20%3D%20%5Cfrac%7B%5Cmathbf%7Bx%7D%5ET%20%5Cmathbf%7By%7D%7D%7B%7C%7C%5Cmathbf%7Bx%7D%7C%7C%20%7C%7C%5Cmathbf%7By%7D%7C%7C%7D

內積與 MLP

那 MLP 當中內積扮演了什麼樣的角色呢?

在純粹線性的 MLP 當中,多層的 https://chart.googleapis.com/chart?cht=tx&chl=f(%5Cmathbf%7Bx%7D) 疊起來,我們可以把他看做是做非常多次的線性轉換或是座標轉換(change of basis),但是這是在 inference 階段的解釋。

那在 training 階段內積扮演了什麼樣的角色呢?

這邊提供一個新的想法:在 training 的過程中,我們的 dataset 是不變的,會變動的是 weight ,而內積則是在衡量這兩者之間的 feature norm 及向量夾角,所以 weight 會調整成匹配這樣特性的樣子。換句話說,內積考慮了 data 與 weight 之間的相似性與大小,並且藉由 training 去調整 weight 讓他與資料匹配。

在 inference 階段,你就可以把他看成是,weight 正在幫你做出某種程度的篩選,跟 weight 匹配的資料,內積值就會比較大,相對的是,weight 不匹配的資料,內積值就會比較小,藉由這樣將內積結果遞進到下一層的運算。

機率與內積

其實還有一個觀點,就是機率觀點,機率要求一個 distribution 的長度為 1,https://chart.googleapis.com/chart?cht=tx&chl=%5Cint_%7B-%5Cinfty%7D%5E%7B%5Cinfty%7D%20P(X)%20%3D%201。在這邊我們的 distribution 常常以一個 vector(或是 random variable)的形式呈現。事實上就是把一個計算好的向量去除以他的長度。如此一來,我們就去除了長度影響的因素,以符合機率的要求。

那機率當中的內積指的是什麼呢?

你如果動動手 google 一下就會發現在機率當中的內積就是這個運算

https://chart.googleapis.com/chart?cht=tx&chl=%5Cmathbb%7BE%7D%5BXY%5D%20%3D%20%5Cint%20XY%20dP

如果有念過統計的人,是不是覺得這東西很眼熟呢?

https://chart.googleapis.com/chart?cht=tx&chl=cov(X%2C%20Y)%20%3D%20%5Cmathbb%7BE%7D%5BXY%5D%20-%20%5Cmathbb%7BE%7D%5BX%5D%5Cmathbb%7BE%7D%5BY%5D

是的!他跟共變異數是有相關的,共變異數還是跟我們要去度量兩個隨機變數之間的 相似性 有關係。

https://chart.googleapis.com/chart?cht=tx&chl=%5Crho%20%3D%20%5Cfrac%7Bcov(X%2C%20Y)%7D%7B%5Csigma_X%20%5Csigma_Y%7D

只要把他除以隨機變數的標準差就可以得到相關係數了呢!

加入非線性

事實上,在我們生活中遇到的事物都是非線性的居多,線性模型可以施展手腳的範疇就不大了。

這時我們就希望在 MLP 中加入非線性的元素以增加模型的表達力。這時候模型的每一層就變成了:

https://chart.googleapis.com/chart?cht=tx&chl=f(%5Cmathbf%7Bx%7D)%20%3D%20%5Csigma%20(W%5ET%20%5Cmathbf%7Bx%7D)

而當中的 https://chart.googleapis.com/chart?cht=tx&chl=%5Csigma 就成了我們的 activation function 了,也就是非線性的來源!

Fully connected layer

當這些層的 node 都互相連接,就代表了所有 node 都參與了計算,這個計算所考慮的資料是 global 的。

這些層所做的運算是相對 簡單 的(相對 convolution 來說)。

每個 node 對每一層運算所做的貢獻是 弱 的。當一層的 node 數很多,e.g. 上千個 node,每個 node 的運算結果就會被稀釋掉了。即便內積運算有包含個別值的大小的成份在裡頭,當 node 數一多,這樣的影響也會被減弱,剩下的是整體向量與向量之間的相似性。但有一個情況例外,當有 node 的值極大,e.g. https://chart.googleapis.com/chart?cht=tx&chl=x_i%20%2F%20x_j%20%3D%201000,當有人是別人的千倍以上的話就要注意一下了,這也是很常在機器學習當中會遇到的問題,這時候就會需要做 normalization 來處理。

最後提醒,內積的運算中雖然有隱含相似性在其中,但是他 不等同 於 去計算相似性。

今天的討論就到這邊告一個段落,希望在大家思考 deep learning 模型的時候,這些東西有幫上一些忙。


上一篇
17 Autoencoder
下一篇
19 Convolution 運算
系列文
機器學習模型圖書館:從傳統模型到深度學習 共 31 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言