# Structure Decision
決定 NNet 的結構是非常核心也是非常困難的問題。
# Deep Learning 的層層萃取
每一層網路會從前一層中萃取出資訊;層層堆疊下來,由已經萃取出的內容中再萃取,就可以萃取出更複雜的結構。
例如手寫數字圖片的例子中,第一層先從眾多 pixels 中萃取出某些小小線段,第二層再從這些線段萃取出像是直角、圓弧等等結構。
一直到倒數第二層,萃取出構成數字 1 的資訊,和構成數字 5 的資訊。
因此最後一層就可以根據最後一層判斷出數字是多少。
這樣逐步的由簡單到複雜,讓每一層的負擔都不會太重,使我們成功做到以前無法一步登天的事情。
# DL 的面臨挑戰和應對技術
- 架構決定有難度
- 可以從與問題相關的「領域知識 domain knowledge」進行推論
- 例如常見於電腦視覺的卷積神經網路,推論基礎就是鄰近的像素比較有關聯
- 所以各個像素不是全都接在一起產下一層輸出,只有附近的像素會接在一起
- 高模型複雜度
- 其實只要資料量夠大就扛的住
- 或者使用 Regularization。近年出現很多新穎的 Regularization 方法:
- dropout 用來對抗「壞掉的神經元」
- denoising 用來對抗「壞掉的輸入」
- 最佳化難度
- 由於權重的初始值影響很大,所以決定初始值很重要
- 會進行「預訓練 pretraining」,小心地挑選初始權重
- 龐大計算量
- 近年硬體蓬勃發展下已逐漸克服
:::warning
老師認為 DL 能突破的關鍵因素主要是越來越多不同的 Regularization 和 pretraining 的方法和思維。
:::
# 預訓練
權重做的特徵轉換,又叫做編碼 encoding。
「好的權重」會讓資訊保留在兩層間,只不過換一種方式表達精煉過的訊息;也就是說我們可以很容易從後一層轉換回跟前一層差不多的東西。
預訓練就是為了找出「好的權重」。
# 自動編碼機
$$
g_{i}(\mathbf{x})\approx x_{i}\\
G(\mathbf{x}) \approx \mathbf{x}
$$
透過自動編碼機可以去近似出恆等函數 Identity function:
$$
F(\mathbf{x}) = \mathbf{x}
$$
成功逼近的話,代表找到了「隱藏的結構」,所以才可以從原本的資料編碼後再解碼,還原回類似的資料。
這些學到的「隱藏結構」,或者說特徵轉換,就是適合作為初始值的「好的權重」;因此自動編碼機是預訓練常用的一個方法。
## 對於監督學習
「好的權重」告訴我們如何萃取出重要的部分,以有效的方法表現出原始資料。
也就是學會了 Informative representatoin of data,用帶有資訊的方法表示原本的資料。
## 對於非監督學習
- 編碼機做得好的資料代表該種資料比較「稠密」,或者說常出現、密度大。
- 編碼機做不好的地方代表稀疏的部分,與上面相反。
如果新資料進來,便可以判斷是稠密或稀疏區域的資料。
稀疏區域除了可能是編碼機單純沒有學會,也有可能是因為離群值,所以也可以拿來判別離群值。
如此便學會了 Typical representatoin of data,去學會哪些是典型的資料。
:::warning
雖然說我們是在做「逼近同等函數」這件事,但這只是做事的方法,我們真正的目的是得到中間那層,得到資料的不同表現方式,不管是帶有資訊的,或是典型的。
:::
## Basic Autoencoder
是一個 $d-\widetilde{d}-d$ 的 NNet,其中 error function 為:
$$
\sum_{i=1}^{d}(g_{i}(\mathbf{x}-x_{i}))^{2}
$$
通常 $\widetilde{d}<d$,才有萃取的效果。
資料:
$$
\mathcal{D}={(\mathbf{x}_{1},y_{1}),(\mathbf{x}_{2},y_{2}),...,(\mathbf{x}_{N},y_{N})}
$$
有時候會加入 Regularization:
$$
w_{ij}^{(1)}=w_{ji}^{(2)}
$$
---
# Regularization
神經網路的 Regularization 可以使用舊方法,也可以使用新方法:
- 可以從結構下手,在結構上減少連結的數量,例如卷積
- 使用 L2 或 scaled L2
- Early stop
- Denoising
- 在 DL 或編碼機都很有用
# Denoising
讓模型在學的時候,在輸入加入「人工弄髒」的資料,但是輸出則不變。
也就是說我們透過讓模型遇到雜訊,但是依舊要學到沒有雜訊時的結果,來限制、指引他要學會的內容,讓他朝向好的 $g$ 的方向前進,而不是連雜訊也都學進去。
這樣限制的方法也是一種 regularization 的方式。
## Denoising autoencoder
所以通常編碼機都會搭配 Denoising。
$$
\mathcal{D}={(\mathbf{\widetilde{x}}_{1},y_{1}),(\mathbf{\widetilde{x}}_{2},y_{2}),...,(\mathbf{\widetilde{x}}_{N},y_{N})}\\
\mathbf{\widetilde{x}}_{n}=\mathbf{x}_{n} + 人工\ noise
$$
:::info
很多預訓練都是發展出更多花樣的自動編碼機,像是有不同的 Regularization,或是加入不同的 hint 等等。
:::
## 人工雜訊 / 提點 資料
「加入人工資料」來達成一些目的,在 DL 中是一種常見的技巧;不只可以加入雜訊,依照情形可以加入點 hints。
---
# Linear Autoencoder
本來不是說最好要從線性的開始,再往非線性的邁進。
下面就來看線性的編碼機有甚麼特點。
## 事前限制
$$
h_{k}(\mathbf{x})=\sum_{j=0}^{\widetilde{d}}w_{kj}\left(\sum_{i=1}^{d}w_{ij}x_{i}\right)
$$
- 去掉 $x_{0}$,這樣第一層往第二層的 range,跟第二層往第三層的 range 才會一樣;
- 也就是上面 $i=1$ 的地方
- 加入 regularization
- $w_{ij}^{(1)}=w_{ji}^{(2)}=w_{ji}$
- 所以上面才會是 $w_{ji}$ 跟 $w_{kj}$
- 令 $\widetilde{d}<d$
- 這樣才不會有 trival 解
所以我們權重可以表示成一個大矩陣:
$$
\mathbf{W}=[w_{ij}],\ size=d\times\widetilde{d}\\
\mathbf{h(x)}=\mathbf{W}\mathbf{W}^{T}\mathbf{x}
$$
並且 $E_{in}$ 為:
$$
E_{in}(\mathbf{h})=E_{in}(\mathbf{W})=\frac{1}{N}\sum_{n=1}^{N}\left\|\mathbf{x}_{n}-\mathbf{W}\mathbf{W}^{T}\mathbf{x}_{n}\right\|^{2}
$$
## Eigen-decompose
$$
\mathbf{W}\mathbf{W}^{T}=\mathbf{V}\mathbf{\Gamma}\mathbf{V}^{T}
$$
- $\mathbf{V}$ 是 $d\times d$ 的正交矩陣 orthogonal
- 也就是說 $\mathbf{V}\mathbf{V}^{T}=\mathbf{I}_{d}$
- $\mathbf{\Gamma}$ 是 $d\times d$ 的對角矩陣 diagonal
- 由於 $\mathbf{V}$ 不是方陣,所以 rank 最高就是 $\tilde{d}$
- 也就限制了 $\mathbf{\Gamma}$ 中最多就 $\tilde{d}$ 個非 0 的值。
- $\mathbf{V}\mathbf{\Gamma}\color{red}{\mathbf{V}^{T}\mathbf{x}_{n}}$
- 由於 $\mathbf{V}$ 是正交矩陣,所以 $\color{red}{\mathbf{V}^{T}\mathbf{x}_{n}}$ 算是某種旋轉或反射的動作而已
- 長度沒有變,只是轉到某個新的坐標系。
- $\mathbf{V}\color{blue}{\mathbf{\Gamma}}\color{red}{\mathbf{V}^{T}\mathbf{x}_{n}}$
- 再乘上 $\color{blue}{\mathbf{\Gamma}}$
- 對角線 0 的地方代表我們把 $\color{red}{\mathbf{V}^{T}\mathbf{x}_{n}}$ 塗掉某些部分
- 非 0 的地方就是給進行一些放縮。
- $\color{green}{\mathbf{V}}\color{blue}{\mathbf{\Gamma}}\color{red}{\mathbf{V}^{T}\mathbf{x}_{n}}$
- 最後乘回 $\color{green}{\mathbf{V}}$
- 轉回原本的坐標系
原本沒有轉換的 $\mathbf{x}_{n}$,其實等同:
$$
\color{green}{\mathbf{V}}\color{blue}{\mathbf{I}}\color{red}{\mathbf{V}^{T}\mathbf{x}_{n}}
$$
所以就是在算經過旋轉、消除、縮放、轉回來,前後兩者的差異性;我們把問題從 $\mathbf{W}$ 轉成了解 $\mathbf{V}$ 跟 $\mathbf{\Gamma}$。
# 新問題
$$
\min_{\mathbf{V}}\min_{\mathbf{\Gamma}}\frac{1}{N}\sum_{n=1}^{N}\left\|
\color{red}{\mathbf{V}}\mathbf{I}\mathbf{V}^{T}\mathbf{x}_{n}-\color{red}{\mathbf{V}}\mathbf{\Gamma}\mathbf{V}^{T}\mathbf{x}_{n}
\right\|^{2}
$$
## $\mathbf{\Gamma}$
由於 $\color{red}{\mathbf{V}}$ 只是旋轉,長度不會變,所以可以先不用管他。
$$
\min_{\mathbf{\Gamma}}\sum \left\|(\mathbf{I}-\mathbf{\Gamma})(\mathbf{V}^{T}\mathbf{x}_{n})\right\|^{2}
$$
為了最小值,所以 $(\mathbf{I}-\mathbf{\Gamma})$ 越多 0 越好。
也就是 $\mathbf{\Gamma}$ 越多 1 越好,根據先前的限制,最多只能塞 $\tilde{d}$ 個 1:
$$
\mathbf{\Gamma}=
\begin{bmatrix}
\mathbf{I}_{\tilde{d}} & 0 \\
0 & 0
\end{bmatrix}
$$
## $\mathbf{V}$
$$
\min_{\mathbf{V}}\sum \left\|
\begin{bmatrix}
0 & 0 \\
0 & \mathbf{I}_{d-\tilde{d}}
\end{bmatrix}
(\mathbf{V}^{T}\mathbf{x}_{n})
\right\|^{2}
$$
從留下的維度越少越好,換成解拿掉的維度越多越好:
$$
\max_{\mathbf{V}}\sum \left\|
\begin{bmatrix}
\mathbf{I}_{\tilde{d}} & 0 \\
0 & 0
\end{bmatrix}
(\mathbf{V}^{T}\mathbf{x}_{n})
\right\|^{2}
$$
由於是 $\mathbf{I}$ 矩陣的緣故,所以 $\mathbf{V}^{T}\mathbf{x}_{n}$ 乘上去的結果就很像是「選取其中幾列」;所以:
- 被 $\Gamma$ 選取的部分要越大越好
- 被 $\mathbf{I} - \Gamma$ 選到的部分要越小越好
可以先往下看推導的過程,下面會再敘述這樣轉換的用意。
## $\tilde{d} = 1$
如果 $\tilde{d} = 1$ ,可以簡化為只剩 $\mathbf{V}$ 第一個 row:
$$
max_{\mathbf{v}}=\sum_{n=1}^{N}\mathbf{v}^{T}\mathbf{x}_{n}\mathbf{x}_{n}^{T}\mathbf{v}
$$
由於 $\mathbf{V}$ 是個正交矩陣,所以每個向量都是單位像量,所以會有限制:
$$
\mathbf{v}^{T}\mathbf{v}=1
$$
## Lagrange Multiplier
這裡使用微積分求有限制極值時的方法,Lagrange Multiplier,Objective 跟 Constraint 的微分只差一個常數:
$$
\sum_{n=1}^{N}\mathbf{x}_{n}\mathbf{x}_{n}^{T}\mathbf{v}=\lambda \mathbf{v}
$$
所以最佳的 $\mathbf{v}$ 要滿足上式,目標函數可以寫改為:
$$
\sum_{n=1}^{N}\mathbf{v}^{T}\mathbf{x}_{n}\mathbf{x}_{n}^{T}\mathbf{v}= \mathbf{v}^{T}\lambda \mathbf{v}=\lambda
$$
## Eigen vector
$$
\sum_{n=1}^{N}\mathbf{x}_{n}\mathbf{x}_{n}^{T}\mathbf{v}=\lambda \mathbf{v}
$$
這個表達式會發現, $\mathbf{v}$ 是 $\sum_{n=1}^{N}\mathbf{x}_{n}\mathbf{x}_{n}^{T}$ 的特徵向量,其中 $\lambda$ 就是特徵值。
所以最佳的 $\mathbf{v}$ 就是擁有最大特徵值的特徵向量。
## 總結
這個可以推廣到 $\tilde{d}$ 等於原本值的情形,$\mathbf{V}$ 就是要找出 $\sum_{n=1}^{N}\mathbf{x}_{n}\mathbf{x}_{n}^{T}$ 的特徵向量們,並且將前 $\tilde{d}$ 大的排在前 $\tilde{d}$ row。
也就是說最佳的 $\mathbf{W}$ 就是把 $\mathbf{x}_{n}$ 投射到前幾大特徵值特徵向量的方向。
所原本的問題可以看做是在找下面的極值:
$$
\sum \left\|
(\mathbf{V}^{T}\mathbf{x}_{n})
\right\|^{2}
$$
最終推導出 $\mathbf{V}$ 是由 $\sum_{n=1}^{N}\mathbf{x}_{n}\mathbf{x}_{n}^{T}$ 的特徵向量組成,所以如果要讓 $\mathbf{I} - \Gamma$ 選到的部分越小,就要把小的特徵向量往下排,或者說就是把大的往上排,因此才會有上面的轉換。
# Principal Component Analysis / PCA
線性編碼機是要找出投射之後的向量的「信號強度 Magnitude」最大的方向:
$$
\max_{\mathbf{V}}\sum \left\|
\begin{bmatrix}
\mathbf{I}_{\tilde{d}} & 0 \\
0 & 0
\end{bmatrix}
(\mathbf{V}^{T}\mathbf{x}_{n})
\right\|^{2}\\
=\sum(magnitude)^{2}
$$
而 PCA 的設計也很類似的,是要找出「變化量 variance」最大的方向
$$
\sum(variance)
$$
而變化量就是資料減去平均後的平方,所以只要把原始資料減去平均值再使用線性編碼機,就可以做出 PCA:
$$
\mathbf{x}_{n}=\mathbf{x}_{n}-\mathbf{\bar{x}}
$$
得到 $\mathbf{W}$ 後除了直接帶入沒有位移的 $\mathbf{x}_{n}$ 做轉換,更常做的使用平移後的資料。
:::info
可以發現,線性的編碼機,就跟統計的古老工具 PCA 在做十分類似的事情。
或者說,自動編碼機就是非線性的 PCA
:::
# Dimension reduction
上面兩種方式,讓我們可以線性的形式,只需要較低的維度,找到資料最好的表現方式,將資料進行壓縮。