Инициализация веса

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

Давайте подумаем вместе. Если начать все веса с 0, то это будет плохой вариант как по времени, так и по стоимости. Или нет смысла их всех запускать как 0.5? Приводит ли запуск с неправильными весами к взрывному или исчезающему градиенту для градиентного спуска? Ответы да! Вот почему нам нужна инициализация. Подведем итоги.

Зачем нам нужна инициализация веса?

  • Обученные искусственные нейронные сети сильно зависят от начальных настроек весов и смещений.
  • «Стохастический градиентный спуск» сходится к локальным минимумам.
  • Избегайте проблем с исчезновением и взрывом градиента. (слишком большая инициализация приводит к взрыву градиентов, а слишком маленькая инициализация приводит к исчезновению градиентов.)

Методы инициализации веса

  1. Нулевая инициализация
  2. Случайная инициализация
  3. Инициализация Ксавьера
  4. Инициализация He-at-al
  5. Инициализация Лекуна

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

 model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, activation='relu', kernel_initializer,
            bias_initializer)
    ])

1. Нулевая инициализация

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

Если все веса сети инициализированы нулями, все активации равны нулю и, соответственно, градиенты. На самом деле не имеет значения, даже если веса инициализированы любой другой константой. Активации могут быть не нулевыми в этом случае, но они все равно будут одинаковыми. Таким образом, мы можем исключить нулевую/константную инициализацию.

model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='zeros',
                              bias_initializer='zeros')
    ])

2. Случайная инициализация

Когда функция активации является сигмовидной, чем дальше значение веса от 0, тем больше стандартное отклонение, тем больше выходное значение смещается близко к 0 и 1, и тогда градиент теряется. Один из способов решить эту проблему — инициализировать веса в нормальном распределении с небольшим стандартным отклонением. Как правило, начальные веса случайным образом инициализируются нормальным распределением (распределением Гаусса) со средним значением 0 и стандартным отклонением 0,01 следующим образом.

# With normal distributions
model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='RandomNormal',
                              bias_initializer='zeros')
    ])
'''
# With Uniform Distributions
model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='RandomUniform',
                              bias_initializer='zeros')
'''

3. Ксавье (Глорот) Инициализация

Случайная инициализация быстро выходит из строя для глубоких сетей. Причина этого в том, что активация быстро падает до нуля после нескольких слоев (как и градиенты). Инициализация Xavier направлена ​​​​на инициализацию весов таким образом, чтобы дисперсия на каждом слое была одинаковой. Другими словами, дисперсия вывода каждого слоя должна быть равна дисперсии входа, а дисперсия градиента до и после прохождения слоев при обратном распространении должна быть одинаковой.

# With normal distributions
model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='glorot_normal',
                              bias_initializer='zeros')
    ])
'''
# With Uniform Distributions
model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='glorot_uniform',
                              bias_initializer='zeros')
'''

4. Инициализация He-at-al

Каймин Хэ предложил начальное значение, подходящее для ReLU, которое названо начальным значением He по его имени. Инициализация почти аналогична инициализации Xavier, но отличается от инициализации Xavier. Эти различия связаны с нелинейностью функции активации ReLU, и они используют разные коэффициенты масштабирования для весов.

# With normal distributions
model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='he_normal',
                              bias_initializer='zeros')
    ])
'''
# With Uniform Distributions
model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='he_uniform',
                              bias_initializer='zeros')
'''

5. Инициализация Лекуна

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

# With normal distributions
model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='lecun_normal',
                              bias_initializer='zeros')
    ])
'''
# With Uniform Distributions
model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(input_shape=(64, 32)),
        tf.keras.layers.Dense(128, 
                              activation='relu', 
                              kernel_initializer='lecun_uniform',
                              bias_initializer='zeros')
'''

Как понять хорошую инициализацию?

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

Как найти подходящие значения инициализации?

  • среднее число активаций должно быть равно нулю.
  • Дисперсия активаций должна оставаться одинаковой для всех слоев.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

  1. https://sebastianraschka.com/pdf/lecture-notes/stat453ss21/L11_norm-and-init__slides.pdf
  2. https://machinelearningmastery.com/weight-initialization-for-deep-learning-neural-
  3. networks/#:~:text=Weight%20initialization%20is%20a%20процедура%20%20нейронная%20сетевая%20модель.
  4. https://heartbeat.comet.ml/weight-initialization-in-deep-neural-networks-e7e0d526f900
  5. https://wandb.ai/sauravmaheshkar/initialization/reports/A-Gentle-Introduction-To-Weight-Initialization-for-Neural-Networks--Vmlldzo2ODExMTg
  6. https://medium.com/guidona-softpedia/weight-initialization-methods-in-neural-networks-a3e7a793cee5
  7. https://machinelearningmastery.com/weight-initialization-for-deep-learning-neural-networks/#:~:text=Weight%20initialization%20is%20a%20procedure%20the%20neural%20network%20model.
  8. https://koreascience.kr/article/JAKO201909055503906.pdf
  9. https://web.eecs.umich.edu/~justincj/slides/eecs498/498_FA2019_lecture10.pdf
  10. https://sebastianraschka.com/pdf/lecture-notes/stat453ss21/L11_norm-and-init__slides.pdf
  11. https://bigmeca.minesparis.psl.eu/wp-content/uploads/2021/02/neural_networks2_handouts.pdf
  12. https://www.deeplearning.ai/ai-notes/initialization/index.html
  13. https://www.tensorflow.org/api_docs/python/tf/keras/initializers