Я пытаюсь закодировать на Python несколько типов алгоритмов ИНС, чтобы лучше понять / интуитивно их понять. Я не использую Scikit-learn или какие-либо другие готовые пакеты, поскольку моя цель скорее образовательная, чем практическая. В качестве примера проблемы я использую базу данных MNIST (http://yann.lecun.com/exdb/mnist/).
В то время как я выполнял простые NN с 1 скрытым слоем и сверточную NN, я успешно избегал любых методов оптимизации второго порядка и, таким образом, не вычислял матрицу Гессе. Однако затем я попал в байесовскую сеть NN, где для оптимизации гиперпараметров вычисление гессиана является обязательным.
В моей полностью подключенной сети 784 входа, 300 скрытых модулей и 10 модулей вывода. Все это дает 238200 весов (+ смещения). Когда я пытаюсь вычислить или даже приблизиться к Гессену (по внешнему произведению градиентов), Python уведомляет об ошибке «MemoryError». Даже если я уменьшу количество весов до ~ 40000 и сообщение об ошибке не появится, мой компьютер зависнет через несколько минут. Насколько я понимаю, проблема в том, что желаемая матрица крайне огромна. Я просмотрел пару статей по байесовским сетям и заметил, что авторы обычно используют сетевые архитектуры не более чем с 10 или 20 входами и скрытыми модулями, таким образом имея намного меньше параметров, чем у меня. Однако я не видел явных заявлений о таких ограничениях.
Что я могу сделать, чтобы применить байесовский подход к NN для MNIST?
В более общем плане: возможно ли применить байесовский подход с этой (238200 весов) или даже более крупной архитектурой? А может, он подходит только для относительно небольших сетей?