Как позаботиться о скользящем среднем и движущейся дисперсии, используя tf.nn.batch_normalization? - PullRequest
0 голосов
/ 14 сентября 2018

Как-то для моей реализации мне нужно сначала определить весовые коэффициенты, и я не могу использовать функции высокого уровня в тензорном потоке, такие как tf.layers.batch_normalization или tf.layers.dense. Поэтому, чтобы выполнить пакетную нормализацию, мне нужно использовать tf.nn.batch_normalization. Я знаю, что для вычисления среднего значения и дисперсии каждого мини-пакета я могу использовать tf.nn.moments, но как насчет скользящего среднего и дисперсии? Кто-нибудь имеет опыт работы с этим или знает пример реализации? Я вижу, что люди, говорящие об использовании tf.nn.batch_normalization, могут быть хитрыми, поэтому я хочу знать, как это сложно сделать. Другими словами, что делает это сложным и с какими моментами я должен быть осторожен во время моей реализации? Есть ли какая-то другая точка, кроме скользящей средней и дисперсии, о которой мне следует знать?

1 Ответ

0 голосов
/ 14 сентября 2018

Вы должны быть осторожны с условиями running_mean и running_variance. В математике и в традиционной науке о компьютерах они называются методами, которые вычисляют эти значения, не видя полных данных. Они также известны как online версии mean и variance. Не то чтобы они могли точно определить mean и variance заранее. Они просто продолжают обновлять значения некоторых переменных mean и variance, поскольку поступает больше данных. Если ваш размер данных конечен, то после просмотра полных данных их значения будут соответствовать значениям, которые можно вычислить, если полные данные доступны.

Случай нормализации партии отличается. Вы не должны думать о running mean и running variance так же, как в предыдущем абзаце.

Время обучения

Во время обучения mean и variance вычисляются для batch. Они не running mean или running variance. Таким образом, вы можете безопасно использовать tf.nn.moments для этого.

Время тестирования

Во время тестирования вы используете то, что должно называться population_estimated_mean и population_estimated_variance. Эти величины вычисляются во время обучения, но не используются напрямую. Они рассчитаны для последующего использования во время тестирования.

Теперь одна ловушка в том, что некоторые люди могут захотеть использовать Knuth Formula для вычисления этих величин. Это не рекомендуется. Почему? : Потому что обучение проводится за несколько epochs. Таким образом, один и тот же набор данных рассматривается столько раз, сколько число epochs. Поскольку увеличение данных также обычно происходит случайным образом, вычисление стандартных running mean и running variance может быть опасным. Вместо этого обычно используется exponentially decaying estimate.

Вы можете достичь этого, используя tf.train.ExponentialMovingAverage над batch_mean и batch_variance. Здесь вы указываете, насколько актуальность будет дана прошлым образцам по сравнению с нынешними образцами. Убедитесь, что переменные, которые вы используете для вычисления, должны быть non-trainable, установив trainable=False.

Во время теста вы будете использовать эти переменные как mean и variance.

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

...