1. 程式人生 > >【深度學習】全面直觀認識深度神經網路

【深度學習】全面直觀認識深度神經網路

01深度學習的精準定義

 一類通過多層非線性變換對高複雜性資料建模演算法的集合。它的兩個非常重要的特徵是多層性和非線性。俗稱多層非線性變換。所以深度學習要去線性化。

為什麼呢?因為線性模型存在侷限性,任意線性模型得到組合仍然還是線性模型。所以只要通過線性變換,任意層的全連線神經網路和單層神經網路模型的表達能力沒有任何區別,而且他們都是線性模型,線性模型解決問題的能力是有限的。

02啟用函式實現去線性化

        每個神經元(也就是神經網路上的節點)的輸出通過一個非線性函式,那麼整個神經網路的模型也就不再是線性的了,這個非線性函式就是啟用函式。

tensorflow常見的啟用函式有:

tf.nn.relu
tf.sigmoid
tf.tanh

tensorflow 也支援自定義啟用函式。

帶啟用函式的前向傳播演算法:

a = tf.nn.relu(tf.matmul(x, w1) + biases1)
y = tf.nn.relu(tf.matmul(a, w2) + biases2)

03單層神經網路解決不了的問題

事實上,一個單極網路可以將平面劃分為兩部分,用多個單極網路組合在一起,並用其中的一個區綜合其他單極網路的結果,就可以構造出一個兩極神經網路。

04組合特徵提取

深度神經網路具有組合特徵提取的功能,這個特徵對於不易提取特徵向量的問題(比如圖片識別和語音識別等)有很大的幫助。隱藏層的主要作用也就是隱藏層節點可以被認為代表了從輸入特徵中抽取更高緯度的特徵。

05損失函式

損失函式用於評價模型的效果。分類問題使用最廣泛的損失函式是交叉熵。

交叉熵:

        刻畫兩個概率分佈的距離,也就是說交叉熵越小兩個概率分佈越接近。

交叉熵的數學定義是:

        其用來衡量在給定真實分佈下,使用非真實分佈所指定的策略消除系統不確定性所需付出的努力的大小。

神經網路的輸出不一定是概率模型,可以使用Softmat迴歸將神經網路的前向傳播的結果變成概率分佈。

程式碼例項:

cross_entropy = -tf.reduce_mean(
        y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)

        但是交叉熵一般會和softmax迴歸一起使用,所以會使用tf.nn.softm

cross_entropy=
    tf.nn.softmax_cross_entropy_with_logits(y,y_)

y代表原始神經網路的輸出結果,而y_給出了標準答案。

在只有一個正確答案的分類問題中,Tensorflow提供了函式:

tf.nn.sparse_softmax_cross_entropy_with_logits

來加快計算過程。

 迴歸問題常用的損失函式是均方誤差。均方誤差是指各資料偏離真實值的距離平方和的平均數。

06神經網路的優化演算法

梯度下降演算法主要用於優化單個引數的取值,而反向傳播演算法則給出了一個高效的方式在所有引數上使用梯度下降演算法,從而使神經網路模型在訓練資料集上的損失函式儘可能的小。

反向傳播演算法是訓練神經網路的核心演算法。它可以根據定義好的損失函式優化神經網路中引數的取值,從而使神經網路模型在訓練資料集上的損失函式達到一個較小的值。

神經網路模型中引數的優化過程直接決定了模型的質量。

07什麼是梯度和學習率

梯度:

由導數的概念,對點x0的導數反應了函式在點x0出的瞬時變化速率,或者叫做點x0出的斜度。推廣到多維函式中,就有了梯度的概念,梯度是一個向量的組合,反應了多維圖形中變化速率最快的反向。

學習率:

每次引數移動的幅度。

08神經網路的優化過程

神經網路的優化過程分為兩個階段:

        1、先通過神經網路的前向傳播演算法計算得到預測值,並將預測值和真實值做對比得出兩者之間的差距。

        2、通過反向傳播演算法計算損失函式對每個引數的梯度,再根據梯度和學習率使用梯度下降演算法更新每一個引數。

        梯度下降演算法並不能保證被優化的函式達到全域性最優解,可能只得到區域性最優解,只有損失函式是凸函式才能保證達到全域性最優解

        結合梯度下降演算法和隨機梯度下降演算法的優缺點,這裡採用一小部分資料(batch)來進行梯度下降,所以神經網路的訓練過程大致如下:

09學習率的設定

在訓練神經網路時,需要設定學習率控制引數更新的速度,學習率決定引數每次更新的幅度,如果幅度過大,可能導致引數在極優值的兩側來回移動,如果幅度過小,雖然能保證收斂性,但是會大大降低優化速度。所以學習率不能過大也不能過小。

指數衰減法設定學習率:

tf.train.exponential_decay()

實現了指數衰減學習率,通過這個函式,可以先使用較大的學習率快速得到一個比較優的解,然後隨著迭代的繼續逐步減小學習率,使得模型訓練後期更加穩定。例項程式碼:

上述程式碼設定了初始的學習率為0.1,因為指定了staircase=True,所以每次訓練100輪後學習率乘以0.96。

10過擬合問題

舉幾個例子:

        1、過擬合就是你想多了,欠擬合就是你太天真。

        2、中國著名電腦科學家,中國機器學習之父,被業內尊稱為中國圖靈的魯迅先生曾經描述過一個名為「中國人」的機器學習演算法,在影象識別上嚴重的過擬合問題。其原文如下:

        一見短袖子,立刻想到白臂膊,立刻想到全裸體,立刻想到生殖器,立刻想到性交,立刻想到雜交,立刻想到私生子。中國人的想像惟在這一層能夠如此躍進。《而已集·小雜感》

        3、遇到幾個渣男就得出結論“男人沒一個好東西”。

        4、舉個物理學上的段子(轉自他人博文),費米的話就是一個非常直觀的理解:

        1953年春天,戴森和自己的學生利用贗標介子理論計算了介子與質子的散射截面,得到了與費米的實驗觀測值十分相符的結果。然而該理論需要4個自由引數,費米很不屑,講了一句日後很著名的話:“我記得我的朋友約翰·馮·諾依曼(John von Neumann)曾經說過,用四個引數我可以擬合出一頭大象,而用五個引數我可以讓它的鼻子擺動。”

        有趣的是,2010年6月,尤根·邁爾(Jurgen Mayer)等三位德國分子生物學家在《美國物理學期刊》(American Journal of Physics)發表了題為“用四個復引數畫出一頭大象”的論文。他們發現,利用四個復引數可以大致勾勒出大象的形態,再引入一個復引數則可以讓大象的鼻子擺動起來。

        5、直觀圖:

過擬合:

        當一個模型過為複雜之後,它可以很好的“記憶”每一個訓練集上的隨機噪聲的部分而忘記要去“學習”訓練資料中通用的趨勢。

過擬合主要有兩個原因造成:資料太少+模型太複雜

奧斯姆剃刀:

        這個原理稱為“如無必要,勿增實體”,即“簡單有效原理”。正如他在《箴言書注》2卷15題說“切勿浪費較多東西去做,用較少的東西,同樣可以做好的事情。”

解決過擬合問題:

        增加資料,減少特徵(特徵提取),交叉驗證,正則化。

正則化:

        避免過擬合問題最常用的方法,它的思想是在損失函式中加入刻畫模型複雜度的指標。

        一般來說模型的複雜度由權重w決定,刻畫模型複雜度的函式R(w)有兩種,L1正則化和L2正則化。

        L1:R(w)=∑∣Wi∣;L2:R(w)=∑(∣Wi∣*∣Wi∣)

L1和L2正則化的差別很大:

        L1正則化會讓引數變得更加稀疏,達到類似特徵提取的功能,以及不可導,但是L2則相反。

11滑動平均模型

        在採用隨機梯度下降演算法訓練神經網路時,使用 tf.train.ExponentialMovingAverage 滑動平均操作的意義在於提高模型在測試資料上的健壯性(robustness)。

tf.train.ExponentialMovingAverage需要提供一個衰減率(decay)。該衰減率用於控制模型更新的速度。該衰減率用於控制模型更新的速度。

        ExponentialMovingAverage 對每一個(待更新訓練學習的)變數(variable)都會維護一個影子變數(shadow variable)。影子變數的初始值就是這個變數的初始值。

shadow_variable=

    decay×shadow_variable+(1−decay)×variable

        由上述公式可知, decay 控制著模型更新的速度,越大越趨於穩定。實際運用中,decay 一般會設定為十分接近 1 的常數(0.99或0.999)。所有需要計算滑動平均的變數必須是實數型。

程式碼示例: