Нейронная сеть с сигмовидными нейронами не узнает, добавлен ли фактор ко всем весам и смещениям после инициализации - PullRequest
0 голосов
/ 31 января 2020

Я собираюсь поэкспериментировать с нейронной сетью для распознавания рукописного ввода, которую можно найти здесь: https://github.com/mnielsen/neural-networks-and-deep-learning/blob/master/src/network.py Если веса и смещения инициализированы случайным образом, он распознает более 80% цифр после несколько эпох. Если после инициализации я добавлю небольшой коэффициент 0,27 ко всем весам и уклонам, обучение будет происходить намного медленнее, но в конечном итоге оно достигнет той же точности, превышающей 80%:

self.biases = [np.random.randn(y, 1)+0.27 for y in sizes[1:]]
self.weights = [np.random.randn(y, x)+0.27 for x, y in zip(sizes[:-1], sizes[1:])]

Epoch 0 : 205 / 2000
Epoch 1 : 205 / 2000
Epoch 2 : 205 / 2000
Epoch 3 : 219 / 2000
Epoch 4 : 217 / 2000
...
Epoch 95 : 1699 / 2000
Epoch 96 : 1706 / 2000
Epoch 97 : 1711 / 2000
Epoch 98 : 1708 / 2000
Epoch 99 : 1730 / 2000

Если я добавлю небольшой коэффициент 0,28 ко всем весам и уклонам после инициализации, сеть больше не учится вообще.

self.biases = [np.random.randn(y, 1)+0.28 for y in sizes[1:]]
self.weights = [np.random.randn(y, x)+0.28 for x, y in zip(sizes[:-1], sizes[1:])]

Epoch 0 : 207 / 2000
Epoch 1 : 209 / 2000
Epoch 2 : 209 / 2000
Epoch 3 : 209 / 2000
Epoch 4 : 209 / 2000
...
Epoch 145 : 234 / 2000
Epoch 146 : 234 / 2000
Epoch 147 : 429 / 2000
Epoch 148 : 234 / 2000
Epoch 149 : 234 / 2000

Я думаю, что это связано с сигмовидной функцией, которая становится очень плоской, когда близка к единице и нулю. Но что происходит в этот момент, когда среднее значение весов и смещений составляет 0,28? Почему количество распознанных цифр так резко падает? И почему есть такие выбросы, как 429 выше?

1 Ответ

1 голос
/ 31 января 2020

Инициализация играет большую роль в обучающих сетях. Хорошая инициализация может значительно ускорить обучение и сближение, а плохая - во много раз медленнее. Он даже может разрешить или предотвратить конвергенцию вообще.

Возможно, вы захотите прочитать эту информацию, чтобы узнать больше о топи c
https://towardsdatascience.com/weight-initialization-in-neural-networks-a-journey-from-the-basics-to-kaiming-954fb9b47c79

Добавляя 0,27 ко всем весам и смещениям, вы, вероятно, смещаете сеть от оптимального решения и увеличиваете градиенты. В зависимости от количества слоев это может привести к взрыву градиентов. Теперь у вас есть очень большие обновления весов на каждой итерации. Может случиться так, что у вас есть некоторый вес, равный 0,3 (после добавления к нему 0,27), и мы говорим, что оптимальное значение будет равно 0,1. Теперь вы получаете обновление с -0.4, теперь вы на -0.1. Следующее обновление может быть 0,4 (или что-то близкое), и вы вернулись к первоначальной проблеме. Таким образом, вместо того, чтобы идти медленно к оптимальному значению, оптимизация просто пересекает все и отскакивает назад и вперед. Это может быть исправлено через некоторое время или может вообще не привести к сходимости, поскольку сеть просто колеблется вокруг.

Также в общем случае вы хотите, чтобы смещения были инициализированы равными 0 или очень близкими к нулю. Если вы попробуете это дальше, вы можете попытаться не добавлять 0.27 к смещениям и устанавливать их в 0 или что-то близкое к 0 изначально. Может быть, благодаря этому он действительно сможет учиться снова.

...