Pull to refresh

Comments 32

Было бы интересно посмотреть на аппроксимацию замкнутых кривых!

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

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

Важное дополнение без которого тебя закалупают всё опытные любители нейронных сетей — скрывать от сети часть входных данных и смотреть как сеть поведёт себя на этих участках. Я бы посоветовал, например, треть входных данных на графике скрывать от обучения и отмечать эти места цветом. Потом посмотреть как качество апроксимации ведёт себя если добавить в скрытый слой больше чем надо нейронов. Бывает довольно поучительное зрелище. А у некоторых других алгоритмов и при правильной регуляризации наоборот получается всё хорошо и красиво.

Спасибо. Хорошее дополнение.

Но преимущество ReLU в том, что это очень простая функция. И имеет очень простую производную. Соответственно скорость вычислений существенно возрастает. Поэтому ReLU можно использовать там, где не важна высокая точность, а важно скорость работы нейронной сети.

Нифига подобного. Преимущество ReLU в том, что для нее не надо подгонять входные и выходные данные под диапозон [0;1] или [-1;1] с нормированием. Что в реальной жизни на реальных данных далеко не всегда возможно.(Далеко не для всех данных известны максимумы и минимумы, без чего нормализация будет неточной).

А теперь по функции. Вы решаете проблему, у которой уже есть решения намного более простые и эффективные чем нейронные сети — вывод функции по точкам 100% ей принадлежащим. Для этого нейросети не нужны! А нужны они в реальной жизни, когда к данным примешан случайный шум. И простые алгоритмы аппроксимации показывают себя намного хуже. Хотите, чтобы ваша демка была про нейросети — реализуйте добавление случайного шума хотя бы +-5% ко всем входным f(x).

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

Про relu, такого не знал, спасибо. Я никакую проблему не решал. Этот пример учебный, и сделал для того что бы лучше понять, как работают/обучаются нейросети. Может еще кому-нибудь этот пример и статья пригодится. Начал с самого простого, и до примерами с шумом еще доберусь.

Что-то я не слышал никогда такого аргумента о ReLU. Их основное преимущество — гораздо меньше шансов на затухание и «взрыв» градиента. Собственно, использование ReLU было одним из важных шагов по построению рабочих глубоких нейросетей (ну и скорость тоже, в принципе). А вот масштабировать данные всё равно стоит в подавляющем большинстве случаев.

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


В статье никакой описательной части по существу моделей, алгоритмов и принципов работы нет. Просто полотно с красивыми картинками.
Получается, вся суть в том, чтобы продать кота в мешке?

Ну если вы переживаете из-за вирусов в исполняемом файле, то уверяю вас, там их нет.


Ну насчет исходников, мое право делать с ними все что захочу. Тем более подчеркиваю что эта статья не рекламнаю, тут про их продажу ничего нет. Есть лишь в видео и на моем сайте.

С вирусами или без вирусов (сам с ними разберусь без проблем), давайте, пожалуйста, бинарник побаловаться. :)
Зачем ещё одна начальная статья по нейронным сетям?

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

У меня знакомый интересуется этой областью.
Если не жалко....

LeakRelu
CRelu
и еще какие нить функции активации было бы интересно посмотреть

троллейбус.jpg
Взять нейронную сеть и начать с её помощью решать задачу, для которой она заведомо не очень хороша? Ну… Может, как учебная задачка и сойдёт, но я бы не стал.

Функцию Дирихле аппроксимируй, для интереса.
Ой, а можно я!!! Можно я!!! Моя апроксимация:
(double x) => { return 1; }

Даёт 100%-ную точность приближения, как показывают тесты.
Ну что умник, сам догадаешься почему, или подсказка через сутки? :)
Иногда лучше быть добрым, чем не самым умным.

Сможешь привести пример кода, который продемонстрирует, что свойства не те?
А знаешь почему не сможешь? Потому что не целые числа в компьютере представляются в виде чисел с плавающей точкой, а они, так уж исторически сложилось, могут представлять только рациональные числа.

Будь добрее к людям, и менее язвителен.
«Because the Dirichlet function cannot be plotted without producing a solid blend of lines» мы вместо неё построим другую функцию. :)))
image
— для необходимого уровня апроксимации — выбираем m и n.
Выходит, что универсальная теорема аппроксимации действительно верна

А разве ее не доказал Цыбенко еще в 1989 году?

В целом, пока пока статья смотрится бледновато — особенных глубин понимания не продемонстрировано. Настоятельно рекомендую посмотреть на курсере курс Machine Learning стэнфордского университета, хотя бы первые 4 недели курса. Там буквально на пальцах разжевывается суть задачи приближения функции и то, как она связана с нейронной сетью. В частности, там вы узнаете, почему добавление весового нейрона улучшает сходимость, в чем прелесть нормирования входных данных, и как можно строить нелинейные приближения, используя линейную функцию активации
Проблема изучения по курсам в том, что человек оказывается малоспособен воспринимать то что осталось за рамками курса. Вот точно так же начав с апроксимации, только я приближал функцию двух переменных, я получил новые знания о эфекте регуляризации на обобщающие способности сети. А те, кто учили по курсам в большинстве своём даже не способны были понять о чём идёт речь, особенно столкнувшись с хоть чуть отличающейся задачи.

ИМХО — правильный путь от половины до четверти пути, там где ты на основе подсказок и намёков понять что именно нужно делать чтобы это увидеть/провеить делать самому, потом снова читать чтобы нахвататься новых идей подсказок и готовых решений для следующей самостоятельно работы.
Хороший подход к изучению этой темы! Очень правильный!
Я не совсем понял: аппроксимация требует несколько двухмерных точек. А у вас на входе одинокое значение. Где второе для одинокой точки? Как вводятся другие точки?
Не понял вопроса. И что значит «одинокое значение»?
Для аппроксимации нужна входная информация {x, f(x)}. Например, (-5, 0.96), (-4, 0.76), (-3, -0.14), (-2, -0.91), (-1, -0.84), (0, 0), (1, 0.84), (2, 0.91), (3, 0.14), (4, -0.76), (5, -0.96). Это синус. Для аппроксимации полиномом желательно иметь точек количеством не менее степени полинома, лучше больше. Если меньше, то аппроксимация станет бессмысленной, вообще не аппроксимирующей. А уж ввод функции без аргумента делает аппроксимацию просто невозможной.
В статье этот вопрос не раскрыт напрочь. То есть для любой выбранной одинокой точки в сеть скармливается только f(x), без x. И не понятно сколько раз вводится.
Ну если вы невнимательно смотрели на схему, то в сеть скармливается x, а не f(x). На выходе сеть дает значение NetOut. Вычисляется ошибка сети, error = f(x) — NetOut. В соответствии с этой ошибкой корректируется веса. Таким образом делается 10 000 итераций (эпоха обучения). После каждой эпохи, график сети обновляется в программе.
Sign up to leave a comment.

Articles