## SCAICT 四月課程第一堂
### 機器學習理論與實作(二)
<br>深度學習(二)
---
## 簽到
![qrcode_docs.google.com](https://hackmd.io/_uploads/HJQRPNPCa.png)
---
## 複習一下
----
### 神經元
![deep_learning_turorials.drawio (11)](https://hackmd.io/_uploads/SJIqtVHJR.png)
----
### 活化函數
![1688885174323 (1)](https://hackmd.io/_uploads/SkiJOGSkR.jpg =50%x)
----
### 感知器Perceptron
![deep_learning_turorials.drawio (12)](https://hackmd.io/_uploads/HkXBgDzxR.png)
----
感知器可模仿真實神經電位
![slide_55](https://hackmd.io/_uploads/B1GPoVryC.jpg =50%x)
----
### 訓練模型步驟
![flowchart.drawio](https://hackmd.io/_uploads/B1_GNvGe0.png)
----
### 神經網路架構
![image](https://hackmd.io/_uploads/HylQRHSyR.png)
* 輸入層(input layer) : 讀取特徵
* 隱藏層(hidden layer) : 學習權重
* 輸出層(output layer) : 讀出預測
---
## 深度學習實作🎉
https://github.com/ChiuDeYuan/SCAICT_lecture/blob/main/0413/housing_price_deeplearning.ipynb
---
## 首先......Python物件導向OOP
----
### 類別(class)
定義事物的抽象資訊---->定義物件的種類
----
### 舉個例子
這些都是屬於「飲料」類別
![e5211630](https://hackmd.io/_uploads/rk3ymYXeC.jpg =50%x)
----
### 舉個例子
所以他們都有相同「屬性Attributes」
例如「容量」、「熱量」、「成分」
![e5211630](https://hackmd.io/_uploads/rk3ymYXeC.jpg =50%x)
----
### 舉個例子
也有相同「方法methods」
例如「喝」、「開瓶蓋」
![e5211630](https://hackmd.io/_uploads/rk3ymYXeC.jpg =50%x)
----
### 另一個例子
台中一中和台中女中都是屬於「學校」類別
<div style="display:flex">
<img src="https://hackmd.io/_uploads/S1sdNLmlR.jpg" style="width:50%;margin-right:10px">
<img src="https://hackmd.io/_uploads/SJhuVI7e0.jpg" style="width:50%;margin-left:10px">
</div>
----
### 另一個例子
所以都有相同「屬性Attributes」
例如「學生數量」、「教室數量」
<div style="display:flex">
<img src="https://hackmd.io/_uploads/S1sdNLmlR.jpg" style="width:50%;margin-right:10px">
<img src="https://hackmd.io/_uploads/SJhuVI7e0.jpg" style="width:50%;margin-left:10px">
</div>
----
### 另一個例子
也有相同「方法methods」
例如「上學」、「放學」等等
<div style="display:flex">
<img src="https://hackmd.io/_uploads/S1sdNLmlR.jpg" style="width:50%;margin-right:10px">
<img src="https://hackmd.io/_uploads/SJhuVI7e0.jpg" style="width:50%;margin-left:10px">
</div>
----
### 定義類別
定義類別時要用「class+類別名稱」
```python=
class School:
# 其他東西
```
----
### 宣告物件
然後就像這樣宣告一個類別為school的物件
```python=
class School:
# 其他東西
TCFSH = School()
```
----
### 修改屬性
屬性的設定則像這樣
```python=
class School:
# 其他東西
TCFSH = School() #TCFSH為school類別的物件
TCFSH.student = 2000 #設定屬性
TCFSH.classroom = 100 #設定屬性
print(TCFSH.student) #output:2000
print(TCFSH.classroom) #output:100
```
----
### 定義類別中的method
其實就是在類別中定義函式
self指的是good_morning屬於該物件而非該類別
```python=
class School:
def good_morning(self):
print("hello!!!")
TCFSH = School()
TCFSH.good_morning() #output:hello!!!
```
----
### 定義類別中的method
其實就是在類別中定義函式
self指的是good_morning屬於該物件而非該類別
```python=
class School:
def good_morning():
print("hello!!!")
TCFSH = School()
School.good_morning() #output:hello!!!
TCFSH.good_morning() #error
```
----
### 建構式
使用\_\_init__( )進行初始化
同時可以輸入參數
```python=
class School:
#建構式
def __init__(self, student):
self.student=student
self.teacher=10
self.classrooms=5
TCFSH = School(2000) #student=2000
```
----
### 物件導向特性
* 封裝 (Encapsulation)
* 繼承 (Inheritance)
* 多形 (Polymorphism)
----
### 封裝 (Encapsulation)
![紙箱打包技巧:裝箱、封箱](https://hackmd.io/_uploads/BkBf61NgR.jpg =60%x)
----
### 繼承 (Inheritance)
![長璽-02 繼承順位-02](https://hackmd.io/_uploads/SJyGR1VgC.jpg =50%x)
----
### 繼承 (Inheritance)
```python=
class School:
def __init__(self):
self.student=10
def good_morning(self):
print("hello!!!")
class AnotherSchool(School): #繼承
def good_night(self):
print("GooD NighT :D")
TCFSH = AnotherSchool()
print(TCFSH.student) #output:10
TCFSH.good_morning() #output:hello!!!
TCFSH.good_night() #output:GooD NighT :D
```
----
### 多形 (Polymorphism)
同樣名稱的method會因為傳入值不同而不同
![6498F21D86-SP-8158983](https://hackmd.io/_uploads/rk-YmeVeR.jpg =70%x)
----
### 多形 (Polymorphism)
```python=
print(1+2) #3
print("1"+"2") #"12"
```
```python=
print(len("Four")) #4
print(len([1,2,3])) #3
```
---
## 張量Tensor
機器學習世界的基本運算單位
----
### 張量Tensor
簡單來說就是儲存數字的容器
n階的張量就如同用n層list儲存資料
$0階張量(標量):1$
$1階張量(向量):[1,2,3]$
$2階張量(矩陣):[[1,2],[3,4],[5,6]]$
----
### 張量Tensor
![1_pgVlfgFbk3t3FWe3QEVlXA](https://hackmd.io/_uploads/HJWxnjfeA.png =70%x)
----
### 張量Tensor
查看張量的形狀
```python=
import torch
t = torch.tensor(1, dtype=torch.int16)
print(t.shape) #output:torch.Size([])
```
----
### 張量Tensor
查看張量的形狀
```python=
import torch
t = torch.tensor([1,2,3], dtype=torch.int16)
print(t.shape) #output:torch.Size([3])
```
----
### 張量Tensor
查看張量的形狀
```python=
import torch
t = torch.tensor([[1,2],[3,4],[5,6]], dtype=torch.int16)
print(t.shape) #output:torch.Size([3,2])
```
----
### 出現在資料集的tensor
[ [13300000,7420,4,2], [12250000,8960,4,4],.... ]
![IMG_0787](https://hackmd.io/_uploads/BkONBNBeA.jpg =80%x)
----
### 出現在資料集的tensor
Q : 如果資料數量為545,特徵數量為13,求shape?
![IMG_0787](https://hackmd.io/_uploads/BkONBNBeA.jpg =80%x)
---
## 資料分割
一個資料集可以(必須)被分割成三個資料集
* 訓練集 (training set) : 訓練權重用
* 驗證集 (validation set) : 調整參數用
* 測試集 (test set) : 最後測試模型效能
----
### 資料集分割比例
訓練 : 驗證 : 測試 = 6 : 2 : 2
or
訓練 : 驗證 = 9 : 1
or
合理大小的驗證&測試
----
### 解讀結果
----
### 過擬合Overfitting & 欠擬合Underfitting
![螢幕擷取畫面 2024-04-10 204350](https://hackmd.io/_uploads/B1C9Y-4lR.png =90%x)
----
### 訓練誤差及驗證誤差
![1_4f2R4EpXYUUY8rfKH888RQ](https://hackmd.io/_uploads/BydVOVElC.png =80%x)
----
### 依據結果調整模型(以error為例)
<div style="text-align:start">
<br>
訓練高、驗證高 ----> 重新設計模型、加大訓練集<br>
訓練低、驗證高 ----> 降低訓練次數、正則化<br>
訓練高、驗證低 ----> 加大驗證集、重新設計模型<br>
<br>
驗證低、測試高 ----> 加大驗證集、測試集<br>
<div style="color:red;">
注意 : <br>
測試集結果不能用來調整模型,包括放棄這個模型
</div>
</div>
---
## 參數更新
前向傳播、反向傳播
----
### 前向傳播
前向傳播就是在由輸入x得到輸出y的過程
![flowchart.drawio (1)](https://hackmd.io/_uploads/HyHon9Ug0.png =80%x)
----
### 反向傳播
由輸出得到的y值更新權重
一層一層更新回去
![flowchart.drawio (2)](https://hackmd.io/_uploads/rkbGGo8eC.png =80%x)
----
### 反向傳播
利用連鎖率減少計算量
![flowchart.drawio (2)](https://hackmd.io/_uploads/rkbGGo8eC.png =80%x)
----
### 優化器
參數更新的實踐
----
定義優化器
```python=
import torch
optimizer = torch.optim.SGD(model.parameters())
# model.parameters()指的是優化目標
```
----
### 各種優化器
----
### 隨機梯度下降SGD
$\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta)$
----
### 隨機梯度下降SGD
每次更新權重都是往垂直於等高線方向
![IMG_0772](https://hackmd.io/_uploads/By2rVx80p.jpg =50%x)
----
### 動量Momentum
功能 : 逃出cost function局部最小值
----
### 動量Momentum
因為不是每次的cost都長這麼簡單
![assets_-LvBP1svpACTB1R1x_U4_-Lw5TMq46bZGMFbfk1mp_-Lw6lSr3sxuY0gzJBEB9_image](https://hackmd.io/_uploads/r1UK7cEA6.png)
----
### 動量Momentum
而是有可能長這樣
![20112303kvi68MILlS](https://hackmd.io/_uploads/rymUevPl0.png =60%x)
----
### 動量Momentum
所以有可能卡在局部最小值
![20112303kvi68MILlS](https://hackmd.io/_uploads/rymUevPl0.png =60%x)
----
### 動量Momentum
$v^i_j:=\lambda v^{i-1}_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta)$
$\theta_j:=\theta_j+v^i_j$
>$i:第i次訓練$
>$\lambda:決定動量大小,通常設為0.9左右$
----
### 動量Momentum
圖形意義
![pY7ZrkX](https://hackmd.io/_uploads/SyINRLwxC.png =40%x)
----
### 動量Momentum
逃出local minima
![V5wDXNv](https://hackmd.io/_uploads/r1-8WvvgC.png =70%x)
----
### 自適應Adagrad
自己調整學習率
----
### 自適應Adagrad
我們回憶一下學習率
![image](https://hackmd.io/_uploads/ByflleIC6.png)
----
### 自適應Adagrad
Adagrad讓學習率隨訓練而減低
![image](https://hackmd.io/_uploads/ByflleIC6.png)
----
### 自適應Adagrad
$\sigma^t:=\sqrt{\sum^t_{i=1}(\frac{\partial}{\partial\theta_j}J^i(\theta))^2+\epsilon}$
$\theta_j:=\theta_j+\frac{\alpha}{\sigma^t}\frac{\partial}{\partial\theta_j}J(\theta)$
>$i:第i次訓練$
>$\epsilon:避免分母為零,通常為1e-8$
----
### Adam
可以視為Adagrad和動量的結合(但其實不是)
是最常用的optimizer
---
### Batch
不知道大家還記不記得梯度下降公式
$$\theta:=\theta+\alpha\sum^m_{i=1}(y^{(i)}-h_\theta(x^{(i)}))x^{(i)}$$
----
### Batch
這是批量梯度下降(BGD)
$$\theta:=\theta+\alpha\sum^m_{i=1}(y^{(i)}-h_\theta(x^{(i)}))x^{(i)}$$
----
### Batch
這是隨機梯度下降(SGD)
$$\theta:=\theta+\alpha(y^{(i)}-h_\theta(x^{(i)}))x^{(i)}$$
----
### Batch
這是小批量梯度下降(mini-batch GD)
$$\theta:=\theta+\alpha\sum^{batch\_size}_{i=1}(y^{(i)}-h_\theta(x^{(i)}))x^{(i)}$$
---
### 正則化
當模型太過複雜時會出現過擬合
![螢幕擷取畫面 2024-04-10 204350](https://hackmd.io/_uploads/B1C9Y-4lR.png =90%x)
----
### 正則化
正則化解決模型過於複雜的問題
![upload_7f0993c161ae4049355735f48ce5939a](https://hackmd.io/_uploads/H19KN2vg0.png)
----
#### L1正則化公式
$loss_{L1}:=loss+\lambda{\Vert w \Vert}_1$
<br>
#### L2正則化公式
$loss_{L2}:=loss+\lambda{\Vert w \Vert}^2_2$
>$\lambda:要多少正則化效果,通常為0.01(要嘗試)$
----
### 範數(向量)
其實就是向量長度
${\Vert v \Vert}_p=(\sum_{i=1}^n|v_i|^p)^{\frac{1}{p}}$
----
### 幾何意義
$L2:\sum_{i=1}^n|w_i|^2<=r^2$
$L1:\sum_{i=1}^n|w_i|<=r^2$
![3UV63nV (1)](https://hackmd.io/_uploads/ryAn9nDxC.png)
(左邊L2,右邊L1)
----
### 正則化
正則化犧牲了模型精準度來換取泛化能力
![upload_7f0993c161ae4049355735f48ce5939a](https://hackmd.io/_uploads/H19KN2vg0.png)
---
### 參考
https://allenlu2007.wordpress.com/2017/04/02/tensor-i-%E5%9F%BA%E6%9C%AC%E8%A7%80%E5%BF%B5/
https://hackmd.io/@allen108108/H1l4zqtp4
---
## 沒了
### 作業放在dc
---
## 回饋表單
![qrcode_docs.google.com (1)](https://hackmd.io/_uploads/Sy98_NwRT.png)
---
{"title":"四月課程第一堂","contributors":"[{\"id\":\"8270ce89-c16d-4965-af18-50cdee721260\",\"add\":12586,\"del\":3451}]"}