## 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}]"}
    347 views