---
# System prepended metadata

title: Deep Learning
tags: [機器學習技法]

---

# 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

上面兩種方式，讓我們可以線性的形式，只需要較低的維度，找到資料最好的表現方式，將資料進行壓縮。