Читать книгу Нейронный сети. Эволюция - Каниа Алексеевич Кан - Страница 12
ГЛАВА 4
Добавляем входной параметр
Моделирование нейрона как линейного классификатора со всеми параметрами линейной функции
ОглавлениеОпределимся с параметром (b). Как будет выглядеть второй вход? Какие данные подавать в ходе обучения?
Параметр (b) – величина постоянная, поэтому мы добавим его на второй вход нейрона, с постоянным значением входного сигнала, равным единице (x2 = 1). Таким образом, произведение этого входа на значение величины (b), всегда будет равно значению самой величины (b).
Пришло время для первого эволюционного изменения структуры нашего нейрона!
Рассмотрим следующую графическую модель искусственного нейрона:
Где, как говорилось выше, на вход нейрона поступают два входных сигнала x (из нашего набора данных) и x2 = 1. После чего, эти значения умножаются со своими изменяемыми параметрами, а далее они суммируются: A*x+b*x2. Значение этой суммы, а по совместительству – значение функции y = A*x+b*x2 = A*x+b, поступает на выход.
Ну и давайте всё представим согласно тем принятым условным обозначениям, которые используются при моделировании искусственных нейронов и нейронных сетей. А именно – коэффициент А и параметр b, обозначим как w1 и w2 соответственно. И теперь будем их называть – весовыми коэффициентами.
Ну и конечно же, визуализируем структуру нашего нейрона, с новыми обозначениями:
Переименуем в нашей первой программе коэффициент (А) и параметр (b), на обозначения весовых коэффициентов, как показано на слайде. Инициализируем их в ней. Дополним небольшую её часть в области с обучением, формулой изменения веса (w2), как мы это делали ранее с коэффициентом (А).
После чего, область с обучением в программе, будет выглядеть следующим образом:
# Прогон по выборке
for e in range(epochs):
for i in range(len(arr)): # len(arr) – функция возвращает длину массива
# Получить x координату точки
x = arr[i]
# Получить расчетную y, координату точки
y = w1 * x + w2
# Получить целевую Y, координату точки
target_Y = arr_y[i]
# Ошибка E = целевое значение – выход нейрона
E = target_Y – y
# Меняем вес при входе x
w1 += lr*(E/x)
# Меняем вес при входе x2 = 1, w2 += lr*(E/x2) = lr*E
w2 += lr*E
И забегая вперед, скажу, что тут нас постигнет разочарование – ничего не выйдет…
Дело в том, что вес (w2) (бывший параметр (b)), вносит искажение в поправку веса (w1) (бывшего коэффициента (А)) и наоборот. Они действуют независимо друг от друга, что сказывается на увеличении ошибки с каждым проходом цикла программы.
Нужен фактор, который заставит наша веса действовать согласованно, учитывать интересы друг друга, идти на компромиссы, ради нужного результата. И такой фактор у нас уже есть – ошибка.
Если мы придумаем как согласованно со всеми входами уменьшать ошибку с каждым проходом цикла в программе, подгоняя под неё весовые коэффициенты таким образом, что в конечном счете привело к самому минимальному её значению для всех входов. Такое решение, являлось бы общим для всех входов нашего нейрона. То есть, согласованно обновляя веса в сторону уменьшения их общей ошибки, мы будем приближаться к оптимальному результату на выходе.
Поэтому, при числе входов нейрона, больше одного, наши выработанные до этого правила линейной классификации, необходимо дополнить. Нужно использовать ошибку, чтобы математически связать все входы таким образом, при котором они начнут учитывать общие интересы. И как следствие, на выходе получить нужный классификатор.
Итак, мы постепенно подходим к ключевому понятию в обучении нейрона и нейронных сетей – обучение методом градиентного спуска.