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

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

Основные обозначения

Рассмотрим нейронную сеть L-слоя, в которой есть L-1 скрытых слоев и по 1 входному и выходному слоям. Параметры (веса и смещения) для слоя l представлены как

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

  • Нулевая инициализация
  • Случайная инициализация

Нулевая инициализация:

Обычно смещения инициализируются 0, а веса инициализируются случайными числами. Что, если веса инициализируются 0?

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

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

W[l] = np.random.zeros((l-1,l))

давайте рассмотрим нейронную сеть только с тремя скрытыми слоями с функцией активации ReLu в скрытых слоях и сигмоидом для выходного слоя.

Используя вышеупомянутую нейронную сеть в наборе данных, «сделайте круги» из наборов sklearn.datasets, результат получился следующим образом:

на 15000 итераций потери = 0,6931471805599453, точность = 50%

Ясно, что инициализация нуля не приводит к успеху в классификации.

Случайная инициализация:

Присваивать весам случайные значения лучше, чем просто 0. Но я должен помнить одну вещь: что происходит, если веса инициализируются высокими или очень низкими значениями, и что является разумной инициализацией значений веса.

a) Если веса инициализируются очень высокими значениями, член np.dot(W,X)+b становится значительно выше, а если применяется функция активации, такая как sigmoid (), функция отображает свое значение, близкое к 1, где наклон градиента изменяется медленно. а обучение занимает много времени.

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

Эту проблему часто называют исчезающим градиентом.

Чтобы увидеть это, давайте посмотрим на пример, который мы взяли выше, но теперь веса инициализируются очень большими значениями вместо 0:

W[l] = np.random.randn(l-1,l)*10

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

для 15000 итераций потеря = 0,38278397192120406, точность = 86%

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

Новые методы инициализации

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

а) Если модель слишком велика и на обучение уходит много дней, то что

б) А как насчет проблемы исчезающего / взрывающегося градиента?

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

Инициализация: мы просто умножаем случайную инициализацию на

Чтобы увидеть, насколько эффективно это решение, давайте воспользуемся предыдущим набором данных и нейронной сетью, которые мы использовали для вышеупомянутой инициализации, и получим следующие результаты:

для 15000 итераций потеря = 0,07357895962677366, точность = 96%

Несомненно, это улучшение по сравнению с предыдущими методами.

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

Инициализация Xavier: Это то же самое, что инициализация He, но используется для функции активации tanh (), в этом методе 2 заменяется на 1.

Некоторые также используют следующую технику инициализации:

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

Источник: нейронные сети и глубокое обучение, Эндрю Нг (Coursera.org).