Подтвердить что ты не робот

Почему ввод масштабируется в 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?

4b9b3361

Ответ 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 и средним линейным средством активации?