www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Подводные камни в пакетной норме в TensorFlow и Sanity Checks для обучающих сетей

Дата публикации Jun 26, 2018

I. Давайте покончим с Batch Norm в TensorFlow, раз и навсегда

Краткая теория нормализации партии

Этот революционный метод введен Сергеем Иоффе, Кристианом Сегеди вбумага,и это цитируется 4994 раза на данный момент. Согласно статье нормализация партии уменьшает смещение внутренней ковариации, т. Е. Делает обучение слоев в сети более независимым друг от друга. Цель уровня пакетной нормы состоит в том, чтобы внести вклад в слой активации, единицу Гаусса, чтобы нейрон не насыщался в случае сигмовидной и желтоватой. Это помогает в быстрой конвергенции сети, позволяет вам быть осторожным при инициализации веса, работает как регуляризация вместо отсева и других методов регуляризации. Теперь я не буду обсуждать большую часть теоретических деталей, но больше о реализации. Я проведу вас через реализацию пакетной нормы в TensorFlow и его математике.
Во время обучения -

Во время тренировки. Изображения взяты из бумаги для пакетной нормализации.

Теперь предположим, что между слоем свертки и активацией используется слой пакетной нормы, тогдаИксявляется выходом слоя свертки, иYявляется выводом уровня пакетной нормы и вводом в уровень активации, который может быть ReLU, сигмоидом и т. д. Уровень пакетной нормы запоминает параметрγа такжеβ, а такжеYзависит от их значений. Следовательно, показано, что лучшее представлениеИксучится с помощьюγа такжеβ, Пожалуйста, обратите внимание на две другие статистическиеЕ [х]а такжеВар [х], население означает и дисперсия. Они оцениваются по скользящему среднему и движущейся дисперсии во время тренировки.

Во время вывода -

Во время вывода

Проход вперед через пакетный слой норм при выводе отличается от обучения. На умозаключении вместо пакетного значения (μ) и дисперсия (σ2) мы используем среднее значение населения (Е [х]) и дисперсия (Вар [х]) вычислятьх ^, Предположим, что вы даете партию размера один во время логического вывода и нормализуетесь, используя среднюю партию и дисперсию партии, в этом случаех ^ = 0какμ = хтогдау = β, который показывает, что вывод слоя(Y)будет одинаковым для любого входа(Икс)что неправильно. Следовательно, чтобы нормализовать во время вывода, мы используем среднее значение и дисперсию населения, которые мы вычисляли во время обучения, используя скользящее среднее и дисперсию. В следующем разделе мы рассмотрим реализацию Batch Norm в TensorFlow.

Предостережения Batch Norm в TF

  • Скользящее среднее и дисперсия не обновляются:
    TensorFlow основан на графике, расчеты выполняются в порядке зависимостей.
import tensorflow as tfa = tf.placeholder(tf.float32, shape=[1,3])
b = tf.placeholder(tf.float32, shape=[1,3])
c = tf.Variable(tf.zeros([1, 3]), dtype=tf.float32)
def train(a,b):
c = tf.add(c,a)
e = some_train_op(a,b)
return eoutput = train(a,b)
loss = tf.log(output)sess = tf.Session()
saver = tf.train.Saver()
sess.run(tf.global_variables_initializer())for itr in range(1000):
ls = sess.run(loss, {a:x, b:y})saver.save(sess, some_path)#Note that this code is for reference only.

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

Давайте подробно разберем, зависимости в графике этой модели. Когда мы бежимпотерятензор,выходбудет вычислено тогдавыходпозвонюпоездот какой стоимостиебудет необходимо, которое будет рассчитываться с использованиема такжеб, Во всех этих вычисленияхсне будет оцениваться как значениепотерятензор не зависит отс, Решение добавитьскак зависимость до вычисленияе, Следовательно, решение

def train(a,b):
c = tf.add(c,a)
with tf.control_dependencies([c]):
e = some_train_op(a,b)
return e

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

Решение: TensorFlow предоставляет три основные функции для нормализации партии

tf.nn.batch_normalization() - Never use this for training, it just compute the y = gamma*x^hat + beta where x^hat = (x-mean)/std_dev.
It doesn't account for keeping moving mean and variance. tf.layers.batch_normalization() - This function can be used for your model. Note: Always add batch norm dependency when using this, either on optimizer op or any other op which you sure that will execute when optimizer op is run. ex:-update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops):
self.solver = tf.train.AdamOptimizer(learning_rate=1e-04)
.minimize(self.loss)Here tf.GraphKeys.UPDATE_OPS is the collections which have moving mean and variance op. tf.contrib.layers.batch_norm() - This function is in contrib module of TensorFlow. This function gives two ways to add dependencies as follows:
1.It has 'update' parameter, set update=None while calling the function and dependency will be added inside the function itself and you don't have to anything else.
Note:This is believed to be slow in comparison to the next method.2. Let the update parameter have it's default value which is "tf.GraphKeys.UPDATE_OPS". Now here also you have to manually add dependency as above with tf.layers.batch_normalization().

Следовательно, вы можете использовать либоtf.layers.batch_normalization () или tf.contrib.layers.batch_norm ()с правильной обработкой зависимостей обновления.

  • Различное использование в поезде и тестовом времени:
    От поезда к времени испытания мы должны переключаться между средним значением партии и дисперсией или средним значением и дисперсией населения. У нас есть параметрыis_trainingа такжеtraining в tf.contrib.layers.batch_norm () и tf.nn.batch_normalization () соответственно. Когда его значениеTrue, используется среднее значение & дисперсия партии, а среднее значение и дисперсия обновляются для оценки среднего значения и дисперсии популяции. НаFalse, средняя численность населения и дисперсия используется. Следовательно, вы должны использовать заполнительtrain_phaseза это. Итак, решение выглядит следующим образом
def Bn(x, is_train):
return tf.contrib.layers.batch_norm(x, decay= 0.99,
is_training=is_train,center= True, scale=True,
reuse= False)train_phase = tf.placeholder(tf.bool, name="is_training")
data = tf.placeholder(tf.float32, shape=[None,240,240,3], name="Image") bn_layer = Bn(data, train_phase)loss = some_loss_op()solver = tf.train.AdamOptimizer().minimize(loss)# Training iteration
sess.run(solver, {data: input_data, train_phase:True})#Validation iteration
sess.run(loss, {data: input_data, train_phase:False})
  • Разделение параметров пакетной нормы:
    Часто вы разделяете веса в двух параллельных сетях, таких как сиамские или дискриминаторы GAN. Когда вы делитесь своими весами, параметры партии также становятся доступными Иногда совместное использование параметров пакетной нормы в двух сетях может быть бесполезным, я точно скажу, когда
    Допустим, мы обучаем GAN, у него будет два экземпляра дискриминатора с общими параметрами, когда начинается обучение, распределение поддельных и реальных изображений различается. Теперь здесь мы обновляем скользящее среднее и дисперсию с помощью двух разных распределений, одно из которых содержит поддельные изображения, а другое - реальное. Но поскольку обучение продолжается и генератор изучает распределение реальных данных, то распределение как поддельных, так и реальных данных в конечном итоге становится примерно одинаковым. Затем мы обновляем среднее значение и дисперсию с тем же распределением, поэтому среднее значение и дисперсию нашего населения следует оценивать статистикой реальных данных после завершения обучения. Следовательно, теоретически, совместное использование параметра нормы партии может не быть такой большой проблемой в случае GAN. Но я сделаю несколько экспериментов в обоих условиях и сообщу об эмпирических результатах в новом блоге.
    В настоящее времяэтот блогможет быть хорошим объяснением с лучшей визуализацией для случаев, когда совместное использование параметров нормы партии может отрицательно повлиять на точность модели.
    В двух словах, совместное использование параметров пакетной нормы можно до тех пор, пока входные распределения для обоих общих уровней пакетной нормы не будут одинаковыми, если это не так, попробуйте использоватьreuse=Falseв вышеупомянутых функциях пакетной нормы, которые позволят вам иметь независимые параметры пакетной нормы для обеих ваших сетей, в которых вы хотите поделиться весами.

II. Sanity Проверки и отладка -

  • Сквозные модели изображений:
    В таких задачах, как сегментация изображения или прогнозирование глубины, в которых в качестве входных данных используется изображение, мы ожидаем, что в качестве выходных данных будет использоваться изображение одинакового размера Обучите вашу модель изучению функции идентификации, то есть задайте входное изображение в качестве целевого изображения. В этом случае сеть будет представлять собой функцию идентификации. Если это обучено отлично, но вы все еще не в состоянии изучить сегментацию или глубину, возможно, вашей модели не хватает мощности. Вы можете попытаться добавить еще несколько слоев или, возможно, лучше использовать функцию потерь для вашей задачи.
  • Целевой и выходной диапазон:
    Если вы нормализовали целевое изображение в диапазоне от 0 до 1, убедитесь, что в слое, генерирующем изображение, есть сигмоидальная функция активации, а не tanh, поскольку tanh будет иметь диапазон от -1 до 1, что затруднит обучение. Если нормализовано от -1 до 1, используйте tanh.
  • Колеблющаяся потеря:
    Наиболее вероятной причиной может быть то, что вашей модели не хватает емкости. Следовательно, веса быстро меняются, чтобы изучить модель, но из-за ограниченной емкости они продолжают быстро менять свои веса, но никогда не приближаются к оптимальным. Вы также должны попытаться уменьшить скорость обучения.
  • Hyper-параметры:
    Никогда не игнорируйте гиперпараметры. Они могут быть не очень важны для точности и производительности вашей сети в целом, но определенно очень важны для конвергенции и стабильности обучения. Инициализация небрежного веса может привести к использованию / исчезновению градиентов или NaN в вашей сети. Проверьте std_dev вашей инициализации веса, если вы используете нормальное распределение, диапазон [0.2, 0.01] в порядке. Скорость обучения и размер партии - это первое, что нужно экспериментировать, если потери ведут себя ненормально.
  • Перестановка последовательных данных:
    Когда ваши входные данные являются последовательными, что чаще всего происходит с видео, например, при автономном вождении, таком как сегментация, прогнозирование глубины и т. Д. Вам следует рассмотреть возможность перетасовки данных, обучение последовательным данным может отрицательно повлиять на точность модели при тестировании.
    Примечание: у вас должны быть последовательные данные, когда задача требует временной согласованности, такой как оптический поток, визуальная одометрия и т. Д.
  • Масштабирование потерь:
    В случае, если вы используете более одного типа потерь в вашей сети, таких как MSE, состязательный, L1,потеря функции,SSIMзатем убедитесь, что все потери правильно масштабированы, чтобы иметь одинаковый порядок, т. е. mse имеет порядок 1e-01, а потери признаков - порядка 1e03, затем масштабируйте потери признаков до такого же порядка.
  • Графическая визуализация, величайшее оружие в этой войне:
    Если вы используете TF и ​​другие фреймворки, имеющие инструмент визуализации. Вы должны использовать визуализацию для проверки соединений, они помогут вам обнаружить пропущенное соединение, ошибку измерения или ошибку распределения веса.
  • Параметр «Общий пакетный параметр»:
    Как упоминалось выше, если вы совместно используете параметры пакетной нормы в двух сетях, убедитесь, что распределение входных данных в обеих сетях одинаково.

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

Спасибо всем за чтение этого блога, я надеюсь, что он спасет вашу борьбу с пакетной нормой и тренировочными сетями. Я приветствую все ваши комментарии и дайте мне знать, если хотите что-то добавить или считаете, что контент вводит в заблуждение. Вы можете связаться со мной по [email protected] для ваших запросов.


Ссылки:

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map