Я написал простой MLP в TensorFlow, который моделирует XOR-Gate .
Таким образом, для:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
он должен произвести следующее:
output_data = [[0.], [1.], [1.], [0.]]
Сеть имеет входной слой, скрытый слой и выходной слой с 2, 5 и 1 нейроном каждый.
В настоящее время у меня есть следующая перекрестная энтропия:
cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))
Я также попробовал эту более простую альтернативу:
cross_entropy = tf.square(n_output - output)
наряду с некоторыми другими попытками.
Однако, независимо от того, какой была моя установка, ошибка с a GradientDescentOptimizer
уменьшалась намного медленнее, чем a AdamOptimizer
.
На самом tf.train.AdamOptimizer(0.01)
деле результаты были действительно хорошими после 400-800 шагов обучения (в зависимости от скорости обучения, где 0.01
были наилучшие результаты), в то время как tf.train.GradientDescentOptimizer
всегда требовалось более 2000 шагов обучения, независимо от того, какой расчет кросс-энтропии или скорости обучения использовался.
Почему это так? Кажется, AdamOptimizer
всегда лучший выбор ?!
Ответы:
В
tf.train.AdamOptimizer
использует Kingma и Ба Адам алгоритм , чтобы контролировать скорость обучения. Адам предлагает несколько преимуществ по сравнению с простымtf.train.GradientDescentOptimizer
. Прежде всего, он использует скользящие средние параметров (импульс); Bengio обсуждает причины, почему это выгодно в Разделе 3.1.1 этого документа . Проще говоря, это позволяет Адаму использовать больший эффективный размер шага, и алгоритм будет сходиться к этому размеру шага без тонкой настройки.Основным недостатком алгоритма является то, что Адаму требуется больше вычислений для каждого параметра на каждом этапе обучения (для поддержания скользящих средних и дисперсии и вычисления масштабированного градиента); и больше состояния, которое будет сохраняться для каждого параметра (приблизительно в три раза размер модели для хранения среднего значения и дисперсии для каждого параметра). Простое
tf.train.GradientDescentOptimizer
может в равной степени использоваться в вашем MLP, но потребует дополнительной настройки гиперпараметра, прежде чем оно будет сходиться так быстро.источник
learning_rate
аргумента дляtf.train.GradientDescentOptimizer
конструктора, пока он не сходится быстрее». :)