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

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

Ящик водки и всех обратно!
Как-то навеяло.

НЛО прилетело и опубликовало эту надпись здесь

Когда я писал ИНС (2001 г.) "велосипедов" (библиотек) было всего пару штук и под мои задачи не подходили — писал сам тоже. :) Недавно обновил под современный C++: https://github.com/akontsevich/NeuroNet — но не дописал к сожалению, т.к. задач под неё пока нет.

На самом деле спасибо за статью! Очень не хватает в интернете подобных гайдов, чтобы самому посмотреть и разобраться как внутри все устроено. Большинство статей по ML используют популярные библиотеки и по факту являются не более чем документацией к ним. Часто говорят про сложную математику, но никто не пытается ее показать либо объяснить. Если накидаете еще таких вот вводных статей, а не «как я использовал тензорфлоу в сотый раз» буду прям благодарен.

Большинство открытых курсов по МЛ как раз и показывают всю математику. А посмотреть на реализацию на C++ лучше в tiny-dnn например, там API и код куда чище, не в обиду автору.

Недавно в процессе археологических раскопок нашёл свой велосипед десятилетней давности на Java.


Активационной функцией может быть любая функция, имеющая предел, т.е значении, к которому она стремится, но никогда не достигнет. Таких функций огромное множество, но мы воспользуемся наиболее популярной – сигмоидой

Тогда я изучал тему методом тыка в рамках хобби, в математике терялся, а с тех пор вообще перестал интересоваться, но помню как сильно недоумевал по этому поводу. Почему там вообще должен быть предел? Я пытался построить не столько "перцептрон", сколько нейронную сеть, которую можно было бы обучить решать произвольное уравнение от нескольких переменных, читай дифур. Ожидалось, что за счёт обучения сети она научится подбирать коэффициенты, при которых решение дифура для заданного временного ряда входных параметров будет стремиться к заданному временному ряду выходных — сродни задаче получения матмодели объекта или подбора коэффициентов для ПИД-регулятора, только вместо ПИД у ней неонка нейронка.


Это я к чему. В довольно-таки простом случае, когда на входе всего один параметр x = 0, 1, 2, 3..., на выходе ожидается y = 0, 1, 4, 9..., сигмоида — это не совсем то, что хотелось бы видеть. При усложнении временных рядов становится нифига не очевидно, какие функции стоит использовать в качестве передаточных ("активация" тут немного не то слово, как собственно и "перцептрон", одинаковое только архитектура и backpropagation).


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



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

Точно, был не прав об ограничениях активационных функций, спасибо, исправлю
Было дело, и я баловался написанием собственных нейросетей. И на С++ и на Java.
Основная хитрость не перцептрон запрограммировать, а выбрать закон расчета начальных весов и правильные параметры обучения. Сеть я делал встречного распространения. Со слоями Кохонена и Гроссберга.
Также я всегда открыт для конструктивной критики и советов по коду, это важно, для этого и существует сообщество.

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

Очень не хватает в интернете подобных гайдов, чтобы самому посмотреть и разобраться как внутри все устроено.

К сожалению, данная статья только уводит в сторону.

Посмотрите простую реализацию micrograd — в первом приближении идея представлена OK.
Забыли добавить bias

Bias вроде бы можно "вшить" в каждом слое, дополнив матрицу и входные-выходные вектора одним доп. измерением (константой 1).
Скажем, вместо y = A*x + b, где y = (y1; y2), A = [ a11, a12; a21, a22 ], x=(x1; x2), b=(b1; b2) сделать
y_new = (y1; y2; 1), A=[a11, a12, b1; a21, a22, b2; 0, 0, 1], x_new=(x1; x2; 1).
Правда есть небольшое сомнение, не "испортит" ли backpropagation последнюю строку матрицы (в данном случае (0, 0, 1)) и не испортит ли накопление ошибок введённую константу 1. Но наверное, это можно вылечить, в backpropagation не учитывая последнюю строку матрицы как оптимизируемые переменные.

Для тех кому интересна тема нейросетей и Си++, привожу свой вариант свёрточной нейросети для Linux и Windows. Используется CUDA, так как если делать свёртки на процессоре, то ждать можно до ослиной пасхи. Для Windows среда Visual Studio 2010. Для Linux Code Blocks. Внутри дофига отладочного закомментированного кода (типа вывода картинки ядер и результатов свёрток в tga-файлы и тому подобного).

Linux вариант

Windows вариант

Собственно, они отличаются по сути только файлами system.h, system.cpp и main.cpp.
Сама сеть в файле ccudacnn.cu.h. В сети два свёрточных слоя, после каждого слой субдискретизации, затем полносвязная сеть.
Есть вариант с softmax выходной функцией, но я его пока в репозитории не помещал.
Игрушка обучается, но склонна запоминать ответы на обучающую выборку. Пока думаю, как прикрутить dropout без проблем.
Внутри ccudacnn.cu.h в константах задаётся размер минипакета. Этот блок будет целиком обучать сеть за один раз на GPU. На вашей карте может не хватить памяти или времени на таймаут GPU для заданных параметров, поэтому этот размер надо настраивать под своё оборудование. А если минипакет сделать слишком маленький, то GPU будет часто простаивать.

Игрушку я делал по вот этой статье.
Автор не точен в формулировках.
1.Описывается однослойная нейросеть, т.к. у однослойного персептрона входные сигналы могут принимать только фиксированные значения: 0 или 1 (neuralnet.info/chapter/персептроны или ru.wikipedia.org/wiki/Перцептрон).
2. Про забытое смещение уже упоминали.
3. Про функции активации (ФА) "Активационной функцией может быть любая функция, имеющая предел" просто неправильно написано (https://ru.wikipedia.org/wiki/Функция_активации) — одна из самых популярных ФА сейчас ReLU, которая предела не имеет.
4. Сигмоида порождает проблему т.н. затухания градиента (otus.ru/media/c7/78/9ac2ca_program_deep_learning_engineer.pdf или ru.coursera.org/lecture/supervised-learning/optimizatsiia-paramietrov-nieironnoi-sieti-yJ04D)
Спасибо, что указали на неточности, это поможет мне разобраться в теме лучше
Было бы хорошо в началах статьи и этой и 3й части сделать ссылки друг на друга, чтобы можно было читать подряд
Спасибо, это действительно будет удобно, добавлю
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории