8.6 損失函數的定義

我們知道,在機器學習中的「有監督學習」演算法里,在假設空間 中,構造一個決策函數 ,對於給定的輸入 ,由 給出相應的輸出 ,這個實際輸出值 和原先預期值 可能不一致。

於是,我們需要定義一個損失函數(loss function) ,也有人稱損失函數為代價函數(cost function)來度量預期和實際二者之間的「落差」程度 。這個損失函數通常記作 L(Y,overline Y ) = L(Y,f(X)) ,其中 Y 為預期輸出值(也稱標籤), overline Y =f(X) 為實際輸出值, X 為樣本。為了方便起見,這個函數的值為非負數。

常見的損失函數有如下3類:

(1)0-1損失函數(0-1 loss function):

L(Y,f(X)) = left{ egin{array}{l} 1,{
m{ }}Y 
e f(X){
m{ }} \ 0,{
m{ }}Y = f(X) \ end{array} 
ight.

(2)絕對損失函數(absolute loss function)

L(Y,f(X)) = |Y - f(X)|

(3)平方損失函數(quadratic loss function)

L(Y,f(X)) = {(Y - f(X))^2}

損失函數值越小,說明實際輸出 和預期輸出 的差值就越小,也就說明我們構建的模型越好。對於第一類損失函數,我們用減肥的例子很容易解釋。

圖8-5 損失函數與減肥

就是減肥目標達到沒?達到了,輸出為0(沒有落差嘛),沒有達到輸出1(減肥尚未成功,胖紙還需努力!)

對於第二類損失函數就更具體了。當前體重秤上讀數和減肥目標的差值,這個差值有可能為正,但還有可能為負值,比如說,減肥目標為150磅,但一不小心減肥過猛,減到140磅,這是值就是「-10」磅,為了避免這樣的正負值干擾,乾脆就取一個絕對值好了。

對於第三類損失函數,類似於第二類。同樣達到了避免正負值干擾,但是為了計算方便(主要是為了求導),有時還會在前面加一個係數「1/2」,這樣一求導,指數上的「2」和「1/2」就可以相乘為「1」了:

L(Y,f(X)) = frac{1}{2}{(Y - f(X))^2}

當然,為了計算方面,還可以用對數損失函數(logarithmic loss function)。這樣做的目的在於,可以使用最大似然估計的方法來求極值(將難以計算的乘除變成容易計算的加減)。一句話,咋個方便咋樣來!

或許你會問,有了這些損失函數?有啥用呢?當然有用了!因為可以用它反向調整網路中的權值(weight),讓損失(loss)最小啊。

我們都知道,神經網路學習的本質,在很大成大上,其實就是利用「損失函數(loss function)」,來調節網路中的權重(weight)。而「減肥」的英文是「weight loss」,所以你看,我用減肥的案例來講這個「損失函數」,是不是很應景啊?

或許你又會說,就算應景,那神經網路的權值,到底該咋個調法咧?

總體來講,有兩大類方法比較好使。第一類方法從後至前調整網路參數,第二類方法正好相反,從前至後調整參數。第一類方法的典型代表就是「誤差反向傳播」。第二類方法的代表就是目前流行的「深度學習」。

對於第一類方法,簡單說來,就是首先隨機設定初值,然後計算當前網路的輸出,然後根據網路輸出與預期輸出之間的差值,採用迭代的演算法,反方向地去改變前面各層的參數,直至網路收斂穩定。

這個例子說起來很抽象,我們用減肥的例子感性認識一下。比如說,影響減肥的兩個主要因素是「運動」和「飲食」,但它們在減肥歷程中的權值,並不瞭然。如果我減肥目標是150磅,而體重秤上給出實際值是180磅,這個30磅的落差,反過來調整我「運動」和「飲食」在減肥過程中的權值(是多運動呢,還是多吃點低卡食物呢?)。

大名鼎鼎的BP演算法,是由傑弗里?辛頓(Geoffrey Hinton)和大衛?魯姆哈特(David Rumelhart)等人1986年提出來的 ,其論文 「通過反向傳播錯誤學習特徵(Learning Representations by Back-propagating errors)」發表在著名學術期刊《Nature》(自然)上。該論文首次系統而簡潔地闡述了反向傳播演算法在神經網路模型上的應用。

BP反向傳播演算法非常好使,它直接把糾錯的運算量,降低到只和神經元數目本身成正比的程度。現在,我們可以回答上一章中提出的問答了,是哪位「王子」把人工智慧這位「白雪公主」吻醒的呢?是的,沒錯,他就是當前的這位「深度學習」教父傑弗里?辛頓!

圖 8-6 吻醒「人工智慧」的白馬王子:傑弗里?辛頓

8.7 熱力學定律與梯度擴散

BP演算法非常經典,在很多領域都有著經典的應用。在當年,它的火爆程度在絕不輸給現在的「深度學習」。但後來,人們發現,實際用起來,BP演算法還是有些問題。比如說,在一個層數較多網路中,當它的殘差反向傳播到最前面的層(即輸入層),其影響已經變得非常之小,甚至出現梯度擴散(gradient-diffusion),導致參數調整失去方向性。

其實,這也是容易理解的。因為在「資訊理論」中有個信息逐層缺失的說法,就是說信息在逐層處理時,信息量是不斷減少的。例如,處理A信息而得到B,那麼B所帶的信息量一定是小於A的。這個說法,再往深層次的探尋,那就是信息熵的概念了。推薦讀者閱讀一部影響我世界觀的著作《熵:一種新的世界觀》

根據熱力學第二定律,我們知道,能量雖然可以轉化,但是無法100%利用。在轉化過程中,必然會有一部分能量會被浪費掉。這部分無效的能量,就是「熵」。把「熵」的概念,遷移到信息理論,它就表示「無序的程度」。

當一種形式的「有序化(即信息)」,轉化為另一種形式的「有序化」,必然伴隨產生某種程度上的「無序化(即熵)」。依據這個理論,當神經網路層數較多時,BP反向傳播演算法中「誤差信息」,就會慢慢「消磨殆盡」,漸漸全部變成無序的「熵」,因此就無法指導神經網路的參數調整了。

圖8-7 熵-->無序化

因為這個特性,早期凡是基於BP演算法的人工神經網路基本沒有操作7層的。所以網路的層次也就被定格在「淺度網路」這個級別。

再後來,第二類神經網路參數調整方法就孕育而生了。它就是當前主流的方法,也就是「深度學習」常用的「逐層初始化」(layer-wise pre-training)訓練機制,不同於BP的「從後至前」的訓練參數方法,「深度學習」採取的是一種從「從前至後」的逐層訓練方法。

本文部分節選自《深度學習之美:AI時代的數據處理與最佳實踐》(張玉宏著,電子工業出版社,2018年7月出版)。更多理論推導及實戰環節,請參閱該書。

(連載待續)

推薦閱讀:

相关文章