我們來更具體一點講 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 模型的時候,這些東西有幫上一些忙。