人工智慧系列(七) 深度學習中的梯度下降與反向傳播
原力君在系列的第六篇《人工智慧系列(六) 深度學習中的神經網路》中提到人工神經網路的基礎是人工神經元,常用的神經元啟用函式為sigmoid,應對深度學習的啟用函式為ReLU、maxout等函式;多層感知機與DNN結構一致,啟用函式有區別;CNN可以用來解決DNN網路引數太多的問題;RNN為帶有反饋的神經網路。但是,仍然存在一個問題:有了神經網路和樣本資料,我們如何訓練模型得到神經網路的最優引數呢?這個問題涉及到引數優化求解,深度學習通常用反向傳播梯度下降法來優化引數。本篇聊聊梯度下降和反向傳播的具體內容。
梯度
神經網路的梯度是指網路引數變化時,網路的代價函式隨引數變化而變化的程度,用高中學過的數學語言來說,梯度就是網路代價函式對網路引數的導數。我們假設神經網路有n個輸入x=[x1,x2,…,xn],樣本資料中每個x的值都對應著一個精確已知的網路輸出y(x)(實際中,y(x)需要人手動獲得。舉個例子,你用草書寫了一個“李”字,要讓機器識別你寫的是李,那麼你要告訴網路那個草書的“李”為輸入x的時候,對應的輸出y(x)為“李”)。
假設目前網路的引數還不是最優的,那麼對於給定的輸入x,它會輸出一個a(x),這個a(x)可能不等於y(x),因此我們定義了一個代價函式來表徵網路輸出與期望輸出之間的差異:
這個代價函式對應的梯度為(這裡梯度符號用倒三角表示,偏導數的內容此處不表,高中和大學均有涉及,理工科的同志應該知道)
梯度下降
梯度下降,是優化網路引數的一種方法;顧名思義,如果梯度一直下降,也就是說網路代價函式對網路引數的導數一直下降,那麼最終網路的代價函式會達到一個最小值(由於網路函式的複雜性,這裡可能得到的是區域性最小。區域性最小問題也是目前深度學習存在的一個問題,此處不表)。那麼對應著最小代價函式的那組網路引數,就是我們所需要的最優網路引數。梯度下降方法的公式推導如下(如果比較反感公式,請跳過這一部分,對於梯度下降主要記住思路即可,在實際工程中,程式大牛們已經給你編好了輪子,可以直接拿來使用)
有同志可能會問了:為什麼要這樣?為什麼引數變化等於它偏導數的負倍數就一定可以?其實,這裡“為什麼”解釋起來比較尷尬:有些東西,可以通過公式推導得到;有些東西是瞎試出來的。像這裡的處理方式,就是老祖宗們瞎試出來的,發現這麼賦值能保證代價函式的變化量一直小於零,也就是說代價函式一直在減小,所以就能保證找到一個最小值(或區域性最小值)。於是,後人就記住了這麼一條規則:這麼處理可以讓函式值變小。其實,數學中有很多結論也是老祖宗們瞎試出來的,不要覺得太神祕。
反向傳播
我們知道神經網路非常複雜,想要計算其代價函式對引數的導數是非常困難的,而反向傳播方法給了我們一個可以近似求解神經網路梯度的方法。關於反向傳播,其理論推導不能用一兩句話解釋清楚,這裡原力君推薦大家學習線上學習課程《Neural Networks and Deep Learning》。這是一本線上教程,作者用非常簡單的語言和思路為大家解釋了神經網路、梯度下降、反向傳播的原理,並且給出了一個數字識別的例子。為了讓我們的文章顯得完整,原力君在這裡貼出反向傳播方法的演算法截圖
不要慌,很多事情不需要你自己編寫
大家看到前面關於梯度、梯度下降、反向傳播的原理,再想想神經網路複雜的結構以及多到令人髮指的引數,是不是腦袋很大?如果所有這些都需要大家自己編寫的話,真的是費時費力,而且很容易出錯。
不過,我們令人尊敬的程式設計師大牛們以及IT大公司們為我們提供了很多的開源工具和開發包。常見的用來進行深度學習的工具有keras, tensorflow, theano, lasagna, caffe, dsstne, torch等等。作為一個初學者,原力君用的就是keras,因為它太簡單了。舉個例子:假設我們有訓練樣本資料x_train,以及它對應的真實輸出y_train,那麼使用神經網路進行模型學習主要由三個步驟:1,確定神經網路結構;2,確定代價函式,配置優化方法;3,優化引數得到最優模型。
第一步,確定神經網路結構。下面的程式碼就定義了一個三層網路:輸入層的輸入是28*28的影象資料,輸出是500維的資料,啟用函式選擇了sigmoid;中間隱藏層的輸入就是前面輸入層的500維輸出,所以不用再定義,而隱藏層的輸出是500維的資料,啟用函式也是sigmoid;輸出層的輸出維數是10維,啟用函式選擇了softmax(也是一種啟用函式,不過它將輸出變成了一種概率分佈,主要用來對輸入資料進行分類。輸入資料對應著概率最大的那個輸出維度,也就是說輸入資料屬於這一維度對應的那個分類。)
第二步和第三步在程式碼中耦合在一起,mse代表的就是我們前面定義的代價函式,model.fit執行完後得到的變數model中就包含了我們所需要的最優網路模型。
一句話總結:梯度是神經網路代價函式對網路引數的導數;梯度下降,代價函式變小,則最終可以找到最小代價函式機器對應的網路引數;反向傳播為我們提供了一種計算梯度的方法;開源工具如keras已經為我們提供了豐富的程式碼庫以及介面。