簡體   English   中英

神經網絡訓練平穩時的梯度下降

[英]gradient descent in neural network training plateauing

我一直在嘗試在python中實現一個基本的back-propogation神經網絡,並完成了初始化和訓練權重集的編程。 然而,在我訓練的所有集合上,誤差(均方)總是收斂到一個奇怪的數字 - 錯誤總是在進一步的迭代中減少,但從未真正接近零。
任何幫助將非常感激。

import csv
import numpy as np

class NeuralNetwork:
layers = 0
shape = None
weights = []

layerIn = []
layerOut = []

def __init__(self, shape):
    self.shape = shape
    self.layers = len(shape) - 1

    for i in range(0,self.layers):
        n = shape[i]
        m = shape[i+1]
        self.weights.append(np.random.normal(scale=0.2, size = (m,n+1)))

def sgm(self, x):
    return 1/(1+np.exp(-x))

def dersgm(self, x):
    y = self.sgm(x)
    return y*(y-1)


def run(self, input):
    self.layerIn = []
    self.layerOut = []

    for i in range(self.layers):
        if i == 0:
            layer = self.weights[0].dot(np.vstack((input.transpose(), np.ones([1,input.shape[0]]))))
        else:
            layer = self.weights[i].dot(np.vstack((self.layerOut[-1], np.ones([1,input.shape[0]]))))
        self.layerIn.append(layer)
        self.layerOut.append(self.sgm(layer))

    return self.layerOut[-1].T

def backpropogate(self, input, y, learning_rate):
    deltas = []
    y_hat = self.run(input)

    #Calculate deltas
    for i in reversed(range(self.layers)):

        #for last layer
        if i == self.layers-1:
            error = y_hat - y
            msq_error = sum(.5 * ((error) ** 2))
            #returns delta, k rows for k inputs, m columns for m nodes
            deltas.append(error * self.dersgm(y_hat))
        else:

            error = deltas[-1].dot(self.weights[i+1][:,:-1])
            deltas.append(self.dersgm(self.layerOut[i]).T * error)

    #Calculate weight-deltas
    wdelta = []
    ordered_deltas = list(reversed(deltas)) #reverse order because created backwards

    #returns weight deltas, k rows for k nodes, m columns for m next layer nodes
    for i in range(self.layers):
        if i == 0:
            #add bias
            input_with_bias = np.vstack((input.T, np.ones(input.shape[0])))
            #some over n rows of deltas for n training examples to get one delta for all examples
            #for all nodes
            wdelta.append(ordered_deltas[i].T.dot(input_with_bias.T))
        else:
            with_bias = np.vstack((self.layerOut[i-1], np.ones(input.shape[0])))
            wdelta.append(ordered_deltas[i].T.dot(with_bias.T))



    #update_weights
    def update_weights(self, weight_deltas, learning_rate):
        for i in range(self.layers):
            self.weights[i] = self.weights[i] +\
                              (learning_rate * weight_deltas[i])


    update_weights(self, wdelta, learning_rate)

    return msq_error

    #end backpropogate

def train(self, input, target, lr, run_iter):
    for i in range(run_iter):
        if i % 100000 == 0:
            print self.backpropogate(input, target, lr)

以下場景中的誤差函數不能為0,因為誤差函數為0將要求點與曲線完美匹配。

數據擬合

擁有更多神經元肯定會減少誤差,因為該功能可以具有更復雜和精確的形狀。 但是,如果您對數據非常適合,則會出現稱為過度擬合的問題,如下圖所示。 從左到右,曲線要么不適合數據集,要么幾乎正確擬合,然后右邊的過度擬合。

不合適與過度擬合

右邊的場景會導致錯誤為0,但這不是必需的,你想避免這種情況。 怎么樣?

確定網絡中神經元數量是否理想(具有良好擬合)的最簡單方法是通過反復試驗。 將您的數據分成訓練數據(80% - 訓練網絡)和測試數據(20% - 僅保留用於在訓練后測試網絡)。 雖然只訓練訓練數據,但可以在測試數據集上繪制性能。

您還可以使用第三個數據集進行驗證,請參閱: 神經網絡中的訓練,驗證和測試集之間的差異是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM