# HY機器學習#2:模型訓練要訣1 https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/overfit-v6.pdf # 類神經訓練不佳的可能原因 Training: xi yi 造出 f_theta(x) 包含未知參數 造出 L(theta) 由未知參數構成的Loss Function 評估 找出最小L(theta)的那個theta* Testing:xi 用f_theta*(x) 來label testing data ![](https://i.imgur.com/CDRdWR0.png) ## 先看Traning Model 如果誤差太大 ### Model Bias太大 Function如果太簡單,可能永遠無法降低Bias =>重新設計Model,例如增加feauture、增加層數、增加函數複雜度(例如sigmoid) ### Optimization Issue Gradient Descent可能只能找到局部最小值,而非全域最小值 越多層越容易發生 => 用其他的Optimization方法 ### Model Bias or Optimization Issue? https://arxiv.org/abs/1512.03385 越多層若bias還比較大,應該就是Optimization Issue (少層可以做得到,多層也可以) 因此可以做一些比較淺層的方法或簡單的模型,若跟原先深的方法差不多,那可以推測是Optimization Issue ## 再Testiong Data 若Training Data誤差小,Testing Data誤差大 ### Over Fitting 用彈性過大的函數描述(例如給共線三點,得到一個彈性更大的四次函數,但實際上就是共線) => 增加Training Data數、Data augmentation(根據經驗生出資料,例如將影像放大或局部)、降低模型彈性(根據對問題的理解,降低參數個數或神經元個數或共用參數(CNN))、降低feauture數、Early Stopping、Regularization、Dropout(以上三個在後面課程) => 降低彈性太多也可能會造成Model Bias Cross Validation 將Training Set分成Train跟Validation 推薦用Validation結果而非Publc Testing的結果 N-Fold Validation 資料分成N份 其中一份Testing 其他Training,共有N種測試方法,將全部模型用在這N種測試方法,看平均來說哪個比較好 ### Mismatching Training/Testing Data分佈不一樣 例如某時期資料在另一時期資料不適用 => 對資料的理解 # Optimization Issue 主因:Gradient=0 => Critical Point 可能是Local Minimum/Saddle Point(某一方向最大/另一方向最小) ## 判斷原因 Local Min:無法再往下走 Saddle point:可以往某個方向繼續 先對Loss Function做以下近似 ![](https://i.imgur.com/3fkcbV1.png) 綠色部份因為gradient=0所以必為0,看紅色部份(Hessian)可判斷 ![](https://i.imgur.com/iFzsHMA.png) 將Critical Point各自代入H矩陣 計算H矩陣的特徵值Eigen Value就可以得知 ![](https://i.imgur.com/0r9cs6P.png) ## 若是Saddle Point 尋找其中一個Eigen Vector,以此為更新方向即可 (實做少用) ![](https://i.imgur.com/3ApamPW.png) ## Local Min? 以多維的角度來看,Local Min情況比較少 # 逃脫crtical point -1:Batch 將資料分成很多份(Batch),每跑一次batch就更新一次參數 全部batch都跑一次稱為一個epoch 之後將資料shuffle打亂再繼續跑epoch 太大:更新參數慢,更新方向穩定(powerful)但需要時間多 太小:更新參數快,但更新方向不一定正確(noisy) =>有平行運算,時間不一定倍數增加,不會增加這麼快 =>因此一個epoch需要的時間,小batch時間會比較多 看起來大batch劣勢消失,好像會比較好 但實際上大batch會有optimization issue,遇到local min就無法前進 小batch可能遇到有點差異的Loss Function,換一條路就可以繼續更新參數。在一樣的training準確率之下,test也會有比較好的準確率。 大的batch可能比較容易走到較陡的像是峽谷的Local Minimum(小的batch有noise,容易跳出峽谷),這樣會讓testing data一旦有些許改變就會影響準確率甚巨 ## 各自的優勢: 大batch:一個epoch的時間短 小batch:Optimization Testing結果優 ## 兼顧? 參考的paper Large Batch Optimization for Deep Learning: Training BERT in 76 minutes (https://arxiv.org/abs/1904.00962) Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes (https://arxiv.org/abs/1711.04325) Stochastic Weight Averaging in Parallel: Large-Batch Training That Generalizes Well (https://arxiv.org/abs/2001.02312) Large Batch Training of Convolutional Networks (https://arxiv.org/abs/1708.03888) Accurate, large minibatch sgd: Training imagenet in 1 hour (https://arxiv.org/abs/1706.02677) # 逃脫crtical point -2:Momenten 動量 可以改善critical point的技術 原先的gradient descent:往gradient反向改變參數 令動量m(n)=λm(n-1)-ηg(n-1) (g為gragient,m(0)=0) 更新參數參數θ(n)=θ(n-1)+m(n) 也就是不只加上gradient的方向,還要加上前次本來的方向 m(n)也就是之前所有g之加權和 也可以看成慣性,不要讓點卡住 # Training 卡住 -Learning Rate https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/optimizer_v4.pdf 若Error surface崎嶇 可能在峽谷的兩端跑來跑去,無法跑到最低點(山谷) 有時候降低learning rate也沒有用,或是可能很耗時 => Learning Rate應該可以隨時調整 坡度大(陡峭):Rate小 坡度小(平緩):Rate大 ### RMS法(在Agagrad法裡面出現的方法) 除了原來的rate(η),還會除以σ,這個變數在每個參數、每次更新都不一樣,算法是過去所有次數該參數的gradient的標準差(方均根) θ(t)=θ(t-1) - [η/σ(t-1)]g(t-1) 這個方法可以讓坡度大的時候(標準差大)Rate變小 ### RMS Prop法 標準差 Rate可能也會想要跟時間有關 原先RMS法:σ(t)^2 = Sum[g(t-1)^2] + g(t) ^2 RMS Prop法:σ(t)^2 = aXSum[g(t-1)^2] + (1-a)Xg(t) ^2 給予之前的、最新一次的方均根不同權重(a自行調整) a比較大的話,表示最近的gradient的影響力比較大 ### Adam法:RMS Pros + Momentum Pytorch有Adam法,可以直接用(預設參數即可) ![](https://i.imgur.com/39Lv3ox.png) https://arxiv.org/pdf/1412.6980.pdf ### Learning Rate Scheduling Learning Rate也可以是時間的函數,通常有以下兩種,一種是decay,一種是先warm up再decay decay是因為後半段通常趨於穩定,每一次的變化需要減少 warm up可能的原因是一開始計算標準差比較不準,需要一段時間探索再增加變化率 ![](https://i.imgur.com/WNa178f.png) ![](https://i.imgur.com/R1m5lEV.png) ###### tags: `機器學習` `李宏毅`