Почему ввод масштабируется в tf.nn.dropout в тензорном потоке?
Я не понимаю, почему функция dropout работает в тензорном потоке. В блоге CS231n говорится, что "dropout is implemented by only keeping a neuron active with some probability p (a hyperparameter), or setting it to zero otherwise."
Также вы можете видеть это на картинке (взято с того же сайта)
![введите описание изображения здесь]()
Из сайта тензорного потока With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0.
Теперь, почему элемент ввода расширяется на 1/keep_prob
? Почему бы не сохранить элемент ввода как есть с вероятностью и не масштабировать его с помощью 1/keep_prob
?
Ответы
Ответ 1
Это масштабирование позволяет использовать ту же сеть для обучения (с помощью keep_prob < 1.0
) и оценки (с помощью keep_prob == 1.0
). Из Отрывная бумага:
Идея состоит в том, чтобы использовать единую нейронную сеть во время тестирования без отсева. Весы этой сети - это уменьшенные версии обученных грузов. Если единица сохраняется с вероятностью p во время тренировки, исходящие веса этого блока умножаются на p во время тестирования, как показано на рисунке 2.
Вместо того, чтобы добавлять ops для масштабирования весов на keep_prob
во время тестирования, реализация TensorFlow добавляет op для увеличения весов на 1. / keep_prob
во время тренировки. Эффект на производительность пренебрежимо мал, и код проще (потому что мы используем один и тот же граф и рассматриваем keep_prob
как tf.placeholder()
, который подавали другое значение в зависимости от того, обучаем ли мы или оцениваем сеть).
Ответ 2
Скажем, сеть имела n
нейроны, и мы применили скорость отсева 1/2
Этап тренировки, мы останемся с n/2
нейронами. Поэтому, если вы ожидали выхода x
со всеми нейронами, теперь вы получите x/2
. Таким образом, для каждой партии, весы сети обучаются в соответствии с этим x/2
Фаза тестирования/вывода/валидации, мы не применяем исключение, поэтому выход равен x. Таким образом, в этом случае выход будет с x, а не x/2, что даст вам неправильный результат. Итак, что вы можете сделать, это масштабировать его до x/2 во время тестирования.
Вместо вышеуказанного масштабирования, специфичного для фазы тестирования. То, что происходит с вытеснением Tensorflow, заключается в том, что независимо от того, имеет ли он выпадение или нет (обучение или тестирование), он масштабирует вывод так, чтобы сумма была постоянной.
Ответ 3
Если вы продолжаете читать в cs231n, объяснена разница между пропуском и инвертированным выпадением.
Поскольку мы хотим оставить прямой проход во время теста нетронутым (и настроить нашу сеть только во время обучения), tf.nn.dropout
напрямую реализует инвертированное выпадение, масштабируя значения.
Ответ 4
Вот быстрый эксперимент, чтобы рассеять любую оставшуюся путаницу.
Статистически веса NN-слоя следуют за распределением, которое обычно близко к нормальному (но не обязательно), но даже в случае, когда на практике выбирается идеальное нормальное распределение, всегда есть ошибки вычислений.
Затем рассмотрите следующий эксперимент:
DIM = 1_000_000 # set our dims for weights and input
x = np.ones((DIM,1)) # our input vector
#x = np.random.rand(DIM,1)*2-1.0 # or could also be a more realistic normalized input
probs = [1.0, 0.7, 0.5, 0.3] # define dropout probs
W = np.random.normal(size=(DIM,1)) # sample normally distributed weights
print("W-mean = ", W.mean()) # note the mean is not perfect --> sampling error!
# DO THE DRILL
h = defaultdict(list)
for i in range(1000):
for p in probs:
M = np.random.rand(DIM,1)
M = (M < p).astype(int)
Wp = W * M
a = np.dot(Wp.T, x)
h[str(p)].append(a)
for k,v in h.items():
print("For drop-out prob %r the average linear activation is %r (unscaled) and %r (scaled)" % (k, np.mean(v), np.mean(v)/float(k)))
Пример вывода:
x-mean = 1.0
W-mean = -0.001003985674840264
For drop-out prob '1.0' the average linear activation is -1003.985674840258 (unscaled) and -1003.985674840258 (scaled)
For drop-out prob '0.7' the average linear activation is -700.6128015029908 (unscaled) and -1000.8754307185584 (scaled)
For drop-out prob '0.5' the average linear activation is -512.1602655283492 (unscaled) and -1024.3205310566984 (scaled)
For drop-out prob '0.3' the average linear activation is -303.21194422742315 (unscaled) and -1010.7064807580772 (scaled)
Обратите внимание, что немасштабированные активации уменьшаются из-за статистически несовершенного нормального распределения.
Можете ли вы определить очевидную корреляцию между W-mean
и средним линейным средством активации?