1. 程式人生 > >從零基礎成為深度學習高手——Ⅱ

從零基礎成為深度學習高手——Ⅱ

今天繼續昨天的知識,繼續學習新的一個階段知識:

深度學習基礎知識  

接下來我們瞭解一下基礎知識,我們上面也提到了,我們這次主要以卷積神經網路在影象識別領域的應用來介紹深度學習的,卷積神經網路,這個詞聽起來非常深奧,但其實沒什麼複雜的,我們可以分開成兩個詞來理解,卷積和神經網路,先看下卷積。  卷積時數學的定義,在數學裡是有明確的公式定義的。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

是不是覺得公式太抽象,看不明白?沒關係,我們舉個栗子就明白了。

640?wx_fmt=png&wxfrom=5&wx_lazy=1   640?wx_fmt=png&wxfrom=5&wx_lazy=1

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

還是以影象識別為例,我們看到的影象其實是由一個個畫素點構成的。  

一般彩色影象的是RGB格式的,也就是每個畫素點的顏色,都是有RGB(紅綠藍三原色混合而成的),是三個值綜合的表現。

0?wx_fmt=png

假設f函式為5x5(對應到圖片上即為5x5畫素)為例,h函式為3x3的函式,大家可以理解為為一個手電筒(也就是篩選器),依次掃過這個5x5的區間。在照過一個區域,就像對應區域裡的值就和框裡的資料去做運算。最終輸出為我們的輸出圖。  

手電筒本身是一個函式,在3x3的區域內,他在每個位置都有引數,它的引數和對應到圖片上相應位置的數字,先相乘,然後再把相乘的數字相加的結果輸出,依次按照這些去把整個圖片全部篩選一遍,就是我們所說的卷積運算了。  

還是比較抽象,沒關係,看下面這個圖片就清楚了。

0?wx_fmt=gif

那我們為什麼要做卷積呢?我們其實就是建立一個輸入和輸出的函式,影象識別的目的就是把輸入的資訊(畫素點資訊)對應到我們輸出結果(識別類別)上去,所以是逐層提取有用特徵,去除無用資訊的過程。  

比如下圖所示,第一層可以識別一些邊緣資訊,後面逐層抽象,彙總到最後,就可以輸出我們想要的結果,也就是我們的識別結果。

0?wx_fmt=png

雖然我們知道特徵是逐層抽象提取的,但是不幸的是,我們並不知道那一層是具體做什麼的,也就不知道那個層數具體是什麼意思。  

也就是說,其實深度學習網路對於我們而言,是個黑盒子,我們只能通過他的輸出來判斷其好壞,而不能直接去調整某個引數。  

那麼,什麼是神經網路呢?

其實這個模型來自於心理學和神經學,人工智慧的專家借鑑了這個結構。

0?wx_fmt=png

左側為神經元,神經元接收外界的輸入刺激或者其他神經元的傳遞過來的訊號,經過處理,傳遞給外界或者給其他神經元。  

右側為我們根據神經元的生物學特徵抽象出來的數學模型,其中x是輸入,包括一開始資料來源(外部刺激)的輸入,也包括其他節點(神經元)的輸入。  

w為引數(weight),每個節點還有一個b,這個b其實是一個偏置。  

大家在學習新東西的時候,凡事多問個為什麼?只有知道背後的原因了,這樣你才能理解的更深刻。有句話說得好,還有什麼比帶著問題學習更有效率的學習方法呢?  

為什麼要加這個b呢?

大家想想看,如果沒有b的話,當輸入x為0的時候,輸出全部為0,這是我們不想看到的。所以要加上這個b,引入更多的引數,帶來更大的優化空間。  

大家看一下,目前為止,這個神經元裡的函式都還是線性的,也就是說輸出與輸入是線性相關的,但是根據神經元的生物學研究,發現其接受到的刺激與輸入並不是線性相關的,也為了能夠表徵一些非線性函式,所以必須要再引入一個函式,也就是下面我們要講的啟用函式(activation function)。  

為什麼需要啟用函式?因為需要引入一些非線性的特性在裡面。  常見的啟用函式有這些。

0?wx_fmt=png

以前是sigmoid比較常見,但是現在ReLU用的比較多一些。  

就類似於下圖這樣,在節點經過線性運算後,經過非線性的ReLU,然後進入下一層的下一個節點。中間的w和b,就是我們卷積神經網路的引數,也是我們模型中需要訓練的物件。

0?wx_fmt=png

大家看LeNet模型中,就是在輸入資料多次進行卷積神經網路的處理。

0?wx_fmt=png

對於模型而已,我們習慣把輸入的資料叫做輸入層,中間的網路叫做隱藏層,輸出的結果叫做輸出層。中間層數越多,模型越複雜,所需要訓練的引數也就越多。  

所謂的deep learning中的deep,指的就是中間層的層數,右圖中GoogLenet有22層。

0?wx_fmt=png

一般說來,模型越複雜,所能實現的功能也越強大,所能達到的精度也越高,目前最深的模型大概有10的7次方個神經元,其神經元比相對原始的脊椎動物如青蛙的神經系統還要小。 

