Алексей Большунов
Мудрец
(10956)
4 года назад
Коррекция весов происходит методом обратного распространения ошибки, в котором ищут такие веса, которые дают минимальную ошибку. Ну, а как найти минимум функции нескольких переменных? Конечно же, методом градиентного спуска. Вот отсюда и производная.
Вот 1 слойная:
from numpy import array, dot, exp, random
inputs=array([[1,0,0],[0,1,1],[1,1,1]])
outputs=array([[1,0,1]]).T
weights=2*random.random((3,1))-1
for i in range(10000):
output=1/(1+exp(-dot(inputs, weights)))
weights+=dot(inputs.T, (1-output)*output*(outputs-output)
Вот 2 слойная:
import numpy as np
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
syn0 = 2*np.random.random((3,4)) - 1
syn1 = 2*np.random.random((4,1)) - 1
for j in range(60000):
l1 = 1/(1+np.exp(-(np.dot(X,syn0))))
l2 = 1/(1+np.exp(-(np.dot(l1,syn1))))
l2_delta = (y - l2)*(l2*(1-l2))
l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1))
syn1 += l1.T.dot(l2_delta)
syn0 += X.T.dot(l1_delta)
Изначально в 2 слойной не была подключена библиотека numpy и вместо range написано xrange, но наверное это сложности создания сайта с кодом. Так вот, во второй нейросети во время корректировки весов я наткнулся на: l1_delta = l2_delta.dot(syn1.T) * (l1 * (1-l1))
В первом коде всё ясно, но почему там например не умножили результат на производную сигмоиды и зачем на него вообще еще нужно умножать? Не знаю почему, но мне кажется что в этом коде где-то ошибка... (наверное потому что в 9 классе такие вещи не проходят и это слишком сложно для моего понимания)