Здравствуйте, Victor G. Tsaregorodtsev. Вы уже много писали про обучение данного вида сети. Ваши ответы мне очень помогли, спасибо. Сейчас хочу обучить такую сеть методом Stochastic Diagonal Levenberg-Marquardt, взятого у Лекуна. Не могли бы Вы уточнить, как стартовать обратное распространение ошибки (для выходного слоя сети) для поиска значения диагонального гессиана. Как я понял, там надо (значение выхода нейрона предыдущего слоя в квадрате) умножить на (квадрат производной функции активации) и умножить на (третий множитель). Третий множитель на старте обучения равен единице? Я просто не совсем понял обозначения в формулах у Лекуна.
Я этим методом сам не пользовался - у меня нормально (в смысле получения сходимости, устраивающей меня по быстроте) работало обычное стандартное обучение. Т.е. я без прочтения статей сейчас ничего не подскажу (т.е. не помню, что и как) - а читать, честно говоря, лень.
Понятно. Я вобщем-то разобрался. Третий множитель - это действительно единица. А можно узнать, до какой СКО вы обучили свою сеть и за сколько эпох обычным алгоритмом?
СКО не мерял, ибо пользовался другой целевой функцией.
Эпох - ставил 50. Только для того, чтобы в ходе массовых экспериментов определить, возникает ли переобучение сети на использованной комбинации выбранных доп.алгоритмов (цел.функция плюс способ послойной инициализации сети плюс способ послойного управления величиной шага - именно эти три отличия и сделали возможным быструю сходимость обычного бэкпропа). В итоге получилось, что при частой (более чем в половине случаев) сходимости ОШИБКИ ОБОБЩЕНИЯ к минимуму за примерно 30 эпох после этого идет довольно четко видимое переобучение (ухудшение точности обобщения до 0.2%). Если же сходимость подтормаживает, то 50 эпох вроде как раз. В итоге при вероятности переобучения лучше подольше поучить, но иметь возможность почетче отфиксировать опт.состояние сети - если сохранять в памяти не только ошибки каждой эпохи, но еще и состояние сети, то можно делать "откат" на нужную конфигурацию. Ну и всё сказанное в итоге и привело к нежеланию пробовать SDLM - проще ручным перебором доп.алгоритмов довольно точно определить правило, квазиоптимально работающее в конкретной задаче для заданного числа слоев сети, чем при автоматическом назначении шага оставаться без какой-либо пригодной для осмысления информации.
Да, я баловался не с ЛеКуновской структурой сверточной сетки (со слоями ресэмплинга), а с вариантом из работ П.Симарда (без слоев ресэмплинга, но со смещениями рецептивных полей сверточных нейронов не на 1, а на 2 пиксела). Т.е. в сети у меня было 4 слоя.
Да, у меня тоже вариант сети из работ Симарда. Одна эпоха обучения на Core 2 Duo 1925 МГц длится 28 минут, поэтому я хочу ускорить сходимость.
1) 28 минут - это долго? А сколько минут обучается ваша реализация на одной эпохе?
2) какую целевую функцию вы используете?
3) >>ухудшение точности обобщения до 0.2%. Вы тестировали на тестовом множестве базы рукописных цифр MNist? Эта ошибка даже меньше чем у Симарда!:)
1. Ну что сказать - надо было читать мой сайт ;) Для сети размером 5-25-50-10 я давал весной цифры в www.neuropro.ru/memo312.shtml Для сети 6-50-100-10 - в www.neuropro.ru/memo315.shtml В общем, на Коре2Дуо Е6420 (2.13мгц) сетка размером 6-50-100-10 у меня в однопоточном режиме молотит 327 примеров в секунду, т.е. эпоха длится 60000/327~~183сек~~3мин максимум (ибо есть возможность ускорения путем необучения правильно и надежно распознаваемых примеров). Т.е., как я писал во второй названной заметке, моя прога исходно шпарит на порядок быстрее других вариантов (я сравнивал с вариантом одного американца, ссылка на его прогу там есть, но теперь и Ваша прога этот вывод подтверждает).
2. "Расстояние до множества правильно интерпретируемых ответов". Кратко была упомянута в книгах Горбаня-Россиева и Миркеса, наиболее полный вариант формул был не помню в какой их статье (Вам вряд ли этот текст будет доступен). Я ей пользуюсь уже более 10 лет, в ходившей по инету моей проге NeuroPro 0.25 для задачи классификации использовалась именно эта ц.ф.
3. Да, МНИСТ. Я просто криво написал - имелось в виду ухудшение по сравнению с достигнутым на обучаемой в настоящий момент сети минимумом ошибки обобщения, если обучение продолжается далее (т.е. ошибка обучения далее еще падает, но ошибка обобщения проходит минимум и начинает подрастать - переобучение в общем). Самый минимум ошибки же - на уровне 1% (чуть хуже, чем 0.9% у ЛеКуновского варианта, т.к. ресэмплинг у Симарда реализован на сверточных слоях смещением на 2 пиксела, что ухудшает точность определения информативных признаков на изображении), но если пользоваться генератором искажений, то точность можно повысить до 0.6-0.7%, как и у них. Да - эти цифры, естественно, для сеток достаточно большого размера (6-50-100-10 и подобные).
Спасибо большое за ответы! А не могли бы Вы рассказать про ноу-хау для "эффективности создания и применения нейронных сетей", если не секрет конечно(хотя бы озвучить их). Очень интересно в образовательных целях. Это распараллеливание обучения сети, развертывание циклов, а что еще?.. В любом случае спасибо!
Здравствуйте. Спешу поделиться промежуточными результатами по обучению сети. Обучил сеть двумя алгоритмами - SDLM и алгоритмом наискорейшего спуска. И там, и там сеть обучалась по две эпохи (сеть сохраняю в файл, поэтому возможно дальнейшее обучение), коэффициент обучения и там, и там на двух эпохах = 0.001. SDLM: СКО = 0.1371, ошибок на тестовом множестве = 583; наискорейший спуск: СКО = 0.1149, ошибок на тестовом множестве = 354.
1)Эти результаты на данном этапе можно считать удовлетворительными?
2)До какой СКО необходимо и достаточно обучать сеть?
3)В каком случае можно не обучать сеть примерам на текущей эпохе? Вы писали, что если пример правильно и надежно распознан. Для текущей эпохи, что является этим "правильно и надежно"?
>"эффективности создания и применения нейронных сетей"
А тут всё собирательно - от знания алгоритмов и особенностей их работы до быстрой программной реализации и выбора/нахождения наиболее оптимального/лучшего решения для конкретной задачи
>Эти результаты на данном этапе можно считать удовлетворительными?
Наверно, нет - SLDM вроде как должен дать лучшую точность. А если "наискорейший спуск" - это на самом деле обычное попримерное обучение, то в принципе его результат на уровне, но, наверно, можно еще проверять-шаманить (с шагом и т.д.), чтобы весь процесс обучения на нескольких десятках эпох шёл нормально и стабильно, без расхождения.
>До какой СКО необходимо и достаточно обучать сеть?
Если Вы не поняли из прошлых моих постов - СКО НЕ ЯВЛЯЕТСЯ сколько-нибудь значимым индикатором чего-либо (например, точностей распознавания обучающей и тестовой выборок) и НЕ ЯВЛЯЕТСЯ АДЕКВАТНЫМ для используемой в задачах классификации схемы интерпретации ответа сети (т.к. используется интерпретатор вида "победитель забирает всё", то этот интерпретатор совершенно никак не завязан на эталонные обучающие коды 0/1 или -1/1 для выходных сигналов)
>В каком случае можно не обучать сеть примерам на текущей эпохе? Вы писали, что если пример правильно и надежно распознан. Для текущей эпохи, что является этим "правильно и надежно"?
Ну, если например, для этого примера все выходные сигналы сети по модулю отклоняются не более чем на 0.1 от эталонных кодов 0/1 или -1/1. В случае используемой мной целевой функции условие "обученности" будет другое. Т.е. смысл в том, что не стоит выжимать копейки, если ответ сети однозначно и надежно говорит в пользу предписанного класса. Из пользы, кроме быстроты, - ну, насыщение нейронов может снизиться (и не возникнет замедление сходимости или паралич обучения), переобучения может не быть.
Ну и наверно, давайте заканчивать общение - мне лень рассказывать материалы из учебников (по моим впечатлениям) либо выдавать ноу-хау, а также повышать информативность чужого портала ;)
Хорошо. Спасибо, что находили время отвечать на мои вопросы. Быши ответы пошли мне на пользу. Удачи!
Увидел ваше обсуждение и подумал, что вам или тому, кто будет читать эту тему может быть полезна ссылка на матлаб реализацию сверточных нейросетей написанную мной: http://www.mathworks.com/matlabcentral/fileexchange/24291
На той же страничке есть ссылка, на аналогичную реализацию, но несколько более гибкую Николая Чумерина.
Моя версия довольно хорошо коментирована и сама структура класса способствует легкой читаемости кода, что, правда, негативно сказывается на производительности. Однако, уже на стадии отладки mex-функция для класса, делающая скорость работы системы сравнимой с заявленной в статье ребят из MS Research (сотни образцов в сек). Ну и главное - это open source.