Вопрос по нейросетям.

andre1941

Пытаюсь обучить простейшую нейросеть, один скрытый слой. Один выход.
Пользуюсь back propagation алгоритмом. Сеть все время стремится к выходу равному одному .
Может кто знает в чем проблема? Возможно где-то нужна нормализация?
Как правильно инициализировать значения в сети?
я делаю так, output_i = x_i - это для входов
output_j = sigmoid(sum_i {w_ji * x_i})
output_total = sigmoid(sum_j {w_j * output_j

vitalek1990

к единице стремится, потому что у тебя начальные значения весов слишком большие.
попробуй а) нормальзовать данные - чтобы все укладывалось в -1...1 б) задавать начальные веса очень небольшими случайными числами - конкретный разброс значений подбирается методом тыка.

andre1941

я задавал и начальные веса маленькими, типа одной от 0 до 0.0001. .
все равно выход пытается приближаться к единице.

andre1941

Может так кто-нибудь увидит ошибку .
delta_k = -2*(y(i,1) - o_k) * o_k * (1 - o_k); //delta_k - это delta для одного выхода

delta_j = delta_k * hidden_layer.*(ones(1,hidden_size) - hidden_layer) .* w_j; // это в векторной форме delta для скрытого слоя , использует предыдущую дельту для выхода , hiddel_layer - это вектор со значениями для скрытых узлов. w_j - веса идущие от скрытых узлов к выходу.
Для каждого тренировочного вектора считаю изменение, которое должно быть (это просто сумма градиентов)
delta_w_j = delta_k * hidden_layer + delta_w_j;
delta_w_ji = delta_j' * o_i + delta_w_ji; // o_i - входные значения x_i
Потом для всей пройденной пачки корректирую веса так:
w_ji = -eps*delta_w_ji + w_ji;
w_j = -eps*delta_w_j + w_j;

Какие веса не беру, все равно сеть старается обучится выходу 1 .

andre1941

output_total = sigmoid(sum_j {w_j * output_j
Может проблема в этом, выход я считаю как сигмоиду, получается он всегда меньше или равен единице .

andre1941

Где ж все отцы нейросетей и AI подевались ?

Sanych

получается он всегда меньше или равен единице
Попытайся, например, во всех тренировочных векторах сделать ответ равным 1/2. В общем, понять, происходит стремление к 1 из-за "плохого" выбора данных или из-за ошибочного их использования в алгоритме. На всякий случай...

andre1941

я сделал нормирование для градиентов (просто отнормировал каждый столбец полученной матрицы производных а также изменил немного формулы - считаю что на выходе сигмоида не вычисляется. Алгоритм заработал вроде, но скорость сходимости не очень .
Я вот не понимаю, мне предлагают считать ошибку на выходе как
sum_k(y_k - output_k)^2 . Если считать, что выход с сигмоидой, здесь же ничего хорошего не будет? y_k - любые, output_k - это результат сигмоиды, то есть меньше единицы.
Пока не знаю как это пройти, просто считаю выход равным сумме весов умноженных на предыдущий скрытый слой (без сигмы). Соответственно поменял производные.
Но для ряда больших данных работает плохо, сходится медленно.
Оставить комментарий
Имя или ник:
Комментарий: