Я немного экспериментирую с автоэнкодерами, и с помощью tenorflow я создал модель, которая пытается восстановить набор данных MNIST.
Моя сеть очень проста: X, e1, e2, d1, Y, где e1 и e2 - уровни кодирования, d2 и Y - уровни декодирования (а Y - восстановленный выход).
X имеет 784 единиц, e1 имеет 100, e2 имеет 50, d1 снова имеет 100 и Y 784 снова.
Я использую сигмоиды в качестве функций активации для слоев e1, e2, d1 и Y. Входные данные находятся в [0,1] и должны быть выходными данными.
Ну, я попытался использовать кросс-энтропию в качестве функции потерь, но на выходе всегда был блоб, и я заметил, что веса от X до e1 всегда будут сходиться к матрице с нулевым значением.
С другой стороны, использование среднеквадратичных ошибок в качестве функции потерь даст хороший результат, и теперь я могу восстановить входные данные.
Почему это так? Я думал, что могу интерпретировать значения как вероятности и, следовательно, использовать перекрестную энтропию, но, очевидно, я делаю что-то не так.
источник
Ответы:
Я думаю, что лучший ответ на это заключается в том, что функция кросс-энтропийной потери просто не подходит для этой конкретной задачи.
Принимая этот подход, вы, по сути, говорите, что истинные данные MNIST являются двоичными, а интенсивность ваших пикселей отражает вероятность того, что каждый пиксель включен. Но мы знаем, что на самом деле это не так. Неправильность этого неявного предположения вызывает у нас проблемы.
Мы видим, что потеря кросс-энтропии асимметрична. Почему мы хотим этого? Действительно ли хуже прогнозировать 0,9 для этих 0,8 пикселей, чем прогнозировать 0,7? Я бы сказал, что может быть лучше, если что.
Мы могли бы, вероятно, углубиться в детали и выяснить, почему это приводит к конкретным сгусткам, которые вы видите. Я бы рискнул предположить, что это потому, что интенсивность пикселей в среднем выше 0,5 в регионе, где вы видите пятно. Но в целом это тот случай, когда предположения о неявном моделировании, которые вы сделали, не соответствуют данным.
Надеюсь, это поможет!
источник