04 | 函式與優化方法:模型的自我學習(上)

小馬牛發表於2020-11-03

目錄

一.損失函式、代價函式和目標函式

損失函式與代價函式

目標函式

常用損失函式

1.0-1 損失函式

2.平方損失函式

3.均方誤差損失函式

4.交叉熵損失函式

5.Softmax 損失函式

二.優化方法之梯度下降

批量梯度下降法(Batch Gradient Descent,BGD)

隨機梯度下降法(Stochastic Gradient Descent,SGD)

小批量梯度下降法(Mini-Batch Gradient Descent, MBGD)


​​​​​​​

一.損失函式、代價函式和目標函式

模型的學習,實際上就是對引數的學習。引數學習的過程需要一系列的約束,這個約束就是損失函式

損失函式與代價函式

我們們回想一下人類的學習過程。假設我們要跟小朋友介紹獅子,我們會給他幾張獅子的照片,並告訴他獅子都有哪些特徵。小朋友以後就知道,當看到一隻動物滿足這些特徵的時候,它就是獅子。但是小朋友一般要多看幾次才能記住獅子的樣子,並且獅子尾巴的長短,皮毛顏色的深淺,鬃毛的濃密程度等,都會影響他的判斷。不斷認清獅子的過程就是一個不斷調整自己認知的過程。

訓練模型也是一樣的。模型一開始什麼也不知道,此時如果我們輸入一個資料,模型的輸出是沒有意義的,所以,我們要給它更多的資料。模型每次拿到資料,都要將自己的輸出和真實的結果進行比較,如果偏差很大,它就要對這個偏差進行反饋,想辦法減少這種偏差,也就是學習更多的特徵,直到學會如何對輸入資料進行正確的判斷。

這就是機器學習的一個抽象的過程。說起來很簡單,但其中需要很多知識和概念。
例子:


我們現在有一些資料樣本,需要用一條函式曲線去擬合它的分佈,經過某種方式學習後,我們得到了 3 種曲線:

                                   f1欠擬合                                                        f2過擬合                                                         f3正好

 

假定這幾個樣本點的真實函式式為 F(x),我們擬合出來的函式式為 f(x)。那麼,對於每一個樣本點,真實值和擬合值之間就存在了一個誤差,我們可以通過一個公式來表示這個誤差:
損失函式(loss fuction):L(x)=(F(x)-f(x))2。
通過這個計算函式,我們可以知道用這個擬合函式去表示真實函式時,表示效果的好壞。損失函式越小,擬合函式就能越好的擬合真實函式。
但實際上,我們手裡的樣本點還是挺多的,它們構成了一個訓練集。我們將訓練集上所有點的擬合誤差做一個平均,可以用如下的函式進行表示:
代價函式(cost function):

這個函式我們稱為代價函式(cost function),這種訓練集資料的平均損失,我們稱為經驗風險。同樣,只要我們將經驗風險最小化,那麼擬合出來的函式就會更接近實際的函式。

一般來說,損失函式是針對一個樣本,而代價函式是針對一個資料集,即所有樣本的,但我們在實際工作中並不會嚴格區分它們


目標函式

當我們把經驗風險最小化的同時,就意味著我們要盡力照顧到所有的樣本點,那我們得到的函式有可能就成為前面紅色的曲線,產生“過擬合”。同時也會讓曲線變得複雜,帶來更多的引數。

於是我們就需要解決兩個問題:如何儘可能地減少引數,以及如何不要產生過擬合?

想一想,是不是我們在損失函式後面加上一個能夠衡量模型複雜度的函式,讓模型簡單點,引數少一點就好了?

那什麼函式可以讓模型變得簡單,或者讓模型儘量不要過擬合呢?對的,就是我在“01 課時”提到的範數:
L1 範數可以實現權值稀疏,L2 範數則用來防止過擬合

我們在損失函式後面加上度量模型複雜度的函式 J(f),稱作正則化(regularization)。L1 和 L2 範數是較為常用的度量模型複雜度的函式。訓練集的平均損失為經驗風險這個度量模型的複雜度函式項我們就稱為結構風險

由此,我們將經驗風險和結構風險同時最小化,就得到了如下的函式:

函式的第一部分就是剛才說的損失函式,J(f)就是正則化項,λ 為正則化項係數。

我們可以把 λ 看成是一種懲罰因子,如果我們不希望模型的結構風險(平均損失)太大,那麼就可以增大 λ,這樣模型就會朝著減小引數複雜度的方向訓練。在實際專案開發中,正則化項不用在一開始新增,可以先只用帶有經驗風險項的損失函式來訓練模型,模型訓練結束後,再嘗試加入正則化項,且 λ 也需要人為或者按照一定規律進行不斷的調整和嘗試。

常用損失函式

前面提到,損失函式是用來估量模型的預測值與真實值的不一致的程度。為了衡量這種不一致,人們提出了很多不同型別的損失函式,用於不同的場景和問題。這裡我會介紹幾個最常用的損失函式:0-1 損失函式、平方損失函式、均方差損失函式、交叉熵損失函式和 Softmax 損失函式。我們依次來看。

1.0-1 損失函式

我們評估一個分類模型的時候,最簡單的評估方法就是:如果模型預測對了,我們就認為損失函式的值為 0,如果模型預測錯了就給出 1。這個就是最簡單的 0-1 損失函式,公式化的表示就是:

但 0-1 損失函式不能求導,所以在深度學習中,無法被應用於反向傳播。0-1 損失函式是最簡單的損失函式,它具有十分重要的意義。

2.平方損失函式

上文中我們們在介紹損失函式的時候,講到這樣一個公式:L(x)=(F(x)-f(x))2。這個就是平方損失函式,它直接測量了機器學習模型的輸出與實際結果之間的距離,一般多用於迴歸問題

3.均方誤差損失函式

均方誤差(Mean Squared Error,MSE)是迴歸損失函式中最常用的誤差,它是預測值與目標值之間差值的平方和/數目。其公式化表示為:


其中 s 為目標值的向量表示,y 為預測值的向量表示。


4.交叉熵損失函式

說到交叉熵,你是不是想到了之前我們們在“01 課時”中提到的熵,也就是如下函式:


我們把函式的格式稍微改變一下就得到了交叉熵損失函式(Cross entropy loss)的公式:

其中,p(x) 表示真實概率分佈,q(x) 表示預測概率分佈。

通過函式不難發現,交叉熵損失函式實際上就是通過縮小兩個概率分佈的差異(誤差),來使預測的概率分佈儘可能達到真實的概率分佈一般多用於分類問題

5.Softmax 損失函式

在學習 Softmax 損失函式之前,我們先來回顧一下我在《02 | 從神經元說起:結構篇》中講到的 Softmax 函式。Softmax 函式是深度學習中使用非常頻繁的一個函式,它可以把輸入的幾個數對映為 0-1 之間的實數,並且歸一化後仍能夠保證幾個數的和為 1。它的公式化表示為:

假設有一個陣列,共有 T 個元素,其中第 j 個元素的 Softmax 值就可以通過上面的公式計算得到,即該元素的指數與所有元素指數和的比值。

回到剛才的交叉熵損失函式公式中的 q(xi),也就是預測的概率分佈,如果我們換成 Softmax 方式的表示,即為:

該損失函式我們就稱為Softmax 損失函式(Softmax loss),也稱為 Softmax with cross-entropy loss,它是交叉熵損失函式的一個特例,和交叉熵損失函式一樣,一般也用於分類問題。

二.優化方法之梯度下降


有了約束(損失函式),模型就可以根據它來學習,而這個學習又要使用到優化方法,也就是模型如何學習或更新。

優化演算法實際上做的就是如何在模型表徵的空間中找到模型評估效果指標最好的模型的過程。具體來說,假定我們有一個函式 f(x), 我們需要找到一組引數權重,使 f(x)的值最小。常見的優化方法包括梯度下降法牛頓法擬牛頓法共軛梯度法等,種類和變體非常多,不同的優化方法適用場景有所不同,但目的都是為了尋找最優的模型。

這些優化方法,在實際的深度學習模型研發過程中,都已經有了現成的封裝好的函式,直接使用即可。但是為了更好地理解深度學習模型的內部機制,我們有必要了解它們。這一課時,我就來帶你瞭解最經典的梯度下降法(Gradient Descent)。

梯度下降法是最早、最簡單,也是使用最多的優化方法。為了便於理解,我們通過一個下山的例子來看。

假設現在有一座山,你站在山頂,但是你有點餓,想趕緊下山,去飯店吃飯,那此時我們該怎麼辦呢?

在不考慮性命危險的情況下,最快的方法就是:哪個地方坡度大,哪個地方最陡峭,就往哪裡走。於是,在確認自己的位置之後,我們就可以對比當前所在位置的所有方向,尋找坡度下降最快的方向,然後往前走一步到達新的位置,再尋找新的位置所有方向中下坡度最陡的方向,如此反覆,直到達到最低點。

這就是梯度下降法最直觀的表示。“梯度向量的方向即為函式值增長最快的方向”。這個結論的實際應用之一就是梯度下降法。

具體來說,在一個三維空間曲線中,任何一點我們都能找到一個與之相切的平面(更高維則是超平面),這個平面上有無窮多個方向,但是隻有一個是曲線函式下降最快的梯度。每次優化我們都沿著最快下降的梯度方向進行,這就是梯度下降。

下山的過程中,方向很關鍵,但是步子大小也同樣重要。步子太大了,就可能跑到別的山谷中,也有可能永遠也走不到飯店的位置,最後每次都要多走一段然後再走回來,反反覆覆地在接近和遠離飯店的路上大踏步地走動(在模型訓練中,這種反覆稱為“震盪”);但步子太小就要計算很多次,還沒有走到飯店,人就餓死了。

這個步子的大小,在演算法中就是引數的學習率(learning rate)。絕大多數情況下,因為步長的存在,我們不可能走到最精確的最低點,最後會在最小值的某一個區域內反覆震盪。這個誤差我們是可以接受的,如果在一段時間內誤差沒有發生新的變化,那我們就可以近似地認為訓練已經收斂了。

批量梯度下降法(Batch Gradient Descent,BGD)

假設有一個線性迴歸函式模型,y 是真實的資料分佈函式,hθ(x)是我們擬合的函式,θ 是引數,也是我們要求的權值。那我們整個優化的過程,就是為了找到最好的 θ損失函式J(θ)可以表示為:

其中,m 表示樣本數量。要想擬合真實分佈,那麼損失函式就要最小(誤差最小),為了得到這個最小值,我們就要使用梯度,即“梯度向量的方向即為函式值增長最快的方向”,讓損失函式以最快的速度減小。

因此,我們要先對 J(θ)中的 θ 求偏導數,這樣就可以得到每個 θ 對應的梯度


得到了每個 θ 的梯度之後,我們就可以按照下降的方向去更新每個 θ

其中α為學習率。更新 θ 後,我們就得到一個更新之後的損失函式,它的值也就更小了,我們就越接近要擬合的函式了。

從以上過程我們可以看到,這個方式的優化可以得到全域性的最優解,因為每次都會使用所有的 m 個樣本。但在很多的場景中,樣本很多,如果每走一步就要動用全部的資料,會造成十分龐大的計算量因此,在資料量大的場合我們一般不推薦使用批量梯度下降法。為了解決這個問題,隨機梯度下降法就出現了。

隨機梯度下降法(Stochastic Gradient Descent,SGD)

不同於批量梯度下降法,隨機梯度下降每次只使用一個隨機選擇的樣本來更新θ,則更新過程變成了:

SGD 在每輪迭代中,會根據隨機選擇的一條資料對應的損失函式值來優化,這樣一來,即便樣本數量很大,整個過程也只需要使用其中一部分資料就可以完成更新了。每一輪引數的更新速度會大大加快,能夠更快地得到最優解。

但 SGD 帶來高速和便捷的同時,也帶來了一些風險。

比如,我們的訓練資料中不可避免地會存在錯誤樣本,即噪聲資料。如果在一次更新中好巧不巧的,就是使用了噪聲資料,就會造成一定程度的準確度的下降,這一次優化就不是朝著最好的方向發展了。此外,因為每次只用一個樣本進行優化,而單個樣本並不能代表全體樣本的情況,所以可能會收斂到區域性最優

隨機梯度下降方法用損失很小的一部分精確度和增加一定數量的迭代次數為代價,換取了最終總體的優化效率的提高。當然,這個過程中增加的迭代次數是要遠遠小於樣本的數量的。
 

小批量梯度下降法(Mini-Batch Gradient Descent, MBGD)


MBGD 的方法實際上相當於批量梯度下降和隨機梯度下降的折中,即每次使用一個固定數量的資料進行優化。這個固定數量,就是 Batch Size。

不同於批量梯度下降,該方法每次選擇一個 Batch(例如 32、64 等)進行優化,這會顯著減少每次的計算量,提高收斂的速度。並且,在實際的計算過程中,引入了矩陣計算,讓該方法計算速度並不比 SGD 慢太多。

需要注意的是,Batch Size 也是一個不斷嘗試的引數,過大過小都不好。如果 Batch Size 太大,每次計算的樣本數就大,計算量就會急劇增大,記憶體或者視訊記憶體的空間佔用也就大如果太小,則達不到 Batch Size 的初衷

基於隨機梯度下降法,人們又提出了 Momentum、Nesterov Momentum 等方法,這部分知識可以自行查閱學習。

相關文章