梯度檢驗和隨機的初始引數

2021-08-15 08:56:22 字數 1736 閱讀 8142

1 梯度檢驗

寫了這麼多篇筆記,我發現反向傳播演算法是目前來說,我了解到最複雜的演算法。

為了完整地理解演算法,我還複習了導數方面的功課,花了不少時間。

這個演算法,有太多的細節,實現起來非常容易出錯。

有時候,你使用梯度下降演算法進行迭代,雖然每次代價函式 j(θ) 的值都在下降,但最終得到的結果卻又有很大的誤差,這很可能**中依然存在一些問題。

對於這樣的情況,應該怎麼處理呢?

有乙個叫梯度檢驗(gradient checking)的方法,可以減少這種錯誤的概率。

那麼梯度檢驗到底是什麼呢?

我們求的梯度,就是乙個曲線的導數。

直觀點,我們可以看看下圖這樣乙個二階模型:

在這裡,導數就是圖中紅色切線的斜率。

以切點為中心,自變數分別增減乙個ε,那麼代價函式對應的就是 j(θ+ε) 和 j(θ-ε)。

兩個點連線得到的綠色直線,其斜率應該和紅色切線斜率是相近的:

因為根據導數的定義:

x 接近於0的時候,得到的 f'(x0) 就是導數。

所以,當 ε 無限小的時候,綠色的直線就是切線。

當然,如果 ε 取值太小的話,計算時可能會存在問題。

一般來說, ε = 10-4 會比較合適。

上面所說的是乙個引數的情況,如果對於很多引數 θ1,θ2,θ3,…,θn ,我們就需要對每個 θ 進行計算:

最終我們求得的計算得到的結果,應該和演算法求得的導數是相近的。

通過這樣的方法進行檢驗,你對自己的模型就能更有信心。

由於這個計算,不是向量化的計算,而是數位化的計算,在迭代的過程中,會非常慢。

如果我們經過檢查,確認實現的演算法沒有問題,那麼記得要把梯度檢驗(gradient checking)關閉掉,否則我們會極大地影響計算速度。

2 隨機初始化

我們對引數 θ 的初始化,一般來說,都是全部設定為 0 ,或者全部設定為 1 。

但這對於神經網路來說,會存在問題。

因為實現邏輯的關鍵,就在於引數的選擇上。

同樣節點的神經網路模型,引數的不一致,實現的效果就不一樣,例如 y = x1 and x2 :

和 y = x1 or x2 :

還記得前面《神經網路演算法》為了實現前面將藍圈和紅叉區分開來,我們對於 y = x1 xnor x2 的實現麼?

如果我們將初始的引數全部都設定為 0 或者 1 ,因為特徵完全相同,引數也完全相同,對於下乙個單元而言,每乙個結果是一樣的。

對於每乙個訓練資料,都有:

這樣的話,得到的結果同步變化,多個神經單元其實只是相當於乙個神經單元。

這不是我們想要的結果,所以我們需要設定隨機的初始引數。

梯度下降 隨機梯度下降和批量梯度下降

對比梯度下降和隨機梯度下降和批量梯度下降 之前看的知識比較零散,沒有乙個系統的解釋說明,看了一些網上的博主的分析,總結了一下自己的理解。例子這裡我參照其他博主的例子做了一些修改,首先是梯度下降 coding utf 8 import random this is a sample to simula...

筆記 隨機梯度下降引數求解實現

隨機梯度下降 描述 每次選取乙個樣本參與梯度計算 場景 一元線性回歸 import numpy as np np.random.seed 1 x 2 np.random.rand 100,1 y 4 3 np.random.randn 100,1 x np.c np.ones 100,1 x m 1...

梯度下降法和隨機梯度下降法

批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...