4

Я пытался реализовать базовую нейронную сеть back-propogation в python и закончил программирование для инициализации и обучения набору веса. Однако на всех наборах, которые я тренирую, ошибка (среднеквадратичная) всегда сходится к странному числу - ошибка всегда уменьшается на дальнейших итерациях, но никогда не приближается к нулю.
Любая помощь была бы высоко оценена.градиентный спуск в нейронной сети обучение плато

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

Как должен выглядеть входной и целевой (формы)? – matousc

+0

вход представляет собой матрицу 4x2, а целью является матрица 4x1 (вектор-столбец) –

+0

Градиентный спуск является подергиванием относительно масштабирования на входах и размера шага неуместным ... вы проверили эти вещи? У вас есть тесты для вышеуказанного кода, которые утверждают, что вычисленные градиенты верны и т. Д.? –

ответ

3

Функция ошибки в следующем сценарии не может быть 0, а для функции ошибки быть 0 потребуют Точки согласования идеально кривого.

Data fitting

Чтобы иметь больше нейронов бы наверняка уменьшить ошибку, так как функция может иметь более сложную и точную форму. Но проблема, называемая переобучением, появляется, когда вы слишком хорошо вписываетесь в свои данные, как показано на следующем рисунке. Слева направо кривая либо подбирает набор данных, почти правильно подгоняя его, а затем плохо перерабатывая справа.

underfitting vs overfitting

Сценарий справа может вызвать ошибки быть 0, но это не требуется, и вы хотите, чтобы избежать этого. Как?

Простейший способ определить, является ли число нейронов в сети идеальным (чтобы иметь хорошую подгонку), путем проб и ошибок. Разделите данные в данных обучения (80% - на обучение сети) и в тестовых данных (20% - зарезервированы только для проверки сети после обучения). В то время как только обучение по данным обучения, можно построить производительность в тестовом наборе данных.

Вы также можете иметь 3-й набор данных, используемый для проверки, см: whats is the difference between train, validation and test set, in neural networks?

Смежные вопросы