###### tags: `人工智慧` ###### Lectured by Yun-Nung Vivian Chen 陳縕儂 @ NTU CSIE ###### 個人用筆記 # 2. 如何訓練Model # Model是甚麼?可以吃嗎? ## 模型結構 有關模型結構已經有在上一章節簡單說明過了。這邊就在幫大家複習一下! * 分類問題 * 二元分類 * 情緒分析(正面、負面) ![](https://i.imgur.com/endNEGp.png) * 多分類問題 * 聲音辨識 ![](https://i.imgur.com/HdFlhMe.png) * 手寫辨識 ![](https://i.imgur.com/dZfF2q5.png) ## 找尋目標函式 機器學習,其實就在找**資料之間的規律**,並且用**數學的函式**表達出來!所以確定好自己想做的Model之後,就要來定義輸出入。 * 輸入資料,通常以 「x」 表示。 * 輸出結果,通常以 「y」 表示,又稱 label。 ![](https://i.imgur.com/YsBgQ75.png) 在其中,我們會**預設輸出入的格式都是固定的**,如果x是2維的資料,訓練完後也就只能使用2維的資料來進行使用!不然會判斷錯誤等情形。 ## 範例:將輸入資料轉成向量 以手寫辨識為例子 輸入資料 x:我們可以將每一個元素排成一維的向量,1代表有顏色,0代表沒顏色。 ![](https://i.imgur.com/BYaXWyt.png) 輸出結果 y:輸出結果就是0 ~ 9之間的一個數字。通常我們會用one hot encoding的方式來表示。 ![](https://i.imgur.com/yNjfiMr.png) ## 單一神經元長怎樣? 好,前面我都可以理解,那究竟每一層裡面的神經元是長怎樣? 左邊的橘色部分所需要處理**資料**,這些資料需要乘上一個**weight權重**,然後再加上**bias誤差**,最後經過一個**Activation Function**激勵函式。 Sigmoid Function: 可以將數值變成0~1之間的數字。 ![](https://i.imgur.com/gtsgqLZ.png) ## 為什麼要有誤差 Bias? 通常來說,經過Sigmoid輸出後會是非線性的函示,假設我們現在輸出的結果是在**紅線上面**。很明顯看起來是沒有超過0.5的部分,但可能你的真實答案是需要超過0.5的。 ![](https://i.imgur.com/YWIwLNw.png) 這時候就可以加上Bias,讓整體結果超過我們所需要的0.5。 ![](https://i.imgur.com/r5Qc96o.png) ## 除了Bias還可以調整什麼? 除了上敘說的Bias可以調整之外,我們還可以透過調整**Weight權重**以及 **Activation Function** 來讓輸出結果趨近於我們想要的狀況。 weight 以及 bias 我們就簡稱為 parameter 又稱 θ,許多個 θ 合在一起,就是 parameter sets (參數集) ![](https://i.imgur.com/0KorxCl.png) ## Activation Function(激勵函式) ![](https://i.imgur.com/mpcPC0C.png) 在實務上比較常用 Non-Linear(非線性)的 Function。 ![](https://i.imgur.com/BU5QfTc.png) 因為非線性的 Function,可以畫出更複雜的函式。 ![](https://i.imgur.com/PcbsgMl.png) ## 單一層神經元-Perceptron ![](https://i.imgur.com/hRNfKlR.png) ## 多層神經元 ![](https://i.imgur.com/nxI0lD2.png) ## Deep Neural Networks(深度學習模型) 只要超過一層就可以算是DNN。 ![](https://i.imgur.com/9sC99pm.png) # 機器知道什麼是"好"嗎? ## Function Set? Model? 前面有提過Model裡面有很多的 Function Set。 ![](https://i.imgur.com/2GxEA7F.png) 在深度學習裡面,所以我們可以將運算過程簡單表示成這個樣子。 ![](https://i.imgur.com/HQyh6mI.png) 電腦會自動將會將 model 裡面的 function set 的 weight 以及 bias 拿出來進行運算。 所以整個訓練的過程中,就是要嘗試多組的 function set 。直到找到最好的為止。 ## 要如何知道怎樣是好? 我們會使用一種叫做 Loss Function 來讓電腦知道自己選的 function set 是不是適合的。 loss function:會去比較電腦運算的結果,跟真實結果的差值,來讓電腦知道,他目前選的 funcion set 有多爛!你沒聽錯,我就爛。通常以 C(θ) 來表示,越小越好! ![](https://i.imgur.com/ym4drXb.png) 也有人會用與 Loss Function 相反的概念來訓練模型。 objective/reward function:比較電腦運算的結果與真實的值,相差多少,讓電腦知道他目前有多厲害。通常以 O(θ) 來表示,越大越好! ![](https://i.imgur.com/7vVjx8U.png) ## Loss Function 範例 簡單一點的 loss function 是將機器計算出的結果,與真實的值做差距,全部加總起來。 ![](https://i.imgur.com/XaAPvkA.png) ## 其他種類的 Loss Function ![](https://i.imgur.com/FnlsADe.png) # 最佳化參數選擇 假設我們現在有一個 loss function 以及多個參數集。我們想要找出一組參數集,可以求出最小的 C(θ)。 θ:又稱參數,就是一組的 weight 以及 bias,許多組參數合在一起,就是參數集。 1. 暴力破解法:這個方法通常是不實際的!因為 weight 跟 bias 基本上是有無限多組的!運算時間會無限久。 2. 微積分:要求出 C(θ) 對 θ 的偏微分,讓這個結果等於零。那個點就會是最小的 C(θ)。 但目前 C(θ) 目前是未知的,所以想要求出最小化的 C(θ) 也不是簡單的事情,但思考概念會往這方向發展。 ## Gradient Descent 梯度下降法 1. 先隨機選擇一個點,並且去求出他的斜率。 2. 透過斜率的正負來決定是否要調整 θ。 3. 調整的幅度會依照 Learning Rate 來調整。 4. 這樣就可以找出 **區域最低點**。 斜率負的,往右下斜,θ 需要增加 斜率正的,往左上斜,θ 需要減少 缺點:如果資料量越多,在求斜率時,就會很花費時間。 ![](https://i.imgur.com/2ukGnEr.png) ## Stochastic Gradient Desent(SGD) 隨機梯度下降法 因為 GD 在訓練時需要將全部資料量運算完,才可以完成一次更新。SGD 變成是會隨機取得一筆資料,再來做運算,所以運算速度上會較為快速。 ## GD v.s. SGD GD 看完全部的資料,才會更新 θ 。 SGD 每看一筆資料,就會更新 θ 。 ![](https://i.imgur.com/YrceroP.png) [Backpropagation 效率地計算大量參數](https://www.youtube.com/watch?v=m0da-eOk2sU) ## Mini-Batch SGD 算是 GD 以及 SGD 的折衷款,可以自訂更新頻率,像是5筆資料更新一次 θ。 ## GD v.s. SGD v.s. Mini-Batch SGD ### 三款 functino的定義圖 ![](https://i.imgur.com/YsGS66n.png) ### 訓練時間,準確度差別圖 ![](https://i.imgur.com/zGn6v1C.png) # 你會遇到的問題問題! ## 區域最低點、全域最低點 前面有說過 GD 他只能找到所謂的區域最低點。並不能直接找到全域最低點。 ![](https://i.imgur.com/vMbWeUc.png) 那我們要怎麼找出全域最低點勒? ## 隨機初始化 如果每次訓練時的第一筆資料都是固定的話,那一定都是走到同一個區域最低點。所以可以透過隨機的方式決定第一筆資料。 ![](https://i.imgur.com/nDx3thJ.png) ## Learning Rate 學習率 Learning Rate 可以決定 θ 調整的幅度。 如果 LR 太大,調整幅度過大,就很難找最佳的解,如圖中的黃色線。 如果 LR 太小,調整幅度過小,運算時間就會很慢。 ![](https://i.imgur.com/nZkbu6M.png) 那該怎麼調整勒? 如果 Batch size 變大,一次看的東西會比較多,每一個 epoch 的的更新速度就會變少,所以 LR 也需要同時一起做改變! epoch:每看完一次 train data 就是一個 epoch。 以20筆資料為例,GD 需要一次看完所有資料,所以一個 epoch 只會更新一次 SGD 一次只需要看一筆,一個 epoch 只會更新20次 Mini-batch SGD 假設一次看5筆,一個 epoch 就會更新4次 ## 從資料端下手! 1. 將資料進行亂序排序,這樣子就可以提升訓練時的多樣性。 2. 每一次 epoch 輸入資料量都一樣,適當的資料量可以提升運算速度! ## Overfitting 過擬合 如果 Degree 太大,就會造成model跟訓練資料太過擬合,model只認得測試資料,而且記得很清楚,在與測試資料集驗證時,正確率反而會下降。 * 可以增加更多的訓練資料 * 適當加上 dropout等等 ![](https://i.imgur.com/yG15fW7.png) # 參考 台大資訊 深度學習之應用 ADL 2.1~2.5 * [ADL 2.1: How to Train a Model? 如何訓練模型?](https://www.youtube.com/watch?v=Q0l1jUy-0mA) * [ADL 2.2: What is a Model? 模型是甚麼?](https://www.youtube.com/watch?v=A83DKnpB7DM) * [ ADL 2.3: What does the "Good" Function Mean? 什麼叫做好的Function呢?](https://www.youtube.com/watch?v=MbgS29j2ZsY) * [ADL 2.4: How can we Pick the "Best" Function? 如何找出最好的Function?](https://www.youtube.com/watch?v=qx-iaTZfhRQ) * [ADL 2.5: Backpropagation 效率地計算大量參數](https://www.youtube.com/watch?v=m0da-eOk2sU)