自從引入隱藏單元,人工神經網路的大小大約每 2.4 年翻一倍,按照現在的發展速度,大概要到2050年左右才能達到人類大腦的神經元數量的規模。

0?wx_fmt=png

損失函式  

怎麼判斷一個模型訓練的好壞呢?我們需要一個評價指標(也就是KPI考核指標),也就是損失函式。  習大大教導我們不忘初心 ,那我們最初的目標是什麼?是建立輸入輸出的對映關係。 

 比如我們的目標是判斷一張圖片上是隻貓,還是一棵樹。那這張圖片上所有的畫素點就是輸入,而判斷結果就是輸出。  

那怎麼表徵這個模型的好壞呢?很簡單,大家應該很容易想到,就是把模型輸出的答案和正確答案做一下比對,看一下相差多少。 

我們一般用下面這個公式(平均平方誤差,即MSE)來評估我們的模型好壞。

0?wx_fmt=png

我們就是通過對比輸出結果與預期結果的差異,其中帶帽子的yu就是預期的結果(也就是標籤值,即是真值),而前面的不帶帽子的yu就是實際的輸出結果。當訓練結果非常好的時候,比如說是全對的時候,平均誤差就是0。當訓練結果非常差的時候,比如說全錯的時候,誤差即為1。

於是我們知道了,這個E越小越好,最好變成0.  大家注意下,這個求和的標識,表示是所有的資料的和,而不是一個的數值。我們常說大資料來訓練模型,其實這就是大資料。我們訓練的時候需要上百萬張的圖片,最終得出來的誤差,就是這裡,然後再除以數量,取平均值。 

 那怎麼去降低這個誤差呢?要回答這個問題,就涉及到卷積神經網路的核心思想了,也就是反向傳播。

反向傳播/梯度下降 

既然講到機器學習,那當然是讓機器自己去通過資料去學習,那機器是如何進行自學習的呢?下面就要敲黑板,劃重點了,因為這就是深度學習的重中之重了,也就是機器學習的核心了,理解了這個概念,基本上就理解了一多半了。  

這個概念就是反向傳播。聽名字比較玄乎,其實這個概念大家在高等數學裡都接觸過這個概念了——梯度,其實也就是求導。  

對於一維函式而言,函式梯度下降的方向就是導數的反方向。

0?wx_fmt=png

對於二維函式而言,就是把誤差對每個變數求偏導,偏導的反方向即為梯度下降的方向。

0?wx_fmt=png

說起來有點抽象,我們舉個例項來說明一下。  

下面是我們的引數和損失函式的值。

0?wx_fmt=png

我們先對第一個引數加一個極小值,算出新的損失函式。

0?wx_fmt=png

然後用損失函式的變化去除這個極小值,就是這個引數的梯度了。

0?wx_fmt=png

同樣我們可以使用同樣的方法去求得其他引數的梯度。

0?wx_fmt=png

0?wx_fmt=png

只要找到梯度下降的方向,按照方向去優化這些引數就好了。這個概念就是梯度下降。  

但是我們知道,我們要訓練的引數非常多,資料量也非常大,經常是百萬、千萬量級的,如果每次都把全部訓練資料都重新計算一遍,計算損失函式,然後再反向傳播,計算梯度,這樣下去,模型的誤差優化的非常非常慢。  那有沒有更快的方法呢?  當然有了。  

這些引數(weights),數量非常多,大概有上百萬個,為了保證能夠更好、更快的計算,節省算力,一般選用隨機梯度下降方法,隨機抽取一定數量(即為批量,batch)的樣本,去計算梯度值,一般選擇32/64/128。

0?wx_fmt=png

這個方法就是隨機梯度下降,這個批量(batch)這也是大家經常要調的引數。  我們可以這樣理解隨機梯度下降,其核心思想是,梯度是期望。期望可使用小規模的樣本近似估計。

具體而言,在演算法的每一步,我們從訓練集中均勻抽出小批量樣本來代替全部資料的梯度,因為其梯度期望是一致的。  

值得一提是:這些batch中的樣本,必須是隨機抽取的,否則其期望就準確了。選的批量(batch)的值越小,進行一次引數優化的計算量越小,就越快,但是其隨機性會比較大一些,如果選取的批量值比較大,則計算會稍微慢一些,但是隨機性會小一些,這是我們需要權衡的。  

前向計算一次,反向反饋一下,更新一下引數,叫做一個Epoch.  Epoch的次數也是個超引數,也是需要搭建模型的時候可以調整的引數。

0?wx_fmt=png

在整個模型中也是類似的。

0?wx_fmt=png

簡單總結下,截止到目前,我們已經瞭解了一些深度學習的基本概念,比如什麼是卷積神經網路,瞭解了反向傳播的傳播的概念,如何梯度下降的方法去優化誤差。  

基本上深度學習是什麼回事,大家已經知道了,但是深度學習還需要注意一些細節。有句話說的好,細節就是魔鬼,細節處理的好壞很大程度上決定了你是一個高手,還是一個菜鳥。

明天我們說說深度學習高手進階篇,希望您繼續關注與閱讀!