---
# System prepended metadata

title: 機器學習
tags: [大學筆記系列]

---

# 教學大綱
1. 機器學習
	* MLP
	* CNN
	* RNN
	* GAN
2. **支援向量機**: 透過許多支援向量，找到最佳的決策邊界
3. **自適應增強**: 透過組合數個弱模型，來組成一個能適應複雜任務的強模型
4. **決策樹**: 透過樹狀結構來描述決策情況，可以選擇不同的分支以抵達葉節點

競賽:
AI CUP
全國智慧製造大數據分析競賽

配分:
作業 30
期中、末 20
AI 桌遊 10
期末程式 20

# 導論
* **使用機器學習的時機**
	* 存在可以被學習的規律，但不好直接寫程式來描述這種規律
	* 有歷史資料

* mechine learning 元素
	* input: 輸入
	* output: 輸出
	* unknown pattern: 待學習參數
	* data: 訓練資料
	* hyposthesis: 學習出的判斷準則

* ![image](https://hackmd.io/_uploads/ByWZMbMzC.png)
	* f 為未知的學習目標
	* 將 training sample 交給 learning algorithm 學習，從 hyposthesis set(許多種可能的判斷準則) 中找出 final hyposthesis g (最接近 f 的 hyposthesis)

* machine learning 的過程可以想像成，透過 data (hyposthesis set 中的資料點)，訓練模型找出自己的 hyposthesis，以逼近 target (true hyposthesis)
* machine learning 是一種實現 Artificial intelligence 的方式

![image](https://hackmd.io/_uploads/Hk7zWWzfC.png =60%x)

## Machine Learning 的種類
### 根據 Output Space 分類
* binary classification: 模型輸出只有兩類 (y=-1, 1)
* Multiclass Classification: 模型輸出包含多類 (y=1, 2, ..., k)
	* One-Class Classification (OCC): 訓練用的資料只來自一個類別，訓練目標是希望辨識輸入是否屬於這個類別
* Regression: 用於預測數執行結果 (y=R)
* structural learning: 適用於大型的 Multiclass Classification、且無法明確定義各個類別時 (例如標記文章中單字的詞性) (y=structual)

### 根據 data label 的形式分類
* Supervised: 每筆資料都有 label
* Unsupervised: 每筆資料都沒有 label
	* clustering、離群值偵測等等
* Semi-supervised: 只有少數資料有 label
* reinforcement learning: 沒有答案，但利用獎賞跟懲罰機制進行訓練

### 根據不同訓練方式分類
* batch learning: 將訓練資料集分成許多 batch，使模型一次處理一個 batch 並更新參數 (填壓式學習)
* online learning: 接收到新的一筆資料時立即進行訓練更新 (不等待累積到一個 batch)，常見於 reinforcement learning (消極的學習)
* active learning: 在信心過低時，主動詢問使用者答案 (主動的學習)

### 根據 Input Space 分類
* concrete feature: 具體特徵，觀察或測量到的實際數據，通常是人為定義的，對於機器來說最容易處理
	* ex: 硬幣的大小
* raw feature: 未經整理的特徵，通常需要透過人工或機器學習，轉成 concrete feature
	* ex: 手寫數字的特性
* abstract feature: 更加抽象的特徵，通常需要透過特徵轉換、抽取等技術處理
	* ex: student ID

# Perceptron(感知器) 模型
* 感知器模型是深度學習架構最基礎的模型
* hypotjesis space h(x): 包含可能所有的線 (高維空間中則為"超平面")
* 專門用來處理**線性二元分**類問題
* 正確性證明:
	* 若 PLA 模型收斂 <-> 資料屬於線性可分割資料
* 優點: 速度快
* 缺點: 資料不一定是線性可分割
## Perceptron Learning Algorithm(PLA) 演算法
* 用來訓練感知器模型的演算法
* 最終找出的分界線: w0+w1x1+w2x2=0
* 優點: 速度快
* 缺點: 不清楚何時會停止
### 演算法流程
![image](https://hackmd.io/_uploads/Hkc5CWOC6.png)
1. 找到一筆錯誤的資料
	* x 代表該筆資料的向量，例如 (1, x1 , x2)
	* w 代表權重的向量，例如 (w0 , w1 , w2)
	* yn 代表該筆資料的答案
	* "錯誤" 指的是權重 w 與 x 的內積結果的正負號，不等於答案的正負號
2. 調整 wt 以使這個資料能被正確分類
	* 當答案是 +，但預測結果為 - 時，代表 w 與 x 當前向量夾角 >90，此時將兩向量相加，如此一來向量的夾角就會變回 +
	* 當答案是 -，但預測結果為 + 時，代表 w 與 x 當前向量夾角 <90，此時將兩向量相減，如此一來兩向量的夾角就會變回 -
3. 重複1~2，直到找不到錯誤點後結束

### 演算法推演
![image](https://hackmd.io/_uploads/Sy_v5hEMR.png =50%x)
* 一開始沒有任何線，任取一點當錯誤點

![image](https://hackmd.io/_uploads/SkPEy-dR6.png =50%x)
* w(t) 代表當前的權重
* x9 代表本輪找到的分類錯誤資料 (角度大於 90 度)
* 利用兩個向量相加，更新 w(t) 成 w(t+1)
* 原本分類錯誤的那個點，成功分類正確

![image](https://hackmd.io/_uploads/H1DPx-u06.png =50%x)
* 接著來到下一輪
* w(t) 代表當前的權重
* x14 代表本輪找到的分類錯誤資料 (角度小於 90 度)
* 利用兩個向量相減，更新 w(t) 成 w(t+1)
* 原本分類錯誤的那個點，成功分類正確

![image](https://hackmd.io/_uploads/rJ7AlbO06.png =50%x)
* 當所有點分類正確，則 PLA 演算法結束

## Pocket Algorithm (雜訊容忍 PLA)
![image](https://hackmd.io/_uploads/SkEP1Gu0T.png =50%x)
* 嘗試找到一個 w，使得整體的分類錯誤個數變得最少
* 相較於原版 PLA 的優點: 能處理雜訊
* 相較於原版 PLA 的缺點: 速度慢 (因為每一輪都要額外花時間檢查 "新的 wt 是否能夠使全部資料的分類錯誤數量比舊的少")

### 演算法流程
![image](https://hackmd.io/_uploads/HJbHxMd0T.png)
1. 用隨機的方式找到一筆錯誤的資料 (xn, yn)
2. 調整 wt 以使這個資料能被正確分類
3. **如果新的 wt 能夠使全部資料的分類錯誤數量比舊的少，才採納這個更新**

與 PLA 只差在第三點，核心概念是 "找到更好的解時，才更新權重"

## 重點
* 感知器是
	* 二維平面上的一條直線
	* 高維空間的超平面
	* 線性的二元分類器
	* 最基礎的模型

# Linear Regression (線性回歸)
* 希望學習出一組權重 w0...wd，能預測一個實數 y ，使其最符合真實的 label (也是實數範圍)
* 與感知器模型相似
	![image](https://hackmd.io/_uploads/SyHObNZJA.png =80%x)


![image](https://hackmd.io/_uploads/H18mXGuRp.png =40%x)
* 以二維的例子來說，便是希望找到一條線，以擬合資料分佈的走向
* 以殘差值衡量結果，希望透過訓練權重，使其最小化 (紅線部分相加)
	* 使用 square error 計算
	![image](https://hackmd.io/_uploads/Sk26mM_C6.png =50%x)
	
## 計算方式
經過一系列的數學推導後，線性回歸有公式解
![image](https://hackmd.io/_uploads/H1wrC7Zk0.png =50%x)

範例:
![image](https://hackmd.io/_uploads/H1Jok4W1R.png =50%x)

將題目的條件轉換成矩陣運算
![image](https://hackmd.io/_uploads/SJ61g4b1C.png =50%x)

帶公式
![image](https://hackmd.io/_uploads/S1argNZJ0.png =60%x)

所求即為
![image](https://hackmd.io/_uploads/HJYte4bJR.png =20%x)

# Neural Network
## 深度學習模型-點、線、面
* Deep Learning 是一個 Machine Learning 中的領域，致力於學習多層的 representation 和 abstraction，以理解圖像、聲音和文本等
* 點: Perceptron (感知器)，可以想像一個神經元只負責一個簡單的線性分類任務
	![image](https://hackmd.io/_uploads/HJMnyt8lR.png)
* 線: Linear Aggregation of Perceptrons，透過結合多個點的預測結果(AND、OR)，便可組合出更細緻的分割邊界 (但此時還是只能處理線性可分割問題)
	![image](https://hackmd.io/_uploads/HympJY8l0.png)
* 面: Multi-Layer Perceptrons，透過多層神經網路，便可組合出複雜問題的解法
	![image](https://hackmd.io/_uploads/HyQWeFLg0.png)
	
## 深度學習的核心精神
* 深度學習模型的每一層都是對輸入進行一次簡單的幾何變換，以將資料轉換成更有用 (好分類) 的 representation

* 例如進行一次簡單的座標映射變換等等
![image](https://hackmd.io/_uploads/r1h1ZFLeA.png =70%x)

* 深度學習的技術定義：學習數據表示的多層級方法
* 深度學習中的 "深度" 指的是一系列連續的 representation layer 深度，強調從連續的 layer 中進行學習，越深的 layer 對應於越來越有意義的表示
	* 越接近模型輸入的 layer 包含了更多關於原始輸入的訊息
	* 越接近模型輸出的 layer 包含了更多關於最終輸出的訊息

## 深度學習的工作原理
* 深度學習中的 "學習" 指的是將幾何變換參數化，並透過某種方式來學習參數
![image](https://hackmd.io/_uploads/HJpBF2IgC.png =60%x)
* 透過損失函數計算模型輸出與預期值之距離，進而衡量模型的好壞
* 利用 "損失值" 重新調整模型權重，透過優化器 (optimizer）實現，這個過程稱為 "反向傳播（backpropagation）
![image](https://hackmd.io/_uploads/Sy4052Ul0.png =60%x)

![image](https://hackmd.io/_uploads/H1SjcSZyA.png =80%x)
* 注意: +1 的部分不屬於模型架構中，但對應的權重仍然需要被訓練

## Activation funciton
* 每一個網路節點後面都會使用 activation function
	* 用來決定節點輸出的激活程度
	* 將節點輸出標準化
* 為了解決廣大的非線性問題，通常採用非線性函數
![image](https://hackmd.io/_uploads/BJUCSBbJR.png =50%x)

### Sigmoid / Logistic
* 優點: 可微分、輸出已被標準化
* 缺點: 梯度消失與梯度爆炸問題、不是以 0 為中心對稱
![image](https://hackmd.io/_uploads/SJNfLrWJR.png =50%x)

### TanH / Hyperbolic Tangent
* 優點: 以 0 為中心 (均值為 0)
* 缺點: 梯度消失與梯度爆炸問題、計算複雜

![image](https://hackmd.io/_uploads/rJY6UHbJ0.png =50%x)

### ReLU (Rectified Linear Unit)
* 優點: 非線性、計算快、可微分
* 缺點: 容易導致神經元節點功能喪失 (輸出為 0)

![image](https://hackmd.io/_uploads/HJT0LS-yR.png =50%x)

### Leaky ReLU
* 優點: 解決 ReLU 神經元節點功能喪失的問題
* 缺點: 在負值區域沒辦法提供一致的預測結果

![image](https://hackmd.io/_uploads/BJDXDSZkR.png =50%x)

## Forward process
將某一筆資料作為模型輸入，並在模型內向前傳遞，取得模型輸出的過程

計算範例:
![image](https://hackmd.io/_uploads/HkVP1U-yA.png)

## back propagation
演算法流程
![image](https://hackmd.io/_uploads/B1Ptk8WkC.png)
1. 隨機取得一筆資料 xn
2. 計算模型的輸出結果 xi
3. 計算模型輸出與真實答案間的誤差 δ
	![image](https://hackmd.io/_uploads/ryjSChBMR.png =40%x)
5. 使用梯度下降法更新權重

計算範例:
1. 計算誤差
	![image](https://hackmd.io/_uploads/S1y0JIbyC.png)
2. 計算權重更新值，這個例子更新 w5，意義即為 error 對 w5 的梯度，使用偏微分計算
	![image](https://hackmd.io/_uploads/rJZRxIWJR.png)
3. 更新 w5 權重
	![image](https://hackmd.io/_uploads/SyAAlUbyC.png)
	
## learning rate 的選擇
![image](https://hackmd.io/_uploads/BylNl6BGA.png =70%x)

	
# Convolutional Neural Network
* CNN 指的是包含一些捲積運算的神經網路
* 一層捲積層中，可能包含數個不同的 filter (捲積核)，用來執行捲積運算
* 每個 filter 對應的 feature map (經由該 filter 捲積產生的結果) 稱作一個 channel
![image](https://hackmd.io/_uploads/Bylz5qhZR.png =50%x)
* 以這個例子為例，圖片中跟 filter 分佈相同的那些位置，其捲積後的結果分數也較高
![image](https://hackmd.io/_uploads/r1ios92bR.png =50%x)
* 將捲積運算以神經層的形式表示
* 相同顏色的部分屬於相同權重
* 以上圖為例，訓練模型時，只需訓練 9 個參數即可
* 訓練捲積神經網路，本質上就是訓練模型找到一個好的 filter，以達成最好的分類效果
* 捲積運算優點
	* 降低參數量: 一層捲積神經網路，只需要訓練 "filter 長 * 寬" 數量的參數即可，相較於全連接層，參數量大幅降低，且執行速度提升
	* 結合影像特性: 捲積運算的模型架構中採用了與平滑變化的特性，與現實影像相符
	* 透過訓練，讓模型自行學會設計捲稽核 (filter)，不再需要專家設計

## Max Pooling
![image](https://hackmd.io/_uploads/SJkU8aBfR.png =40%x)
* Max Pooling 技術常與 CNN 放在一起，目的是次取樣影像，使其計算量降低

## 完整 CNN 模型架構
![image](https://hackmd.io/_uploads/ry3iR5nbR.png =70%x)
* 完整的 CNN 通常由以下數個必要元素組成
	* 捲積層
	* 池化層: 為了取得更多特徵，可能會有許多捲積與池化層互相交錯
	* 展平 (Flatten) 層: 將高維資料展平成一維資料，以銜接接下來的神經網路
	* 全連接層: 不需要太多層，否則可能會導致 overfitting

## 深度學習重要的參數
![image](https://hackmd.io/_uploads/SykmZo3b0.png =70%x)
* learning rate: 學習速率
* momentum (動量): 意義為 "前一個 iteration 的方向"，可以加速模型收斂
* weight decay: 用於正規化，以控制模型的複雜度
* Epoch: 將所有的訓練資料丟給模型後，算一個 Epoch
* Batch Size: 訓練資料會分批丟給模型，Batch Size 為每一批次的大小
* Iterations: 需要幾批才能完成一個 epoch

## 解決 overfitting 的方法
* Dropout Learning: 加入遺忘層，使一定比例的神經元輸出為 0，避免模型過度適應訓練資料特徵
* Weight Decay: 正規化技術
* Data Augmentation: 擴增資料

## 深入理解損失函數 --- Cross Entropy
![image](https://hackmd.io/_uploads/rylQQj3WR.png =80%x)
* a 為模型預測結果
* y 為正確答案
* C 為計算出來的 loss
	* 當 a==y 時，C=0
	* 當 a 與 y 差越多時，C 越大

## 深入探討激活函數 --- Softmax Function
常用於模型的輸出層，使模型能輸出每一個類別的機率值，且總和為 1

![image](https://hackmd.io/_uploads/rkNlEon-0.png =50%x)
* 使用 exp() 的原因: 進行 normalization，並拉大模型預測值之間的差異
	* ex: [2,4,2,1] -> [0.1025,0.7573,0.1025,0.0377]
		![image](https://hackmd.io/_uploads/Hyl2c0rzA.png)

## 有名的 CNN 模型
### Lenet-5
![image](https://hackmd.io/_uploads/rkAInCrzC.png =80%x)

### AlexNet
![image](https://hackmd.io/_uploads/Skud3CrzR.png =40%x)

### VGG Net
![image](https://hackmd.io/_uploads/B15DpABzA.png)

### GoogleNet
![image](https://hackmd.io/_uploads/SyxKTRrMC.png)
* 注意 1x1 捲積的部分，該操作可以減少 feature map 數目，並進行跨通道訊息整合、加入非線性計算的機會

### Residual net (最常使用)
一般的 CNN
![image](https://hackmd.io/_uploads/SJPkeyUGR.png =70%x)

Residual net
![image](https://hackmd.io/_uploads/rkvMt6PMC.png =70%x)


* 通過殘差連接的方式，使得模型在訓練過程中可以更有效地傳遞梯度
* 在加深神經網路層數時，能得到更好的效果

### DenseNet (優勢較 Residual net 弱)
![image](https://hackmd.io/_uploads/S1p-xkLGR.png =60%x)

### Multi-Scale Deep Learning
![image](https://hackmd.io/_uploads/rkvbN18MR.png =40%x)
* 針對不同的尺度，都訓練一組神經網路
* 最終整合各個尺度的特徵
* 能提升模型的性能和泛化能力

### Multi-Model Deep Learning
* 一個能同時接受影像、文字、音訊等等作為輸入的神經網路

![image](https://hackmd.io/_uploads/rJJau1IMR.png =40%x)

### Multi-Task Deep Learning
* 透過一個共享的模型來同時處理多個不同的任務或目標

![image](https://hackmd.io/_uploads/Hy_UcJUz0.png =60%x)

## Confusion matrices
![image](https://hackmd.io/_uploads/S1WFVS8zC.png =60%x)
* row 代表真實答案
* column 代表模型的預測結果

Accuracy: 全部的資料中，有多少是預測成功的
![image](https://hackmd.io/_uploads/S1lyHS8zR.png =50%x)

Precision: 模型預測為正的輸出中，有多少資料真的是正的
![image](https://hackmd.io/_uploads/S1uVrBLzR.png =50%x)

recall (又稱為 "真陽性率"，將陽性者預測為陽性結果的比率): 所有正的資料中，有多少被模型預測正確
![image](https://hackmd.io/_uploads/rketrSIMR.png =50%x)

假陽性率，將陰性的資料錯誤的預測為陽性結果的比率: 
![image](https://hackmd.io/_uploads/Hy2vvBLzC.png =50%x)

## CNN 模型應用
### 人臉辨識
#### 通用流程
![image](https://hackmd.io/_uploads/SJnzk8IfR.png =80%x)
1. 偵測臉部
2. 對齊
3. 進行配對

#### Multiple patches
* 將圖像切成多個小部分 (如眼睛、嘴巴等等) 分別處理
* Baidu
![image](https://hackmd.io/_uploads/Sy7JJLLz0.png)

#### Alignment
![image](https://hackmd.io/_uploads/r14iyL8GR.png)

#### Loss function
* 最知名的方法是 Triplet loss: 希望透過訓練，拉近 Anchor 與 Positive 的距離，拉遠與 Negitive 的距離
	* Anchor: 可以是作某一個人的影像
	* Positive: 同一個人的影像
	* Negitive: 其他人的影像
![image](https://hackmd.io/_uploads/rkY-gUIfR.png)

## Re-identification problem
* 給定一張某人的圖片，找出一堆圖片中，哪些圖片是這個人
* 難點在於同一個目標可能是跨相機、或是不同角度的
* 與該問題相似的還有
	* Identification: 一般的分類問題
	* Verification: 決定兩張圖片是否相同

#### Siamese Architecture
* 使用 Hinge Loss 來衡量損失
	![image](https://hackmd.io/_uploads/H1owewyGA.png =50%x)
	* $L_{similar}$: 代表兩張同一個目標的圖像間的損失
	* $L_{dissimilar}$: 代表兩張不同個目標的圖像間的損失
	* margin: m，是模型的常數之一，margin 越大，不同類影像的距離也越大
	* 整體 loss 為兩者相加

## Loss function 設計準則
### L2 Distance
### Cosine Distance

### Center loss
* 核心概念: 使各個不同類別的資料點，往各自類別的中心點靠近

![image](https://hackmd.io/_uploads/S1jFmPkzA.png)

### Sphere Loss
* 將特徵 normalization，投影到高維球面上

![image](https://hackmd.io/_uploads/SynJEP1GC.png)

### Object Detection

# RNN
* RNN 將會把前一輪的輸出 (hidden state)做為下一輪的輸入，如此便能處理時序預測的效果
![image](https://hackmd.io/_uploads/SkLz5TbmR.png)
* 上一輪的 hidden state 輸出 ($h_{t-1}$)，以及本輪的輸入 (x_t)
* 會產生本輪的 hidden state 輸出

## RNN 種類
* RNN 有許多種類
    * ![image](https://hackmd.io/_uploads/Bk-Z66-7R.png)
    * ![image](https://hackmd.io/_uploads/BkwX6a-mC.png)
        * 利用反向的輸入資訊

## RNN 問題
* 會忘記舊的資訊
* 訓練不穩定
* 會發生梯度消失的問題

# Transformer
## 先備知識: Auto encoder
* 希望透過訓練一組 encoder 跟 decoder，
* encoder 負責將原本的圖片壓縮成 code (較低維度的 feature representation)
* decoder 負責重建原本的圖像
* 目的是在 code 這個壓縮後的 feature representation 進行操作
![image](https://hackmd.io/_uploads/S1Hw1CZmA.png)

## Transformer 介紹
* Transformer 引入了 Multi-headed Self-Attention 機制
* 該模型更容易平行化、訓練時間較短

### Auto-Regressive model
* 模型的輸入為 x1 ... xn
* 模型的輸出為 y1 ... ym
* 由 x1 ... xn 得出 y1
* 由 x1 ... xn 以及 y1 得出 y2
* 由 x1 ... xn 以及 y1, y2 得出 y3
* ...

## Transformer 模型架構
### Encoder

#### Feed forward
* 由兩層 MLP 組成

#### input/output embedding
* 將詞語轉成長度為512 的向量 representation

#### Positional encoding
* 讓資料加上順序性的差異
* 透過兩個不同的 sin() 函數，製造出位置差異，並將這種資訊加到輸入中

![image](https://hackmd.io/_uploads/SymSh0-XR.png)


### Decoder
![image](https://hackmd.io/_uploads/By8SNC-7C.png)

#### Mask
由於 Transformer 是一種 Auto-Regressive model,故 y_t 只能看 y1 ... y_{t-1}，故要把其他的部分遮住

#### Attention
* Query 是一筆詢問的資料
* key, value pair 是資料庫
* 目的是計算 query 與 key 間的相似度，並把這個相似度作為 value 加權和，加權後進行輸出
* 當 Q、K、V 來自同源時，這種 Atterntion 機制又稱為 self attention

![image](https://hackmd.io/_uploads/ryiBPCZXA.png)
![image](https://hackmd.io/_uploads/ByM8vCbmC.png)

#### Multi-Head Attention

## 完整架構
![image](https://hackmd.io/_uploads/Sk6_c0-QA.png)

# LSTM
* 優化了 RNN 會遇到的各種問題
* Gate 概念: 透過一層 sigmod layer，以控制資料通過的比率
* 分成三個模組
    * forget gate: 過去的資料，需要忘記多少
    * input gate: 現在的資料，需要保留多少
    * output gate: 
* C 為長期記憶
* h 為短期記憶

![image](https://hackmd.io/_uploads/S1StEyzXC.png)

# GAN
* 核心概念: 找到一種轉換方式，將 Gaussian distribution 對應至真實資料集的關係

生成器
優點
缺點
判別器
優點
缺點

## 訓練流程
1. 訓練判別器，使其能分出生成器生成之圖片與真實圖片
2. 訓練生成器，使其能成功欺騙判別器
	![image](https://hackmd.io/_uploads/By8eSHNVA.png)
	* 之所以不能直接當作一整個模型來訓練，而是要固定其中一半、訓練另一半的原因: 若是前後部分一起訓練，則可能會導致前半部份的參數沒訓練到，而後半參數過度訓練 -> 導致隱藏層 (我們要的生成圖片的那一層) 無意義

## Loss function
![image](https://hackmd.io/_uploads/BkdNUBN4C.png)


# Auto Encoder
![image](https://hackmd.io/_uploads/SkNuASV4A.png)
* 分成 Encoder 以及 Decoder 兩部分進行訓練

gan 問題
mode collapse

gan 種類
conditional gan
generator 的輸入多了關於條件的描述（文字 圖片等）
discrimeter 在判斷時會參考條件進行判斷

stack gan
gan 模型無法直接輸入高解析度的圖像
透過將多個模型堆疊在一起，放大圖片的同時還維持解析度

patch gan
訓練用的影像切成更小的 patch

unsupervise conditional generation
當只需要改變少許部分時，可以考慮直接轉換

當遇到較複雜的轉換時，可以使用以下技巧
projection to common space
domain discrimeter (負責確保中間表示式的意義一致)
cycle consistency 交叉計算
semantic consistency


cycle gan


star gan
當有多個 domain 要互相轉換時，可以採用此架構
主要透過多傳入領域的相關資訊，


# Diffusion model
![image](https://hackmd.io/_uploads/BkgD4cOaVC.png)
* 模型目標: 希望訓練一個神經網路，將高斯分佈的集合，轉換成 "貼近真實世界之影像" 的集合

## Train
![image](https://hackmd.io/_uploads/B1yJ0dTN0.png)
* 直接加第 t 步的雜訊至原圖中
* 訓練 noise predictor，輸入加過雜訊的圖、以及第 t 步的 t，希望模型能預測出加入的雜訊是什麼

## sampling
![image](https://hackmd.io/_uploads/SyMaZY6V0.png)

## 評估生成式模型的方法
### Fréchet Inception Distance (FID)
* 判斷真實資料集 distributioon，以及模型輸出的 distribution 的距離

### CLIP Score
* 使用額外的模型，將 "文字" "圖像" 的特徵抽取出來，並衡量兩這間的距離
![image](https://hackmd.io/_uploads/BkAFGFTNC.png)

## diffusin model 應用
### stable diffusion
### DALL-E
* 利用 CLIP 計算文字與影像的關聯性

### Imagen
* 透過 diffusion model，生成解析度更高的圖像

### DDPM-based Representation for Image Segmentation
* 透過 diffusion model，提取像素級別的 reqresentation
* 提取出的特徵可用於之後的分類任務

### Time-series Forecasting
* 將時序以及相關的資訊結合進 diffusion model 之中

### Self-Supervised Training with Diffusion
* 透過 mask 遮住部分可能異常區域，並讓模型重新生成
* 若模型生成出的部分與原圖片差異大，則可能代表原圖片的該區域出現異常

### Self-Supervised Training with Diffusion
* 類似上面的技巧，將圖片中的某部分遮住，讓 diffusion model 重新生成

### Seq2Seq Text Generation
* 結合 diffusion model 跟 文字生成

# 決策樹
* 決策樹是一種樹狀的資料結構
![image](https://hackmd.io/_uploads/Bk4icM5SC.png)
* G(x): 整棵決策樹的判斷準則
* b(x): 用來分類的條件
* G_c(x): 子樹的判斷準則

## 決策樹演算法 --- C&RT Algorithm

![image](https://hackmd.io/_uploads/B1SInmqSC.png)
* 使用遞迴實作
* 遞迴終止條件:
	* 當落在這個節點的資料 y(n) 皆相同的時候
	* 當落在這個節點的輸入資料 x(n) 皆相同的時候 (例如只剩一筆資料落在這個節點中)
	* 此時，回傳最基本的分類器
* 向下遞迴:
	* 學習用來分類的條件 b(x)
	* 透過 b(x) 將資料 x 分成兩類
	* 將分類後的 x 遞迴的丟進決策樹中
	* 最終 G(x) 便是所求

### Purifying
* 透過 Purifying 的機制，可以學習用來分類的條件 b(x)
![image](https://hackmd.io/_uploads/rym7QXcSA.png)
* 以將輸入分成兩類的決策樹為例，某個節點最終選擇的 b(x) 將會是 "透過該條件將當前資料分成兩類後，不純 (Impurity) 比例最低的" 那個分類條件

#### Impurity function
* 通常來說，最常見的 Impurity function 為 Gini index，該值越低代表分的越純
	![image](https://hackmd.io/_uploads/ByRn97cS0.png =50%x)
	![image](https://hackmd.io/_uploads/H1zljXqrR.png)
	
#### 分類條件的選擇	
* 所有可能的分類條件，則可以進一步分成 True/False 的資料以及數值型的資料
	![image](https://hackmd.io/_uploads/Bkxa-EcHC.png =30%x)
	* True/False 的資料: 此種類型可直接作為一種可能的分類條件來使用，並計算其 Gini index
		![image](https://hackmd.io/_uploads/rJ0SE4qBA.png =60%x)
		* 使用 "是否愛爆米花" 作為分類條件
		* 左子樹以及右子樹的 Gini Impurity 分別為 0.375 以及 0.444
		* 兩個 Gini Impurity 的權重和 (根據子樹分得之資料數量) 便是這個分類條件的 Total Gini Impurity
	* 數值型的資料: 將數值排序後，以所有相鄰數字作為分類依據，分別計算其 Gini index
		![image](https://hackmd.io/_uploads/HJl3zVqrR.png =50%x)

## Regularization
* 由於訓練完成後，決策樹在訓練資料集上的表現，準確率為 100%，故決策樹很容易發生 overfitting 的現象
* 可以透過 Regularization 的機制，限制決策樹的複雜度
* 具體而言，在訓練決策樹時，除了希望其準確率越高越好外，還希望葉節點的個數越少越好
* 包含這種機制的決策樹又稱為 Pruned decision tree

# Adaptive Boosting
* 核心概念: 將許多小弱分類器組合起來，成為一個大強分類器

## Bootstrapping as Re-weighting Process
![image](https://hackmd.io/_uploads/HkQYIojHC.png =80%x)
* Bootstrapping 是一種技術，透過從原始資料集中隨機抽樣（有放回的），生成多個子樣本，可作為一種重新加權的過程
* D 是原始資料集
* $D_t$ 是隨機抽樣的資料集，可以觀察到
	* $x_1$ 出現了兩次，因此在計算 error 的時候被計算了兩次，故權重是 2
	* $x_3$ 沒有出現，因此在計算 error 的時候不被採納，故權重是 0；

## Re-weighting (重要概念，必考)
![image](https://hackmd.io/_uploads/ryvkuoir0.png =80%x)
* $g_t$ 跟 $g_{t+1}$ 是小弱分類器
* $u_{t}$ 跟 $u_{t+1}$ 是權重
* argmin() 的意思是希望找到一組 h()，使得括號中的值 (error) 最小
* 目標是找到一組 $u_{t+1}$ 權重，使得 $g_t$ 的表現最差，這樣便可以保證在此權重下，重學出來的 $g_{t+1}$ 跟 $g_{t}$ 不一樣
	* 使得 $g_t$ 的表現最差: 讓 $g_t$ 的分類結果，像是亂猜的一樣；也就是讓 "做對的數量" = "做錯的數量"
		* 假設原本 "做對的數量" = 6211，"做錯的數量" = 1126
		* 則那些 "做對的資料" 的權重將會乘以 1126
		* 那些 "做錯的資料" 的權重將會乘以 6211
		* 如此一來，便能平衡做對跟做錯的分類結果
		* 這個動作便稱為 Re-weighting

### Scaling Factor
* 實際上在調整 "做對的資料" 以及 "做錯的資料" 的權重時，為了避免一直乘導致數字過大，故採用 Scaling Factor 的方式處理
![image](https://hackmd.io/_uploads/BJiowhirC.png =70%x)

## Adaptive Boosting (AdaBoost) Algorithm
![image](https://hackmd.io/_uploads/Syx4vpjrC.png =80%x)
* 初始化權重，每筆資料一開始的權重相同
* 針對每一輪的權重更新
	* 將資料丟進任一個 learning algorithm，取得 $g_t$ (其中一個小弱分類器)
	* 計算 Scaling Factor，並依此更新權重 $u^{(t)}$
	* 計算 $α_t$ (該小弱分類器的權重，越準數字越大)
* 將所有的小些分類器加權組合起來，形成大強分類器 G(x)


# Linear Support Vector Machine
* 在保證資料都分對的情況下，右者學習出的分類邊界最佳，因為該邊界能容許最大的誤差
	![image](https://hackmd.io/_uploads/By3To2nrC.png =50%x)
* 也就是說，支援向量機的目標，便是
	1. 保證所有資料都分對
	2. 學出 "largest-margin separating hyperplane"，這樣可以使得學習出的模型能容忍 noise
* 經過一系列數學推導後，可以將支援向量機的目標用以下數學式表示
	![image](https://hackmd.io/_uploads/rkCBl6hHR.png)
	
## 計算範例
![image](https://hackmd.io/_uploads/H1sP8J6rA.png =80%x)
* X 代表點的座標
* y 代表 label，也就是答案
* 先透過 ![image](https://hackmd.io/_uploads/HJJgIk6BA.png) 計算出限制條件
	![image](https://hackmd.io/_uploads/HJl-UJpSR.png)
* 接著代入 ![image](https://hackmd.io/_uploads/ByoQLJaHA.png) 後，便可得出一條關係式
* 當 ![image](https://hackmd.io/_uploads/ryTN816rA.png) 時，這條關係式的值將會最小
* 最終答案即為 ![image](https://hackmd.io/_uploads/HJ0I8y6SC.png)

## SVM general case
* 對於更複雜、更高維的 SVM 問題，我們可以使用線性代數中的 Quadratic Programming 來解決
* Quadratic Programming 可以想像成，準備好 Q, p, A, c 後，便可以透過數學工具將答案算出來
	![image](https://hackmd.io/_uploads/rkB5w16SC.png =80%x)




	













