Multi-Layer Preceptron 的意義
目錄
在前一篇講完了 deep learning 的意義之後我們來更具體一點講 multi-layer perceptron (MLP)。
最簡單的版本莫過於 linear MLP,不過不太會有人去用他,其實只是每層 layer 的 activation function 都是採用 identity。你可以想像他是有很多的線性轉換所疊起來的模型。
一般線性模型:$f(\mathbf{x}) = W^{\prime T}\mathbf{x} + b = W^T\mathbf{x}$
Linear MLP:
$f_1(\mathbf{x}) = W_1^T\mathbf{x}$
$f_2(\mathbf{x}) = W_2^Tf_1(\mathbf{x})$
$f_3(\mathbf{x}) = W_3^Tf_2(\mathbf{x})$
…
$f_n(\mathbf{x}) = W_n^Tf_{n-1}(\mathbf{x})$
那這樣這個有什麼好講的呢?
大家應該有看到在這邊唯一的運算:內積(inner product)
內積的意義
有念過線性代數的人應該對內積這個運算還算熟悉(在這邊都假設大家有一定線性代數基礎)。
$$
<\mathbf{x}, \mathbf{y}> = \mathbf{x}^T \mathbf{y}
$$
$$
= \begin{bmatrix}
x_1 \
x_2 \
\vdots \
x_n
\end{bmatrix}^T
\begin{bmatrix}
y_1 \
y_2 \
\vdots \
y_n
\end{bmatrix}
=
\begin{bmatrix}
x_1, x_2, \cdots, x_n
\end{bmatrix}
\begin{bmatrix}
y_1 \
y_2 \
\vdots \
y_n
\end{bmatrix}
$$
內積,要先定義矩陣相乘的運算,而矩陣的相乘其實是一種線性轉換。
$$
f(\mathbf{x}) = A\mathbf{x}
$$
我們來觀察一下內積這個運算,這兩個向量會先把相對應的分量相乘。
$$
\begin{bmatrix}
x_1 \
x_2 \
\vdots \
x_n
\end{bmatrix}
\leftrightarrow
\begin{bmatrix}
y_1 \
y_2 \
\vdots \
y_n
\end{bmatrix}
$$
接著,再相加。
$$
x_1y_1 + x_2y_2 + \cdots + x_ny_n
$$
這時候我們可以想想看,如果當一邊是權重另一邊是資料的時候所代表的意義是什麼?
當兩個分量的大小都很大的時候,相乘會讓整個值變很大,相對,如果兩個都很接近零的話,結果值就不大。如果很多分量乘積結果都很大,相加會讓整體結果變得很大。
內積,其實隱含了 相似性 的概念在裡面,也就是說,如果你的權重跟資料很匹配的話,計算出來的值會很大。大家有沒有從裏面看出些端倪呢?
我們再由另一個角度切入看內積,內積我們可以把他寫成另一種形式,這個應該在大家的高中數學課本當中都有:
$$
\mathbf{x}^T \mathbf{y} = ||\mathbf{x}|| ||\mathbf{y}|| cos \theta
$$
這時候我們就可以看到內積可以被拆成3個部份:分別是兩個向量的大小跟向量夾角的 $cos \theta$ 值。
而當中 $cos \theta$ 就隱含著相似性在裡頭,也就是說,當兩個向量的夾角愈小,$cos \theta$ 會愈接近 1。相反,如果兩個向量夾角愈接近 180 度,那 $cos \theta$ 會愈接近 -1。剛好呈現 90 度就代表這兩個向量是 沒有關係的。
這時候可能有人會說內積又不是完全反應相似性而已,沒錯!因為他也考慮了兩個向量的長度,當一組向量夾角與另一組向量夾角相同,但是第1組的向量長度都比較長,那內積的結果第1組向量就會比較大。
所以內積是沒有去除掉向量長度因素的運算,如果單純想要用向量夾角來當成相似性的度量的話可以考慮用 cos similarity。
$$
cos \theta = \frac{\mathbf{x}^T \mathbf{y}}{||\mathbf{x}|| ||\mathbf{y}||}
$$
內積與 MLP
那 MLP 當中內積扮演了什麼樣的角色呢?
在純粹線性的 MLP 當中,多層的 $f(\mathbf{x})$ 疊起來,我們可以把他看做是做非常多次的線性轉換或是座標轉換(change of basis),但是這是在 inference 階段的解釋。
那在 training 階段內積扮演了什麼樣的角色呢?
這邊提供一個新的想法:在 training 的過程中,我們的 dataset 是不變的,會變動的是 weight ,而內積則是在衡量這兩者之間的 feature norm 及向量夾角,所以 weight 會調整成匹配這樣特性的樣子。換句話說,內積考慮了 data 與 weight 之間的相似性與大小,並且藉由 training 去調整 weight 讓他與資料匹配。
在 inference 階段,你就可以把他看成是,weight 正在幫你做出某種程度的篩選,跟 weight 匹配的資料,內積值就會比較大,相對的是,weight 不匹配的資料,內積值就會比較小,藉由這樣將內積結果遞進到下一層的運算。
機率與內積
其實還有一個觀點,就是機率觀點,機率要求一個 distribution 的長度為 1,$\int_{-\infty}^{\infty} P(X) = 1$。在這邊我們的 distribution 常常以一個 vector(或是 random variable)的形式呈現。事實上就是把一個計算好的向量去除以他的長度。如此一來,我們就去除了長度影響的因素,以符合機率的要求。
那機率當中的內積指的是什麼呢?
你如果動動手 google 一下就會發現在機率當中的內積就是這個運算
$$
\mathbb{E}[XY] = \int XY dP
$$
如果有念過統計的人,是不是覺得這東西很眼熟呢?
$$
cov(X, Y) = \mathbb{E}[XY] - \mathbb{E}[X]\mathbb{E}[Y]
$$
是的!他跟共變異數是有相關的,共變異數還是跟我們要去度量兩個隨機變數之間的 相似性 有關係。
$$
\rho = \frac{cov(X, Y)}{\sigma_X \sigma_Y}
$$
只要把他除以隨機變數的標準差就可以得到相關係數了呢!
加入非線性
事實上,在我們生活中遇到的事物都是非線性的居多,線性模型可以施展手腳的範疇就不大了。
這時我們就希望在 MLP 中加入非線性的元素以增加模型的表達力。這時候模型的每一層就變成了:
$$
f(\mathbf{x}) = \sigma (W^T \mathbf{x})
$$
而當中的 $\sigma$ 就成了我們的 activation function 了,也就是非線性的來源!
Fully connected layer
當這些層的 node 都互相連接,就代表了所有 node 都參與了計算,這個計算所考慮的資料是 global 的。
這些層所做的運算是相對 簡單 的(相對 convolution 來說)。
每個 node 對每一層運算所做的貢獻是 弱 的。當一層的 node 數很多,e.g. 上千個 node,每個 node 的運算結果就會被稀釋掉了。即便內積運算有包含個別值的大小的成份在裡頭,當 node 數一多,這樣的影響也會被減弱,剩下的是整體向量與向量之間的相似性。但有一個情況例外,當有 node 的值極大,e.g. $x_i / x_j = 1000$,當有人是別人的千倍以上的話就要注意一下了,這也是很常在機器學習當中會遇到的問題,這時候就會需要做 normalization 來處理。
最後提醒,內積的運算中雖然有隱含相似性在其中,但是他 不等同 於 去計算相似性。
今天的討論就到這邊告一個段落,希望在大家思考 deep learning 模型的時候,這些東西有幫上一些忙。