梯度下降法與反向傳播


一、梯度下降法

1.什么是梯度下降法

順着梯度下滑,找到最陡的方向,邁一小步,然后再找當前位,置最陡的下山方向,再邁一小步…

  

 

通過比較以上兩個圖,可以會發現,由於初始值的不同,會得到兩個不同的極小值,所以權重初始值的設定也是十分重要的,通常的把W全部設置為0很容易掉到局部最優解,一般可以按照高斯分布的方式分配初始值。

 2.有兩種計算梯度的方法

(1)慢一些但是簡單一些的數值梯度/numerical gradient

對每個維度,都在原始值上加上一個很小的h,然后計算這個維度/方向上的偏導,最后組在一起得到梯度grad。

 

#encoding:utf-8
import numpy as np
def eval_numeriical(f,x):
    """"計算x上f的梯度算法,x是一個vector,f為參數為x的函數"""
    fx=f(x)
    grad=np.zero(x.shape)
    h=0.00001
    #對x的每個維度都計算一遍
    it=np.nditer(x,flags=['multi_index'],op_flags=['readwrite'])
    while not it.finished:
        #計算x+h處的函數值
        ix=it.multi_index
        old_value=x[ix]
        x[ix]=old_value+h
        fxh=f(x)
        x[ix]=old_value
        #計算偏導數
        grad[ix]=(fxh-fx)/h
        it.iternext()
return grad

 

 關於迭代的步長:1)步子邁得太小,時間耗不起。  2)步子邁得太大,容易跳過最小值,可能找不到最優點

 

(2) 速度快但是更容易出錯的解析梯度/analytic gradient

解析法計算梯度:速度非常快,但是容易出錯(反倒之前的數值法就顯出優勢),我們可以先計算解析梯度和數值梯度,然后比對結果和校正,然后就可以大膽地進行解析法計算了(這個過程叫做梯度檢查/檢測)

舉例:一個樣本點的SVM損失函數:

求偏導:

這個求偏導的意思是:當括號里的l是個布爾函數,表示如果括號里的表達式成立的話就是1,不成立的話就是0.

 3.這個簡單的循環就是很多神經網絡庫的核心

 

4.什么是Mini-batch,以及其作用

Mini-batch就是從所有的訓練樣本中抽出一部分來訓練,被抽出的訓練樣本就是Mini-batch。

對整個訓練數據集的樣本都算一遍損失函數,以完成參數迭代是一件非常耗時的事情,一個我們通常會用到的替代方法是,采樣出一個子集在其上計算梯度。

 

二、反向傳播

簡單來說就是高數中得鏈式法則。

 比如函數f(x,y,z)=(x+y)*z

Sigmoid例子

函數:                

 

 Sigmoid函數 的導數

 

具體算一下:

Sigmoid神經網絡的例子

 

(1)

(2)

(3)

(4)

以上為正向傳播的公式,(2)是對(1)的簡單縮寫,a=sigmod(z),c為cost損失函數,c對z的偏導為輸出層的誤差

              

損失函數要可導,第一個公式是求損失函數對於L層的神經元的偏導,為了更容易理解,不是對a求偏導,而是對z求偏導,其中a=sigmod(a)。也就是可以得出dc/dz,我們要求得dc/dw=dc/dz * dz/dw,而dz/dw就是a的值,最終推得第四個公式。

 

 

概括的一個描述

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM