在這個子課程中我們將學會:
在訓練ML模型的過程中,我們都會監看損失函數值的變化,例如下圖,訓練損失會隨著訓練過程一直下降,然而測試損失卻不是這樣,一開始會先下降,下降到一個程度之後卻開始上升,這時候就是所謂的過擬合(Over-fitting) 的現象發生了,而正規化就是要避免或者減輕過擬合的發生。
以下面的例子來看,左下角明明都是橘色的資料,然而模型預測卻出現一小塊藍色的區域,當使用的模型過於複雜、參數太多的時候,就很容易出現這種過擬合的現象。
正規化的目的是為了減輕模型的過擬合,而其概念就是懲罰模型的複雜度,一般常用的正規化技巧有:
在損失函數中加入懲罰項,如下圖示,就可以達到泛化的效果:
接著我們介紹 L1-norm 和 L2-norm 的正規化方式,首先是兩個的計算方式:L1-norm 是將參數的絕對值相加,L2-norm 是平方和相加開根號。
這種計算方式隱含的意義是將參數值限縮在一個範圍內,L2-norm 是類似一個圓、L1-norm 是類似一塊長方形的概念 (因為參數空間維度可以很高,所以這邊用“類似”這個詞)。
寫成完整數學式子表示的話,L1-norm、L2-norm 加在原本損失函數後面如下面的式子,其中 是用來調控正規項影響的大小(有的地方稱作 regularization rate),這樣就是使用正規化的方式。
正規化的技巧可以讓我們得到一個泛化較好的模型,而一個泛化良好的模型才能同時在訓練和測試的資料上,表現得一樣好。
學習率(Learning rate) 是用來控制優化時,參數空間更新步伐的大小,若學習率太小,那麼訓練就會花很久時間,若學習率太大,訓練就無法收斂。
批次大小(Batch size) 則是用來控制多少樣本資料要被拿來計算梯度,若批次大小太小,那麼訓練時損失函數就會彈跳,若批次大小太大,訓練更新一次參數需要計算量大就比較花費時間。
下面是ML模型部分的 TensorFlow 程式碼,裡面用到的參數如 batch_size
、learning_rate
、l2_regularization_strength
就是上面我們提到的內容。
另外最下面有用到一個參數 steps
,這邊額外來說明一下在ML模型訓練中,常常會講到 epoch
和 step
,這兩個東西到底有什麼關聯呢?
epoch
其實是指看過所有訓練資料集的次數,而 step
則是訓練的次數,這兩者會和 batch_size
有關係,舉個簡單的例子:假如:
那麼此時模型會訓練的次數會是 50 次,也就是說 step=50,一般在單一機器上訓練的時候使用 epoch 或 step 都可以,但若是分散式的訓練,就會只使用 step ,而不會用 epoch 了。
最後,在訓練模型的時候,我們通常會將資料洗牌,然後做切分,那為什麼要做“洗牌”的這個動作呢?其實這個步驟的目的是會了讓我們之後取的每個批次,都能夠在某種程度上表示全部資料的行為,若每次批次不夠具有代表性,那麼損失函數就很容易跳來跳去,造成模型收斂速度變慢或甚至是無法收斂。
在這個實作中,我們將學會:
登入 GCP,開啟Notebooks後,複製課程 Github repo (如Day9的Part 1 & 2步驟)。
在左邊的資料夾結構,點進 training-data-analyst > courses > machine_learning > deepdive > 05_artandscience ,然後打開檔案 a_handtuning.ipynb。
先將資料讀進來後,用 head()
、 describe()
看一下資料基本的樣子:
使用不同的超參數和更多的特徵引入,都可以得到不一樣的結果,ML模型的訓練過程就是在這些選擇中,尋找出一個比較好的組合。
今天介紹了正規化、學習率和批次大小,明天我們將介紹 “超參數的調整”。