Как найти, почему RBM не работает правильно?

Я пытаюсь реализовать RBM и тестирую его на наборе данных MNIST. Тем не менее, он не кажется сходящимся.

У меня 28х28 видимых юнитов и 100 скрытых юнитов. Я использую мини-партии размером 50. Для каждой эпохи я пересекаю весь набор данных. У меня скорость обучения 0,01 и импульс 0,5. Весовые коэффициенты генерируются случайным образом на основе гауссовского распределения среднего значения 0,0 и стандартного отклонения 0,01. Видимые и скрытые смещения инициализируются до 0. Я использую функцию логистической сигмоиды в качестве активации.

После каждой эпохи я вычисляю среднюю ошибку реконструкции всех мини-пакетов, вот ошибки, которые я получаю:

epoch 0: Reconstruction error average: 0.0481795
epoch 1: Reconstruction error average: 0.0350295
epoch 2: Reconstruction error average: 0.0324191
epoch 3: Reconstruction error average: 0.0309714
epoch 4: Reconstruction error average: 0.0300068

Я построил гистограммы весов для проверки (слева направо: скрытые значения, веса, видимые элементы. Вверху: веса, снизу: обновления):

Гистограмма весов после 3 эпохи
Гистограмма весов после эпохи 3 http://baptiste-wicht.com/static/finals/histogram_epoch_3.png

Гистограмма весов после эпохи 4
Гистограмма весов после эпохи 4 http://baptiste-wicht.com/static/finals/histogram_epoch_4.png

но, за исключением скрытых предубеждений, которые кажутся немного странными, остальные, кажется, в порядке.

Я также попытался построить скрытые веса:

Веса после 3 эпохи

Веса после эпохи 3 http://baptiste-wicht.com/static/finals/hiddens_weights_epoch_3.png

Веса после эпохи 4

Веса после эпохи 4 http://baptiste-wicht.com/static/finals/hiddens_weights_epoch_4.png

(они построены в двух цветах с использованием этой функции:

static_cast<size_t>(value > 0 ? (static_cast<size_t>(value * 255.0) << 8) : (static_cast<size_t>(-value * 255.)0) << 16) << " ";

)

И здесь они вообще не имеют смысла …

Если я пойду дальше, ошибка восстановления будет немного больше, но не дальше 0,025. Даже если через какое-то время я изменю импульс, он пойдет выше, а затем немного понизится, но не интересно. Более того, веса не имеют больше смысла после нескольких эпох. В большинстве примеров реализации, которые я видел, веса имели смысл после итерации полного набора данных два или три раза.

Я также пытался восстановить изображение из видимых единиц, но результаты кажутся почти случайными.

Что я могу сделать, чтобы проверить, что идет не так в моей реализации? Должны ли веса быть в пределах некоторого диапазона? Что-то кажется странным в данных?

Полный код: https://github.com/wichtounet/dbn/blob/master/include/rbm.hpp

2

Решение

Вы используете очень маленький уровень обучения. В большинстве NN, обученных SGD, вы начинаете с более высокой скоростью обучения и со временем снижаете ее. Ищите скорость обучения или адаптивную скорость обучения, чтобы найти больше информации об этом.

Во-вторых, при реализации нового алгоритма я бы порекомендовал найти статью, в которой он был представлен, и воспроизвести результаты. Хороший документ должен включать большинство используемых настроек — или метод, используемый для определения настроек.

Если бумага недоступна или была протестирована на наборе данных, к которому у вас нет доступа — найдите работающую реализацию и сравните выходные данные, используя те же настройки. Если реализации не совместимы по функциям, отключите как можно больше функций, которые не являются общими.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]