iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0

前言

在進行 yolov4 以及 yolov7 介紹之前,我認為需要將以下名詞介紹給各位方便後續的了解。

激勵函數 activation function

在類神經網路中如果不使用激勵函數,那麼在類神經網路中皆是以上層輸入的線性組合作為這一層的輸出(也就是矩陣相乘),
輸出和輸入依然脫離不了線性關係,做深度類神經網路便失去意義。

所以以一句話簡潔的來說,激勵函數就是爲深度學習引入非線性,

常見的激勵函數選擇有 sigmoid, tanh, Relu ,

以天氣預測來做說明的話,
[w1, w2, w3] = [0.3, 0.7, 0.1],[x1, x2, x3] = [4, 1, 3] ,
如果這個值,y = w1x1 + w2x2 + w3 * x3 + b 沒有 > 1 的話,
我們就說明天不下雨,反之,就認為明天會下雨。

示意圖

這裡會有個門檻,我的結果需要 > 1 ,也就是落在點上,才會下雨。
那如果我們將結果改成機率來看待的話呢?
例如說: 0.65 或是 0.32 或是 0.45 等,才說是不是會下雨,
上述的概念便是 sigmoid ,可以得到一個比較柔和的結果,
但這個激勵函數較少人使用,

sigmoid 示意圖

實用上最常使用 ReLU ,

Relu 示意圖

那為何 Relu 是最常用的激勵函數呢?

  1. 梯度消失問題 (vanishing gradient problem)

ReLU的分段線性性質能有效的克服梯度消失的問題。

對使用反向傳播訓練的類神經網絡來說,梯度的問題是最重要的,
使用 sigmoid 和 tanh 函數容易發生梯度消失問題,是類神經網絡加深時主要的訓練障礙。

具體的原因是這兩者函數在接近飽和區 (如 sigmoid 函數在 [-4, +4] 之外 ),
求導後趨近於0,也就是所謂梯度消失,造成更新的訊息無法藉由反向傳播傳遞。

梯度消失

在神經網絡反向傳播中,當梯度從後往前傳時,梯度不斷減小,最後變為零,
此時,淺層的神經網絡權重得不到更新,那麼前面隱藏層的學習速率低於後面隱藏層的學習速率,即隨著隱藏層數目的增加,分類準確率反而下降了,這種現象叫做梯度消失。

梯度消失導致後層的權重更新的快,靠近輸出層的權值更新相對正常,而前層網絡由於梯度傳遞不過去而得不到更新。
靠近輸入層的權值更新會變得很慢,導致靠近輸入層的隱藏層權值幾乎不變,接近於初始化的權值,這樣在神經網路網絡很深的時候,學習的速度很慢或者根本無法學習。

梯度消失導致神經網絡的 hidden layer 1 相當於只是一個映射層,對所有的輸入做了一個函數映射,這時此深度神經網絡的學習就等價於只有後幾層的隱藏層網絡在學習,就發揮不到深層神經網絡的效果了。

神經網絡每層的訓練速度
如示意圖所示,我們可以看出來神經網絡中從輸出層 Hidden Layer 4 到輸入層 Hidden Layer 1 的訓練速度依次減慢。

分段線性性質 示意圖

  1. 類神經網路的稀疏性(奧卡姆剃刀原則)

Relu會使部分神經元的輸出為0,可以讓神經網路變得稀疏,緩解過度擬合( over fitting )的問題。

但衍生出另一個問題是,如果把一個神經元停止後,就難以再次開啟 ( Dead ReLU Problem ) ,
因此又有 Leaky ReLU ( x<0時取一個最小值而非0 )、maxout ( 增加激勵函數專用隱藏層 ) 等方法,或使用 adagrad 等可以調節學習率的演算法。

奧卡姆剃刀原則的涵義為 "若無必要,勿增實體"

  1. 生物事實:全有全無律 (all or none law)

在神經生理方面,當刺激未達一定的強度時,神經元不會興奮,因此不會產生神經衝動。
如果超過某個強度,才會引起神經衝動, Relu 比較好的捕捉了這個生物神經元的特徵。

  1. 計算量節省

Relu 計算量小,只需要判斷輸入是否大於0,不用指數運算。

激勵函數選擇備註

無免費午餐定理:
最佳化演算法的總體效能並無法定義孰優孰劣,也就是說,不存在一個對所有問題具有普遍優勢的演算法;換一個樂觀一點的說法:一定存在某個演算法在解某種問題時表現最好。

這可以回答激勵函數選擇上,或任意最佳化演算法設計上的問題;不可能有一個最好的最佳化演算法設計適合所有的任務。

損失函數 cost function

損失函數是機器學習當中很重要的一項技藝,他量化了神經網路應該出來的值與神經網路現有的值。
例如說:這張照片上面是一隻狗,出來的判斷結果就應該是狗,結果回傳結果是貓,這樣就不對了。這就代表模型訓練的判斷程度還不夠,例如說這次出來模型只有 79% 的正確率,使用均方誤差 MSE (Mean square error ) 作為描述預測的模型,下一次神經網路學習到的新結果會反映在這上面,另外一個常用的損失函數為交叉熵 ( cross-netropy ) 。

損失函數是用來估量模型的預測值 f(x) 與真實值 Y 的不一致程度,它是一個非負實值函數,通常使用 L(Y, f(x)) 來表示,損失函數越小,模型的強健性就越好。
損失函數是經驗風險函數的核心部分,也是結構風險函數重要組成部分,模型的結構風險函數包括了經驗風險項和正則項。

在回歸上

在回歸的問題中,通常希望模型很棒,預測出來的東西可以跟實際的值一樣。但現實是不可能預測出的值跟實際值是一樣的,預測出來的東西基本上跟實際值都會有落差,這個落差在統計學上稱為「殘差(residual)」。

換個角度解釋,如果是做股票預測模型,預測指數應該到 10000 點,結果實際是 11000 點,中間差了 1000 點,如果我們照著模型去投資,我們是不是損失了 1000 點的差異,所以應該不會有人用「 模型跟實際值有 1000 點的殘差 」來解釋吧。

所以損失函數中的損失就是「實際值和預測值的殘差」。
數學上都會用 y 表示實際值, ŷ 表示預測值。

「損失/殘差」數學表示為

所以都希望這個 損失/殘差 越小越好 ( 最小化 ) ,這樣代表的就是模型做得越好。

在分類上

在分類的問題中,也是希望模型做得很好,可以完美區隔不同類別的資料,也是希望分類的錯誤率越小越好 ( 等同於正確率最大化 ) 。
用 y 表示實際類別, ŷ 表示預測類別。

但在分類的問題中,不會直接拿分類錯誤率當作損失函數進行最佳化,
但損失函數在分類問題的設計會有錯誤率的核心在內,這部分在交叉熵會提到為什麼不直接拿錯誤率當損失函數。

回歸常用的損失函數

有兩種分別是均方誤差 ( Mean square error,MSE ) 和平均絕對值誤差 ( Mean absolute error,MAE ),

在機器學習/統計學中最常被用在回歸上的損失函數就是均方誤差 ( Mean square error,MSE ) ,這裡衍生一個問題,前面都在講損失和殘差,
怎麼多了一個誤差 (error) ,其實這裡的誤差跟前面的殘差是一樣的意思,但為什麼前面不提誤差這個字,因為統計學上的誤差有其他的定義,所以不特別去解釋。

簡單說一下均方誤差,就是計算方法是求「預測值與真實值之間差異的均方值」。

前面提到都是預測值與真實值之間的差異,這差異不是只是一個值嗎?
但資料有可能不只有一筆,有可能有一百筆甚至一千萬筆,所以需要計算這所有資料的平均值,但平均值計算的差值內有正有負,直接相加會有問題。

例如兩筆資料 y1=0 , y2=1 結果模型預測 ŷ1=100 , ŷ2=-99 。

loss1=y1- ŷ1=0–100=-100
loss2=y2- ŷ2=1-(-99)=100
loss1+ loss2=-100+100=0

然後下個結論模型是很好的呦,預測差值等於0。
但這樣絕對是不合理的,

所以加個平方,值都是正數,那預測值和實際值的差異就出來了。

MSE 公式

以上述的例子來說,就會如下圖,

可以看到 MSE 很大,所以模型並不好。

而平均絕對值誤差 (Mean absolute error,MAE) 如均方誤差內的介紹,預測值和實際值的差值內有正有負,直接相加會有問題,除了平方讓差值變成正數,當然還可以用絕對值讓差值變成正數。

