Все веса после тренировки становятся отрицательными

Делаю нейронную сеть. Результат тренировки для всех пар равен 0 или 1. Я заметил, что если я добавлю только одну тренировочную пару с целевым результатом «1» и 9 других пар с «0», все мои веса после тренировки станут отрицательными, однако, если Я увеличиваю количество целевых выходов «1» в тренировочном наборе, я также вижу положительные веса.

Учебный набор, который дает все отрицательные веса: ВХОД:

[[0.46       0.4        0.98039216]
 [0.58       0.         0.98039216]
 [0.2        1.         0.39215686]
 [0.1        0.4        0.45960784]
 [0.74       0.53333333 0.19607843]
 [0.48       0.93333333 0.        ]
 [0.38       0.7        0.98039216]
 [0.02       0.53333333 1.        ]
 [0.         0.03333333 0.88235294]
 [1.         0.8        0.78431373]]

ВЫХОД:

[[0.][0.][0.][0.][0.][0.][0.][0.][0.][1.]]

ВЕС ДО ТРЕНИРОВКИ (СЛУЧАЙНЫЙ):

[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]

ВЕС ПОСЛЕ ТРЕНИРОВКИ:

[[-1.48868116]
 [-4.8662876 ]
 [-5.42639621]]

Однако, если я изменю целевые выходы еще на одну «1» как таковую

[[0.][0.][0.][0.][0.][0.][0.][0.][0.][1.]]

Я также получаю положительный вес после тренировки:

[[ 1.85020129]
 [-1.9759502 ]
 [-1.03829837]]

Что может быть причиной этого? Может ли быть так, что слишком много «0» делает «1» незначительной при обучении? Если да, то как мне изменить подход при обучении? Я хочу использовать это обучение с тренировочным набором, содержащим около 480 тренировочных пар с выходом «0» и 20 с «1».

(Я использую сигмовидную функцию :)

Полный код:

from numpy import exp, array, random, dot
from collections import defaultdict
import csv
import numpy as np

class NeuralNetwork():
    def __init__(self):

        random.seed(1)

        self.synaptic_weights = 2 * random.random((3, 1)) - 1

    def __sigmoid(self, x):
        return 1 / (1 + exp(-x))

    def __sigmoid_derivative(self, x):
        return x * (1 - x)

    def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations):
        for iteration in range(number_of_training_iterations):

            output = self.think(training_set_inputs)
            error = training_set_outputs - output
            adjustment = training_set_inputs.T.dot(error * self.__sigmoid_derivative(output))

            self.synaptic_weights += adjustment


    def think(self, inputs):
        return self.__sigmoid(dot(inputs, self.synaptic_weights))


if __name__ == "__main__":

    neural_network = NeuralNetwork()

    print ("Random starting synaptic weights: ")
    print (neural_network.synaptic_weights)

    training_set_inputs = array([
     [0.46,0.4,0.98039216],
     [0.58,0.0,0.98039216],
     [0.2,1.0,0.39215686],
     [0.1,0.4,0.45960784],
     [0.74,0.53333333,0.19607843],
     [0.48,0.93333333,0.0],
     [0.38,0.7,0.98039216],
     [0.02,0.53333333,1.0],
     [0.,0.03333333,0.88235294],
     [1.0,0.8,0.78431373]])

    training_set_outputs = array([[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]]).T

    neural_network.train(training_set_inputs, training_set_outputs, 10000)

    print ("New synaptic weights after training: ")
    print (neural_network.synaptic_weights)

    print ("Considering new situation [0.5,0.5,0.5] -> ?: ")
    test = [0.5,0.5,0.5]
    print (neural_network.think(array(test)))

Есть идеи?

Спасибо


person AmberGintare    schedule 01.09.2018    source источник
comment
Можете ли вы опубликовать полный код?   -  person user2653663    schedule 01.09.2018
comment
@ user2653663 только что опубликовал это в вопросе. :)   -  person AmberGintare    schedule 01.09.2018


Ответы (1)


Похоже, вы пропустили скорость обучения при вычислении обновления. Попробуйте умножить "корректировку" примерно на 0,001.

        error = training_set_outputs - output
        adjustment = training_set_inputs.T.dot(error * self.__sigmoid_derivative(output))

        self.synaptic_weights += adjustment
person Ho John Lee    schedule 02.09.2018
comment
К сожалению, все веса по-прежнему отрицательные. :( Но я все равно добавлю скорость обучения! - person AmberGintare; 02.09.2018