6 深度學習之神經網路核心原理與演算法 學習率

2021-09-20 05:44:22 字數 3642 閱讀 8028

學習率 一塔 就是每次挪動中的步長。一塔通常來說給乙個比較小的值會更好一些。

步子太大會導致邁過谷底。

而由於偏導數方向的改變。你再次挪動又會向著谷底的方向挪動。

只是由於步子還是很大,還是會邁過谷底。這樣就會像上圖一樣來回折返。

到底設定為多少,是要根據自己的專案進行判斷的。但是小一點的值總是要好一點的。

收斂的比較慢,但是可以使loss的值下到谷底。

每次訓練隨機丟棄一些神經元,就相當於整個網路結構發生變化

減少過擬合風險

在某些層上臨時關閉一些節點,讓他們不輸入也不輸出。原則上選擇關閉哪些節點都是隨機性的。

在分類階段,將所有的節點都置於有效的狀態

就可以把訓練中得到的子網路併聯起來使用。

學習慢有時候我們使用相同的學習率,初始化不同的w和b,開始學習的變化率會很慢。

網路在開始學習的時候,整個loss下降的很慢。

舉例: 使用梯度下降法來計算w和b, 來看看它是如何學習的

w=0.6 b=0.9 x=1.0 y=0.82 學習率=0.15

簡化後的網路。

我們的w和b在不斷的變化,我們的cost在不斷的下降。

w=2.0 b=2.0 x=1.0 y=0.2 學習率=0.15

可以看到網路的訓練開始學習的很慢。w和b的變化很慢。

複雜的神經網路學習很慢。

原因: 其實就是因為偏導很小造成的。

也就是圖中某一點的斜率幾乎水平了。

為什麼偏導很小,導致學習很慢。

回顧一下之前的網路更新方程。

最後一層的偏loss/偏b 等於 **出來的結果減去網路的標籤。點乘於sigmoid的導數。

這裡的y0 yi都是乙個定值。sigmoid在z 小於-4 或大於4.水平。斜率為0.

想要讓網路學習快一點,也就是偏導大一些。我們就要增大sigmoid函式的導數值。

之前我們都是使用二次cost來定義我們網路的損失函式。這裡我們可以使用交叉熵來定義我們網路的損失函式。

我們可以重新推導一遍偏loss偏w和偏loss偏b的值。

如果使用交叉熵函式,而不使用二次損失函式。

可以看到最終的公式裡就沒有sigmoid的導數這一項了。同樣的方法我們也可以推導出偏loss/偏b。(避免使用sigmoid的導數)

這裡的x,n,y都是定製。sigmoid(z)是網路的**結果。如果網路的**結果和真實結果接近的話,整個網路的loss值就會減小。

如果偏差比較大的話,loss的值也會因為偏導較大而減小。

可以看到情況1中loss一直隨著訓練輪數增加而下降。

情況2不再出現學習很慢的情況。

如何在**裡面新增交叉熵(cross entropy)

network類的初始化時我們可以定義乙個損失函式。

def __init__(self, sizes, cost=crossentropycost):

# 損失函式

self.cost = cost

增加乙個cost引數。

定義乙個二次cost的類

class quadraticcost(object):

@staticmethod

def fn(a, y):

return 0.5 * np.linalg.norm(a -y) ** 2

@staticmethod

def delta(z, a, y):

return (a - y) * sigmoid_prime(z)

通過staticmethod裝飾器,可以直接通過類名.方法名呼叫(不要例項化:quadraticcost.fn)

fn裡面a是網路**結果,y是真實的標籤。我們返回二次cost函式。

1/2 乘以 (**值-真實值)的二範數 的平方。

再定義另乙個delta方法,輸入引數為z,**值a,真實值y

返回(誤差) 乘以 sigmoid(z)

這時候再定義交叉熵的類。

class crossentropycost(object):

'''>>>import numpy as np

>>> a = np.array([[np.nan,np.inf],\

... [-np.nan,-np.inf]])

>>> a

array([[ nan, inf],

[ nan, -inf]])

>>> np.nan_to_num(a)

array([[ 0.00000000e+000, 1.79769313e+308],

[ 0.00000000e+000, -1.79769313e+308]])

'''@staticmethod

def fn(a, y):

return np.sum(np.nan_to_num(-y * np.log(a) - (1 - y) * np.log(1 - a)))

@staticmethod

def delta(z, a, y):

return (a - y)

交叉熵的方程:

因為在計算出來的數中可能存在無限大和nan值。所以我們通過nan_to_num方法將其進行處理。

網路初始化時,我們可以預設使用crossentropycost這個類

接著我們要將反向更新的**進行修改:

# 反向更新了

# 計算最後一層的誤差

delta = (self.cost).delta(zs[-1], activations[-1], y)

使用self.cost函式來替換掉我們之前寫死的二次損失函式。

10 深度學習之神經網路核心原理與演算法 卷積核

在滑動過程中提取特徵 卷積核的表示式 這個和普通線性分類器看起來是一樣的。這是乙個 5,5 一共25個畫素點的。每個畫素點只有兩個取值0或1 我們設定的卷積核的w和b 黃色部分是乙個 3,3 九個畫素的小方框。從左到右,從上到下的與w完成內積,最後再與b相加。前面是w和當前黃色視窗的9個值的內積。計...

深度學習之神經網路

神經網路由輸入層 隱藏層 輸出層組成 1 單層神經網路 感知機 類似邏輯回歸,線性分類,全連線 沒有啟用函式 2 兩層神經網路 多層感知機 帶乙個隱層,非線性分類,全連線 3 多層神經網路 深度學習 全連線 4 卷積神經網路 cnn 非全連線 5 迴圈神經網路 rnn 處理序列資料 作非線性變換 s...

機器學習之 神經網路演算法原理

神經網路 好了,前面花了不少篇幅來介紹啟用函式中那個暗藏玄機的e,下面可以正式介紹神經元的網路形式了。下圖是幾種比較常見的網路形式 前面講過,使用梯度下降的方法,要不斷的修改k b兩個引數值,使最終的誤差達到最小。神經網路可不只k b兩個引數,事實上,網路的每條連線線上都有乙個權重引數,如何有效的修...