學習率 一塔 就是每次挪動中的步長。一塔通常來說給乙個比較小的值會更好一些。
步子太大會導致邁過谷底。
而由於偏導數方向的改變。你再次挪動又會向著谷底的方向挪動。
只是由於步子還是很大,還是會邁過谷底。這樣就會像上圖一樣來回折返。
到底設定為多少,是要根據自己的專案進行判斷的。但是小一點的值總是要好一點的。
收斂的比較慢,但是可以使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類的初始化時我們可以定義乙個損失函式。
增加乙個cost引數。def __init__(self, sizes, cost=crossentropycost):
# 損失函式
self.cost = cost
定義乙個二次cost的類
通過staticmethod裝飾器,可以直接通過類名.方法名呼叫(不要例項化:quadraticcost.fn)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)
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這個類
接著我們要將反向更新的**進行修改:
使用self.cost函式來替換掉我們之前寫死的二次損失函式。# 反向更新了
# 計算最後一層的誤差
delta = (self.cost).delta(zs[-1], activations[-1], y)
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兩個引數,事實上,網路的每條連線線上都有乙個權重引數,如何有效的修...