Wolfram открыла доступ к своему репозиторию нейронных сетей

Оглавление (нажмите, чтобы открыть):

Wolfram открыла доступ к своему репозиторию нейронных сетей

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

Выражаю огромную благодарность Кириллу Гузенко за помощь в переводе.

«Что изображено на этой картинке?» Люди практически сразу могут ответить на этот вопрос, и раньше казалось, что это непосильная задача для компьютеров. Последние 40 лет я знал, что компьютеры научатся решать подобные задачи, но не знал, когда это произойдёт.

Я создавал системы, которые дают компьютерам разные составляющие интеллекта, и эти составляющие зачастую далеко за пределами человеческих возможностей. С давних про мы интегрируем разработки по искусственному интеллекту в Wolfram Language.

И сейчас я весьма рад сообщить о том, что мы перешли новый рубеж: вышла новая функция Wolfram Language — ImageIdentify, которую можно спросить — «что изображено на картинке?» и получить ответ.

Сегодня мы запускаем Wolfram Language Image Identification Project — проект по идентификации изображений, который работает через интернет. Можно отправить туда изображение с камеры телефона, с браузера, или перетащить его посредством drag&drop в соответствующую форму, или просто загрузить файл. После этого ImageIdentify выдаст свой результат:

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

Это хороший практический пример искусственного интеллекта. Однако для меня более важный момент состоит в том, что подобное взаимодействие с искусственным интеллектом мы встраиваем напрямую в Wolfram Language — ещё один мощный камень фундамента парадигмы программирования, основанной на знаниях.

Для того, чтобы распознать какое-то изображение при работе с Wolfram Language, Вам нужно просто применить функцию ImageIdentify к этому изображению:

На выходе Вы получаете некоторый символьный объект, с которым можно и дальше работать в Wolfram Language. Как в данном примере — выяснить, что это именно животное, млекопитающее и так далее. Или просто спросить определение:

Или, к примеру, сгенерировать облако из тех слов, что встречаются в статье Википедии, посвященной объекту на картинке:

Если у Вас есть какой-то массив фотографий, то Вы можете почти моментально написать программу на Wolfram Language, которая бы, к примеру, выдавала бы статистику о том, какие животные, устройства, платы — не важно что — насколько часто встречаются в этом массиве.

С помощью функции ImageIdentify, встроенной непосредственно в Wolfram Language, очень легко создавать какие-то API, приложения, в которых это используется. А с помощью Wolfram Cloud очень легко создавать сайты — как, к примеру, сайт Wolfram Language Image Identification Project.

Я был воодушевлён теми идеями, которые впоследствии были реализованы в Wolfram Language — идея в символьном сопоставлении с образцами, которая, как мне представлялось, может отразить некоторые аспекты человеческого мышления. Но я знал, что если распознавание изображений и основано на сопоставлении с образцом, то тут нужно кое-что другое — нечёткое сопоставление.

Я пытался создать алгоритмы нечёткого кеширования. И не переставал думать о том, как мозг реализует всё это. Мы должны позаимствовать принципы его работы. И это сподвигло меня начать изучение идеализированных нейронных сетей и их поведения.

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

И в какой-то момент я осознал, что как нейронные сети, так и самопритягивающиеся скопления частиц являются примерами систем, которые хоть и имели простые базовые компоненты, но почему-то добились сложного коллективного поведения. Копая глубже, я дошёл до клеточных автоматов, что привело меня ко всем тем идеям и открытиям, которые вылились в книгу A New Kind of Science.

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

История нейронных сетей была сопряжена с чередой взлётов и падений. Сети внезапно появляются в 1940-е. Однако к 60-м годам интерес к ним снизился, и ходило мнение о том, что они довольно-таки бесполезны и с их помощью мало чего можно сделать.

Однако это было верно лишь для перцептрона с одним слоем (одна из первых моделей нейронной сети). Возрождение интереса пришлось на начало восьмидесятых — появились модели нейронных сетей со скрытым слоем. И несмотря на то, что я знаю многих передовиков этого направления, всё же я оставался в некотором роде скептиком. Меня не покидало впечатление, что те задачи, которые решаются с помощью нейронных сетей, могут быть гораздо проще решены множеством других способов.

И мне казалось, что нейронные сети — слишком сложные формальные системы; как-то я даже попытался разработать свою собственную альтернативу. Однако я всё ещё поддерживал людей в научном центре по исследованию нейронных сетей и включал их статьи в свой журнал Complex Systems.

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

Тем временем мы занимались разработкой множества мощных прикладных алгоритмов анализа данных в Mathematica и в том, что потом превратилось в Wolfram Language. И несколько лет назад мы пришли к тому, что настало время двигаться дальше и попытаться интегрировать в систему высокоавтоматизированное машинное обучение. Идея заключалась в том, чтобы создавать очень мощные и общие функции; к примеру, функция Classify, которая будет классифицировать вещи любого вида: скажем, на какой фотографии день, а на какой — ночь, звуки различных музыкальных инструментов, важность сообщений электронной почты и так далее.

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

Я вначале не был уверен, что это будет работать. Но всё работает, и очень хорошо.

В качестве данных для обучения Вы можете использовать практически всё, что угодно, а Wolfram Language будет работать с классификаторами в автоматическом режиме. Так же мы внедряем всё больше и больше различных уже встроенных классификаторов: скажем, для языков, флагов стран:

И некоторое время назад мы пришли к тому, что пора взяться за масштабную проблему классификации — распознавание изображений. И вот наш результат — ImageIdentify.

В чём заключается распознавание изображений? В мире существует большое количество самых разнообразных вещей, которым люди дали имя. Суть распознавания — определить, какие из этих вещей представлены на этом изображении. Если более формально — отобразить все возможные изображения в некоторое множество имён объектов в символьной форме.

То есть мы не имеем никакого способа описать, к примеру, стул. Но мы можем привести множество примеров того, как выглядит стул, как бы говоря: «всё, что похоже на вот это вот, пусть определяется системой как стул». То есть мы хотим, чтобы все изображения, в которых содержится нечто, похожее на стул, имели соответствие со словом стул, а другие изображения не имели бы такого соответствия.

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

Капли дождя — они как изображения, а точки подножья горы — как виды объектов. Под каплями дождя мы подразумеваем некоторые физические объекты, которые движутся под действием гравитации. Однако изображения состоят из пикселей. И вместо физического движения мы должны думать о том, как эти цифровые значения должны быть обработаны программой.

И точно такое же аттракторное поведение происходит и здесь. К примеру, есть множество клеточных автоматов, в котором каждый автомат может менять цвета нескольких соседних клеток, но всё в любом случае закончится некоторым устойчивым состоянием (большинство клеточных автоматов, на самом деле, имеют более интересное поведение, которое не имеет какого-то конечного состояния, однако тогда бы у нас не получилось провести аналогию к задачам распознавания).

Так что же произойдёт, если мы возьмём изображение и применим к нему алгоритмы клеточных автоматов? В действительности, когда мы обрабатываем изображения, то некоторые обычные операции (на компьютерах или с помощью визуального осмотра человеком) есть просто алгоритмы двумерных клеточных автоматов.

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

Автоматически созданные программы

Так как мы это сделаем? В случае таких цифровых данных, как изображения — никто не знает, как это сделать одним махом. Это итеративный процесс. Вначале мы имеем некоторую заготовку, а затем постоянно меняем её форму, вылепливая то, что нам нужно.

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

Для систем с конечным действительным числом параметров есть отличный метод под названием «обратное распространение» (back propagation), который основан на вычислениях. Он является, по сути, вариантом очень простого метода — метода наследования градиента, в котором вычисляются производные, а затем используются для определения того, как изменить параметры, чтобы система обладала желаемым поведением.

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

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

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

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

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

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

Люди легко могут распознавать тысячи самых разных объектов — примерно столько, сколько в языке имеется существительных, которые можно как-то изобразить. Другие животные различают гораздо меньше объектов. Но если мы попытаемся распознавать образы так, как это делает человек, эффективно отображая их в слова, которые есть в человеческих языках, то тогда мы столкнёмся со всем масштабом проблемы. Ключ к её решению — нейронная сеть масштаба человеческого мозга.

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

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

Вижу только шляпу

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

Вероятно, как и у мозга, у нейронной сети ImageIdentify имеется множество слоёв, которые содержат нейроны разных типов (общая структура, конечно, хорошо описана символьным представлением Wolfram Language).

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

Я сам давно интересовался такими вещами, как визуальное текстурное распознавание, (определение каких-то текстурных примитивов, наподобие основного цвета) и полагаю, что мы сейчас сможем многое понять из этого. Так же, думаю, было бы очень интересно заглянуть в глубокие слои нейронной сети и посмотреть, что же там происходит. Мы бы смогли там обнаружить некоторые концепции, которые и в самом деле описывают классы объектов, в том числе и те, для которых пока что нет слов на естественных человеческих языках.

Как и во множества других проектов для Wolfram Language, при создании ImageIdentify нам потребовалось заниматься множеством разных вещей. Работа с большим количеством обучающих изображений. Разработка онтологии визуализируемых объектов и перенос её на Wolfram Language. Анализ динамики нейронных сетей с использованием методов, которые применяются в физике. Кропотливая оптимизация параллельного кода. Даже некоторые исследования в стиле A New Kind of Science для программ вычислительного мира. И множество субъективных мнений о том, как привносить функциональность, которая была бы полезной на практике.

В самом начале я не был уверен, будет-ли ImageIdentify работать. И в самом начале количество абсолютно неправильно распознанных образов было очень высоким. Однако шаг за шагом мы постепенно приблизились к тому моменту, когда с помощью ImageIdentify уже можно было получить что-то полезное.

Но осталось ещё большое количество нерешенных проблем. Система хорошо справлялась с одними вещами, но серьезно буксовала в других. Мы что-то меняли, что-то настраивали, а потом были новые неудачи и шквал сообщений в стиле «мы опять потеряли муравьеда!» (о том, как те изображения, которые ImageIdentify использовал для корректного распознавания муравьедов, распознавались почему-то как что-то совершенно другое).

Отладка ImageIdentify была весьма увлекательным процессом. Что можно считать осмысленными входными данными? А что есть осмысленные данные на выходе? Как выбрать — более общий и надёжный результат, или более конкретный, но менее надёжный (просто собака, или охотничья собака, или бигль)?

Бывали и вещи, которые на первый взгляд казались абсолютно сумасшедшими. Свинья, которая идентифицировалась как упряжь. Кусок каменной кладки определялся как мопед. Но хорошая новость состояла в том, что мы всегда находили причину — к примеру то, что некоторые нерелевантные объекты постоянно оказывались на обучающих изображениях (единственные каменные кладки, которые видел ImageIdentify — азиатские, на фоне которых постоянно были мопеды).

Чтобы испытать систему, я часто пробовал нестандартные изображения:

И меня поразило то, что я обнаружил. Да, ImageIdentify может ошибаться. Но почему-то ошибки казались очень понятными и в каком-то смысле человеческими. Казалось, что ImageIdentify весьма успешно копирует какие-то аспекты того, как сам человек распознаёт изображения.

Что насчёт абстрактного искусства? Это нечто вроде теста Роршака как для машин, так и для людей — весьма интересное представление о чертах ImageIdentify.

Назад к природе

Такие проекты, как создание ImageIdentify, никогда не заканчиваются. Но пару месяцев назад (см. статью на Хабрахабре «Стивен Вольфрам: Рубежи вычислительного мышления (отчёт с фестиваля SXSW)») мы выпустили предварительную версию на Wolfram Language. И сегодня мы выпустили новую версию и использовали её как основу для Wolfram Language Image Identification Project.

Мы продолжим обучение и разработку ImageIdentify, особенно сосредоточившись на обратной связи и статистике с сайта. Как для Wolfram|Alpha в сфере понимания естественного языка, без активного использования людьми нет никакой возможности реально оценить прогресс, или даже определить, каковы должны быть цели для распознавания реальных изображений.

Должен сказать, что я нахожу весёлым занятием даже просто поиграть с Wolfram Language Image Identification Project. Это будоражит — видеть, как после долгих лет работы получился искусственный интеллект, который и правда работает. Более того, когда Вы видите, что ImageIdentify отвечает на необычное или сложное изображение, возникает такое чувство, как будто это человек делает догадки, или просто шутит.

Под капотом всего этого, конечно, просто код, с весьма простыми циклами. Этот код почти такой же, как тот, который я, к примеру, писал для своих нейронных сетей в восьмидесятые (конечно, сейчас это код на Wolfram Language, а не на низкоуровневом C).

Это очень необычный пример из истории идей — нейронные сети исследуются более семидесяти лет, однако интерес к ним неоднократно угасал. Нейронные сети для нас — то, что привело нас к успеху в решении такой образцовой задачи искусственного интеллекта, как распознавание изображений. Полагаю, что такие передовики в исследовании нейронных сетей, как Уоррен Мак-Каллок и Уолтер Питтс несколько удивились бы тому, что делает ядро Wolfram Language Image Identification Project. Вероятно, они были бы поражены, что для этого потребовалось аж 70 лет.

Но для меня гораздо большее значение имеет то, как могут быть такие вещи, как ImageIdentify, встроены в символьную структуру Wolfram Language. То, что делает ImageIdentify — это то, что делают люди из поколения в поколение. Но символьный язык даёт нам возможность представить весь багаж интеллектуальных достижений человечества. И сделать всё это вычислительным, полагаю, будет чем-то столь масштабным, что я только сейчас начинаю осознавать значимость этого.

Что касается текущего момента, то я надеюсь, что Вам понравится Wolfram Language Image Identification Project. Рассматривайте его как о праздник достижения новых рубежей искусственного интеллекта. Рассматривайте его как отдых для ума, навевающий мысли о будущем искусственного интеллекта. Но не стоит забывать наиболее, на мой взгляд, важное: это так же и прикладная технология, которую Вы можете использовать здесь и сейчас в Wolfram Language и выгружать туда, куда только пожелаете.
Напоследок от команды Блога Wolfram.

Однажды попав на Хабрахабр, заболеваешь им в хорошем смысле этого слова и ImageIdentify кажется знает почему;)

Глубокое обучение: быстрый старт для разработчиков

Глубокое обучение считается чем-то вроде rocket science: звучит круто, выглядит сложно и содержит всякую математику. На самом деле все не так сложно. Вот вам перевод руководства по глубокому обучению «Deep Learning for Developers: Tools You Can Use to Code Neural Networks on Day 1» от Эмиля Волнера.

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

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

Вам не нужна особая подготовка. Достаточно базового понимания Python, командной строки и Jupyter notebook.

Глубокое обучение — часть машинного обучения. Доказано, что это эффективный метод поиска паттернов в сырых данных, таких как звук или изображение. Скажем, вы хотите классифицировать картинки кошек и собак. Без специального программирования, сперва выделим границы изображения. Затем построим паттерны из набора изображений, и наконец выделим носы, хвосты и лапы. Так нейронная сеть в итоге классифицирует собак и кошек.

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

Основная логика

Представьте машину, собранную из случайного набора шестеренок. Шестеренки собраны в слои и взаимодействуют друг с другом. Изначально машина не работает. Шестеренки настроены случайным образом, и их нужно перенастроить так, чтобы машина заработала.

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

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

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

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

Мелкая искусственная нейронная сеть

Многие считают, что искусственные нейронные сети — цифровые копии нашего неокортекса. Это не так. Мы слишком мало знаем о собственном мозге, чтобы требовать такое. Это было источником вдохновения для Фрэнка Розенблатта, создателя нейронных сетей.

Поиграйтесь с симулятором нейронной сети пару часов, чтобы примерно почувствовать, как это работает. Мы начнем с создания простой нейронной сети, чтобы познакомиться с синтаксисом TFlearn. Классическая проблема для начала — оператор OR. Хотя нейронные сети лучше подходят для других типов данных, для начала сойдет и такой вариант, чтобы понять, как это вообще работает.

Все программы глубокого обучения следуют одной логике:

  • Сперва подключаем библиотеки, импортируем и очищаем данные. Все входные данные интерпретируются как числа, неважно, изображения это, звуки или данные с сенсоров.
  • Эти длинные списки чисел — входные данные для нашей сети.
  • Теперь описываем нейронную сеть.
  • Выбираем тип и количество слоев сети.
  • Идет процесс обучения.
  • Сеть ищет корреляцию между входными данными и выходными.
  • Финальный шаг выводит предсказание, полученное обученной сетью.

Вот код нашей сети.

Строка 1
Комментарии начинаются с #

Строка 2
Подключаем библиотеку TFlearn, она позволит нам использовать функции глубокого обучения из Google Tensorflow.

Строки 5–6
Данные из таблицы сохраняются в списки. Точка в конце каждого числа преобразует их в числа с плавающей точкой. Это повысит точность вычисления.

Строка 9
Инициализируем сеть и определяем форму входных данных. Каждый оператор OR идет парой, таким образом имея форму, равную 2. None — дефолтное значение, представляющее размер серии.

Строка 10
Наш выходной слой. Параметр activation определяет функцию, отображающую выходные данные на слой. В нашем случае мы используем сигмоиду, которая отображает значение между 0 и 1.

Вот материал, который более подробно раскроет суть строк 9 и 10: tflearn.org/layers/core

Строка 11
Применяем регрессию. Параметр optimizer выбирает алгоритм минимизации функции потерь. Параметр learning rate определяет, как быстро нужно модифицировать сеть, и параметр loss определяет, как вычислять ошибку.

Строка 14
Выбираем, какую сеть использовать. Здесь же выбираем, где хранить логи обучения.

Строка 15
Тренируем сеть и модель. Выбираем входные данные (OR) и эталонную метку (Y_truth). Параметр n_epoch определяет, сколько раз мы прогоним данные через сеть. snapshot_epoch=True определяет, нужно ли валидировать модель после каждого прогона.

Строки 18–22
Вывод предсказания, сделанного обученной моделью. В нашем случае это вывод вероятности того, что вернется True/1.

Подробнее насчет строк 1422: tflearn.org/models/dnn

Вывод
Первый результат — комбинация [0.] & [0.], с вероятностью в 4% это true, и так далее. Выше можно увидеть, сколько обучений в итоге прошла модель. Поскольку данные помещаются в одну серию, это все равно что одна эпоха. Если данные слишком велики, чтобы поместиться в памяти, вам придется разбить их на части. loss — сумма ошибок по всем эпохам. SGD — стохастический градиентный спуск (Stochastic Gradient Descent), метод минимизации функции потерь. Iter показывает текущий кусок данных и общий размер данных.

Вы обнаружите подобную логику и синтаксис практически в любой сети, основанной на TFlearn. Лучший способ познакомиться с кодом поближе — изменить его и получить кучу ошибок.

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

  • Увеличьте количество обучений и эпох
  • Попробуйте поменять или добавить все возможные параметры к каждой функции, руководствуясь документацией: например, вместо tflearn.fullyconnected(g, 1, activation=’sigmo >Python и Tensorflow — самая распространенная связка для глубокого обучения. TFlearn — фреймворк высокого уровня, построенный поверх Tensorflow. Другой распространенный фреймворк — Keras. У него больше возможностей, но я нахожу синтаксис TFlearn более простым и понятным. Оба фреймворка работают поверх Tensorflow.

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

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

Установите floyd-cli, пользуясь документацией. Кроме того, у FloydHub есть чат в Intercom, на случай, если вы застряли на каком-то этапе. Давайте запустим вашу первую сеть в FloydHub, используя TFlearn, Jupyter Notebook, и Tensorboard. После установки и входа в FloydHub, скачайте необходимые файлы:

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

Теперь вы готовы к запуску сети на FloydHub.

Команда запуска проекта принимает различные параметры. Сейчас наши действия таковы:

  • Примонтируем датасет к FloydHub, используя параметр —data emilwallner/datasets/cifar-10/1:data. Мы можем просмотреть датасет (и вообще большинство публичных датасетов) прямо на FloydHub.
  • Используем облачный GPU с параметром —gpu
  • Подключаем Tensorboard с параметром —tensorboard
  • Запускаем задачу в режиме Jupyter Notebook с параметром —mode jupyter

Как только команда инициализирует Jupyter в браузере, откройте файл с именем start-here.ipnyb. Это простая нейронная сеть для знакомства с синтаксисом TFlearn. Мы подробно разобрались с ней выше.

В меню выберите Kernel > Restart & Run All. Если вы увидите сообщение, значит все работает. Зайдите в проект на FloydHub, и там вы найдете ссылку на Tensorboard.

Глубокая нейронная сеть

Глубокая сеть — сеть с несколькими скрытыми слоями. Работа сверточных сетей подробно разбирается в руководствах:

  • How Convolutional Neural Networks work, Youtube
  • CS231n Convolutional Neural Networks for Visual Recognition
  • CS231n Winter 2020: Lecture 7: Convolutional Neural Networks, Youtube

Мы же сосредоточимся на высокоуровневых принципах, которые применимы к большинству сетей.

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

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

Регуляризация — процесс уменьшения переобучения путем забывания определенных сигналов из тренировочных данных. Чтобы лучше понять этот принцип, мы используем датасет CIFAR-10. Это 60 тысяч изображений в десяти категориях, таких как автомобили, грузовики и птицы. Цель — определить категории изображений.

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

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

Выбор количества слоев

Давайте посмотрим, как отличается сеть с одним и тремя наборами слоев. Каждый набор состоит из слоев свертки, подвыборки и соединительного слоя. Первые два эксперимента — experiment-0-few-layers.ipynb и experiment-0-three-layer-sets.ipynb.

Глядя на графики в Tensorboard, мы заметим, что сеть с одним набором примерно на 15% аккуратнее сети с несколькими наборами. Дело в том, что сеть с несколькими наборами недообучена.

Посмотрите на графики Accuracy и Accuracy/Validation. Наилучший подход в глубоком обучении — разделить датасет пополам, одну половину используя в обучении, а вторую для валидации. Так вы определите, как хорошо нейронная сеть справляется с предсказанием на новых данных, то есть с ее способностью к обобщению.

Как мы видим, точность тренировочных данных выше точности данных для валидации. Фоновый шум и детали мешают сети хорошо работать на новых данных.

Для борьбы с переобучением вы можете ограничивать сложные функции и вводить шум в нейронную сеть. Общие методы регуляризации — ограничение функций и исключающие слои.

Исключающие слои

Регуляризация исключением похожа на демократию: вместо использования нескольких мощных нейронов мы распределяем мощность по всей сети.

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

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

Второй популярный метод предотвращения переобучения — применение L1/L2 регуляторной функции на каждый слой.

L1 и L2 регуляризация

Скажем, вы хотите описать признаки лошади. Если описание будет слишком конкретным, вы исключите из выборки много лошадей. Однако если описание будет слишком размытым, в выборку попадут и другие животные. L1/L2 регуляризация помогает сети определить это различие.

Если мы сделаем сравнение сетей, аналогичное предыдущему эксперименту, мы получим похожий результат.

Нейронная сеть с регуляризацией показывает себя лучше сети без регуляризации.

Регуляторная функция L2 ограничивает влияние слишком сложных функций. Она вычисляет, как сильно каждая функция влияет на конечный результат, и вводит ограничивающие коэффициенты.

Размер серии

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

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

Большая серия сделает меньше шагов, но расход времени и памяти на каждый шаг больше.

Скорость обучения

Финальный эксперимент — сравнение сетей с малой, средней и высокой скоростью обучения.

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

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

Когда вы закончите с экспериментами, не забудьте остановить инстанс на FloydHub, выбрав в меню Cancel.

Следующие шаги

В официальном репозитории TFlearn вы найдете примеры хороших сверточных сетей. Разберитесь с тем, как они устроены, и попробуйте улучшить свою сеть. Лучший результат на сегодняшний день — 96.43% (Graham, 2015).

Прим. переводчика: в репозитории http://rodrigob.github.io/are_we_there_yet собрана таблица лидеров по разным датасетам, в том числе по CIFAR-10.

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

Об авторе (Эмиль Воллнер)

Это первая статья из серии статей о глубоком обучении. Я потратил десять лет на изучение человеческого обучения. Работаю в бизнес-школе Оксфорда, инвестировал в образовательные стартапы и построил бизнес в сфере технологического обучения. В прошлом году я поступил в Ecole 42, чтобы найти применение своим знаниям в сфере машинного обучения.

Вы можете следить за моим прогрессом в Твиттере. Если у вас есть вопросы или пожелания, оставьте комментарий в Медиум.

Первоначально публиковалось в блоге FloydHub.

Глубокое обучение считается чем-то вроде rocket science: звучит круто, выглядит сложно и содержит всякую математику. На самом деле все не так сложно. Вот вам перевод руководства по глубокому обучению «Deep Learning for Developers: Tools You Can Use to Code Neural Networks on Day 1» от Эмиля Волнера.

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

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

Вам не нужна особая подготовка. Достаточно базового понимания Python, командной строки и Jupyter notebook.

Глубокое обучение — часть машинного обучения. Доказано, что это эффективный метод поиска паттернов в сырых данных, таких как звук или изображение. Скажем, вы хотите классифицировать картинки кошек и собак. Без специального программирования, сперва выделим границы изображения. Затем построим паттерны из набора изображений, и наконец выделим носы, хвосты и лапы. Так нейронная сеть в итоге классифицирует собак и кошек.

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

Основная логика

Представьте машину, собранную из случайного набора шестеренок. Шестеренки собраны в слои и взаимодействуют друг с другом. Изначально машина не работает. Шестеренки настроены случайным образом, и их нужно перенастроить так, чтобы машина заработала.

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

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

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

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

Мелкая искусственная нейронная сеть

Многие считают, что искусственные нейронные сети — цифровые копии нашего неокортекса. Это не так. Мы слишком мало знаем о собственном мозге, чтобы требовать такое. Это было источником вдохновения для Фрэнка Розенблатта, создателя нейронных сетей.

Поиграйтесь с симулятором нейронной сети пару часов, чтобы примерно почувствовать, как это работает. Мы начнем с создания простой нейронной сети, чтобы познакомиться с синтаксисом TFlearn. Классическая проблема для начала — оператор OR. Хотя нейронные сети лучше подходят для других типов данных, для начала сойдет и такой вариант, чтобы понять, как это вообще работает.

Все программы глубокого обучения следуют одной логике:

  • Сперва подключаем библиотеки, импортируем и очищаем данные. Все входные данные интерпретируются как числа, неважно, изображения это, звуки или данные с сенсоров.
  • Эти длинные списки чисел — входные данные для нашей сети.
  • Теперь описываем нейронную сеть.
  • Выбираем тип и количество слоев сети.
  • Идет процесс обучения.
  • Сеть ищет корреляцию между входными данными и выходными.
  • Финальный шаг выводит предсказание, полученное обученной сетью.

Вот код нашей сети.

Строка 1
Комментарии начинаются с #

Строка 2
Подключаем библиотеку TFlearn, она позволит нам использовать функции глубокого обучения из Google Tensorflow.

Строки 5–6
Данные из таблицы сохраняются в списки. Точка в конце каждого числа преобразует их в числа с плавающей точкой. Это повысит точность вычисления.

Строка 9
Инициализируем сеть и определяем форму входных данных. Каждый оператор OR идет парой, таким образом имея форму, равную 2. None — дефолтное значение, представляющее размер серии.

Строка 10
Наш выходной слой. Параметр activation определяет функцию, отображающую выходные данные на слой. В нашем случае мы используем сигмоиду, которая отображает значение между 0 и 1.

Вот материал, который более подробно раскроет суть строк 9 и 10: tflearn.org/layers/core

Строка 11
Применяем регрессию. Параметр optimizer выбирает алгоритм минимизации функции потерь. Параметр learning rate определяет, как быстро нужно модифицировать сеть, и параметр loss определяет, как вычислять ошибку.

Строка 14
Выбираем, какую сеть использовать. Здесь же выбираем, где хранить логи обучения.

Строка 15
Тренируем сеть и модель. Выбираем входные данные (OR) и эталонную метку (Y_truth). Параметр n_epoch определяет, сколько раз мы прогоним данные через сеть. snapshot_epoch=True определяет, нужно ли валидировать модель после каждого прогона.

Строки 18–22
Вывод предсказания, сделанного обученной моделью. В нашем случае это вывод вероятности того, что вернется True/1.

Подробнее насчет строк 1422: tflearn.org/models/dnn

Вывод
Первый результат — комбинация [0.] & [0.], с вероятностью в 4% это true, и так далее. Выше можно увидеть, сколько обучений в итоге прошла модель. Поскольку данные помещаются в одну серию, это все равно что одна эпоха. Если данные слишком велики, чтобы поместиться в памяти, вам придется разбить их на части. loss — сумма ошибок по всем эпохам. SGD — стохастический градиентный спуск (Stochastic Gradient Descent), метод минимизации функции потерь. Iter показывает текущий кусок данных и общий размер данных.

Вы обнаружите подобную логику и синтаксис практически в любой сети, основанной на TFlearn. Лучший способ познакомиться с кодом поближе — изменить его и получить кучу ошибок.

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

  • Увеличьте количество обучений и эпох
  • Попробуйте поменять или добавить все возможные параметры к каждой функции, руководствуясь документацией: например, вместо tflearn.fullyconnected(g, 1, activation=’sigmo >Python и Tensorflow — самая распространенная связка для глубокого обучения. TFlearn — фреймворк высокого уровня, построенный поверх Tensorflow. Другой распространенный фреймворк — Keras. У него больше возможностей, но я нахожу синтаксис TFlearn более простым и понятным. Оба фреймворка работают поверх Tensorflow.

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

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

Установите floyd-cli, пользуясь документацией. Кроме того, у FloydHub есть чат в Intercom, на случай, если вы застряли на каком-то этапе. Давайте запустим вашу первую сеть в FloydHub, используя TFlearn, Jupyter Notebook, и Tensorboard. После установки и входа в FloydHub, скачайте необходимые файлы:

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

Теперь вы готовы к запуску сети на FloydHub.

Команда запуска проекта принимает различные параметры. Сейчас наши действия таковы:

  • Примонтируем датасет к FloydHub, используя параметр —data emilwallner/datasets/cifar-10/1:data. Мы можем просмотреть датасет (и вообще большинство публичных датасетов) прямо на FloydHub.
  • Используем облачный GPU с параметром —gpu
  • Подключаем Tensorboard с параметром —tensorboard
  • Запускаем задачу в режиме Jupyter Notebook с параметром —mode jupyter

Как только команда инициализирует Jupyter в браузере, откройте файл с именем start-here.ipnyb. Это простая нейронная сеть для знакомства с синтаксисом TFlearn. Мы подробно разобрались с ней выше.

В меню выберите Kernel > Restart & Run All. Если вы увидите сообщение, значит все работает. Зайдите в проект на FloydHub, и там вы найдете ссылку на Tensorboard.

Глубокая нейронная сеть

Глубокая сеть — сеть с несколькими скрытыми слоями. Работа сверточных сетей подробно разбирается в руководствах:

  • How Convolutional Neural Networks work, Youtube
  • CS231n Convolutional Neural Networks for Visual Recognition
  • CS231n Winter 2020: Lecture 7: Convolutional Neural Networks, Youtube

Мы же сосредоточимся на высокоуровневых принципах, которые применимы к большинству сетей.

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

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

Регуляризация — процесс уменьшения переобучения путем забывания определенных сигналов из тренировочных данных. Чтобы лучше понять этот принцип, мы используем датасет CIFAR-10. Это 60 тысяч изображений в десяти категориях, таких как автомобили, грузовики и птицы. Цель — определить категории изображений.

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

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

Выбор количества слоев

Давайте посмотрим, как отличается сеть с одним и тремя наборами слоев. Каждый набор состоит из слоев свертки, подвыборки и соединительного слоя. Первые два эксперимента — experiment-0-few-layers.ipynb и experiment-0-three-layer-sets.ipynb.

Глядя на графики в Tensorboard, мы заметим, что сеть с одним набором примерно на 15% аккуратнее сети с несколькими наборами. Дело в том, что сеть с несколькими наборами недообучена.

Посмотрите на графики Accuracy и Accuracy/Validation. Наилучший подход в глубоком обучении — разделить датасет пополам, одну половину используя в обучении, а вторую для валидации. Так вы определите, как хорошо нейронная сеть справляется с предсказанием на новых данных, то есть с ее способностью к обобщению.

Как мы видим, точность тренировочных данных выше точности данных для валидации. Фоновый шум и детали мешают сети хорошо работать на новых данных.

Для борьбы с переобучением вы можете ограничивать сложные функции и вводить шум в нейронную сеть. Общие методы регуляризации — ограничение функций и исключающие слои.

Исключающие слои

Регуляризация исключением похожа на демократию: вместо использования нескольких мощных нейронов мы распределяем мощность по всей сети.

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

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

Второй популярный метод предотвращения переобучения — применение L1/L2 регуляторной функции на каждый слой.

L1 и L2 регуляризация

Скажем, вы хотите описать признаки лошади. Если описание будет слишком конкретным, вы исключите из выборки много лошадей. Однако если описание будет слишком размытым, в выборку попадут и другие животные. L1/L2 регуляризация помогает сети определить это различие.

Если мы сделаем сравнение сетей, аналогичное предыдущему эксперименту, мы получим похожий результат.

Нейронная сеть с регуляризацией показывает себя лучше сети без регуляризации.

Регуляторная функция L2 ограничивает влияние слишком сложных функций. Она вычисляет, как сильно каждая функция влияет на конечный результат, и вводит ограничивающие коэффициенты.

Размер серии

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

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

Большая серия сделает меньше шагов, но расход времени и памяти на каждый шаг больше.

Скорость обучения

Финальный эксперимент — сравнение сетей с малой, средней и высокой скоростью обучения.

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

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

Когда вы закончите с экспериментами, не забудьте остановить инстанс на FloydHub, выбрав в меню Cancel.

Следующие шаги

В официальном репозитории TFlearn вы найдете примеры хороших сверточных сетей. Разберитесь с тем, как они устроены, и попробуйте улучшить свою сеть. Лучший результат на сегодняшний день — 96.43% (Graham, 2015).

Прим. переводчика: в репозитории http://rodrigob.github.io/are_we_there_yet собрана таблица лидеров по разным датасетам, в том числе по CIFAR-10.

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

Об авторе (Эмиль Воллнер)

Это первая статья из серии статей о глубоком обучении. Я потратил десять лет на изучение человеческого обучения. Работаю в бизнес-школе Оксфорда, инвестировал в образовательные стартапы и построил бизнес в сфере технологического обучения. В прошлом году я поступил в Ecole 42, чтобы найти применение своим знаниям в сфере машинного обучения.

Вы можете следить за моим прогрессом в Твиттере. Если у вас есть вопросы или пожелания, оставьте комментарий в Медиум.

Первоначально публиковалось в блоге FloydHub.

ИТ Аутсорсинг

Программное обеспечение Wolfram Mathematica Neural Networks обеспечивает надежную среду для моделирования структур данных. Пакет Neural Networks разработан, чтобы дать профессионалам и студентам инструменты для тренировки, визуализации и использования моделей нейронных сетей.

Neural Networks поддерживает исчерпывающий набор структур нейронных сетей и содержит современные алгоритмы, в то же время использует все вычислительные и изобразительные преимущества программы Mathematica. Кроме того, включает специальные функции для решения типовых задач анализа данных, в том числе для аппроксимации и классификации функций, кластеризации и нелинейной идентификации систем.
С помощью Neural Networks можно подобрать подходящую нейронную сеть, визуализировать ее и наблюдать распределение ошибок с помощью немногих команд.

Neural Networks разработан для использования с Mathematica 4 и более поздними версиями и может работать в системах Windows, Mac OS, Mac OS X, Linux (PC, Alpha, PowerPC), Solaris, HP-UX, IRIX, AIX, Compaq Tru64 Unix и совместимыми с ними системами.

Premier Service – комплексная программа уникальных услуг и скидок, которая помогает повысить производительность работы, одновременно позволяя экономить вложения подписчика.

Программа Premier Service, призванная повысить отдачу от приобретенного пользователем программного обеспечения, предоставляет больше возможностей, чем традиционные программы поддержки и получения обновлений. Благодаря постоянному расширению списка дополнительных возможностей, подписчики могут пользоваться всеми преимуществами новых технологий компании Wolfram, получая обновления сразу после их выхода. Кроме того, подписчикам предоставляются скидки на прохождение учебных курсов и возможность участия в различных мероприятиях, первоочередная техническая поддержка, а также доступ к электронной версии журнала The Mathematica Journal и многое другое.
Срок подписки составляет 1 год, а перечень преимуществ варьируется в зависимости от программных продуктов.

Действующий список преимуществ Premier Service:

Новые технологии:

  • Автоматический доступ к последней выпущенной версии программы.
  • Бесплатное получение обновлений и новых версий.
  • Предварительное уведомление о выпуске новых версий и новых продуктов.

Техническая поддержка:

  • Бесплатная, индивидуальная техническая поддержка по любой проблеме, с которой может столкнуться пользователь.
  • Первоочередное соединение с инженерами службы технической поддержки.*

Дополнительные продукты и услуги:

  • Бесплатная лицензия на пакет Mathematica для домашнего компьютера подписчика.
  • Бесплатная лицензия на домашнее использование некоторых прикладных пакетов на базе системы Mathematica, которые пользователь приобретает сейчас или которыми он уже владеет.
  • Бесплатная копия программы Wolfram Workbench, мощной интегрированной среды разработки для технологий Mathematica.
  • Бесплатные копии программы Mathematica Player Pro, профессиональной системы доставки приложений, созданных на базе технологий Mathematica.
  • Вспомогательная копия системы webMathematica Amateur, которая позволяет размещать документы с интерактивными вычислениями и визуализацией данных в Интернете.
  • Бесплатный доступ к электронному варианту журнала The Mathematica Journal, посвященного различным аспектам системы Mathematica и связанным с ней темам.

Специальные скидки:

  • Скидка 15% на некоторые прикладные пакеты Mathematica.
  • Скидка 15% на сертифицированные учебные курсы, которые проводит подразделение Wolfram Education Group.
  • Скидки и приглашения для участия в конференциях, семинарах и других мероприятиях Wolfram Research.

*Эти льготы распространяются на продукты .

Facebook выложил в свободный доступ модули для машинного обучения

Xakep #246. Учиться, учиться, учиться!

Группа по исследованиям в области искусственного интеллекта Facebook AI Research поделилась с сообществом собственными наработками в области глубокого обучения (deep learning) — алгоритмов машинного обучения, которые пытаются моделировать высокоуровневые абстракции в данных, используя архитектуры, состоящие из множества нелинейных трансформаций.

Под свободной лицензией опубликован исходный код модулей для Torch, популярного фреймворка на Lua, который широко используется в научном сообществе для разработки и тестирования алгоритмов машинного обучения. Фреймворк использует скриптовый язык LuaJIT.

Оптимизированные модули от компании Facebook гораздо эффективнее, чем штатные модули Torch. С их помощью можно обучать нейросети большего размера за меньшее время, что позволяет существенно ускорить научно-исследовательские работы. Оптимизация включает в себя, среди прочего, эффективное использования GPU в свёрточных нейронных сетях (ConvNets), а также в сетях, которые часто применяются в приложениях по обработке информации на естественном языке (Natural Language Processing). Более подробно о модулях ConvNets рассказано в научной работе.

Кроме упомянутого модуля, в свободный доступ попали и другие модули, использующие архитектуру CUDA, в том числе контейнеры для параллелизации обучения нейросети на нескольких GPU, оптимизированные модули Lookup Table и Hierarchical SoftMax и др.

В последние годы deep learning стало одной из самых перспективных областей информатики. Технологии машинного обучения широко используются, в том числе, в различных веб-сервисах для распознавания образов, анализа логов, распознавания спама и т.д. Нейросети применяют такие компании как Google, Twitter, Nvidia, AMD, Intel, Facebook и многие другие, не считая бесчисленного количества стартапов, действующих в этой области.

Нейросеть обманом «перепрограммировали» на распознавание совсем других объектов

Gamaleldin Elsayed et al. / arXiv.org, 2020

Исследователи из Google Brain создали метод, позволяющий применять для выполнения определенной задачи нейросетевой алгоритм, обученный выполнять другую задачу, используя для такого «перепрограммирования» только входные данные. К примеру, авторы показали, как можно с помощью специально созданных входных изображений распознавать рукописные цифры на изображении, используя нейросеть, обученную распознавать животных. Статья с описанием метода опубликована на arXiv.org.

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

Наглядный пример атаки с использованием состязательного примера

Ian Goodfellow et al. / arXiv.org, 2014

Группа разработчиков из Google Brain под руководством Яши Сол-Дикштейна (Jascha Sohl-Dickstein) разработала новый вид атаки с использованием состязательных примеров, позволяющий использовать алгоритмы, обученные для классификации одних объектов, в качестве классификаторов других типов объектов, используя для такого «перепрограммирования» только входные данные. Стоит отметить, что предложенная исследователями атака подразумевает, что злоумышленник получил доступ к параметрам алгоритма-жертвы. Входные данные в этом методе состоят из двух частей: непосредственно данных для анализа и данных, заставляющих алгоритм выполнять требуемую задачу. К примеру, это может быть небольшое изображение с цифрой, встроенное в гораздо большее изображение, представляющее собой «программу» для выполнения нужной задачи.

Gamaleldin Elsayed et al. / arXiv.org, 2020

Для проверки концепции исследователи выбрали шесть сверточных нейросетевых моделей, используемых для классификации изображений животных из известного датасета ImageNet. При этом принцип работы метода относительно универсален и может быть использован и для других моделей. Авторы выбрали для эксперимента три популярные задачи в области машинного обучения: распознавание рукописных цифр из датасета MNIST, распознавание фотографий из датасета CIFAR-10 и распознавание количества квадратов на изображении. Для каждой из шести моделей и задачи подбиралось такое изображение-программа, чтобы она представляла десять классов животных из исходного датасета ImageNet в качестве соответствующих десяти классов из других датасетов. К примеру, для задачи распознавания количества квадратов каждому из десяти изображений с квадратами было сопоставлено десять классов животных.

Пример изображения-программы с встроенным в нее изображением рукописной цифры из датасета MNIST

Gamaleldin Elsayed et al. / arXiv.org, 2020

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

Один из авторов работы Айан Гудфеллоу (Ian Goodfellow) известен как один из разработчиков концепции генеративно-состязательных нейросетей, которая была описана в 2014 году и с тех пор была использована во многих проектах, использующих машинное обучение для обработки и создания изображений. Например, с помощью такой архитектуры исследователи научили нейросети создавать изображения по текстовому описанию и рисовать оригинальные произведения искусства, превращать фотографию в короткое видео с событиями из будущего, и генерировать фотореалистичные портреты людей.

Свежее

«Сбербанк» создал самый мощный в России суперкомпьютер

Роботы Mini Cheetah поиграли в футбол и сделали синхронное сальто

В Подмосковье продули «Солнце Москвы»

В России ввели в строй флагманский неатомный ледокол проекта «Портофлот»

Стратосферные испытания японского псевдоспутника начнутся в 2020 году

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.

Учёные всё ближе к созданию полностью оптических нейронных сетей

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

Оптически нейронные сети во многом превосходят электронные

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

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

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

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

Схематичное изображение нейронной сети из научной работы группы Вольфарама Перниса

В мае Вольфрам Пернис (Wolfram Pernice) из Института физики Мюнстерского университета в Германии и его коллеги сообщили о тестировании полностью оптического «нейрона», использующего специальный материал, изменяющий своё состояние при получении сигнала между жидким и твёрдым, что позволило использовать его для оптического хранения данных. С его помощью они продемонстрировали нелинейную обработку данных и выходные импульсы, похожие на импульсы органических нейронов. Затем учёные создали интегрированную фотонную схему, которая включала в себя четыре таких оптических нейрона, работающих на разных длинах волн, каждый из которых был подключен к 15 оптическим синапсам. Данная схема включала около 140 компонентов и смогла распознавать простые оптические структуры. Исследователи утверждают, что их устройство является масштабируемым, и в будущем данная технология обещает «доступ к высокой скорости и пропускной способности, присущей оптическим системам, что позволит напрямую обрабатывать оптические телекоммуникационные и визуальные данные». Исследование было опубликовано в журнале Nature.

Многослойная полностью оптическая нейронная система, разработанная учёными из Гонконга

Теперь группа из Гонконгского университета науки и технологии опубликовала научную работу в журнале Optica, где они описали, как им удалось создать полностью оптическую нейронную сеть, основанную уже на другом физическом процессе — электромагнитно-индуцированной прозрачности, эффекте, при котором свет влияет на то, как атомы перемещаются между квантово-механическими уровнями энергии. «Этот процесс является нелинейным и может быть инициирован очень слабыми световыми сигналами», — объясняет Шенгванг Ду (Shengwang Du), профессор физики и соавтор статьи.

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

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

«Их демонстрация кажется верной и работоспособной», — комментирует Фолькер Зоргер (Volker Sorger), инженер-электрик из Университета Джорджа Вашингтона. Он соглашается, что полностью оптический подход очень привлекателен, так как предлагает очень высокий параллелизм, но частота обновления нейронов, по его мнению, в проекте Шенгванга составит примерно 100 герц из-за используемых в них жидких кристаллов, и потому Волкер не совсем уверен, что такую систему возможно масштабировать без ошибок.

Wolfram открыла доступ к своему репозиторию нейронных сетей

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

Выражаю огромную благодарность Кириллу Гузенко за помощь в переводе.

«Что изображено на этой картинке?» Люди практически сразу могут ответить на этот вопрос, и раньше казалось, что это непосильная задача для компьютеров. Последние 40 лет я знал, что компьютеры научатся решать подобные задачи, но не знал, когда это произойдёт.

Я создавал системы, которые дают компьютерам разные составляющие интеллекта, и эти составляющие зачастую далеко за пределами человеческих возможностей. С давних про мы интегрируем разработки по искусственному интеллекту в Wolfram Language.

И сейчас я весьма рад сообщить о том, что мы перешли новый рубеж: вышла новая функция Wolfram Language — ImageIdentify, которую можно спросить — «что изображено на картинке?» и получить ответ.

Сегодня мы запускаем Wolfram Language Image Identification Project — проект по идентификации изображений, который работает через интернет. Можно отправить туда изображение с камеры телефона, с браузера, или перетащить его посредством drag&drop в соответствующую форму, или просто загрузить файл. После этого ImageIdentify выдаст свой результат:

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

Это хороший практический пример искусственного интеллекта. Однако для меня более важный момент состоит в том, что подобное взаимодействие с искусственным интеллектом мы встраиваем напрямую в Wolfram Language — ещё один мощный камень фундамента парадигмы программирования, основанной на знаниях.

Для того, чтобы распознать какое-то изображение при работе с Wolfram Language, Вам нужно просто применить функцию ImageIdentify к этому изображению:

На выходе Вы получаете некоторый символьный объект, с которым можно и дальше работать в Wolfram Language. Как в данном примере — выяснить, что это именно животное, млекопитающее и так далее. Или просто спросить определение:

Или, к примеру, сгенерировать облако из тех слов, что встречаются в статье Википедии, посвященной объекту на картинке:

Если у Вас есть какой-то массив фотографий, то Вы можете почти моментально написать программу на Wolfram Language, которая бы, к примеру, выдавала бы статистику о том, какие животные, устройства, платы — не важно что — насколько часто встречаются в этом массиве.

С помощью функции ImageIdentify, встроенной непосредственно в Wolfram Language, очень легко создавать какие-то API, приложения, в которых это используется. А с помощью Wolfram Cloud очень легко создавать сайты — как, к примеру, сайт Wolfram Language Image Identification Project.

Я был воодушевлён теми идеями, которые впоследствии были реализованы в Wolfram Language — идея в символьном сопоставлении с образцами, которая, как мне представлялось, может отразить некоторые аспекты человеческого мышления. Но я знал, что если распознавание изображений и основано на сопоставлении с образцом, то тут нужно кое-что другое — нечёткое сопоставление.

Я пытался создать алгоритмы нечёткого кеширования. И не переставал думать о том, как мозг реализует всё это. Мы должны позаимствовать принципы его работы. И это сподвигло меня начать изучение идеализированных нейронных сетей и их поведения.

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

И в какой-то момент я осознал, что как нейронные сети, так и самопритягивающиеся скопления частиц являются примерами систем, которые хоть и имели простые базовые компоненты, но почему-то добились сложного коллективного поведения. Копая глубже, я дошёл до клеточных автоматов, что привело меня ко всем тем идеям и открытиям, которые вылились в книгу A New Kind of Science.

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

История нейронных сетей была сопряжена с чередой взлётов и падений. Сети внезапно появляются в 1940-е. Однако к 60-м годам интерес к ним снизился, и ходило мнение о том, что они довольно-таки бесполезны и с их помощью мало чего можно сделать.

Однако это было верно лишь для перцептрона с одним слоем (одна из первых моделей нейронной сети). Возрождение интереса пришлось на начало восьмидесятых — появились модели нейронных сетей со скрытым слоем. И несмотря на то, что я знаю многих передовиков этого направления, всё же я оставался в некотором роде скептиком. Меня не покидало впечатление, что те задачи, которые решаются с помощью нейронных сетей, могут быть гораздо проще решены множеством других способов.

И мне казалось, что нейронные сети — слишком сложные формальные системы; как-то я даже попытался разработать свою собственную альтернативу. Однако я всё ещё поддерживал людей в научном центре по исследованию нейронных сетей и включал их статьи в свой журнал Complex Systems.

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

Тем временем мы занимались разработкой множества мощных прикладных алгоритмов анализа данных в Mathematica и в том, что потом превратилось в Wolfram Language. И несколько лет назад мы пришли к тому, что настало время двигаться дальше и попытаться интегрировать в систему высокоавтоматизированное машинное обучение. Идея заключалась в том, чтобы создавать очень мощные и общие функции; к примеру, функция Classify, которая будет классифицировать вещи любого вида: скажем, на какой фотографии день, а на какой — ночь, звуки различных музыкальных инструментов, важность сообщений электронной почты и так далее.

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

Я вначале не был уверен, что это будет работать. Но всё работает, и очень хорошо.

В качестве данных для обучения Вы можете использовать практически всё, что угодно, а Wolfram Language будет работать с классификаторами в автоматическом режиме. Так же мы внедряем всё больше и больше различных уже встроенных классификаторов: скажем, для языков, флагов стран:

И некоторое время назад мы пришли к тому, что пора взяться за масштабную проблему классификации — распознавание изображений. И вот наш результат — ImageIdentify.

В чём заключается распознавание изображений? В мире существует большое количество самых разнообразных вещей, которым люди дали имя. Суть распознавания — определить, какие из этих вещей представлены на этом изображении. Если более формально — отобразить все возможные изображения в некоторое множество имён объектов в символьной форме.

То есть мы не имеем никакого способа описать, к примеру, стул. Но мы можем привести множество примеров того, как выглядит стул, как бы говоря: «всё, что похоже на вот это вот, пусть определяется системой как стул». То есть мы хотим, чтобы все изображения, в которых содержится нечто, похожее на стул, имели соответствие со словом стул, а другие изображения не имели бы такого соответствия.

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

Капли дождя — они как изображения, а точки подножья горы — как виды объектов. Под каплями дождя мы подразумеваем некоторые физические объекты, которые движутся под действием гравитации. Однако изображения состоят из пикселей. И вместо физического движения мы должны думать о том, как эти цифровые значения должны быть обработаны программой.

И точно такое же аттракторное поведение происходит и здесь. К примеру, есть множество клеточных автоматов, в котором каждый автомат может менять цвета нескольких соседних клеток, но всё в любом случае закончится некоторым устойчивым состоянием (большинство клеточных автоматов, на самом деле, имеют более интересное поведение, которое не имеет какого-то конечного состояния, однако тогда бы у нас не получилось провести аналогию к задачам распознавания).

Так что же произойдёт, если мы возьмём изображение и применим к нему алгоритмы клеточных автоматов? В действительности, когда мы обрабатываем изображения, то некоторые обычные операции (на компьютерах или с помощью визуального осмотра человеком) есть просто алгоритмы двумерных клеточных автоматов.

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

Автоматически созданные программы

Так как мы это сделаем? В случае таких цифровых данных, как изображения — никто не знает, как это сделать одним махом. Это итеративный процесс. Вначале мы имеем некоторую заготовку, а затем постоянно меняем её форму, вылепливая то, что нам нужно.

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

Для систем с конечным действительным числом параметров есть отличный метод под названием «обратное распространение» (back propagation), который основан на вычислениях. Он является, по сути, вариантом очень простого метода — метода наследования градиента, в котором вычисляются производные, а затем используются для определения того, как изменить параметры, чтобы система обладала желаемым поведением.

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

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

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

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

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

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

Люди легко могут распознавать тысячи самых разных объектов — примерно столько, сколько в языке имеется существительных, которые можно как-то изобразить. Другие животные различают гораздо меньше объектов. Но если мы попытаемся распознавать образы так, как это делает человек, эффективно отображая их в слова, которые есть в человеческих языках, то тогда мы столкнёмся со всем масштабом проблемы. Ключ к её решению — нейронная сеть масштаба человеческого мозга.

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

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

Вижу только шляпу

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

Вероятно, как и у мозга, у нейронной сети ImageIdentify имеется множество слоёв, которые содержат нейроны разных типов (общая структура, конечно, хорошо описана символьным представлением Wolfram Language).

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

Я сам давно интересовался такими вещами, как визуальное текстурное распознавание, (определение каких-то текстурных примитивов, наподобие основного цвета) и полагаю, что мы сейчас сможем многое понять из этого. Так же, думаю, было бы очень интересно заглянуть в глубокие слои нейронной сети и посмотреть, что же там происходит. Мы бы смогли там обнаружить некоторые концепции, которые и в самом деле описывают классы объектов, в том числе и те, для которых пока что нет слов на естественных человеческих языках.

Как и во множества других проектов для Wolfram Language, при создании ImageIdentify нам потребовалось заниматься множеством разных вещей. Работа с большим количеством обучающих изображений. Разработка онтологии визуализируемых объектов и перенос её на Wolfram Language. Анализ динамики нейронных сетей с использованием методов, которые применяются в физике. Кропотливая оптимизация параллельного кода. Даже некоторые исследования в стиле A New Kind of Science для программ вычислительного мира. И множество субъективных мнений о том, как привносить функциональность, которая была бы полезной на практике.

В самом начале я не был уверен, будет-ли ImageIdentify работать. И в самом начале количество абсолютно неправильно распознанных образов было очень высоким. Однако шаг за шагом мы постепенно приблизились к тому моменту, когда с помощью ImageIdentify уже можно было получить что-то полезное.

Но осталось ещё большое количество нерешенных проблем. Система хорошо справлялась с одними вещами, но серьезно буксовала в других. Мы что-то меняли, что-то настраивали, а потом были новые неудачи и шквал сообщений в стиле «мы опять потеряли муравьеда!» (о том, как те изображения, которые ImageIdentify использовал для корректного распознавания муравьедов, распознавались почему-то как что-то совершенно другое).

Отладка ImageIdentify была весьма увлекательным процессом. Что можно считать осмысленными входными данными? А что есть осмысленные данные на выходе? Как выбрать — более общий и надёжный результат, или более конкретный, но менее надёжный (просто собака, или охотничья собака, или бигль)?

Бывали и вещи, которые на первый взгляд казались абсолютно сумасшедшими. Свинья, которая идентифицировалась как упряжь. Кусок каменной кладки определялся как мопед. Но хорошая новость состояла в том, что мы всегда находили причину — к примеру то, что некоторые нерелевантные объекты постоянно оказывались на обучающих изображениях (единственные каменные кладки, которые видел ImageIdentify — азиатские, на фоне которых постоянно были мопеды).

Чтобы испытать систему, я часто пробовал нестандартные изображения:

И меня поразило то, что я обнаружил. Да, ImageIdentify может ошибаться. Но почему-то ошибки казались очень понятными и в каком-то смысле человеческими. Казалось, что ImageIdentify весьма успешно копирует какие-то аспекты того, как сам человек распознаёт изображения.

Что насчёт абстрактного искусства? Это нечто вроде теста Роршака как для машин, так и для людей — весьма интересное представление о чертах ImageIdentify.

Назад к природе

Такие проекты, как создание ImageIdentify, никогда не заканчиваются. Но пару месяцев назад (см. статью на Хабрахабре «Стивен Вольфрам: Рубежи вычислительного мышления (отчёт с фестиваля SXSW)») мы выпустили предварительную версию на Wolfram Language. И сегодня мы выпустили новую версию и использовали её как основу для Wolfram Language Image Identification Project.

Мы продолжим обучение и разработку ImageIdentify, особенно сосредоточившись на обратной связи и статистике с сайта. Как для Wolfram|Alpha в сфере понимания естественного языка, без активного использования людьми нет никакой возможности реально оценить прогресс, или даже определить, каковы должны быть цели для распознавания реальных изображений.

Должен сказать, что я нахожу весёлым занятием даже просто поиграть с Wolfram Language Image Identification Project. Это будоражит — видеть, как после долгих лет работы получился искусственный интеллект, который и правда работает. Более того, когда Вы видите, что ImageIdentify отвечает на необычное или сложное изображение, возникает такое чувство, как будто это человек делает догадки, или просто шутит.

Под капотом всего этого, конечно, просто код, с весьма простыми циклами. Этот код почти такой же, как тот, который я, к примеру, писал для своих нейронных сетей в восьмидесятые (конечно, сейчас это код на Wolfram Language, а не на низкоуровневом C).

Это очень необычный пример из истории идей — нейронные сети исследуются более семидесяти лет, однако интерес к ним неоднократно угасал. Нейронные сети для нас — то, что привело нас к успеху в решении такой образцовой задачи искусственного интеллекта, как распознавание изображений. Полагаю, что такие передовики в исследовании нейронных сетей, как Уоррен Мак-Каллок и Уолтер Питтс несколько удивились бы тому, что делает ядро Wolfram Language Image Identification Project. Вероятно, они были бы поражены, что для этого потребовалось аж 70 лет.

Но для меня гораздо большее значение имеет то, как могут быть такие вещи, как ImageIdentify, встроены в символьную структуру Wolfram Language. То, что делает ImageIdentify — это то, что делают люди из поколения в поколение. Но символьный язык даёт нам возможность представить весь багаж интеллектуальных достижений человечества. И сделать всё это вычислительным, полагаю, будет чем-то столь масштабным, что я только сейчас начинаю осознавать значимость этого.

Что касается текущего момента, то я надеюсь, что Вам понравится Wolfram Language Image Identification Project. Рассматривайте его как о праздник достижения новых рубежей искусственного интеллекта. Рассматривайте его как отдых для ума, навевающий мысли о будущем искусственного интеллекта. Но не стоит забывать наиболее, на мой взгляд, важное: это так же и прикладная технология, которую Вы можете использовать здесь и сейчас в Wolfram Language и выгружать туда, куда только пожелаете.
Напоследок от команды Блога Wolfram.

Однажды попав на Хабрахабр, заболеваешь им в хорошем смысле этого слова и ImageIdentify кажется знает почему;)

Wolfram открыла доступ к своему репозиторию нейронных сетей

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

Преимущества Wolfram Mathematica:

  • Автоматизация. Автоматизация является ключом к продуктивным вычислениям. В отличие от других систем Mathematica применяет разумную автоматизацию во всех её частях, от выбора алгоритма до расположения графиков и построения пользовательских интерфейсов. В итоге вы получаете высококачественные результаты без необходимости глубоких алгоритмических знаний, и даже в случае экспертного использования, результат будет получен быстрее.
  • Интегрированная универсальная платформа. Специализированное программное обеспечение и дополнительные тулбоксы препятствуют творческой работе с новыми идеями и направлениями—что стоит даже большего, чем их номинальная цена. Система Mathematica не требует покупки никаких дополнительных пакетов. В неё включены специализированные функции из многих технических направлений, от вычислительной биологии до вейвлет-анализа, тесно интегрированные с остальной частью системы.
  • Гибридная символьно-численная методология. Символьные и численные вычисления традиционно считаются раздельными в ущерб пользователям. В системе Mathematica они тесно интегрированы, что делает возможным построение уникальных гибридных методов для решения многих задач и гарантирует последовательные результаты при сочетаний величин произвольных точностей.
  • Мультипарадигмальный язык. Ни один стиль программирования не подходит идеально для всех задач. Система Mathematica отличается от традиционных языков программирования одновременной поддержкой множества программных парадигм: процедурной, функциональной, основанной на правилах или шаблонах и других.
  • Встроенная информация. Операции поиска по стандартным базам данных и их обновление не дожны нарушать ваш рабочий процесс. Система Mathematica выгодно отличается от других платформ для технических вычислений тем, что включает обширные коллекции тщательно выверенных данных самых разных типов, которые постоянно обновляются и расширяются.
  • Рабочий процесс на базе документов. У вас не должна возникать необходимость пользоваться одной программой для обработки данных, другой для их визуализации, а третьей для их интерактивного преподнесения. Система Mathematica всё это осуществляет в течение рабочего процесса, сохраняя все элементы проекта—вычисления, визуализации, данные, документацию, и даже интерактивные приложения—вместе, в уникально гибких документах.

Возможности Wolfram Mathematica:

  • Вычисление. Будь то для численных вычислений с произвольной точностью, символьных вычислений или визуализации—система Mathematica является очень мощным вычислительным инструментом, используя общесистемные технологии для обеспечения надежности, простоты в использовании и производительности. Вычислительную силу системы Mathematica можно использовать непосредственно, в качестве орудия в какой-то инфраструктуре, или через автономное приложение, в которое она интегрирована.
    • Основные алгоритмы. Наибольшее в мире тесное сплетение математических возможностей и алгоритмов.
    • Численные вычисления. Численные вычисления промышленного уровня, от мгновенных расчетов до объемных и сложных математических вычислений.
    • Прикладные направления. Полностью интегрированная, специализированная техническая функциональность.
    • Получение и анализ данных. Универсальное решение для получения и накопления данных, обработки, анализа и визуализации.
    • Графика и визуализация. Уникально интегрированная графика и мощная визуализация.
  • Разработка. Разрабатывайте инструментарий, приложения, документы и компоненты инфрастуктуры, используя плавный рабочий процесс системы Mathematica, уникальный символьный язык, и прогрессивную среду редактирования кода, достигая быстрого оборота в небольших проектах и рекордных сроков исполнения на больших системах.
    • Программирование и разработка. Уникально мощный символьный язык, являющийся основой системы Mathematica.
    • Интерактивность и проектирование интерфейса. Динамические интерактивные вычисления и мгновенное создание интерфейса.
  • Развертывание. Назависимо от формы конечного продукта, будь то интерактивные документы, презентации, приложения или промышленные системы, система Mathematica может развертывать результаты работы в широком диапазоне форматов локально или по сети. Снабженная многими способами подключаться к внешним системам и работать с ними, система Mathematica предназначена для максимального увеличения вашей производительности.
    • Развертывание и взаимодействие. Немедленное развертывание в любых масштабах.
    • Продуктивность и удобство в использовании. Оптимизированный рабочий процесс: от концепции до результата.

Mathematica 11 представляет функциональные возможности для значимых новых областей, включая 3D печать, обработку аудио, машинное обучение и нейронные сети, а также многие другие улучшения, все построенные на основе языка Wolfram Language.

  • Свыше 500 новых функций значительно расширяют охват в новых и уже существующих областях
  • Алгоритмическое генерирование, импорт и прямая печать трёхмерных моделей на локальных или облачных 3D принтерах
  • Новые вычислительные аудио синтез, обработка и анализ для приложений в музыке и речи
  • Новая структура нейронных сетей предоставляет доступ к глубинному обучению с ускорением вычислений на графических процессорах
  • Расширенные и усиленные функциональные возможности машинного обучения, включая вычленение признаков и байесовскую оптимизацию
  • Многочисленные расширения и улучшения в облаке Wolfram, а также веб-операциях и хранении данных
  • Широкий набор новых видов визуализации: от статистичекой до географической и анатомической, а также улучшенные варианты презентации
  • Улучшения в работе и характеристиках лидирующих в своей сфере символики, численных операций и геометрии
  • Расширенная география, включая новые географические понятия, карточный задний план, проектирование и многое другое
  • Новая вычислительная география, а также больше инструментов для обработки изображений и сигналов
  • Новая и улучшенная поддержка для случайных матриц, временных рядов и количественных представлений в теории вероятности и статистике
  • Экспериметальный канал структуры Wolfram для асинхронной передачи информации между облаком, рабочим столом и встроенными системами
  • Запуск кода языка Wolfram Language отовсюду: локально или в облаке, с новым интерпретатором командной строки WolframScript
  • Более богатые структуры функционального прграммирования, благодаря улучшениям обработки списков и массивов
  • Более мощная обработка текста и языка и возросшая многоязычная поддержка
  • Проверка орфографии в режиме реального времени, дополненная словарями для технических терминов, имён собственных и поддержкой около 25 языков
  • Улучшенное представление кода, автодополнение ввода, и сообщения об ошибках помогают улучшить продуктивность пользователей
  • Более быстрый и гибкий доступ к базе данных Wolfram, включая произвольные наборы данных
  • И многое другое

ОС: Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Vista, Windows Server 2012, Windows HPC Server 2008, Windows Server 2008

Контрольные суммы образа:
CRC32: 825BBC2A
MD5: 86541CF5ABE923C5053F8B973E6A1429
SHA-1: A1C4329D06E115CE76E6567F0A2EC2DF2FE18BEE

Информационный портал по безопасности

Информационный портал по безопасности » Программирование » Веб-разработка » Wolfram Function Repository: открытый доступ к платформе для расширений языка Wolfram

Wolfram Function Repository: открытый доступ к платформе для расширений языка Wolfram

Предпосылки состоятельности языка Wolfram

Сегодня мы стоим на пороге великих свершений вместе с языком программирования Wolfram Language . Всего три недели назад мы запустили бесплатный движок Wolfram для разработчиков , чтобы помочь нашим пользователям интегрировать язык Wolfram Language в их масштабные программные проекты. Именно сегодня мы запускаем репозиторий функций Wolfram , для того чтобы предоставить скоординированную платформу для функций, созданных для расширения языка Wolfram, а также мы открываем репозиторий функций для каждого, кто может внести свой вклад в развитие нашего программного продукта.

полномасштабного вычислительного языка . В традиционных языках программирования добавление значительных новых функций обычно включает в себя создание целых дополнительных библиотек, которые могут работать или не работать при совместном использовании. Однако в языке Wolfram Language так много уже встроено в сам язык , что существует возможность значительно расширять его функциональность, просто добавляя новые функции, незамедлительно интегрирующиеся в целостную структуру всего языка.

Например, уже сейчас в репозитории функций Wolfram содержится 532 новых функции структурированных по 26 тематическим категориям:

Аналогично более чем 6000 стандартных функций , встроенным в язык Wolfram, каждая функция из репозитория имеет страницу документации с подробным их описанием и примерами работы:

Для перехода на страницу скопируйте приведенный выше объект (функциональный BLOB), вставьте его в строку ввода и затем запустите функцию – она уже встроена в язык Wolfram и поддерживается по умолчанию, начиная с версии 12.0 :

Здесь следует отметить, что при обработке LogoQRCode Вам не нужно, например, настраивать «библиотеку для обработки изображений» — так как в языке Wolfram Language нами уже реализован последовательный и тщательно алгоритмизированный способ обработки изображений , которые незамедлительно могут быть обработаны различными графическими функциями языка:

Надеюсь, что при поддержке замечательного и талантливого сообщества , которое растет и расширяется (на базе языка Wolfram Language) на протяжении последних нескольких десятилетий. Репозиторий функций Wolfram позволит в обозримом будущем значительно расширить диапазон (возможно потенциально значительных, специализированных в различных областях знаний науки и техники) функций, доступных в языке. Таким образом, появляется возможность использовать как содержание языка (его встроенные функции), так и принципы развития , которые реализуются на базе языка. (Здесь следует отметить, что Wolfram Language имеет уже более чем 30-летнюю историю развития и стабильного роста ).

Внутри функций из репозитория могут быть небольшие или достаточно объемные фрагменты кода, написанного на языке Wolfram Language. Например, это могут быть вызовы внешних API и сервисов или внешних библиотек на других языках . Уникальной особенностью данного подхода является то, что, когда Вы переходите к функциональности на уровне пользователя, будут отсутствовать возможные нестыковки по причине того, что данный подход построен на базе согласованной структуры языка Wolfram Language — и каждая функция автоматически будет работать правильно — именно так, как ей и надлежит.

Оболочка и программная структура репозитория функций Wolfram настроены таким образом, чтобы каждый мог внести свой вклад в общее дело максимально простым и удобным для него путем — по сути, просто заполнив текстовый файл блокнота (с расширением nb) WL . Встроенные автоматические функции позволяют выполнять проверку новых добавляемых в репозиторий функций с целью их гарантированной интеграции в язык. Наша компания делает ставку на обширный круг пользователей, которые могут интегрировать свои функции в язык, а не на большие сложности новых функций — и хотя здесь реализован процесс проверки, мы не настаиваем на чем — то вроде кропотливого анализа конструкции или строгих стандартов полноты и надежности новых функций пользователей, в отличие от более тщательных проверок функций, встроенных в ядро языка, которые мы применяем.

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

Повышение эффективности при снижении затрат

Еще до появления в Интернета существовали способы обмениваться кодом Wolfram Language (нашим первым крупным централизованным проектом был MathSource , созданный для Mathematica в 1991 году на базе CD-ROM и т. п.). Безусловно, предлагаемый к реализации подход на базе репозитория функций Wolfram является более мощным и надежным средством для реализации вышеперечисленных задач.

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

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

Создание репозитория, который бы действительно хорошо работал, является интересной задачей мета-программирования. Например, избыток ограничений в программе не сможет позволить получить требуемую унификацию и универсальность работы алгоритма. Так же, как и при недостаточном количестве функциональных ограничений Вы не сможете реализовать достаточно правильную последовательность выполнения алгоритма. Несколько предыдущих примеров реализации компромисса данных подходов, реализованных нашей компанией, сработали достаточно стабильно — это: Проект Вольфрам Демонстрации , запущенный в 2007 году и теперь работающий в интерактивном режиме в сети Интернет и содержащий более 12000 пользовательских интерактивных демонстраций. В базе данных Wolfram имеется более 600 готовых баз данных, которые можно использовать в языке Wolfram Language, а хранилище нейронных сетей Wolfram пополняется новыми нейронными сетями практически каждую неделю (сейчас их уже 118) и они сразу же подключаются через функцию NetModel в языке Wolfram Language.

Все вышеперечисленные примеры имеют принципиальную особенность — собираемые в проект объекты и функции имеют очень высокую степень структурирования и распределения процессов. Безусловно, детализация структуры того, что является демонстрацией или нейронной сетью или чем-то другим, могут сильно различаться, но фундаментальная структура для любого текущего репозитория всегда остается неизменной. Так какое же Ваше мнение, уважаемый пользователь, по поводу создании такого репозитория, который добавляет расширения к языку Wolfram? Язык Wolfram Language спроектирован таким образом, чтобы быть чрезвычайно гибким, поэтому его можно расширять и видоизменять любым способом. Данное обстоятельство является чрезвычайно важным для возможности быстро создавать различные крупномасштабные программные проекты на языке Wolfram Language. Здесь следует отметить, что с ростом гибкости языка неизбежно возрастет и стоимость проектов, реализуемых на таком языке. Это происходит по причине того, что чем больше пользователь применяет такой язык, тем больше он получает выделенной функциональности, но не следует забывать, что данный подход может иметь и негативные стороны в части невозможности обеспечения последовательной согласованности программных модулей.

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

Таким образом, идея репозитория функций Wolfram состоит в том, чтобы избежать проблемы, озвученной выше — просто добавляя расширения к языку в виде сравнительно небольших элементов программного кода посредством отдельных функций, разработка которых в виде согласованных модулей является более простой задачей. При этом существуют особенности программирования, которые невозможно сделать удобными при помощи отдельных функций (и наша компания в ближайшем будущем собирается выпустить оптимизированный программный алгоритм для помощи в реализации крупномасштабных программных пакетов). Однако, на базе уже встроенных в язык Wolfram Language функций, существует множество возможностей для программирования, которые реализованы на базе отдельных функций. Здесь мысль заключается в том, чтобы при сравнительно небольших программных усилиях можно было создать ряд новых и очень полезных функций, которые обеспечат достаточную согласованность проекта, при этом они будут хорошо согласованы друг с другом, а также, помимо этого, они будут иметь возможность легко и широко использоваться в языке в дальнейшем.

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

Помощь при добавлении пользовательских функций в репозиторий функций

Специалисты нашей компании упорно работали над тем, чтобы сделать свой вклад в функции репозтитория Wolfram достаточно легким для пользователей. На рабочем столе (уже в версии 12.0 ), Вы можете просто последовательно перейти по вкладкам основного меню: File > New > RepositoryItem > Function Repository Item и Вы получите « Definition Notebook » (программно внутри рабочей среды. Вы можете также использовать функцию аналог — CreateNotebook[«FunctionResource»] ):

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

Нажмите кнопку «Открыть образец» вверху, чтобы увидеть пример того, что Вам нужно сделать:

Фактически, Вы пытаетесь создать нечто похожее на встроенную функцию в языке Wolfram Language. За исключением того, что она может делать что-то гораздо более конкретное, чем встроенная функция. При этом ожидания относительно ее полноты и надежности будут намного ниже.

Вам необходимо задать имя для Вашей функции, которое будет соответствовать принципам именования функций Wolfram Language. Кроме этого Вам понадобится разработать документацию для Вашей функции, по аналогии со встроенными функциями языка. Более подробно я расскажу об этом позже. Сейчас просто обратите внимание на то, что в ряду кнопок в верхней части файла блокнота определений есть кнопка «Рекомендации по стилю» , в которой объясняется, что делать, и кнопка «Инструменты», которая предоставляет инструментарий для форматирования документации Вашей функции.

Когда Вы убедитесь, что все заполнено должным образом и Вы готовы, нажмите кнопку «Check» («Проверить»). Совершенно нормальным является то, что Вы еще не разобрались во всех деталях. Поэтому функция «Check» будет автоматически выполняться и делать много проверок стиля и согласованности. Часто она сразу же предложит Вам подтвердить и принять исправления (Например: «Эта строка должна заканчиваться двоеточием», и она предложит ввести двоеточие). Иногда она попросит Вас добавить или изменить что-то самостоятельно. Мы будем постоянно добавлять новые возможности к автоматической функциональности кнопки «Check», но в основном его цель состоит в том, чтобы гарантировать — все, что вы отправляете в репозиторий функций, уже точно соответствует как можно большему количеству рекомендаций по стилю

Итак, после запуска «Check» вы можете использовать «Preview» («Предпросмотр»). «Preview» создает предварительный просмотр страницы документации, которую Вы определили для своей функции. Вы также можете создать предварительный просмотр для файла, созданного на Вашем компьютере или для файла, находящегося в облачном хранилище. Если Вас, по каким-то причинам, не устраивает то, что Вы увидите в предварительном просмотре, просто вернитесь назад и выполните необходимые исправления, а затем снова нажмите кнопку Preview.

Теперь Вы готовы разместить свою функцию в репозитории. Кнопка Deploy предоставляет Вам четыре варианта действий:

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

Итак, допустим, Вы хотите фактически передать свою функцию в базу знаний функций Wolfram. Для этого Вы нажимаете кнопку «Отправить» в репозиторий. Так что же тогда происходит в данный момент? Ваша заявка сразу же попадает в очередь для рассмотрения и утверждения нашей специальной командой кураторов.

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

Что же должно быть в хранилище?

Следует отметить, что в нашей компании очень высокие стандарты полноты, надежности и общего качества, из 6000+ функций, которые мы уже встроили в язык Wolfram за последние 30 с лишним лет все соответствуют вышеперечисленным требованиям. Цель репозитория функций Wolfram заключается в том, чтобы использовать всю структуру и функциональные возможности, которые уже существуют в языке Wolfram Language, для того чтобы добавить как можно больше гораздо более легких функций (то есть функций с более высокой производительностью).

Безусловно, функции в репозитории функций Wolfram должны соответствовать принципам разработки языка Wolfram Language — чтобы они могли полноценно взаимодействовать с другим функциям и ожиданиям пользователей относительно того, как функции надлежит правильно работать. Однако при этом функции не должны иметь одинаковую полноту или надежность.

Во встроенных функциях языка Wolfram, мы упорно работаем над тем, чтобы сделать программные функции как можно более общими. При этом при нахождении в репозитории функций Wolfram нет ничего плохого в том, чтобы в него попала функция, которая просто обрабатывает какой-то очень конкретный, но полезный случай. Например, функция SendMailFromNotebook может получать файлы в одном определенном формате и создавать почту одним определенным способом. PolygonalDiagram создает диаграммы только с определенными цветами и маркировкой и т. д.

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

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

Теперь давайте рассмотрим пример тестирования функций в репозитории. Ожидания согласованности для таких функций естественно гораздо ниже, чем для встроенных функций языка. Это тем более актуально в случаях, когда функции зависят от внешних ресурсов, таких как API, важно постоянно проводить последовательные тесты, что автоматически происходит внутри алгоритмов проверки. В файле nb вы можете явно указать определения (в разделе «Дополнительная информация») и задать столько тестов, определяемых либо строками ввода и вывода, либо полными символьными объектами типа VerificationTest , сколько посчитаете нужным. Кроме того, система постоянно пытается превратить приведенные Вами примеры документации в процесс проверки (при этом иногда это может быть довольно ресурсоемко, например, для функции, результат которой зависит от случайных чисел или времени суток).

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

Основная цель репозитория функций (как следует из его названия) состоит в том, чтобы вводить в функционал языка новые функции. Если Вы хотите добавить новые данные или новые сущности , используйте репозиторий Wolfram Data . Но что делать, если Вы хотите ввести новые виды объектов для Ваших вычислений?

На самом деле есть два пути. Возможно, Вы захотите ввести новый тип объекта, который будет использоваться в новых функциях в репозитории функций. И в этом случае Вы всегда можете просто записать его символьное представление и использовать его при вводе или выводе функций в репозитории функций.

Но что делать, если Вы хотите представить объект, а затем определить, через существующие функции в языке Wolfram Language, которые должны работать вместе с ним? Для этого у Wolfram Language всегда был легкий механизм, который называется UpValues . С некоторыми ограничениями (особенно для функций, которые не могут оценивать свои аргументы ), репозиторий функций позволяет Вам просто представить функцию и определить значения для нее. (Чтобы повысить ожидание согласованности при создании новой важной конструкции, полностью интегрированной везде в языке Wolfram Language, — это, как правило, очень важная процедура, которая не может быть достигнута только с помощью повышения стоимости проекта и это то, что наша компания делает в рамках проектов долгосрочного развития языка, данная задача не является целью, которая ставится в рамках развития репозитория).

Итак, что же может быть в коде функций в репозитории функций? Все, что встроено в язык Wolfram Language , конечно (по крайней мере, если это не представляет угрозы для безопасности и работоспособности самой программы, как вычислительной среды) также как и любая функция из репозитория функций. При этом существуют и другие возможности функционирования: функция в репозитории функций может вызывать API, либо в Wolfram Cloud , либо из другого источника . Конечно, существуют некоторые риски, связанные с этим. По причине того, что отсутствуют гарантии, что API не изменится, а функция в хранилище функций при этом перестанет работать. Для выявления подобных проблем существует примечание на странице документации (в разделе «Требования») для любой функции, которая опирается не только на встроенную функциональность Wolfram Language. (Конечно, когда речь идет о реальных данных, могут быть проблемы даже с такой функциональностью — потому что реальные данные о мире постоянно меняются, а иногда даже меняют их определения и структура.)

Должен ли весь код для репозитория функций Wolfram быть написан на языке Wolfram? Определенно, код внутри внешнего API не должен быть написан на языке Wolfram, что собственно даже не делает код языка. На самом деле, если Вы найдете функцию практически на любом внешнем языке или библиотеке, вы сможете создать оболочку, которая позволит использовать ее в репозитории функций Wolfram. (Обычно для этого следует использовать встроенные функции ExternalEvaluate или ExternalFunction в коде языка Wolfram.)

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

Кстати, когда вы первый раз анализируете типовые внешние библиотеки, они часто кажутся слишком сложными, чтобы их можно было охватить лишь несколькими функциями, но во многих случаях большая часть сложности возникает из-за создания инфраструктуры, необходимой для библиотеки, и всех функций для ее поддержки. Однако при использовании языка Wolfram Language, инфраструктура, как правило, уже встроена в пакеты, и поэтому не нужно подробно раскрывать все эти функции поддержки, а нужно лишь создать функции для нескольких «самых верхних» функций, ориентированных на приложение в библиотеке.

«Экосистема» базы знаний

Если Вы написали функции, которые используете постоянно, то отправьте их в репозиторий функций Wolfram! Если из этого в итоге не получится что-то большее (развитие языка), то и тогда Вам будет гораздо удобнее использовать функции для личного пользования. Однако логично предположить, что, если Вы используете функции постоянно, возможно и другие пользователи также найдут их полезными.

Естественно, что Вы можете оказаться в ситуации, когда вы не имеете возможности — или не хотите — делиться своими функциями или в случае получения доступа к частным информационным ресурсам. Даже в таких случаях Вы можете просто развернуть функции в своей собственной учетной записи в облаке, указав права доступа к ним. (Если в Вашей организации есть частное облако Wolfram Enterprise , то вскоре оно сможет разместить собственный частный репозиторий функций, который можно администрировать из Вашей организации и устанавливать принудительный просмотр представлений или нет для сторонних пользователей.)

Функции, которые Вы отправляете в репозиторий функций Wolfram, не обязательно должны быть идеальными; они просто должны быть полезными. Это немного похоже на раздел «Ошибки» в классической документации Unix — в «Разделе определений» есть раздел «Заметки автора», в котором Вы можете описать ограничения, проблемы и т. п., о которых Вы уже знаете о своей функции. Кроме того, когда вы отправляете свою функцию в репозиторий, Вы можете добавить примечания к отправке, которые будут прочитаны специальной командой кураторов.

После публикации функции ее страница всегда имеет две ссылки внизу: « Отправить сообщение об этой функции » и « Обсудить в сообществе Wolfram ». Если Вы прикрепляете пометку (например, сообщать мне об ошибках), Вы можете установить флажок, в котором говорится, что вы хотите, чтобы Ваше сообщение и контактная информация были переданы автору функции.

Иногда возникает необходимость просто использовать функции из репозитория функций Wolfram, например встроенные функции, не заглядывая в их код. Однако если вы хотите «заглянуть внутрь», в верхней части всегда есть кнопка «Блокнот». Нажмите на нее, и Вы получите собственную копию оригинальной тетради определения, которая была отправлена в репозиторий функций. Иногда Вы можете просто использовать ее в качестве примера для своих нужд. При этом Вы также можете разработать Вашу собственную модификацию данной функции. Возможно, Вы захотите разместить эти найденные Вами функции из репозитория на своем компьютере или в своей учетной записи в Вашем облачном хранилище тли, может быть, Вы захотите отправить их в базу знаний функций, возможно, в качестве улучшенной, дополненной версии исходной функции.

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

Рассмотрим вопрос, как работает «версионность» разработанных функций. Прямо сейчас, когда Вы используете функцию из репозитория функций, ее определение будет постоянно храниться на вашем компьютере (или в вашей облачной учетной записи, если вы используете облако). Если появилась новая версия функции, то при следующем ее использовании вы получите сообщение, извещающее Вас об этом. И если Вы хотите обновить функцию до новой версии, Вы можете сделать это с помощью команды ResourceUpdate . («Функциональный BLOB-объект» на самом деле хранит больше информации о версиях, и в будущем мы планируем сделать это более доступным для наших пользователей.)

Одной из прекрасных особенностей репозитория функций Wolfram является то, что любая программа Wolfram Language в любом месте может использовать функции из него. Если программа появляется в блокноте, часто бывает удобно отформатировать функции репозитория в виде функций легко читаемых «функциональных двоичных объектов» (возможно, с соответствующим набором версий).

Вы всегда можете обратиться к любой функции репозитория функций, используя текстовую ResourceFunction [. ] . И это очень удобно, если Вы пишете код или сценарии непосредственно для Wolfram Engine, например, с помощью IDE или текстового редактора кода (cледует особо отметить, что репозиторий функций полностью совместим с Free Wolfram Engine для разработчиков ).

Как это работает?

Внутри функций в репозитории Wolfram это возможно с использованием точно такой же системы ресурсов базы, как и во всех других наших существующих репозиториях (хранилище данных, Neural Net Repository , коллекция демонстрационных проектов и т.д.), как и все остальные системные ресурсы Wolfram, ResourceFunction в конечном счете основан на функции ResourceObject .

Внутри Вы можете увидеть некоторую информацию, используя функция Information :

Как работает настройка функции ресурса? Самый простой — это чисто локальный случай. Вот пример, который берет функцию (в данном случае просто чистую функцию) и определяет ее как функцию ресурса для данного сеанса работы в программе:

После того как Вы сделали определение, вы можете использовать функцию ресурса:

Обратите внимание, что в этом BLOB-объекте функции есть черный значок . Это означает, что BLOB-функция относится к функции ресурсов в памяти, определенной для текущего сеанса. Для функции ресурса, которая постоянно хранится на Вашем компьютере или в облачной учетной записи, есть серый значок . А для официальной функции ресурса в репозитории функций Wolfram есть оранжевый значок .

Итак, что происходит, когда вы используете меню «Развертывание» в блокноте определения? Во-первых, он берет все определения в блокноте и из них создает символьный ResourceObject ). (А если Вы используете текстовую IDE или программу, то тогда Вы также можете явно создать ResourceObject )

Локальное развертывание функции из репозитория на Вашем компьютере выполняется при помощи команды LocalCache для объекта ресурса, чтобы сохранить его как LocalObject в Вашей файловой системе. Развертывание в облачной учетной записи выполняется при помощи команды CloudDeploy для объекта ресурса, а публичное развертывание в облаке — CloudPublish . Во всех случаях ResourceRegister также используется для регистрации имени функции ресурса, так что ResourceFunction[«name»] будет работать.

Если нажать кнопку Submit для Function Repository, то, что под ним происходит ResourceSubmit вызывается на объект ресурса. (И если Вы используете текстовый интерфейс ввода, Вы также можете вызвать ResourceSubmit напрямую.)

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

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

Некоторые тонкости в работе

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

Первая непосредственная тонкость: Когда Вы заполняете «Блокнот определений», Вы можете просто ссылаться на свою функцию везде, используя имя, подобное MyFunction, которое выглядит как обычное имя для функции в языке Wolfram Language, но для документации репозитория функций это заменяется ResourceFunction[«MyFunction»] – это именно то, что пользователи фактически будут использовать при работе с функцией.

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

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

Репозиторий функций предназначен для определения новых функций. И эти функции могут иметь опции. Часто эти параметры (например, Method или ImageSize ) будут иметь возможность использования для встроенных функций, а также для тех, для которых уже существуют встроенные символы. Но иногда новой функции могут потребоваться и новые опции. Для того чтобы сохранить модульность, необходимо, чтобы эти параметры были символами, определенными в уникальном внутреннем контексте (или что-то вроде целых функций ресурса, то есть сами по себе). Для простоты репозиторий функций позволяет задавать новые опции в определениях в виде строк. И для удобства пользователю, эти определения (при условии, что они использовали OptionValue и OptionsPattern ) также обрабатываются так, что при использовании функций параметры могут быть заданы не только как строки, но и как глобальные символы с теми же именами.

Большинство функций просто делают то, что они должны делать каждый раз, когда их вызывают, но некоторые функции нуждаются в инициализации, прежде чем они смогут работать в определенном сеансе — и для решения этой проблемы в разделе «Определение» есть раздел «Инициализация».

Функции из репозитория могут использовать другие функции, которые уже находятся в репозитории, для того чтобы настроить определения для репозитория функций, включающие две (или более) функции, которые ссылаются друг на друга необходимо развернуть их в своем сеансе работы с программой, чтобы Вы могли ссылаться на них как ResourceFunction[«name»] , затем Вы можете создать нужные Вам комбинации этих функций примеры (не поняла) и добавить в репозиторий новую функцию на базе уже размещенных ранее. (или уже или ранее – оба слова коряво)

Перспективы развития. Что должно произойти, когда репозиторий станет по-настоящему большим?

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

Первая проблема касается имен функций и их уникальности. Репозиторий функций спроектирован таким образом, что в нем, как и для встроенных функций в языке Wolfram Language, можно ссылаться на любую данную функцию, просто указав ее имя. Но это неизбежно означает, что имена функций должны быть глобально уникальными по всему репозиторию, так что, например, в репозитории может быть только одна ResourceFunction[«MyFavoriteFunction»] .

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

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

(Здесь следует отметить, что простое добавление какого-либо т

Принципы построения нейронных сетей. Пишем простую нейросеть на JavaScript

Рассмотрим базовые принципы работы нейронных сетей, узнаем про Brain.js и попробуем подкрепить теорию на практике. Напишем свою первую нейронную сеть, которая будет уметь чуть больше чем ничего, но чуть меньше чем что-то. Статья не претендует на пособие по разработке нейронных сетей, я постараюсь дать Вам базовые знания и представления о работе нейросетей, которыми обладаю сам>

Введем понятие ИНС — искусственная нейронная сеть. т.e. сеть построенная при помощи компьютерной системы;

НС — нейронная сеть мозга человека.

Что такое ИНС?

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

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

Для понимания устройства нейронной сети давайте немного окунемся в биологию и устройство человеческого мозга и проведем некоторые параллели с устройством ИНС. Это не так сложно, как может показаться!

Нейронная сеть (биологическая нейронная сеть) — совокупность нейронов головного и спинного мозга центральной нервной системы (ЦНС) и ганглия периферической нервной системы (ПНС), которые связаны или функционально объединены в нервной системе, выполняют специфические физиологические функции.

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

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

Давайте более подробно разберем это определение. Из него следует что нейронная сеть представляет собой некоторое количество нейронов, связанных между собой. Сколько нейронов в мозге человека? По подсчетам многих ученых, мозг человека состоит из порядка 100 миллиардов нейронов (плюс-минус пара миллиардов). Именно эта цифра долгие годы приводилась в учебниках по нейробиологии и психологии. Каждый из нейронов является вычислительной единицей, которая обрабатывает входящую информацию и передает ее дальше. Для получения информации у нейрона есть входные каналы, которые называются синапсы. Синапсы это каналы, по которым в нейрон поступает информация из других нейронов. На рисунке синапсы обозначены буквой W, а другие нейроны буквой X. Каждый синапс обладает весом, чем больше вес синапса, тем больше результат работы нейрона будет преобладать в дальнейших вычислениях. Рассмотрим работу синапсов на примере изображения:

Разноцветные круги слева — нейроны. Линиями изображены синапсы. Как видно, каждый синапс обладает весом. Этот вес проставляется случайным образом в диапазоне от 0 до 1. На изображении справа изображена работа сумматора. Сумматор — это функция, которая рассчитывает вес входных сигналов и передает их дальше в функцию активации, об этом чуть позже. Давайте попробуем рассчитать вес входных сигналов, если результаты работы нейронов были следующие:

Важно понимать что ИНС оперирует данными в диапазоне от 0 до 1. Вычисление веса в сумматоре производится пос следующей формуле:

(L1 * W1) + (L2 * W2) + (L3 * W3) = W

Функция совершенно линейна, из этого мы получаем следующую формулу:

(0.35 * 0.1) + (0.12 * 0.3) + (0.6 * 0.2) = 0.191

Таким образом мы получили некую единицу, вес который будет передан в функцию активации.

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

Функций активации достаточно много поэтому мы рассмотрим самые основные: Линейная, Сигмоид (Логистическая) и Гиперболический тангенс. Главные их отличия — это диапазон значений.

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

Это самая распространенная функция активации, ее диапазон значений [0,1]. Именно на ней показано большинство примеров в сети, также ее иногда называют логистической функцией. Соответственно, если в вашем случае присутствуют отрицательные значения (например, акции могут идти не только вверх, но и вниз), то вам понадобиться функция которая захватывает и отрицательные значения.

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

Подведем итоги. Что мы узнали про ИНС?

У нейрона есть входы. На них подаются сигналы в виде чисел. Каждый вход имеет свой вес (тоже число). Сигналы на входе умножаются на соответствующие веса. Получаем набор «взвешенных» входных сигналов.

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

Затем взвешенная сумма преобразуется функцией активации и мы получаем выход нейрона.

Виды ИНС

Мы разобрались со структурой искусственного нейрона. Искусственные нейронные сети состоят из совокупности искусственных нейронов. Возникает логичный вопрос – а как располагать/соединять друг с другом эти самые искусственные нейроны?

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

На этом схожесть заканчивается и начинаются различия.

Однослойные нейронные сети

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

Выглядит однослойная нейронная сеть следующим образом:

На этой картинке входной слой обозначен кружками (он не считается за слой нейронной сети), а справа расположен слой обычных нейронов.

Нейроны соединены друг с другом стрелками. Над стрелками расположены веса соответствующих связей (весовые коэффициенты).

Однослойная нейронная сеть (Single-layer neural network) — сеть, в которой сигналы от входного слоя сразу подаются на выходной слой, который и преобразует сигнал и сразу же выдает ответ.

Многослойные нейронные сети

Такие сети, помимо входного и выходного слоев нейронов, характеризуются еще и скрытым слоем (слоями). Понять их расположение просто – эти слои находятся между входным и выходным слоями.

Такая структура нейронных сетей копирует многослойную структуру определенных отделов мозга.

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

Многослойные нейронные сети обладают гораздо большими возможностями, чем однослойные.

Работу скрытых слоев нейронов можно сравнить с работой большого завода. Продукт (выходной сигнал) на заводе собирается по стадиям. После каждого станка получается какой-то промежуточный результат. Скрытые слои тоже преобразуют входные сигналы в некоторые промежуточные результаты.

Сети прямого распространения

Можно заметить одну очень интересную деталь на картинках нейросетей в примерах выше.

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

Сети прямого распространения (Feedforward neural network) (feedforward сети) — искусственные нейронные сети, в которых сигнал распространяется строго от входного слоя к выходному. В обратном направлении сигнал не распространяется.

Такие сети широко используются и вполне успешно решают определенный класс задач: прогнозирование, кластеризация и распознавание.

Однако никто не запрещает сигналу идти и в обратную сторону.

Сети с обратными связями

В сетях такого типа сигнал может идти и в обратную сторону. В чем преимущество?

Дело в том, что в сетях прямого распространения выход сети определяется входным сигналом и весовыми коэффициентами при искусственных нейронах.

А в сетях с обратными связями выходы нейронов могут возвращаться на входы. Это означает, что выход какого-нибудь нейрона определяется не только его весами и входным сигналом, но еще и предыдущими выходами (так как они снова вернулись на входы).

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

Классификация ИНС

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

Классификация образов. Задача состоит в указании принадлежности входного образа (например, речевого сигнала или рукописного символа), представленного вектором признаков, одному или нескольким предварительно определенным классам. К известным приложениям относятся распознавание букв, распознавание речи, классификация сигнала электрокардио-граммы, классификация клеток крови, обеспечение деятельности биометрических сканеров и т. п.

Кластеризация/категоризация. При решении задачи кластеризации, которая известна также как классификация образов без учителя, отсутствует обучающая выборка с метками классов. Алгоритм кластеризации основан на подобии образов и размещает близкие образы в один кластер. Известны случаи применения кластеризации для извлечения знаний, сжатия данных и исследования свойств данных.

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

Предсказание/прогноз. Пусть заданы n дискретных отсчетов в последовательные моменты времени t1, t2. tn. Задача состоит в предсказании значения y (tn+1) в некоторый будущий момент времени tn+1. Предсказание/прогноз имеют значительное влияние на принятие решений в бизнесе, науке и технике. Предсказание цен на фондовой бирже и прогноз погоды являются типичными приложениями техники предсказания/прогноза.

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

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

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

Отлично! Но как научить сеть делать то, что я от нее хочу? Может нужно помочь ей? Или она сама себя обучит?

Искусственная нейронная сеть – это совокупность искусственных нейронов. Теперь давайте возьмем, например, 100 нейронов и соединим их друг с другом. Ясно, что при подаче сигнала на вход, мы получим что-то бессмысленное на выходе.

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

Что мы можем менять в нейронной сети?

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

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

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

Остается только один вариант – менять веса связей.

Обучение нейронной сети (Training) — поиск такого набора весовых коэффициентов, при котором входной сигнал после прохода по сети преобразуется в нужный нам выходной.

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

Однако есть еще один важный момент. Если обучать сеть, используя только один входной сигнал, то сеть просто «запомнит правильный ответ». Со стороны будет казаться, что она очень быстро «обучилась». И как только вы подадите немного измененный сигнал, ожидая увидеть правильный ответ, то сеть выдаст бессмыслицу.

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

Именно с этой целью и создаются обучающие выборки.

Обучающая выборка (Training set) — конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит обучение сети.

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

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

Тестовая выборка (Testing set) — конечный набор входных сигналов (иногда вместе с правильными выходными сигналами), по которым происходит оценка качества работы сети.

Мы поняли, что такое «обучение сети» – подбор правильного набора весов. Теперь возникает вопрос – а как можно обучать сеть? В самом общем случае есть два подхода, приводящие к разным результатам: обучение с учителем и обучение без учителя.

Обучение с учителем

Суть данного подхода заключается в том, что вы даете на вход сигнал, смотрите на ответ сети, а затем сравниваете его с уже готовым, правильным ответом.

Важный момент. Не путайте правильные ответы и известный алгоритм решения! Вы можете обвести пальцем лицо на фото (правильный ответ), но не сможете сказать, как это сделали (известный алгоритм). Тут такая же ситуация.

Затем, с помощью специальных алгоритмов, вы меняете веса связей нейронной сети и снова даете ей входной сигнал. Сравниваете ее ответ с правильным и повторяете этот процесс до тех пор, пока сеть не начнет отвечать с приемлемой точностью (как я говорил в 1 главе, однозначно точных ответов сеть давать не может).

Обучение без учителя

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

Что же происходит при таком обучении сети? Оказывается, что при таком «обучении» сеть начинает выделять классы подаваемых на вход сигналов. Короче говоря – сеть начинает кластеризацию.

Например, вы демонстрируете сети конфеты, пирожные и торты. Вы никак не регулируете работу сети. Вы просто подаете на ее входы данные о данном объекте. Со временем сеть начнет выдавать сигналы трех разных типов, которые и отвечают за объекты на входе.

Обучение без учителя (Unsupervised learning) — вид обучения сети, при котором сеть самостоятельно классифицирует входные сигналы. Правильные (эталонные) выходные сигналы не демонстрируются.

Выводы

В этой главе вы узнали все о структуре искусственного нейрона, а также получили полное представление о том, как он работает (и о его математической модели).

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

Вы также ознакомились с тем, что представляет собой обучение сети с учителем и без учителя.

Вы уже знаете необходимую теорию. Давайте попробуем подкрепить наши знания на практике.

Практика

Наиболее распространенным решением является использование Python для построения ИНС. Существует огромное множество готовых решений и библиотек для построения ИНС. Но так как мы лучше знакомы с веб языками программирования, то мы будем использовать JavaScript. При работе с ИНС Вам вряд ли придется их самостоятельно писать, но понимать принцип работы ИНС необходимо понимать при работе с ними.
Мы будем использовать популярную JavaScript библиотеку brain.js.

В библиотеке уже реализованы все необходимые инструменты для работы с ИНС и нам лишь необходимо передать необходимые параметры для создания нужного нам экземпляра brain.js. Первый релиз библиотеки состоялся 1 января 2020г. Правильнее будет сказать, что первый релиз после упадка библиотеки состоялся 1 января 2020г. Библиотека brain.js является работой энтузиастов, которые не стали равнодушны к закрытию проекта brain и создали собственный форк, который по сей день очень активно развивается. Начать работать с brain.js очень просто, для этого Вам необходимо пройти несколько шагов:

  • Установить NodeJS и NPM, либо использовать версию для браузера (ее можно подключить прямо в документ с CDN);
  • Если Вы решили использовать NodeJS, то Вам необходимо установить пакет brain.js, выполнив команду npm install brain.js и подключить ее в файл командой const brain = require(‘brain.js’) ;
  • Создать экземпляр объекта ИНС, передав необходимые параметры конструктору: const net = new brain.NeuralNetwork(<. >) ;
  • Тренировать сеть при помощи команды train и набора тренировочных данных;
  • Использовать ИНС при помощи команды run ;

Библиотека имеет отличный пример работы в котором на первом этапе Вам необходимо создать тренировочные данные для ИНС выбирая цвет текста на разноцветных плитках, который лучше видно. На втором этапе после обучения, ИНС сама будет определять какой цвет текста будет лучше видно на разноцветных плитках. Пример находится по этому адресу. Так же существует отличный интерактивный урок по работе с brain.js на scrimba. Еще больше примеров и уроков можно найти в WIKI на GitHub.

Вот некоторая техническая информация которая может понадобиться Вам при работе с brain.js. Я не нашел русского перевода, поэтому перевел самостоятельно, поправьте если я где-то допустил ошибку.

Использование brain.js в браузере требует вычислительных затрат, поэтому вы должны попытаться обучить сеть в автономном режиме (или на рабочем месте) и использовать опции toFunction()или toJSON(), чтобы подключить предварительно обученную сеть к своему веб-сайту.

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

Тренировка с NeuralNetwork

Каждый тренировочный шаблон должен иметь an inputи an output , оба из которых могут быть либо массивом чисел от 0 до 1 , либо хешем чисел от 0 до 1 . Для демонстрации цветового контраста это выглядит примерно так:

Для обучения с RNNTimeStep, LSTMTimeStepиGRUTimeStep
Каждый шаблон тренировки может:

— Быть массивом чисел
— Быть массивом массивов чисел

Пример использования массива чисел:

Пример использования массива чисел:

Для обучения с RNN, LSTMиGRU
Каждый шаблон тренировки может:

— Быть массивом значений
— Будь строкой
— Есть input и output
Любой из которых может массив значений или строка

Пример использования прямых строк:

Пример использования строк с входами и выходами:

Варианты обучения

train() принимает хэш опций в качестве второго аргумента:

Сеть прекращает обучение, когда выполняется один из двух критериев: ошибка обучения опустилась ниже порога (по умолчанию 0.005) или 20000достигнуто максимальное количество итераций (по умолчанию ).

Тренируясь по умолчанию не дам вам знать , как она делает до конца, но установить logдля , trueчтобы получить периодические обновления на текущей ошибке обучения сети. Ошибка обучения должна уменьшаться каждый раз. Обновления будут распечатаны на консоли. Если вы установите logфункцию, эта функция будет вызываться с обновлениями, а не выводиться на консоль.

Скорость обучения — это параметр, который влияет на скорость обучения в сети. Это число от 0до 1. Если скорость обучения близка 0, обучение займет больше времени. Если скорость обучения ближе 1, она будет тренироваться быстрее, но результаты обучения могут быть ограничены локальным минимумом и плохо работать с новыми данными. ( Переоснащение ) Скорость обучения по умолчанию — 0.3.

JSON
Сериализация или загрузка в состоянии обученной сети с помощью JSON:

Автономная функция
Вы также можете получить настраиваемую автономную функцию из обученной сети, которая действует так же, как run():

Активация
Этот параметр позволяет указать, какую функцию активации должна использовать ваша нейронная сеть. Есть в настоящее время четыре поддерживаемых функций активации, сигмовидные по — умолчанию:

— sigmoid
— relu
— leaky-relu (с этой опцией доступен параметр «leakyReluAlpha», по умолчанию 0,01)
— tanh

Вот таблица (спасибо, Википедия!), Обобщающая множество функций активации — Функция активации

Скрытые слои
Вы можете использовать это, чтобы указать количество скрытых слоев в сети и размер каждого слоя. Например, если вы хотите два скрытых слоя — первый с 3 узлами, а второй с 4 узлами, вы должны дать:

hiddenLayers: [3, 4]
По умолчанию brain.js используется один скрытый слой с размером, пропорциональным размеру входного массива.

Типы нейронных сетей

Теперь когда мы знаем что представляют из себя ИНС и обладаем технической информацией по работе с brain.js можно приступить к написанию своей первой ИНС. Я буду использовать repl.it для публикации кода и NodeJS для вычислительных процессов что бы не нагружать Ваши браузеры.

В качестве первого примера предлагаю написать нейронную сеть по расчету XOR. XOR — это операция, которая принимает значение «истина» только если всего один из аргументов имеет значение «истина».

Более подробно изучить работу XOR Вы можете в отличной статье fealsoft на habr.com.

Пример 1

В реальной жизни эта ИНС конечно же является абсолютно бесполезной, но отлично подходит для простого промера. В качестве тренировочных данных на вход мы будем передавать два аргумента, а на выход результат XOR. К примеру [input: [0,0];output: 0,input:[0,1];output:1, . ] . Таким образом наша ИНС найдет закономерность и будет самостоятельно выявлять XOR. Важно понимать фактически она не будет высчитывать XOR, она будет делать предсказания каким может быть XOR для введенных аргументов. Весь код имеет комментарии и не вижу необходимости более детально углубляться в подробности реализации, Вы можете попробовать поменять значения передаваемые в функцию run и проверить корректность работы ИНС. Пример ИНС для расчета XOR:

Разрабатывать бесполезную ИНС для выполнения элементарных вычислений безумно «увлекательное » занятие, не так ли? Вы наверняка хотели бы создавать нейросети, которые будут уметь отвечать пользователю, проявлять признаки интеллекта или хотя бы будут как-то полезны обществу. Не вопрос!

Пример 2

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

Предположим что в учебном заведении есть закрытая социальная сеть, в которой учащиеся ежедневно оставляют более 500 000 сообщений. Эта информация строго конфиденциальная, но Вы имеете к ней доступ, так как подписали договор о не разглашении. Отлично! Теперь у нас есть несколько миллионов сообщений вместо 30 000 учеников!

Эмм. Звучит не особо оптимистично, но помимо психологии Вы увлекаетесь построением ИНС. Действительно. Зачем заниматься классификацией сообщений самому, если это может сделать машина и дать Вам отчет.

Перед нами стоит следующая задача: Построить ИИС которая будет определять эмоциональное состояние человека по сообщению.

Входными данными является сообщение пользователя.

Выходными данными является строка: «хорошее» — если эмоциональный окрас сообщения позитивный, «плохое» — если эмоциональный окрас сообщения агрессивный или депрессивный.

Сообщение «Завтра будет просто ужасный день!»

Погрешность конечно оставляет желать лучшего, после 1000 итераций она составляет около 0.011. Это довольно большая цифра если мы говорим о классификации. Если увеличить количество обучающего материала и увеличить количество итераций, то можно добиться более внушительных результатов, но это займет слишком много времени в рамках чтения этой статьи.

Советую сохранять результаты обучения и не заставлять сеть учиться каждый раз когда Вы ее запускаете. Сохранить результаты обучения сети можно при помощи функции toJSON . Далее полученную строку сохраните в файл и при последующем запуске при помощи команды fromJSON выгрузите результаты вычислений обратно в сеть.

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

Мастер Йода рекомендует:  Accessibility в WEB
Добавить комментарий