深度學習-反向傳播

  終於明白了反向傳播的意義。
  核心要明白一個概念就是求導就是要經過構建的正向鏈,而後再經過反向鏈求導數值。
  爲何要求導數值?由於要求最小值。求什麼最小值?
  求的是損失函數的最小值,能夠經過數值方式(倒數公式)來進行求導,也能夠通反向傳播的方式來求導。
  爲何要求損失函數的極值?
  由於要經過損失函數的極值來推斷出來W值。咱們的終極目標實際上是要求出W的最優質,這個最優質就是實現損失函數最小,爲了求最小,因此咱們要求損失函數的導數。
  可是有一點強調一下:求導數必定是某組數據的導數,或者說空間的某一個點的導數,離開具體的點來說導數沒有意義;因此導數的求解其實真實某個樣本(空間一點)來求導;由於每一個點的導數都是指向降速最快的地方,因此若是參數在迭代過程當中每次都是向每一個點的法向(可是什麼是法向,等高線又是怎麼回事),總體就是向最優解方向走。可是,有一點要注意,爲了求損失函數的,而逆向求導不是損失函數(公式)自己的逆向,而是從神經網絡隱藏層到loss層。
  下面是gradient的代碼:網絡

 1  def gradient(self, x, t):
 2         # 構建正向鏈,自己,咱們是要對loss函數求導,因此這裏先構建一下正向鏈
 3         self.loss(x, t)
 4         # 輸出層(softmax)求導
 5         dout = 1
 6         dout = self.lastlayer.backward(dout)
 7         # 隱藏層求導
 8         layers = list(self.layers.values())
 9         layers.reverse()
10         for layer in layers:
11             dout = layer.backward(dout)
12         grads = {}
13         for idx in range(1, self.hidden_layer_size + 2):
14             grads["W" + str(idx)] = self.layers["Affine" + str(idx)].dW + self.weight_decay_lambda * self.layers["Affine" + str(idx)].W
15             grads["b" + str(idx)] = self.layers["Affine" + str(idx)].db
16 
17         return grads

  這裏注意首先調用loss函數目的是爲了先正向構建loss函數路徑,這個路徑包括x層通過的各個層(包括Affine層,Relu層等),最後纔到來softmaxloss層,這個層裏面是cross_entropy函數;注意:反向不是cross_entropy的函數的反向,而是從softmaxloss到relu到Affine,這個層之間的反向,你經過空間一點(x)正向走完了以後,反向再走一遍就能夠求出來cross_entropy的導數。
這裏包括下面的是loss函數的實現:函數

1     def loss(self, x, t):
2         y = self.predict(x)
3         weigh_decay = 0
4         # 注意這裏+2,是由於還要把lastLayer也給加上
5         for idx in range(1, self.hidden_layer_size+2):
6             W = self.params["W" + str(idx)]
7             weigh_decay += 0.5 * self.weight_decay_lambda * np.sum(W ** 2)
8 
9         return self.lastlayer.forward(y, t) + weigh_decay

   最後一個問題,爲何要有Relu層呢?由於若是都是Affine層的話,訓練出來的是線性函數,可是不少場景都是曲線,非線性分佈,這個時候就須要爲神經網絡的學習增長一下非線性的層,來實現對於數據的擬合。學習

相關文章
相關標籤/搜索