Практикум на ЭВМ (317)/Autoencoder
Материал из MachineLearning.
Это черновик задания. Не сто́ит приступать к его выполнению до официального релиза. |
В этом задании Вам предстоит реализовать нейросетевой алгоритм сокращения размерности данных, известный как автокодировщик (autoencoder). Его нужно настроить на базе изображений рукописных цифр MNIST. Обратите внимание, что нейросети обучаются значительное время.
Содержание |
Цели
- Познакомиться с задачей сокращения размерности данных (сжатия с потерями).
- Понять, какие практические проблемы возникают при обучении искусственных нейронных сетей.
- Усвоить принципы глубинного обучения.
- Закрепить навыки манипуляции с матрицами.
Бэкграунд
- когда нужны нейросети? (большие данные, нелинейная разделяющая поверхность)
- нужно ли искать глобальный оптимум?
- проблемы использования нейросетей: вычислительно трудная оптимизация (сейчас есть кластеры), проблемы с инициализацией весов и воспроизводимостью (глубинное обучение),
- автокодировщик, идея feature learning.
Данные
MNIST:
- качаем отсюда: http://yann.lecun.com/exdb/mnist/
- конвертер от Салахутдинова: http://www.sciencemag.org/content/suppl/2006/08/04/313.5786.504.DC1/1127647code_tar.zip (или дать уже сконвертированные)
- отображение:
imshow(reshape(digitdata(1,:), 28,28)')
(транспонирование, т.к. записаны по строкам)
Детали задания
- использование кросс-энтропии при обучении (бонус — MSE)
- регуляризация — L2 (weight decay) и gaussian noise
Мои результаты
- MNIST, only 0, PCA-30: MSE=9.0
- MNIST, only 01, PCA-30: MSE=7.3
- MNIST, all-dig, PCA-30: MSE=14.2
- MNIST, only 0, PCA-18: MSE=13.0
- MNIST, only 1, PCA-18: MSE=3.7
- MNIST, only 01, PCA-18: MSE=10.6
- MNIST, all-dig, PCA-18: MSE=20.0
- MNIST, only 0, autoenc-st0b5e10: MSE=50.0 (averages everything) // 5 batches, 10 epochs (default: targ-CE, opt-CG)
- MNIST, only 0, autoenc-stNorm(0,0.3)b5e1000: MSE=12.6 (continues optimizing)
- MNIST, only 0, autoenc-stNorm(0,0.3)Tie-b5e400: MSE=16.0, 2-3 hours // seems no difference from the previous case
- MNIST, only 0, autoenc-stNorm(0,0.3[*2,4])Tie-b5e400: MSE=23.4
- MNIST, only 0, autoenc-stNorm(0,0.2)-b5e100,targ-MSE: MSE=55.0, (continues optimizing, diverse) // slower, but okay
- could not make stochastic gradient find non-trivial optimum
- MNIST, only 0, autoenc-LeCunInitTanh(Last)Mean-b5e300,targCE: MSE=131.8
- MNIST, only 0, autoenc-stLeCunInitx10-b5e300: MSE=28.7
- MNIST, only 0, pretrain-tiedw-1-stNorm(0,0.3)-b6e50: MSE=2.7, 20 min
- MNIST, all-dig, pretrain-tiedw-stNorm(0,0.3)-b6: MSE1(e200): 0.86, MSE2(e500): 3.1, MSE3(e200): 3.3, MSE4(e200): 9.7. Backprop, 300it: MSE=6.5
- MNIST, only 0, pretrain-tiedw-stNorm(0,0.3)-stoch-b150: MSE1(e200): 1.6, MSE2(e500): 4.2, MSE3(e200): 2.3, MSE4(e200): 4.7. Backprop, 500it: MSE=3.0 // 2 hours
- MNIST, all-dig, pretrain-tiedw-stNorm(0,0.3), targ-MSE, arch-sigm+1e-4(except-linear,last): // 630 s
- level1: 3ep, momentum=0.97, nbatches=1500, step=(k+1)(-1/4), MSE=3.2.
- level2: 3ep, momentum=0.97, nbatches=1500, step=(k+1)(-1/4), MSE=7.3.
- level3: 3ep, momentum=0.97, nbatches=1500, step=(k+1)(-1/4), MSE=4.1.
- level4: 3ep, momentum=0.97, nbatches=1500, step=(k+1)(-1/4), MSE=6.0.
- backprop: 3ep, momentum=0.97, nbatches=1500, step=(k+1)(-1/4), MSE=8.0. // 630 s
- MNIST, all-dig, pretrain-tiedw-stNorm(0,0.3), targ-Xentropy, arch-sigm: // 730 s
- level1: 3ep, momentum=0.97, nbatches=1500, step=(k+1)(-1/4), MSE=1.7.
- level2: 3ep, momentum=0.97, nbatches=1500, step=(k+1)(-1/4), MSE=5.3.
- level3: 3ep, momentum=0.97, nbatches=1500, step=(k+1)(-1/4), MSE=2.5.
- level4: 10ep, momentum=0.97, nbatches=1500, step=0.01*(k+1)(-1/4), MSE=7.4.
- backprop: 3ep, momentum=0.97, nbatches=1500, step=0.1*(k+1)(-1/4), MSE=8.7. // 645 s