深度學習(3)--反向傳播算法

      由上一節的內容中我們知道了隨機梯度下降算法,我們通過下面兩個公式來進行更新,最重要的就是對兩個變量weights和biases的更新,我們通過backpropagation來計算偏導數。

                 

 Backpropagation算法

     通過迭代性的來處理訓練集中的實例

     對比經過神經網絡後輸入層預測值(predicted value)與真實值(target value)之間

     反方向(從輸出層=>隱藏層=>輸入層)來以最小化誤差(error)來更新每個連接的權重(weight)

     算法詳細介紹

           輸入:D:數據集,l 學習率(learning rate),一個多層前向神經網絡

           輸入:一個訓練好的神經網絡(a trained neural network)

           1 初始化權重(weights)和偏向(bias): 隨機初始化在-1到1之間,或者-0.5到0.5之間,每個單元有一個偏向

           2 對於每一個訓練實例X,執行以下步驟:

              2.1:由輸入層向前傳送

                                       

                                                                                                           

            2.2 根據誤差(error)反向傳送

                      對於輸出層:

                      對於隱藏層:

                      權重更新: 

                                             

                      偏向更新 :

                                            

          3 終止條件

                  3.1 權重的更新低於某個閾值

                  3.2 預測的錯誤率低於某個閾值

                  3.3 達到預設一定的循環次數

   

 Backpropagation 算法舉例

          

代碼實現

    def back(self,x,y):

        nabla_b = [np.zeros(b.shape) for b in self.biases] #隨機梯度下降算法,用於存儲我們指定的minibatch中的數據的bias的總和
        nabla_w = [np.zeros(w.shape) for w in self.weights]

        activation =x #第一層的激活值一般就是輸入值,或者通過數據增強後的輸入值
        activations = [x]
        zs = [] #存儲中間結果,待激活值
        for w,b in zip(self.weights,self.biases):
           # print w.shape,b.shape
            z = np.dot(w,activation)+b
            zs.append(z)
            activation = sigmoid(z)
            activations.append(activation)
        delta = cost(activations[-1],y)*sigmoid_prime(zs[-1])
        nabla_b[-1] = delta
        #delta 目前可能是10*1 的向量,而activation[-2]可能是784*1 無法直接點乘 需要轉置後者 最終是10個784維向量 內部相加輸出 10*1
        nabla_w[-1] = np.dot(delta,activations[-2].transpose())
        for l in range(2,self.layers):
            delta = np.dot(self.weights[-l+1].transpose(),delta)*sigmoid_prime(zs[-l])
            nabla_b[-l] =delta
            nabla_w[-l] = np.dot(delta,activations[-l-1].transpose())
        return (nabla_b,nabla_w)

  堅持一件事或許很難,但堅持下來一定很酷^_^!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章