那兩種方法會有什麼差異呢?看圖,

MSE 和 MAE 的差異,這邊假設實際值為 0 ,預測值為 -10~10 ,可以發現平方的 loss 很大 ( 紅色軸 ) ,絕對值的 loss 相對小很多 ( 藍色軸 ) ,而且平方的 loss 變化比較曲線,絕對值的 loss 比較線性 ( V字 )。

那平方的loss很大會造成什麼問題呢,這邊需要以 RMSE ( MSE 加個開根號 ) 來做解釋,

如果所有的資料分布很均勻,這時候 MAE 和 RMSE 算出來差不多,但當有離群值 ( outlier ) 出來時,雖然兩個指標都變大,但 RMSE 的變化反而大很多。

如果用 MSE 來推估模型時,因為模型在學習基本上目的就是要消除殘差 ( residual ) 也就是最小化的意思,所以一定先拿殘差最大的先開刀,因此離群值的權重基本上會比其他的大,所以參數在更新 ( 深度學習 ) 會往離群值誤差的方向去更新,更容易造成模型性能變差。

但 MAE 在梯度學習部分存在一個問題,更新參數時, MAE 的梯度始終相同,所以當 loss 很小的時候,梯度一樣很大,這樣在學習時,容易在快學習到最佳解時,更新的解進不到最佳的地方。

所以 MSE 的梯度變化會隨著帶進去的點變化,離最佳解越遠梯度越大,越靠近解梯度越小,而 MAE 的部分梯度是一個定值,看起來很小,但靠近解的時候這個值又太大。

但其實平方跟絕對值的貢獻不是在找解部分,因為大多數的資料頂多一兩個離群值,如果樣本數多一點,離群值根本不太影響,所以這兩個方法基本上都在正規化參數上比較常用來比較差異 ( 關鍵字是 L1 和 L2 Regularization )。

L1 Regularization 其實是 norm-1 正規化→絕對值。
L2 Regularization 其實是 norm-2 正規化→平方值。

MAE 對離群值比較有用,但因為微分不連續(剛剛的例子在x=0時,MAE函數就不可以微分),因此可能在執行時容易出錯,MSE對outlier較敏感,但在求解時,比較容易找到穩定的解。

擬合 fitting

無論是在訓練機器學習或是深度學習的模型,都會遇過『 Underfitting 』與『 Overfitting 』的狀況,而其中又以 Overfitting 最讓人頭疼。
上圖給了一個很好的例子,左邊的圖描了 Underfitting 的狀況,中間的圖描述了良好的模型該有的劃分曲線,右邊的圖則是典型的 Overfitting 。

欠擬合 ( Underfitting )

當我們在訓練一個模型時,發現不管是在訓練集或是測試集資料都無法達到一定的準度時,就可能是遇到 Underfitting 的狀況。
通常造成 Underfitting 的主要原因包含訓練時間不足、模型複雜度不足,而這兩種狀況都不難解決。
在深度學習中,可以透過增加訓練迭代的次數來解決「訓練時間不足」的問題,透過調整神經元數量、模型深度、Kernel 深度來解決「模型複雜度不足」的問題。
如果上述調整仍然無法改善,就要考慮可能是訓練資料本身的問題。

過擬合 ( Overfitting )

相較於 Underfitting , Overfitting 通常是讓人更為頭疼的問題,而在深度學習中該如何觀察 Overfitting 的狀況呢?
下圖給了我們一個很好的例子,當隨個訓練的時間增長、迭代的次數增加,我們訓練集與測試集的 Error 都會逐步的下降,但當我們觀察到訓練集與測試集的 Error 開始分道揚鑣時,就可能是 Ovefirring 的狀況發生。用一句話描述 Overfitting:

模型過度去學習、硬背訓練資料

而造成Overfitting的主要原因包含:

  • 訓練資料不足

訓練資料不足是大家最常會遇到的問題之一,當訓練集太小時,模型找不到泛化的特徵,因此就頃向去硬記所擁有的資訊。

  • 迭代次數過多

不斷讓模型去學習訓練資料集時,到了最後模型就會試圖去硬背特徵,而大大降低了泛化能力。

  • 模型複雜度太高

剛好與 Underfitting 相反,當使用一個很強的模型去學習時,模型較容易發生過擬合的狀況。

在訓練一個模型其實就是在做偏差 ( Bias ) 跟方差 ( Variance ) 的 Trade-off,該如何理解呢?
做偏差就是模型的準度,預期希望模型越準越好,也就是希望做偏差降很低,但此時又會遇到另一個問題,要是模型針對訓練集資料學得很好,就會降低對其他資料的準度,也就是方差會提高,所以在做的就是一個取捨。

用 Underfitting 與 Overfitting 的角度來看的話:

Underfitting:偏差很高,準度不足。
Overfitting:試圖去降低偏差,到最後偏差變很小,然而方差卻提高許多。

正規化 Regularization

在機器學習中藉由降低 error 來訓練出一個能對未知資料有準確預測的 model ,
在利用訓練資料優化 error function 的過程中,最後會得到一個 error 極低的 model ,但是在測試資料上卻會有出乎意外的高 error,

會造成這樣的原因是,利用訓練資料而得到的模型太過於擬合「訓練資料」本身,反而偏離了一般化的目標,稱這現象為 Overfitting ( 過擬合 ) "

從上圖可以理解,在機器學習中,或許可以以一些準確度來交換一般性,使其在測試資料上的準確度可以提高。

要達成這樣的目標使用的方法就是使用 Regularization 正規化。

正則化最常使用的就是 L1 Regularization & L2 Regularization,
這兩種方式其實就是在 Loss Function 中加上對應的 L1 及 L2 penalty (懲罰項)

梯度下降 Gradient descent

梯度下降法 ( gradient descent ) 是最佳化理論裡面的一個一階找最佳解的一種方法,主要是希望用梯度下降法找到函數的局部最小值,因為梯度的方向是走向局部最大的方向,所以在梯度下降法中是往梯度的反方向走。

這邊先大概說一下梯度, 要算一個函數 f(x) 的梯度有一個前提,就是這個函數要是任意可微分函數,這也是深度學習為什麼都要找可微分函數出來當激活函數 ( activation function ) 。
一維度的純量 x 的梯度,通常用 f'(x) 表示。
多維度的向量 x 的梯度,通常用 ∇f(x) 表示。

一維度的純量x的梯度就是算f(x)對x的微分,
多維度的向量x的梯度就是算f(x)對x所有元素的偏微分

多維度的梯度,一般公式寫的是

舉一個實際的例子
假設 x 有兩個維度的參數,梯度就分別需要對不同維度的參數做偏微分

多維度的範例 1 :

多維度的範例 2 :

從一開始的純量的微分到多維度的梯度,應該知道梯度怎麼算了。

那算出來的梯度跟梯度下降法有什麼關係?

在機器學習,通常有一個損失函數 ( loss function ) 或稱為 cost function ,在最佳化理論我們會稱為目標函數 ( objection function ),我們通常是希望這個函數越小越好 ( 也就是找極小值 ) ,這邊可以參考回歸分析或是MLP描述的目標函數。

雖然回歸有唯一解,但我在回歸最後面有寫到,因為回歸有算反矩陣等,計算複雜度相對梯度下降法來的複雜,而且也有可以因為矩陣奇異,反矩陣推估錯誤,導致模型估計錯誤,所以用梯度下降法來做應該比較合適。
梯度下降法是一種不斷去更新參數 ( 這邊參數用x表示 ) 找「解」的方法,所以一定要先隨機產生一組初始參數的「解」,
然後根據這組隨機產生的「解」開始算此「解」的梯度方向大小,然後將這個「解」去減去梯度方向,

公式如下:

這邊的 t 是第幾次更新參數, γ 是學習率 ( Learning rate ) 。
梯度的方向知道了,但找「解」的時候公式是往梯度的方向更新,一次要更新多少,就是由學習率來控制的。

好,今天就介紹到這邊,今天的歌曲是 光澤-假面
https://www.youtube.com/watch?v=RBaODL8b520&list=PLZ_d6NX2sE80hOIrDy5J6vaCS53vj0oo7&ab_channel=%E6%8A%92%E6%83%85%E9%9B%BB%E5%8F%B0TherMusic


上一篇
Day5 FC / ANN 介紹
下一篇
Day7 Yolov4 介紹
系列文
數位中介法沒有屏蔽的 AI 大數據大補帖30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言