Как стать автором
Обновить

Комментарии 46

тщетно бытие -)
Да, смотрится внушительно.
Хорошо бы ссылку, чтобы скачать целиком код
Вы — большой молодец. Разложили по полочкам.
Кстати, вам не попадались статьи со сравнением скорости работы различных алгоритмов обучения? Хотя бы применительно к какой-то конкретной задаче. Было бы интересно сравнить.
не попадались, все хочется почитать про всякие другие крутые алгоритмы, но не доходят руки. оправдываю себя тем, что если градиентный спуск работает на задаче плохо, то замена алгоритма если и улучшит качество, то не сильно, лучше копаться в структуре сети и в других параметрах. ну это чисто интуитивное наблюдение
ну да и обратная сторона, если градиентный спуск дал хороший результат то и более крутой алгоритм даст хороший, и может чуть лучше. проверял на задаче OCR. в сами эти модные алгоритмы не вникал, брал готовые на матлабе
если градиентный спуск дал хороший результат то и более крутой алгоритм даст хороший

Это определение «более крутого алгоритма». :)
По-идее, алгоритм обучения на качестве никак особо не может сказаться. Точнее, сеть либо будет обучена, либо не будет.
А вот на «толстых» задачах с входными векторами больших размерностей и со сложной топологией сети смена алгоритма может дать ощутимый прирост в скорости обучения.
Это если говорить про перцептроны, конечно. В других моделях свои нюансы.
да на счет скорости мое империческое правило не распространяется -) все новые алгоритмы она как раз на ускорение заточены

Точнее, сеть либо будет обучена, либо не будет.

а это как? какой критерий обученности сети? по идее сеть с рандомными параметрами уже обучена, просто хренова -) сеть останавливает обучение как только попадает в некий локальный минимум (ну в общем случае, может есть алгоритм какой нибудь который видит «дальше» локальных), а вот уже в каком минимуме она остановится зависит в том числе и от алгоритма. но не только. начальная инициализация весов тоже крайне важна.

в общем состояние обученности это не однозначное состояние -)
Ну да, я не совсем корректно выразился. Имел ввиду про локальный минимум.
Да, все весьма относительно в плане обученности сети :)
все новые алгоритмы она как раз на ускорение заточены

Точнее, на получение хорошего ответа за приемлемое время. Акцент всё же на точности, а не на скорости.

сеть останавливает обучение как только попадает в некий локальный минимум

Или в длинный овраг с маленьким градиентом

ну в общем случае, может есть алгоритм какой нибудь который видит «дальше» локальных

Есть методы глобальной оптимизации. Но по понятным причинам, они медленные.
Есть методы глобальной оптимизации. Но по понятным причинам, они медленные.


наверное ооооочень медленные -)
А то! Ещё и не факт, что сойдутся. Проблема в общем не решается.
По-идее, алгоритм обучения на качестве никак особо не может сказаться. Точнее, сеть либо будет обучена, либо не будет.

С плохим алгоритмом сеть свалится в первый попавшийся локальный минимум. Или будет обучаться годами.
Кстати, вам не попадались статьи со сравнением скорости работы различных алгоритмов обучения? Хотя бы применительно к какой-то конкретной задаче.

Кстати, может кто знает. Юзал для нейросетей на Java Encog (вроде самый быстрый из NS-фрэймворков для Java, на C# он тоже есть) и пытался приметить обучение через Levenberg-Marquardt (вроде самый быстрый метод, на примитивных тестовых задачах отрабатывает на порядки быстрее, чем Resilient Propagation). Так вот какую бы реальную задачу (а это у меня всегда как минимум несколько десятков входных нейронов) я ни пытался так решать сетью с таким методом обучения, всегда отказывается тренироваться, ссылаясь на нехватку памяти (а 2 гига я ей выделяю спокойно). Так вот интересно: сколько входных нейронов ей можно подсунуть так, чтобы она не поперхнулась?
Отличное изложение!
Очень похоже на то, как объясняли в Стенфордском курсе.
мл прошел -)
НЛО прилетело и опубликовало эту надпись здесь
честно говоря первый раз слышу -) а что это? случаем не там где learning rate изменяется динамически?
НЛО прилетело и опубликовало эту надпись здесь
ну как освою тогда напишу сюда -) давно хочу изучить способ динамического изменения скорости обучения. каким нибудь не тупым способом типа равномерно уменьшать при увеличении итераций
Ну все, вы попали. Я вас заплюсовал.
Большое спасибо! Весьма мало таких статей где мат. формулы поясняются в виде кода — а это очень ценно! (Тем более c#).
это и есть цель — показать наглядно -) графикой не умею, так что показываю кодом -)
Графикой не передать суть :)
Код. Только код. :)
С кодом часто есть риск за деревьями не увидеть леса.
С картинками часто есть риск за водой не увидеть ничего.
Хотел бы вам (автору) предложить прочитать одну мою статью здесь Резюме проблемы «двух и более учителей» и субъективное мнение о ИИ-сообществе. Там есть заголовок «Задача». Можете вашей реализацией решить поставленную там тестовую задачу и показать результат в аналогичном виде. Было бы интересно сравнить. (К сожалению, я сейчас занят другим и думаю руки дойдут до этого не скоро). Ниже в комментариях, есть еще один вариант реализации вроде как тоже с BackProp, но там без исходников — поэтому доверия меньше.
попробую на днях, а так сходу отвечу что решит наверняка. еще в 1969 году… а лучще я цитату с педивикии приведу -)

В 1969 году Марвин Минский и Сеймур Паперт опубликовали книгу «Перцептроны», где математически показали, что перцептроны, подобные розенблаттовским, принципиально не в состоянии выполнять многие из тех функций, которые хотели получить от перцептронов.


так что если вы применяли именно персептрон, то вполне он мог и не решить задачу
Про Минского вы зря :)… то о чем говорил Минский ровно также относится и к BackProp… но тут речь совсем о другом…

Вопрос не в том решит или нет (оба варианта решают задачу на раз). Вопрос как решит.
а я и не сказал что Минский писал про бэкпроп, он писал про персептрон, и вы используете персептрон, вы даете не полные данные, он не обучается. можно предположить что это как то связанно -)
Вы пишите не о чем. Минского вы же не читали :) он писал и о том и о другом, кстати… про перцептрон Розенблатта, конечно, больше.

Дальше вообще странная фраза «вы даете не полные данные, он не обучается», какие данные ?, почему не обучается? Я ему даю все, что надо и он замечательно обучается. Похоже Вы чего-то не поняли… но я не понимаю что.
не читал, но то о чем он пишет можно узнать и по другому -)

да вероятно не понял задачу

Но когда всё известно нет места для прогноза. Поэтому давайте уберем каждую вторую точку


убрав каждуй вторую точку и попросив персептрон обобщить оставшиеся, это разве то? вы даете ему часть инфы, просите обобщить. и задача в том, сможет ли это обобщить другая модель, и на сколько лучше/хуже. в общем я так это понял.
Нет, по другому узнать не возможно, по другому вы узнаете то, что он никогда не писал, а то, что ряд сказочников придумал, что он писал :)

«убрав каждуй вторую точку и попросив персептрон обобщить»

Это стандартная постановка задачи для ЛЮБОЙ нейронной сети — задача прогнозирования. Что вас смущает? Известно, что перцептрон Розенблатта и MLP+BackProp — это делает… вопрос в деталях… они мне и интересны.
Нет, по другому узнать не возможно, по другому вы узнаете то, что он никогда не писал, а то, что ряд сказочников придумал, что он писал :)


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

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

Мне интересно число ошибок при этом — отдельно для обучающей выборки, отдельно для тестовой, возможность безошибочного обучения на обучающей выборке, а также распределение ошибок по квадрату.
И да еще. Мне на самом деле важно, то как вы закодируете — там есть два способа: один в точности как я написал: «будем иметь БИНАРНЫХ 16 входов и 256 выходов в перцептроне», и то как упростил ererer «десятичные два входа и один выход».

Вы забыли главное, показать, имплементировать практическое применение и расказать почему именно ваша сеть лучше других, без этого смахивает на очередную лабу из политеха.
это не моя сеть -) это просто сеть, а на ней просто алгоритм градиентного спуска, ничего особенного
Насколько большим может быть размеры первого и последнего слоев? Как решается задача классификации текстов с помощью нейронных сетей? Как я понял на вход подается вес каждого слова из корпуса, а размер последнего слоя равен количеству категорий.
это уже тема отдельных статей.

последний — это размерность выходного вектора, она задана обычно условием задачи оптимизации

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

про тексты. размер последнего — да, количество категорий. входной вектор — это например бинарный вектор из всего словаря, где 1 если слово есть в тексте, а 0 если нет. можно вектор фич по другому построить. количество скрытых слоев и их размер на ваш выбор.
в самой первой формуле случайно нет ошибки? может x_ i (а не x_ j)?
спс, поправил. прикольно что только спустя столько времени была замечена опечатка =) поздавляю! вы походу первый кто при чтении вникал =)
Давно не был на хабре, просто читал все посты подряд, а тут ваш. Приятные воспоминания, лет 15 назад тоже кодил бэкпроп. Правда ничего серьезного, просто ради развлечения, эх, молодость =)))
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории