Pull to refresh

Comments 28

Вторая ссылка, где про почитать, вдет туда же, что и первая.

Математик?


20% кода можно было сократить linq.
Что за ссылка на какой-то левый и невероятно тормозной "yadi.sk"?

Можно сократить в linq и сеть потеряет в производительности.

Справедливости ради хочу заметить, что странно говорить о падении производительности от использования Linq на сети с 16 (шестнадцатью) параметрами. Вы просто не почувствуете разницу.

Это же проект для тренировки. Позже окажется, что добавив немного кода, можно получить сеть поумнее. И так по нарастающей. Я видел, как такие вот «программулины для примера» превращаются в коммерческое ПО. Вот только оптимизация уже отнимает больше сил и времени. Поэтому изначально лучше не сокращать код жертвуя производительностью, особенно когда он не упрощается, а именно сокращается. Неужели linq тут выглядел бы понятнее? Ну разве что чуть-чуть.
Даже такой простой код написан так, что и комментарии не помогают читать его не возвращаясь несколько раз назад. :(

Я не перфекционист, но блин… )
Очень интересный путь к проекту, который видно в заголовке консоли :)
Мамка не разрешает прогать, и он прячет VS похлеще порнухи =)
О, ссылка на моё видео) автор, посмотри OpenCL под C#, возможно это ускорит твою сеть. =)

Вставлю-ка и я свои пять копеек.


"Нейронные сети. Полный курс" Саймона Хайкина к прочтению в том случае, если вам придётся столкнуться с применением/написанием/разработкой нейросетей и прочего подобного stuff'а. Хотя в ней нет материала про новомодные свёрточные сети, никто не мешает загуглить лекции от какого-нибудь харизматичного работника Yandex/Mail.ru/etc. никто не мешает.

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


Я мог использовать, всякие Theano и Tensor Flow, НО под капотом моей смерть-машины в моём ноутбуке стоит "красная" видеокарта без особой поддержки API, через которые обращаются к мощи GPU(ведь именно их и используют Theano/Tensor Flow/etc.).

Они прекрасно работают на CPU. Но медленнее, конечно. Хотя для того же распознавания циферок из MNIST вполне и CPU хватит. Если персептрон, то за пару минут обучится.


Я не буду использовать смещения, потому что просто не хочу.

Если бы вы обучали не XOR(a, b), а NOT(XOR(a, b)), то без смещений у вас бы мало что вышло.


ReadKey();//чтоб консоль не закрывалась :)

Чтоб консоль не закрывалась можно нажать Ctrl-F5 в Visual Studio. В консольных приложениях обычно паузу в конце не ставят, ведь их запускают из консоли. ;)


По поводу самой статьи. Слишком много шуток-прибауток и прочей мишуры и слишком мало разговоров по сути. Если бы я всё это не знал, мне было бы сложно разобраться.

Если бы вы обучали не XOR(a, b), а NOT(XOR(a, b)), то без смещений у вас бы мало что вышло.

Если бы вы были повнимательнее, то заметили бы, что я обучил сеть не только XOR, но и NXOR. И это «вышло» без смещений. Нет, ну правда, зачем мне 2 нейрона на выходном слое?
Книжка Хайкина, конечно, классная, но порядком подустарела. Не зря свёрточные сети так популярны — они реально работают на больших данных. Персептроном на практике много не насчитаешь.

Я рассматриваю книжку Хайкина не в качестве «пилюли от всех болезней», а лишь как учебное пособие для построения фундамента знаний по этой теме. Я знаю, что свёрточные сети показывают результаты намного лучше, поэтому я напишу продолжение этой статьи об этом виде сетей.
Слишком много шуток-прибауток и прочей мишуры и слишком мало разговоров по сути.

Сама по себе статья не очень большая, код занимает ~35%. Так что сколько сути, столько и разговоров о ней) А шуток-прибауток, соответственно, ещё меньше.

Все равно спасибо за замечания, учёл для написания будущих материалов)
Я рассматриваю книжку Хайкина не в качестве «пилюли от всех болезней», а лишь как учебное пособие для построения фундамента знаний по этой теме. Я знаю, что свёрточные сети показывают результаты намного лучше, поэтому я напишу продолжение этой статьи об этом виде сетей.

Если она будет в стиле данной статьи, то не стоит.
Вы пробежались по верхам темы, не очень запарились с реализацией, и как бы качество материалы вышло «тяпь-ляпь».
Лучше убейте пару тройку дней (недель) на более плотное изучение материала, чтобы можно было лаконично и понятно для всех все это изложить и показать качественный код.
А то так ценность статьи дико падает, т.к. статей уже куча на эту тему, и все реализуют персептрон для XOR.
Хорош уже приводить академические примеры, персептрон можно легко и непринужденно использовать для управления и моделирование процессами (именно процессами, а не операциями типа XOR).

Сама по себе статья не очень большая, код занимает ~35%. Так что сколько сути, столько и разговоров о ней) А шуток-прибауток, соответственно, ещё меньше.

Теории в ней очень мало.
Почему структура именно такая а не иная? (потому что так в книжке написано?)
Почему функция активации именно такая и чем она лучше других? (а кстати каких?)
Каково качество обучения и обобщения полученной сети?
Все эти вопросы быстро бы возникли, если бы взяли задачу посложнее XOR.
Как по мне, все быстренько реализуют XOR, считают что карасавчеги и потом пишут в резюме «нейронные сети», а по факту когда встает реальная задача, возникает куча вопросов, на которые они не могут дать ответы и бегут читать книжку Хайкена.
Грустно товарищи, грустно!
Если бы вы были повнимательнее, то заметили бы, что я обучил сеть не только XOR, но и NXOR. И это «вышло» без смещений. Нет, ну правда, зачем мне 2 нейрона на выходном слое?

Да, в самом деле невнимательно читал. XAND — редкое обозначение на самом деле, не обратил внимание.


Но разве у вас «вышло»? Вот 4 нейрона в скрытом слое, скажем, зачем вам? Если сеть для XOR требует 3 нейронов максимум на всё (ну или 4, если хотите ещё второй выход добавить). Связей больше, обучается медленнее.


Ну вот сами посудите. Допустим, на входе все нули. Если нет смещений, на выходах нейронов первого слоя всегда будет 0.5. И за всех начинает отдуваться скрытый слой. Если добавлять нейроны, то, подозреваю, некоторые просто начнут играть роль смещения.


Вот вы раз в Unity программируете сами же видели, что в компьютерной графике матрицы 4×4, хотя координат 3. Вот это как раз из-за смещений. Чтобы вместо аффинных преобразований были линейные. С ними проще и лучше.

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

Сверточные сети разве не для ограниченного круга задач (свертки изображений по средствам фильтра)
Это вопрос, и это не точно)))

Даже сверточные сети по итогу сводятся к персептрону, так что я думаю немного не корректно писать что перцептрон не очень.
Сверточные сети разве не для ограниченного круга задач (свертки изображений по средствам фильтра)
Это вопрос, и это не точно)))

Про свёрточные сети я вспомнил, так как о них вспомнил автор. А круг у них хоть и ограничен, но очень широк. Я занимаюсь цифровой обработкой изображений с их помощью. Мне для работы хватает и ещё остаётся. :) Конечно, есть и другие архитектуры. Скажем, в обработке текста популярны LSTM/GRU.


Даже сверточные сети по итогу сводятся к персептрону, так что я думаю немного не корректно писать что перцептрон не очень.

Ну, не сказал бы, что прямо так сводятся. Архитектуры разные. Разве что вы какой-то обобщённый персептрон имеете в виду. Иначе можно было бы говорить, что все сети вообще сводятся к матрицам, но мы же не говорим о матрицах.


Персептрон в самом деле не очень, так как глубокую сеть пришлось бы обучать до скончания веков. Глубокое обучение и интерес к нейронным сетям появился именно после развития других архитектур. Хотя, конечно, как элемент большой сети персептроны используются. Например, как финальные слои свёрточного классификатора.


Хотя, конечно, это моё мнение, и все рассуждения в контексте именно глубокого обучения. А так персептроны можно много где использовать, если задача не слишком большая и сложная.

Можно ещё добавить в коррекцию весов предыдущее изменение веса с некоторым коэффициентом, как в пункте 4 на вики.

Вот, кстати, хорошее замечание. Инерция в стохастическом градиентном спуске заметно ускоряет сходимость.

Для такой сложной задачи на мой взгляд не требуется добавление момента инерционности. Вот в апдейте с рекогнитором картинок это будет.
рекогнитором

Классификатором. Ну или хотя бы рекогнайзером, хотя никто так их не называет. (Неологизмы Derivativator и Gradientor тоже порядком удивили.)

Всё началось с активатора и сумматора)

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

Информация о сетях свёртки в книге Хайкина, фактически, просто свидетельствует о существовании такого рода сетей.

Нынешние свёрточные сети во многом выросли из неокогнитрона, которому сто лет в обед. Так что они и в старых книжка упоминаются. Но подходы, которые сейчас стали повсеместными, появились сравнительно недавно. Скажем, ResNet в 2015, GAN в 2014 (опять же, я про обработку изображений больше, так как в этой области сейчас работаю). И всё это постоянно развивается и совершенствуется. На arXiv ежедневно что-то интересное и новое появляется, не успеваешь читать.


Хотя спорить не буду, когда-то основы по Хайкину и сам учил. Но вот не пригодилось.


P.S. Тут, книжку Гудфеллоу по глубокому обучению на русский перевели. Я теперь, если спрашивают, её рекомендую. А ещё лучше бесплатно на английском, так как перевод косячный местами.

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

В код не вдавался, кинул взгляд, но вот как то так, дерзайте :-)
1. У нейросетей бывает когнитивный диссонанс? :)
2. Не кажется ли хабровчанам, что люди — тоже нейросети? :)
Sign up to leave a comment.

Articles