Почему веса нейронных сетей должны быть инициализированы случайными числами? [закрыто]


105

Пытаюсь построить нейронную сеть с нуля. Во всей литературе по ИИ существует консенсус в отношении того, что веса следует инициализировать случайными числами, чтобы сеть могла быстрее сходиться.

Но почему начальные веса нейронных сетей инициализируются как случайные числа?

Я где-то читал, что это делается для того, чтобы «нарушить симметрию», и это заставляет нейронную сеть учиться быстрее. Как нарушение симметрии ускоряет обучение?

Разве инициализация весов на 0 не была бы лучшей идеей? Таким образом, веса смогут быстрее находить свои значения (положительные или отрицательные)?

Есть ли какая-то другая философия, лежащая в основе рандомизации весов, кроме надежды на то, что они будут близки к своим оптимальным значениям при инициализации?


8
Похоже, это лучше подходит для перекрестной проверки .
Sycorax

2
Я голосую за закрытие этого вопроса, потому что он касается не программирования, как определено в справочном центре, а общей теории и методологии машинного обучения.
desertnaut

Ответы:


140

Здесь важно нарушение симметрии, а не с точки зрения производительности. Представьте себе первые 2 слоя многослойного персептрона (входной и скрытый):

введите описание изображения здесь

Во время прямого распространения каждый объект в скрытом слое получает сигнал:

введите описание изображения здесь

То есть каждый скрытый блок получает сумму входных данных, умноженную на соответствующий вес.

Теперь представьте, что вы инициализируете все веса одним и тем же значением (например, нулем или единицей). В этом случае каждый скрытый объект получит точно такой же сигнал . Например, если все веса инициализированы равными 1, каждая единица получает сигнал, равный сумме входов (и выходов sigmoid(sum(inputs))). Если все веса равны нулю, что еще хуже, каждая скрытая единица получит нулевой сигнал. Независимо от того, что было введено - если все веса одинаковы, все единицы в скрытом слое тоже будут одинаковыми .

Это основная проблема симметрии и причина, по которой вы должны инициализировать веса случайным образом (или, по крайней мере, с разными значениями). Обратите внимание, что эта проблема затрагивает все архитектуры, использующие соединения "каждый с каждым".


1
Отличное объяснение. Но зачем использовать слово symmetryне correlation? Кто первым использовал это слово?
nn0p 01

1
@ nn0p: корреляция означает, что 2 сигнала изменяются в одном направлении, но не всегда и не с одинаковой величиной. По крайней мере, насколько мне известно, симметрия не имеет формального определения и используется здесь для представления точно таких же сигналов по всем связям между узлами, что делает обучение бесполезным.
ffriend 01

@ffriend, чем в случае использования dropout, рандомизация больше не нужна. Я ошибся?
emanuele

1
@emanuele Dropout сам по себе является разновидностью рандомизации, так что да, он должен работать. Тем не менее, все соединения, которые не «выпадают» на каждой итерации, по-прежнему будут получать симметричное обновление, поэтому я предполагаю, что обучение будет довольно медленным, и поэтому рекомендую по-прежнему использовать случайную инициализацию в любой практической сети.
ffriend 01

Это хорошо объясняет прямое распространение звука, но как насчет обратного распространения ошибки?
Зелл

75

Аналогия:

Надеюсь, это хорошая аналогия. Я постарался объяснить это как можно проще.

Представьте, что кто-то сбросил вас с вертолета на неизвестную вершину горы, и вы оказались там в ловушке. Везде туман. Единственное, что вы знаете, это то, что вам нужно как-то спуститься на уровень моря. В каком направлении вы должны спуститься до самой низкой точки?

Если бы вы не могли найти путь к уровню моря, вертолет снова отвезет вас и сбросил бы на ту же самую вершину горы. Вам придется снова следовать тем же направлениям, потому что вы «инициализируете» себя в тех же исходных положениях .

Тем не менее, каждый раз , когда вертолет падает вы где - то случайным образом на горе, вы бы разные направления и шаги. Значит, будет больше шансов добраться до самой низкой точки.

Вот что подразумевается под нарушением симметрии . Инициализация асимметричная ( что отличается ), поэтому вы можете найти разные решения одной и той же проблемы.

В этой аналогии, где вы приземляетесь, есть гири . Таким образом, с разным весом больше шансов достичь наименьшего ( или более низкого ) точки.

Кроме того, это увеличивает энтропию в системе, поэтому система может создавать больше информации, чтобы помочь вам найти нижние точки ( локальные или глобальные минимумы ).

введите описание изображения здесь


10
Кажется, что вертолет несколько раз случайно сбрасывает вас на гору, однако при глубоком обучении мы просто случайным образом инициализируем веса только один раз.
YuFeng Shen

1
Это настоящее интуитивное объяснение. Мы также должны отметить, что NN почти никогда не бывают выпуклыми, поэтому рандомизация - идеальный способ, но если у вас есть выпуклая функция потерь, то, конечно, не имеет значения, чем вы инициализируете свои веса.
Kingz

4
Это хорошая аналогия, но имеет смысл предположить, что вас и ваших друзей бросают на гору (то есть узлы в сети) - либо в одном месте, либо разные люди в разных местах. И предположим, что вы все можете общаться друг с другом. Различные точки с коммуникациями позволят быстрее спускаться. Одно и то же место означает, что все пойдут одним и тем же путем.
ahmedhosny

26

Ответ довольно прост. Базовые алгоритмы обучения имеют жадный характер - они не находят глобального оптимума, а скорее - «ближайшего» локального решения. В результате, начиная с любой фиксированной инициализации, ваше решение смещается в сторону определенного набора весов. Если вы сделаете это случайным образом (и, возможно, много раз), то гораздо менее вероятно, что вы застрянете в какой-то странной части поверхности ошибки.

Тот же аргумент применяется к другим алгоритмам, которые не могут найти глобальный оптимум (k-средних, EM и т. Д.), И не применяется к методам глобальной оптимизации (например, алгоритм SMO для SVM).


Значит, не гарантируется, что он не застрянет в локальных минимумах просто из-за рандомизации? Но после нескольких прогонов с разными рандомизированными весами он может получить глобальный минимум?
Shayan RC

1
Нет никакой гарантии, но несколько инициализаций могут помочь хотя бы приблизиться к истинному оптимуму.
lejlot

Есть ли стандартная формула или правило для установки значения для инициализации весов? У меня есть многоуровневая нейронная сеть с прямой связью и обратным распространением, в которой используется сигмоидальная функция.
lkkkk

в книге С. Хайкина "нейронные сети" есть практическое
правило

3
Это не причина, по которой люди используют случайную инициализацию, поскольку большинство людей не перезапускают обучение много раз с разными случайными инициализациями, и сеть все еще может достичь хороших локальных оптимумов.
cesarsalgado

4

Как вы упомянули, ключевым моментом является нарушение симметрии . Потому что если вы инициализируете все веса равными нулю, тогда все скрытые нейроны (единицы) в вашей нейронной сети будут выполнять точно такие же вычисления. Это не то, чего мы хотим, потому что мы хотим, чтобы разные скрытые блоки вычисляли разные функции. Однако это невозможно, если вы инициализируете все одинаковое значение.


2
  1. Разве инициализация весов на 0 не была бы лучшей идеей? Таким образом, веса смогут быстрее находить свои значения (положительные или отрицательные)?

  2. Как нарушение симметрии ускоряет обучение?

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

Узлы, которые расположены бок о бок в скрытом слое, подключенном к одним и тем же входам, должны иметь разные веса, чтобы алгоритм обучения обновлял веса.

Сделав веса ненулевыми (но близкими к 0, например, 0,1 и т. Д.), Алгоритм изучит веса на следующих итерациях и не застрянет. Таким образом происходит нарушение симметрии.

  1. Есть ли какая-то другая философия, лежащая в основе рандомизации весов, кроме надежды на то, что они будут близки к своим оптимальным значениям при инициализации?

Алгоритмы стохастической оптимизации, такие как стохастический градиентный спуск, используют случайность при выборе начальной точки для поиска и в прогрессии поиска.

Развитие поиска или обучения нейронной сети известно как конвергенция. Обнаружение неоптимального решения или локальных оптимумов приводит к преждевременной конвергенции.

Вместо того, чтобы полагаться на один локальный оптимум, если вы запустите свой алгоритм несколько раз с разными случайными весами, есть лучшая возможность найти глобальные оптимумы, не застревая на локальных оптимумах.

После 2015 года, благодаря достижениям в исследованиях машинного обучения, He-et-al Initializatio n вводится вместо случайной инициализации.

w=np.random.randn(layer_size[l],layer_size[l-1])*np.sqrt(2/layer_size[l-1])

Веса по-прежнему случайны, но различаются по диапазону в зависимости от размера предыдущего слоя нейронов.

Таким образом, ненулевые случайные веса помогают нам

  1. Выйди из локальных оптимумов
  2. Нарушение симметрии
  3. Достичь глобального оптимума в дальнейших итерациях

1

В дополнение к инициализации случайными значениями, начальные веса не должны начинаться с больших значений. Это связано с тем, что мы часто используем функции tanh и sigmoid в скрытых слоях и слоях вывода. Если вы посмотрите на графики этих двух функций, то после прямого распространения на первой итерации значения будут выше, и эти значения соответствуют местам в сигмоидной и tanh-функциях, которые сводят производную к нулю. Это приводит к холодному запуску процесса обучения и увеличению времени обучения. В результате, если вы начнете взвешивание наугад, вы можете избежать этих проблем, умножив эти значения на такие значения, как «0,01» или «0,001».


1

Во-первых, некоторые алгоритмы сходятся даже при нулевых начальных весах. Простым примером является сеть линейного персептрона. Конечно, многие обучающие сети требуют случайного начального взвешивания (хотя это не гарантия получения самого быстрого и лучшего ответа).

Нейронные сети используют обратное распространение для обучения и обновления весов, и проблема в том, что в этом методе веса сходятся к локальному оптимальному (локальный минимум затрат / потерь), а не к глобальному оптимальному.

Случайное взвешивание помогает сети использовать шансы для каждого направления в доступном пространстве и постепенно улучшать их, чтобы прийти к лучшему ответу, а не ограничиваться одним направлением или ответом.

[Изображение ниже показывает одномерный пример того, как конвергенция. С учетом исходного местоположения достигается локальная оптимизация, но не глобальная оптимизация. В более высоких измерениях случайное взвешивание может увеличить шансы оказаться в нужном месте или начать лучше, что приведет к сходимости весов к лучшим значениям.] [1]

[1]: https://i.stack.imgur.com/2dioT.png [Калхор, А. (2020). Классификация и регрессия НС. Лекция.]

В простейшем случае новый вес будет следующим:

W_new = W_old + D_loss

Здесь градиент функции стоимости добавляется к предыдущему весу, чтобы получить новый вес. Если все предыдущие веса одинаковы, то на следующем шаге все веса могут быть одинаковыми. В результате в этом случае с геометрической точки зрения нейронная сеть наклонена в одном направлении и все веса одинаковы. Но если веса разные, можно обновить веса на разные величины. (в зависимости от импакт-фактора, который каждый вес имеет на результат, он влияет на стоимость и обновления весов. Таким образом, даже небольшая ошибка в начальном случайном весе может быть решена).

Это был очень простой пример, но он показывает влияние инициализации случайного взвешивания на обучение. Это позволяет нейронной сети переходить в разные места, а не в одну сторону. В результате в процессе обучения переходите к лучшим из этих пространств.


0

Давайте будем более математичными. Фактически, причина, по которой я отвечаю, заключается в том, что я обнаружил, что этого бита не хватает в других ответах. Предположим, у вас 2 слоя. Если мы посмотрим на алгоритм обратного распространения, вычисление

dZ2 = A2 - Y

dW2 = (1 / м) * dZ2 * A2.T

Игнорируем db2. (Жаль не жаль ;) )

dZ1 = W2.T * dZ2. * g1 '(Z1)

...

Проблема, которую вы видите, выделена жирным шрифтом. Вычисление dZ1 (которое требуется для вычисления dW1) содержит W2, равное 0. У нас никогда не было возможности изменить веса на что-то большее, чем 0, и мы никогда не сделаем этого. По сути, нейронная сеть ничего не узнает. Я считаю, что это хуже логистической регрессии (единичная единица). В случае логистической регрессии вы учитесь с большим количеством итераций, поскольку благодаря X вы получаете разные входные данные. В этом случае другие слои всегда дают одинаковый результат, поэтому вы вообще не учитесь.


0

Я узнал одну вещь: если вы инициализируете вес нулями, очевидно, что единицы активации в одном слое будут одинаковыми, а это значит, что они будут иметь одинаковые значения. Когда вы выполняете обратный переход, вы обнаружите, что все строки градиента dW также совпадают, следовательно, все строки весовой матрицы W остаются такими же после обновлений градиентного спуска. В общем случае инициализация всех весов равными нулю приводит к тому, что сеть не нарушает симметрию. Это означает, что каждый нейрон в каждом слое будет изучать одно и то же, и вы также можете тренировать нейронную сеть n[l]=1n[l]=1для каждого слоя, и сеть не более мощная, чем линейный классификатор, такой как логистическая регрессия. Эндрю Нг, курс:

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.