神經網絡多分類原理與反向傳播原理

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度學習實戰(不定時更新)


7.2 神經網絡多分類原理與反向傳播原理

學習目標

  • 目標
    • 說明神經網絡的softmax以及分類損失計算公式
    • 知道淺層神經網絡的前向計算過程
    • 知道選擇激活函數的原因
    • 說明淺層網絡的反向傳播推導過程
    • 知道導數、導數計算圖
    • 掌握鏈式法則、邏輯迴歸的梯度下降優化
    • 瞭解淺層神經網絡的前向計算(傳播)與反向計算過程
  • 應用

7.2.1 神經網絡計算輸出

假設有這樣一個網絡,我們根據設置的神經元個數以及權重來計算輸出:

我們假設中間都是使用sigmoid激活函數,運算的表示爲:

神經網絡解決多分類問題最常用的方法是設置n個輸出節點,其中n爲類別的個數。

任意事件發生的概率都在0和1之間,且總有某一個事件發生(概率的和爲1)。如果將分類問題中“一個樣例屬於某一個類別”看成一個概率事件,那麼訓練數據的正確答案就符合一個概率分佈。如何將神經網絡前向傳播得到的結果也變成概率分佈呢?Softmax迴歸就是一個常用的方法。

神經網絡是如何去進行訓練優化的呢,首先得知道神經網絡分類的損失函數?

7.2.3 softmax迴歸

Softmax迴歸將神經網絡輸出轉換成概率結果

這樣就把神經網絡的輸出也變成了一個概率輸出

那麼如何去衡量神經網絡預測的概率分佈和真實答案的概率分佈之間的距離?

7.2.4 交叉熵損失

7.2.4.1 公式

它的損失如何計算?

0log(0.10)+0log(0.05)+0log(0.15)+0log(0.10)+0log(0.05)+0log(0.20)+1log(0.10)+0log(0.05)+0log(0.10)+0log(0.10)

上述的結果爲1log(0.10),那麼爲了減少這一個樣本的損失。神經網絡應該怎麼做?所以會提高對應目標值爲1的位置輸出概率大小,由於softmax公式影響,其它的概率必定會減少。只要這樣進行調整這樣是不是就預測成功了!!!!!

7.2.5 梯度下降算法

目的:使損失函數的值找到最小值

方式:梯度下降

函數的梯度(gradient)指出了函數的最陡增長方向。梯度的方向走,函數增長得就越快。那麼按梯度的負方向走,函數值自然就降低得最快了。模型的訓練目標即是尋找合適的 w 與 b 以最小化代價函數值。假設 w 與 b 都是一維實數,那麼可以得到如下的 J 關於 w 與 b 的圖:

7.2.6 反向傳播算法

反向傳播是訓練神經網絡最重要的算法,可以這麼說,沒有反向傳播算法就沒有深度學習的今天。但是反向傳播算法設計一大堆數據公式概念。所以我們先帶大家複習回顧一下之前機器學習中迴歸算法的常見優化方式。會先得到假設函數和代價函數,然後使用梯度下降算法求出代價函數的最小值,最後得到最優參數

  • 導數、導數計算圖
  • 鏈式法則、邏輯迴歸的梯度下降優化、向量化編程
  • 淺層神經網絡的前向計算(傳播)與反向計算過程

導數

理解梯度下降的過程之後,我們通過例子來說明梯度下降在計算導數意義或者說這個導數的意義。

7.2.6.1 導數

導數也可以理解成某一點處的斜率。斜率這個詞更直觀一些。

  • 各點處的導數值一樣

例:取一點爲a=2,那麼y的值爲4,我們稍微增加a的值爲a=2.001,那麼y的值約等於4.004(4.004001),也就是當a增加了0.001,隨後y增加了4倍

取一點爲a=5,那麼y的值爲25,我們稍微增加a的值爲a=5.001,那麼y的值約等於25.01(25.010001),也就是當a增加了0.001,隨後y增加了10倍

可以得出該函數的導數2爲2a。

  • 更多函數的導數結果

7.2.6.2 導數計算圖

7.2.6.3 鏈式法則

7.2.6.4 邏輯迴歸的梯度下降

邏輯迴歸的梯度下降過程計算圖,首先從前往後的計算圖得出如下。

7.2.7 向量化編程

每更新一次梯度時候,在訓練期間我們會擁有m個樣本,那麼這樣每個樣本提供進去都可以做一個梯度下降計算。所以我們要去做在所有樣本上的計算結果、梯度等操作

7.2.7.1 向量化優勢

什麼是向量化

import numpy as np
import time
a = np.random.rand(100000)
b = np.random.rand(100000)
  • 第一種方法
# 第一種for 循環
c = 0
start = time.time()
for i in range(100000):
    c += a[i]*b[i]
end = time.time()

print("計算所用時間%s " % str(1000*(end-start)) + "ms")
  • 第二種向量化方式使用np.dot
# 向量化運算
start = time.time()
c = np.dot(a, b)
end = time.time()
print("計算所用時間%s " % str(1000*(end-start)) + "ms")

Numpy能夠充分的利用並行化,Numpy當中提供了很多函數使用

函數 作用
np.ones or np.zeros 全爲1或者0的矩陣
np.exp 指數計算
np.log 對數計算
np.abs 絕對值計算

所以上述的m個樣本的梯度更新過程,就是去除掉for循環。原本這樣的計算

7.2.7.2 向量化反向傳播實現僞代碼

  • 思路

這相當於一次使用了M個樣本的所有特徵值與目標值,那我們知道如果想多次迭代,使得這M個樣本重複若干次計算。

總結:前面我們所做的整個過程分爲兩個部分,一個是從前往後的計算出梯度與損失,另外一部分是從後往前計算參數的更新梯度值。所以在神經網絡當中會經常出現兩個概念,正向傳播與反向傳播。

7.2.8 淺層神經網絡的前向傳播與反向傳播

淺層神經網絡表示

之前已經說過神經網絡的結構了,在這不重複敘述。假設我們有如下結構的網絡

對於這個網絡我們建立一個簡單的圖示?我們對第一個隱藏層記爲[1],輸出層爲[2]。如下圖

計算圖如下

激活函數的前向傳播和反向傳播(瞭解)

將上述網絡的隱層激活函數修改爲tanh,最後一層同樣還是二分類,所以激活函數選擇依然是sigmoid函數

  • 前向傳播

  • 反向梯度下降

那麼通過這個計算圖來理解這個過程,單個樣本的導數推導過程:

由於網絡已經存在兩層,所以我們需要從後往前得到導數結果,並且多個樣本的情況下改寫成

7.2.9 激活函數的選擇

涉及到網絡的優化時候,會有不同的激活函數選擇有一個問題是神經網絡的隱藏層和輸出單元用什麼激活函數。之前我們都是選用 sigmoid 函數,但有時其他函數的效果會好得多,大多數通過實踐得來,沒有很好的解釋性。

可供選用的激活函數有:

  • tanh 函數(the hyperbolic tangent function,雙曲正切函數):

效果比 sigmoid 函數好,因爲函數輸出介於 -1 和 1 之間。

注 :tanh 函數存在和 sigmoid 函數一樣的缺點:當 z 趨緊無窮大(或無窮小),導數的梯度(即函數的斜率)就趨緊於 0,這使得梯度算法的速度會減慢。

  • ReLU 函數(the rectified linear unit,修正線性單元)

當 z > 0 時,梯度始終爲 1,從而提高神經網絡基於梯度算法的運算速度,收斂速度遠大於 sigmoid 和 tanh。然而當 z < 0 時,梯度一直爲 0,但是實際的運用中,該缺陷的影響不是很大。

  • Leaky ReLU(帶泄漏的 ReLU):

Leaky ReLU 保證在 z < 0 的時候,梯度仍然不爲 0。理論上來說,Leaky ReLU 有 ReLU 的所有優點,但在實際操作中沒有證明總是好於 ReLU,因此不常用。

7.2.9.1 爲什麼需要非線性的激活函數

使用線性激活函數和不使用激活函數、直接使用 Logistic 迴歸沒有區別,那麼無論神經網絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,就成了最原始的感知器了。

7.2.10 總結

  • 神經網絡分類原理、損失
  • 知道選擇激活函數的原因
  • 說明淺層網絡的反向傳播推導過程
  • 知道導數、導數計算圖
  • 掌握鏈式法則、邏輯迴歸的梯度下降優化
  • 瞭解淺層神經網絡的前向計算(傳播)與反向計算過程

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章