Разное

Нейросети habrahabr: Нейросети для чайников. Начало / Хабр

Содержание

Нейросети и трейдинг. Практическая реализация / Хабр

Продолжение этой статьи здесь.

Мода на трейдинг переживает взлеты и падения вместе с курсом Биткоина. Сейчас эта тема в нижней точке после невероятного роста в 2018 году. Многие за это время успели познакомиться с криптобиржами — вникали в тему, учились, трейдили, теряли деньги и даже иногда зарабатывали. В итоге, мода прошла, а опыт остался, пусть и негативный. Слова «лонг», «шорт», «спред», «дивер» можно услышать от тех, от кого уж точно этого не ожидаешь. Но не только торговля «руками» приковывала к себе внимание, есть еще торговые боты. Что у нас в этой области, о чем говорит опыт последних 2-3 лет?


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

Остается последняя надежда — нейросети. Тут уж точно должно получиться, ведь нейросеть учится как человек и сама подстраивается под рынок. Как дела в этой области? Ну… вы уже догадались. Все плохо, разговоров много, а работающих решений нет. Все очень плохо! Яркий тому пример магазин приложений сообщества MQL5. За брендом MQL5 стоит профессиональная платформа для трейдинга — MetaTrader5 плюс огромное сообщество трейдеров и программистов. Так вот в этом магазине есть раздел для решений на основе нейросетей, там много ботов, но ни одного настоящего. Добавить туда бота использующего нейросети запрещено правилами. В это трудно поверить, но это так. Запрет на подключение внешнего API исключает возможность использования нейросетей, а встроенные в MQL5 средства на практике не работают. Этот вопрос я обсуждал с техподдержкой MQL5, внятного ответа так и не получил. В итоге, на рынке нет ничего реально работающего из коробки, выложенные на гитхабе решения из серии «обучи сам» в расчет не берутся.

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

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

С нейросетью надо как с ребенком, смотреть на мир ее глазами и начинать с простых задач. Самый простой вопрос который можно задать — «куда пойдет цена через Х свечей, вверх или вниз?». Не важно на сколько сильно изменится цена и не важно, что ответ потом нельзя будет превратить в торговую стратегию. Забываем про торговлю, сейчас главная задача хоть чему-то обучить сеть, просто получить правильный ответ.

У меня эта начальная задача решилась после 100500 подборов входных данных. Использовал TensoFlow плюс Keras, сеть Sequental Dense. Входной датасет на 200-300 тыс примеров, входной вектор 250-350 фичь. Из поставленного сети вопроса вытекает и форма ответа — бинарная классификация «вверх» или «вниз». Входные данные готовил ботом на MQL5. Бот пробегая историю формирует обычный csv фаил, каждая строка — вектор. В конце каждого вектора правильный ответ ввиде 1:0 если вверх, 0:1 если вниз.

Вот несколько советов тем, кто попробует это сделать:

  1. Хорошо обучается в пределах прогноза от 15 минут до 60 минут. На меньшем периоде растет хаотичность движения цены, на большем увеличивается внешнее влияние — новости и прочее, 15-60 минут самая «техничная» зона.
  2. Лучше всего обучение проходит на BTCUSD, второе место у EURUSD. Почему так — не знаю.
  3. Не забивайте голову вопросами типа «а что если цена не изменилась? тогда это третий вариант ответа?». При сборе данных я просто не включал их в датасет, задачу надо упрощать.
  4. При прогоне на тестовом участке ответы сети на первый взгляд будут казаться хаотичными с практически случайным, приближающимся к 50% уровнем результативности. Это серьезная проблема, ниже поясню как я ее решил.

Надо понимать с каким материалом имеем дело. Рынок это на 95% хаос. Когда мы подаем сети данные для обучения и указываем правильный ответ, на самом деле мы кормим ее хаосом. Это как пытаться обучить нейросеть отличать кошку от собаки, а на обучении показывать ей бабочек, звезды и знаки зодиака, результата не будет. Так и здесь, но, к счастью, рынок дает примерно 5% реально работающих закономерностей которые сеть сможет уловить и это отразится в ее ответах. Поэтому внимательнее относитесь к анализу результатов тестирования.

Используя такой подход получил следующий результат:

примерно в 2% ответов сеть угадывает дальнейшее движение в соотношении 2 правильных ответа к 1 неправильному. При тесте на реальном рынке именно так и получается, но возникает другая проблема. У нас ведь всего 2% вопросов имеют ответ, остальное игнорируем. Т.е. запускаем нейро на реальном рынке на таймфрейме 5 минут и ждем… при 2% — это только каждая 50ая свеча будет с ответом, один ответ за 4 часа! И что с этим делать? Ладно если бы ответ был «купи/продай», тогда 6 сделок в сутки нормально, а тут абстрактные «вверх/вниз» и то неточно, полное разочарование.

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

Подведем итог, теперь есть нечто, что можно запустить на реальном рынке и иметь сигналы «вверх/вниз» со средней отработкой. Уже веселее, но практического толку по-прежнему ноль.

Пара слов о реализации. У меня это работало на связке MQL5 плюс Keras. Бот запущенный в MetaTrader5 на каждой свече готовил данные для нейросети и через сокеты передавал скрипту на питоне, который по очереди опрашивал все модели и при прохождении ответом допустимого порога отправлял сигнал в Телеграм канал.

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

Долго ли, коротко ли, но после всех переделок стал получать единые ответы нейросети на каждой свече выраженные в процентах ожидаемой отаботки от -100% до +100%. Знак отражает ожидаемое направление движения «вверх/вниз». Стало видно, что теперь смысл есть в каждом ответе. Оно работает! Я сам имею опыт трейдинга и видел как поведение сети на глазах становилось осмысленным. Иногда ее логика была понятна иногда нет, но всегда за ее ответами чувствовалось какое то свое, часто парадоксальное, видение рынка. В добавок к этому, выяснилось, что чем выше уверенность сети тем ближе к нужному сроку ожидаемая отработка и наоборот. Низкая уверенность как бы говорила «что будет через 15 минут не знаю, но общий тренд вверх».

С этого места, я понял, что пытаться все это формализовать в сигналы «купи/продай» это как микроскопом забивать гвозди. Нужен был какой то инструмент для визуализации сигналов нейросети — графического отображения на каждой свече уровня «уверенности». Широкий набор инструментов MQL5 позволил все это собрать в «Эксперт» для MetaTrader5. «Эксперт» через API получает ответы нейросети и занимается только отрисовкой. Вот пример его работы на BTCUSD M1:

Цветная область вверху — прогноз «вниз», область внизу — прогноз «вверх», толщина — степень уверенности.

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

В итоге, на сегодняшний день есть Expert к MetaTrader5 с двумя видами прогнозов — кроткосрочным и долгосрочным. Постепенно накапливается статистика, есть обратная связь с трейдерами. Полученный результат вдохновляет на дальнейшую работу, теперь надо подбираться к заветным «buy/sell» командам. Сделать это можно существенно увеличив качество прогноза. Дальше вижу такой путь развития:

  1. Надо подготовить еще десяток прогнозов в промежутке между 15 и 60 минутами. Т.е. начать предсказывать «вверх/вниз» для 20, 25, 30, 35 минут и так до 60. Каждый прогноз, напомню, строится из ответов примерно 20 моделей.
  2. Имея такой объем информации на каждой минутной свече, можно и нужно анализировать ее другой нейросетью. Связь прогнозов между собой на разных временных отрезках может оказаться совсем нетривиальной, поэтому нейросеть тут будет уместна.
  3. Датасет для этой нейросети не будет так зашумнен как у ее младших товарищей, поэтому ее надо обучать не банальному «вверх/вниз», а предсказанию силы движения актива, а это уже прямой выход на «buy/sell».

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

Кстати, этот Expert для MetaTrader5 распространяю бесплатно, если хотите увидеть работу нейросети на реальном рынке обращайтесь.

P.S.

1) сайт проекта ENNRO.com;

2) продолжение этой статьи здесь.

Краткий обзор популярных нейронных сетей / Хабр

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

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

Начну с классики.

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

Сеть такого типа обычно очень хорошо справляется с задачами, где:

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

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

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

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

Слабые стороны — неумение работать с динамическими процессами, необходимость большой обучающей выборки.

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

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

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

Сильные стороны: сеть очень хороша для работы с динамическими процессами

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

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

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

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

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

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

Перспективы:

— разработана ядерная (от слова kernel) ассоциативная память, которая способна к обобщению образов, и имеет неограниченный объем памяти (сеть растет по мере заполнения).

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

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

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

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

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

Сильные стороны: очень интересны для изучения как модели биологических сетей.

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

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

P.S. я намеренно не затрагивал сеть Кохонена и подобные ей архитектуры, т.к. не могу сказать о них ничего нового, и на эту тему здесь уже есть отличная статья: habrahabr.ru/blogs/artificial_intelligence/51372

UPD: а еще здесь есть отличная статья о сверточных сетях, суть которых состоит в обучении набора ядер, с которыми сворачивается изображение, и применения нескольких слоев такой фильтрации последовательно: habrahabr.ru/blogs/artificial_intelligence/74326

Что скрывают нейронные сети? / Хабр

Статья является вольным переводом The Flaw Lurking In Every Deep Neural Net.

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

В статье «Интригующие свойства нейронных сетей» за авторством Christian Szegedy, Wojciech Zaremba, Ilya Sutskever, Joan Bruna, Dumitru Erhan, Ian Goodfellow and Rob Fergus, команды, включающей авторов из проекта Google по глубокому обучению, кратко описываются два открытия в поведении нейронных сетей, противоречащие тому, что мы думали прежде. И одно из них, честно говоря, поражает.


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

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

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

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

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

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

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

Как бы то ни было, это не так

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

Однако, результаты есть.

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

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

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

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

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

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

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

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

Что всё это означает?

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

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

Первое, о чём вы можете подумать «Ну, и что, что кот может быть классифицирован как собака?». Но если вы немного измените ситуацию, вопрос может звучать как «Что, если беспилотный автомобиль, использующий глубокую нейронную сеть, не распознает пешехода перед собой и будет думать, что дорога свободна?».

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

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

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

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

Итог

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

Архитектура нейронной сети RetinaNet / Хабр

Данная статья посвящается объяснению устройства архитектуры нейронной сети RetinaNet. Обзор был проведён мною в ходе выполнения дипломной работы, а так как для его написания потребовалось обращаться исключительно к англоязычным источникам и собрать найденную информацию воедино, я решил, что полученный материал поможет кому-то сократить время на поиск нужной информации и упростить понимание устройства нейросетей для задачи Object Detection.

Введение

Архитектура свёрточной нейронной сети (СНС) RetinaNet состоит из 4 основных частей, каждая из которых имеет своё назначение:

a) Backbone – основная (базовая) сеть, служащая для извлечения признаков из поступающего на вход изображения. Данная часть сети является вариативной и в её основу могут входить классификационные нейросети, такие как ResNet, VGG, EfficientNet и другие;

b) Feature Pyramid Net (FPN) – свёрточная нейронная сеть, построенная в виде пирамиды, служащая для объединения достоинств карт признаков нижних и верхних уровней сети, первые имеют высокое разрешение, но низкую семантическую, обобщающую способность; вторые — наоборот;

c) Classification Subnet – подсеть, извлекающая из FPN информацию о классах объектов, решая задачу классификации;

d) Regression Subnet – подсеть, извлекающая из FPN информацию о координатах объектов на изображении, решая задачу регрессии.

На рис. 1 изображена архитектура RetinaNet c ResNet нейросетью в качестве backbone.

Рисунок 1 – Архитектура RetinaNet с backbone-сетью ResNet

Разберём подробно каждую из частей RetinaNet, представленных на рис. 1.

Backbone часть сети RetinaNet

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

Недавние исследования по оптимизации СНС позволили разработать классификационные модели, которые опередили все ранее разработанные архитектуры с лучшими показателями точности на датасете ImageNet при улучшении эффективности в 10 раз. Данные сети получили название EfficientNet-B(0-7). Показатели семейства новых сетей представлены на рис. 2.

Рисунок 2 – График зависимости наибольшего показателя точности от количества весов сети для различных архитектур

Пирамида признаков

Feature Pyramid Network состоит из трёх основных частей: восходящий путь (bottom-up pathway), нисходящий путь (top-down pathway) и боковые соединения (lateral connections).
Восходящий путь представляет собой некую иерархическую «пирамиду» – последовательность свёрточных слоёв с уменьшающейся размерностью, в нашем случае – backbone сеть. Верхние слои сверточной сети имеют большее семантическое значение, но меньшее разрешение, а нижние наоборот (рис. 3). Bottom-up pathway имеет уязвимость при извлечении признаков – потеря важной информации об объекте, например из-за зашумления небольшого, но значимого, объекта фоном, так как к концу сети информация сильно сжата и обобщена.

Рисунок 3 – Особенности карт признаков на разных уровнях нейросети


Нисходящий путь также представляет собой «пирамиду». Карты признаков верхнего слоя этой пирамиды имеют размер карт признаков верхнего слоя bottom-up пирамиды и увеличиваются вдвое методом ближайшего соседа (рис. 4) по направлению вниз.

Рисунок 4 – Увеличение разрешения изображения методом ближайшего соседа

Таким образом в top-down сети каждая карта признаков вышележащего слоя увеличивается до размеров карты нижележащего. Помимо этого, в FPN присутствуют боковые соединения, это означает, что карты признаков соответствующих слоёв bottom-up и top-down пирамид поэлементно складываются, причём карты из bottom-up проходят свёртку 1*1. Этот процесс схематично представлен на рис. 5.

Рисунок 5 – Устройство пирамиды признаков

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

Далее, каждый из полученных слоёв в top-down пирамиде обрабатывается двумя подсетями.

Подсети классификации и регреcсии

Третей частью архитектуры RetinaNet являются две подсети: классификационная и регрессионная (рис. 6). Каждая из этих подсетей образует на выходе ответ о классе объекта и его расположении на изображении. Рассмотрим принцип работы каждой из них.

Рисунок 6 – Подсети RetinaNet

Разница в принципах работы рассматриваемых блоков (подсетей) не отличается до последнего слоя. Каждый из них состоит из 4 слоёв свёрточных сетей. В слое формируются 256 карт признаков. На пятом слое количество карт признаков изменяется: регрессионная подсеть имеет 4*A карт признаков, классификационная – K*A карт признаков, где A – количество якорных рамок (подробное описание якорных рамок в следующем подразделе), K – количество классов объектов.

В последнем, шестом, слое каждая карта признаков преобразуется в набор векторов. Регрессионная модель на выходе имеет для каждой якорной рамки вектор из 4 значений, указывающих смещение целевой рамки (англ. ground-truth box) относительно якорной. Классификационная модель имеет на выходе для каждой якорной рамки one-hot вектор длиной K, в котором индекс со значением 1 соответствует номеру класса, который нейросеть присвоила объекту.

Якорные рамки

В прошлом разделе был использован термин якорных рамок. Якорная рамка (англ. anchor box) – гиперпараметр нейросетей-детекторов, заранее определенный ограничивающий прямоугольник, относительно которого работает сеть.

Допустим, сеть имеет на выходе карту признаков размером 3*3. В RetinaNet каждая из ячеек имеет 9 якорных рамок, каждая из которых имеет разный размер и соотношение сторон (рис. 7). Во время обучения каждой целевой рамке подбираются в соответствие якорные рамки. Если их показатель IoU имеет значение от 0.5, то якорная рамка назначается целевой, если значение меньше 0.4, то она считается фоном, в других случаях якорная рамка будет проигнорирована для обучения. Классификационная сеть обучается относительно выполненного назначения (класс объекта или фон), регрессионная сеть обучается относительно координат якорной рамки (важно отметить, что ошибка вычисляется относительно якорной, но не целевой рамки).

Рисунок 7 – Якорные рамки для одной ячейки карты признаков с размером 3*3

Функции потерь

Потери RetinaNet являются составными, их составляют два значения: ошибка регрессии, или локализации (ниже обозначено как Lloc), и ошибка классификации (ниже обозначено как Lcls). Общая функция потерь может быть записана как:

Где λ является гиперпараметром, который контролирует баланс между двумя потерями.

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

Как было описано ранее, каждой целевой рамке назначается якорная. Обозначим эти пары как (Ai,Gi)i=1,…N, где А представляет якорь, G – целевую рамку, а N количество сопоставленных пар.

Для каждого якоря регрессионная сеть предсказывает 4 числа, которые можно обозначить как Pi=(Pix,Piy,Piw,Pih). Первые две пары означают предсказанную разницу между координатами центров якорной Ai и целевой рамки Gi, а последние две – предсказанную разницу между их шириной и высотой. Соответственно, для каждой целевой рамки вычисляется Ti, как разница между якорной и целевой рамкой:

Где smoothL1(х) определяется формулой ниже:

Потери задачи классификации в сети RetinaNet вычисляются с помощью функции Focal loss.

где К – количество классов, уi – целевое значение класса, р – вероятность предсказания i-го класса, γ – параметр фокуса, α – коэффициент смещения. Данная функция является усовершенствованной функцией кросс-энтропии. Отличие заключается в добавлении параметра γ∈(0,+∞), который решает проблему несбалансированности классов. Во время обучения, большая часть объектов, обрабатываемых классификатором, является фоном, который является отдельным классом. Поэтому может возникнуть проблема, когда нейросеть обучится определять фон лучше, чем другие объекты. Добавление нового параметра решило данную проблему, уменьшив значение ошибки для легко классифицируемых объектов. Графики функций focal и cross entropy представлены на рис.8.

Рисунок 8 – Графики focal и cross entropy функций

Спасибо за прочтение данной статьи!

Список источников:

  1. Tan M., Le Q. V. EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. 2019. URL: arxiv.org/abs/1905.11946
  2. Zeng N. RetinaNet Explained and Demystified [Электронный ресурс]. 2018 URL: blog.zenggyu.com/en/post/2018-12-05/retinanet-explained-and-demystified
  3. Review: RetinaNet — Focal Loss (Object Detection) [Электронный ресурс]. 2019 URL: towardsdatascience.com/review-retinanet-focal-loss-object-detection-38fba6afabe4
  4. Tsung-Yi Lin Focal Loss for Dense Object Detection. 2017. URL: arxiv.org/abs/1708.02002
  5. The intuition behind RetinaNet [Электронный ресурс]. 2018 URL: medium.com/@14prakash/the-intuition-behind-retinanet-eb636755607d

Сравнение мозга с нейронной сетью / Хабр

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

Граница знаний

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

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

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

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

Мозг это должно быть просто

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

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

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

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

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

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

Если мы проанализируем нервную систему кольчатого червя c.elegans, животного, чей коннектом из 301 нейрона полностью составлен, то увидим, что не только отдельные нейроны важны в правильной работе его нервной системы, но и имеют значения даже отдельные синапсы. То есть мы можем присвоить отдельному нейрону кольчатого червя 100% эффективности. Если рассматривать с этой точки зрения нервную систему человека, то сложно присвоить нейронам значимое значение эффективности которые можно вынести ломиком из черепной коробки, при этом сохранив жизнедеятельность человека и даже его социальную интеграцию, ну почти сохранив.*

*отсылка к очень известному случаю Финеаса Гейджа
Википедия

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

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

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

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

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

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

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

Эти формулы содержат несколько коэффициентов определяющих некоторые параметры мембраны нейрона, такие как скорость реакции ионных каналов, их проводимость и т.д. Эта волшебная модель описывает сразу несколько явлений, помимо изменения заряда на поверхности мембраны нейрона. Во-первых, она описывает функцию активации нейрона, или механизм суммации, он достаточно прост. Если исходный заряд недостаточен, то модель остаётся в равновесном состоянии. Если заряд переходит через определённый порог, то модель отвечает одним спайком. Если заряд в значительной степени превышает данный порог, то модель отвечает серией спайков. В компьютерных нейронных сетях используется большое разнообразие вариантов функции активации, самые близкое к биологии может являться функция Хевисайда (единичная ступенька) и линейный выпрямитель (Rectifier). Но нужно понимать, что мы описываем достаточно простой аспект работы нейрона – суммацию. В своей работе над головастиком, упомянутой выше, я применил очень простой вариант модели суммации, который образно можно представить в виде сосуда накапливающего в себе фактор побудительного воздействия, если этот фактор превышал определённый порог, то нейрон активизировался. Чтобы этот сумматор работал в реальном времени, из образного сосуда фактор воздействия медленно истекал.

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

Во-вторых, модель Ходжкина-Хаксли описывает изменение заряда в одной точке мембраны, но если мы, к примеру, создадим топологически точную 3D модель нейрона и разобьём эту модель на равномерную сетку, мы сможем применить модель Ходжкина-Хаксли в каждой вершине (узле) этой сетки, с условием влияния заряда на значение в соседних вершинах по сетке. Тем самым мы получим модель распространения возбуждения по нейрону близко к тому, как это происходит в живом нейроне.

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

В рамках проекта Human Brain Project (HBP) была создана модель небольшого фрагмента коры мозга мыши, её создатели учли очень многое. 3D модели нейронов были воссозданы по реальным нейронам, использовался один из вариантов моделей Ходжкина-Хаксли, учитывались различные типы нейронов и нейромедиаторов, и нет сомнений в том, что модель действительно соответствует биологическому аналогу. На это потрачено множество ресурсов и времени, но так и не дало значимых результатов по причине того, что в столь малом размере из-за парадокса эффективности нейрона невозможно было увидеть значимых процессов. Поэтому путь подробного повторения биологии является очень и очень трудоёмким. Залог успеха это возможность понимания того как работает нервная ткань и нейроны в более широком масштабе.

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

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

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

После зоны V1 информация передаётся в следующую зону V2, все последующие зоны будут иметь меньшие площади. В зависимости от того, что наблюдает мозг, был это объект, символ, лицо человека, место или что-то другое информация из V2 может передаваться в различные области V3, V4, V5. То есть уже на этой зрительной области V2 происходит серьёзная категоризация зрительных образов. И примерно уже на третьем или четвёртом слое можно будет выделить нейроны-детекторы определённых образов. К примеру, мы сможем выделить нейрон-детектор буквы «А», цифры 3 или лица Дженнифер Энистон. По активации этих нейронов-детекторов мы сможем судить об том, что в данный момент наблюдает мозг. Достаточно простая архитектура нейронной сети, если сравнить её с архитектурой компьютерных нейронных сетей специализированных на распознавании визуальных образов, свёрточных нейронных сетей.

AlexNet

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

Человек может распознать сложные образы за доли секунд, скорость распространения потенциала действия по мембране от 1 до 120 м/с, синаптическая задержка в химических синапсах составляет 0,2-0,5мс, что говорит о том, что за время распознавания может задействоваться цепочка не более чем ста нейронов.

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

Формальный нейрон

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

Формальный нейрон Маккалока-Питса можно представить как некую функцию с множеством аргументов и одним ответом. Аргументы-входы преумножаются с соответствующими коэффициентами, называемыми весами (W1, W2,… Wn), затем эти значения складываются и полученная сумма проходит через активационную функцию, результат которой и является результатом вычислений нейрона. Главное это правильно подобрать веса, то есть обучить нейронную сеть. Эта модель нейрона может показаться простой и очевидной, но в ней сильный акцент на дендритных синапсах.

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

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

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

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

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

Оливер Сакс о галлюцинациях

Подвижные нейроны

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

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

Для изменений в пресинапсах синапсов аксона уже существует алгоритм, так называемое правило Хебба.

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

Hebb, D. O. The organization
of behavior: a neuropsychological theory. New York (2002) (Оригинальное издание — 1949) (спасибо)

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

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

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

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

Анализ и Синтез

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

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

Синтез – это механизм объединения, обобщения различных признаков в один образ или действие.

Пример из экспериментов И.П. Павлова:

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

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

Пример из работ И.П. Павлова:

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

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

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

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

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

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

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

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

Вместо заключения

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

Сейчас я поставил себе задачу создать алгоритм нейронной сети, которая сможет различать рукописные цифры из стандартного набора MNIST, причём при обучении должно использоваться не более 1000 примеров и предъявлений. Результат я буду считать удовлетворительным при хотя бы 5% ошибке. Я уверен это возможно потому, что наш мозг делает нечто подобное. Напоминаю, что MNIST содержит 6000 примеров обучения, которые для настройки нейронной сети могут предъявлять по несколько десятков раз.

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

In English on Medium: Comparison of the brain with a computer neural network

Применение сверточных нейронных сетей для задач NLP / Блог компании Open Data Science / Хабр

Когда мы слышим о сверточных нейронных сетях (CNN), мы обычно думаем о компьютерном зрении. CNN лежали в основе прорывов в классификации изображений — знаменитый AlexNet, победитель соревнования ImageNet в 2012 году, с которого начался бум интереса к этой теме. С тех пор сверточные сети достигли большого успеха в распознавании изображений, в силу того факта, что они устроены наподобие зрительной коры головного мозга — то есть умеют концентрироваться на небольшой области и выделять в ней важные особенности. Но, как оказалось, CNN хороши не только для этого, но и для задач обработки естественного языка (Natural Language Processing, NLP). Более того, в недавно вышедшей статье [1] от коллектива авторов из Intel и Carnegie-Mellon University, утверждается, что они подходят для этого даже лучше RNN, которые безраздельно властвовали областью на протяжении последних лет.

Сверточные нейронные сети

Для начала немного теории. Что такое свертка? Мы не будем на этом останавливаться подробно, так как про это написана уже тонна материалов, но все-таки кратко пробежаться стоит. Есть красивая визуализация от Стэнфорда, которая позволяет ухватить суть:

Источник


Надо ввести базовые понятия, чтобы потом мы понимали друг друга. Окошко, которое ходит по большой матрице называется фильтром (в англоязычном варианте kernel, filter или feature detector, так что можно встретить переводы и кальки этих терминов не пугайтесь, это все одно и то же). Фильтр накладывается на участок большой матрицы и каждое значение перемножается с соответствующим ему значением фильтра (красные цифры ниже и правее черных цифр основной матрицы). Потом все получившееся складывается и получается выходное (“отфильтрованное”) значение.

Окно ходит по большой матрице с каким-то шагом, который по-английски называется stride. Этот шаг бывает горизонтальный и вертикальный (хотя последний нам не пригодится).

Еще осталось ввести важный концепт канала. Каналами в изображениях называются известные многим базовые цвета, например, если мы говорим о простой и распространенной схеме цветового кодирования RGB (Red — красный, Green — зеленый, Blue — голубой), то там предполагается, что из трех этих базовых цветов, путем их смешения мы можем получить любой цвет. Ключевое слово здесь — “смешение”, все три базовых цвета существуют одновременно, и могут быть получены из, например, белого света солнца с помощью фильтра нужного цвета (чувствуете, терминология начинает обретать смысл?).

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

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

Источник: cs231n

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

Все, мы вооружены терминологией для того, чтобы двигаться дальше. Параллельно с терминологией мы разобрались, как работает сверточный слой. Он является базовым для сверточных нейронных сетей. Есть еще один базовый слой для CNN — это так называемый pooling-слой.

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

Источник: cs231n

В качестве дальнейшего чтения по этому поводу я рекомендую пост Криса Ола (Chris Olah).

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

Источник

Это хорошие нелинейные гладкие функции, но они все-таки требуют существенных вычислений по сравнению с той, которая правил бал в CNN: ReLU — Rectified Linear Unit. По-русски ReLU принято называть линейным фильтром (вы еще не устали от использования слова фильтр?). Это простейшая нелинейная функция, к тому же не гладкая. Но зато она вычисляется за одну элементарную операцию, за что ее очень любят разработчики вычислительных фреймворков.

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

Применение сверток к текстам

Вот эта картинка практически полностью объясняет, как мы работает с текстом с помощью CNN. Непонятно? Давайте разбираться. Прежде всего вопрос — откуда у нас возьмется матрица для работы? CNN же работают с матрицами, не так ли? Здесь нам нужно вернуться немного назад и вспомнить, что такое embedding (по этому поводу есть отдельная статья).

Если вкратце, embedding — это сопоставление точки в каком-то многомерном пространстве объекту, в нашем случае — слову. Примером, возможно, самым известным такого embedding является Word2Vec. У него кстати есть семантические свойства, вроде word2vec(“king”) - word2vec(“man”) + word2vec(“woman”) ~= word2vec(“queen”). Так вот, мы берем embedding для каждого слова в нашем тексте и просто ставим все вектора в ряд, получая искомую матрицу.

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

Хорошо, разобрались с матрицей, теперь дальше про свертки. Получается, что свертка у нас может ходить только по одной оси — по ширине. Поэтому для того, чтобы отличить от стандартной свертки, ее называют одномерной (1D convolution).

И сейчас уже практически все понятно, кроме загадочного Max Over Time Pooling. Что это за зверь? Это уже обсуждавшийся выше max-pooling, только примененный ко всей последовательности сразу (то есть ширина его окна равна всей ширине матрицы).

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

Картинка для привлечения внимания. На самом деле иллюстрация из работы [4].

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

В работе [2] Юн Ким (Yoon Kim) показывает, что CNN хороши для классификации предложений на разных датасетах. Картинка, использованная для иллюстрации раздела выше — как раз из его работы. Он работает с Word2Vec, но можно и работать непосредственно с символами.

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

У сверточных нейронных сетей есть существенный недостаток, по сравнению с RNN — они могут работать только со входом фиксированного размера (т.к. размеры матриц в сети не могут меняться в процессе работы). Но авторы вышеупомянутой работы [1] смогли решить эту проблему. Так что теперь и это ограничение снято.

В работе [4] авторы классифицируют тексты исходя прямо из символов. Они использовали набор из 70 символов для того чтобы представить каждый символ как one-hot вектор и установили фиксированную длину текста в 1014 символа. Таким образом, текст представлен бинарной матрицей размером 70×1014. Сеть не имеет представления о словах и видит их как комбинации символов, и информация о семантической близости слов не предоставлена сети, как в случаях заранее натренированных Word2Vec векторов. Сеть состоит из 1d conv, max-pooling слоев и двух fully-connected слоев с дропаутом. На больших датасетах они показали даже лучшие результаты, чем сети, работавшие со словами. К тому же этот подход заметно упрощает preprocessing шаг что может поспособствовать его использованию на мобильных устройствах.

В другой работе [5] авторы пытаются улучшить применение CNN в NLP использованием наработок из компьютерного зрения. Главные тренды в компьютерно зрении в последнее время это увеличивание глубины сети и добавление так называемых skip-связей (e.g., ResNet) которые связывают слои которые не соседствуют друг с другом. Авторы показали что те же принципы применимы и в NLP, они построили CNN на основе символов с 16-размерными embedding, которое учились вместе с сетью. Они натренировали сети разной глубины (9, 17, 29 и 49 conv слоёв) и поэкспериментировали со skip-связями, чтобы выяснить, как они влияют на результат. Они пришли к выводу, что увеличение глубины сети улучшает результаты на выбранных датасетах, но производительность слишком глубоких сетей (49 слоев) ниже чем умеренно глубоких (29 слоев). Применение skip-связей привел к улучшению результатов сети из 49 слоев, но все равно не превзошел показатель сети с 29 слоями.

Другая важная особенность CNN в компьютерном зрении это возможность использования весов сети натренированной на одном большом датасете (типичный пример — ImageNet) в других задачах компьютерного зрения. В работе [6] авторы исследуют применимость этих принципов в задаче классификации текстов с помощью CNN с word embedding. Они изучают, как перенос тех или иных частей сети (Embedding, conv слои и fully-connected слои) влияет на результаты классификации на выбранных датасетах. Они приходят к выводу что в NLP задачах семантическая близость источника на котором заранее тренировалась сеть играет важную роль, то есть сеть, натренированная на рецензиях к фильмам, будет хорошо работать на другом датасете с кинорецензиями. К тому же они отмечают, что использование тех же embedding для слов увеличивает успех трансфера и рекомендуют не замораживать слои, а дотренировывать их на целевом датасете.

Практический пример

Давайте на практике посмотрим, как сделать sentiment analysis на CNN. Мы разбирали похожий пример в статье про Keras, поэтому за всеми деталями я отсылаю вас к ней, а здесь будут рассмотрены только ключевые для понимания особенности.

Прежде всего на понадобится концепция Sequence из Keras. Собственно, это и есть последовательность в удобном для Keras виде:

x_train = tokenizer.texts_to_sequences(df_train["text"])
x_test = tokenizer.texts_to_sequences(df_test["text"])
x_val = tokenizer.texts_to_sequences(df_val["text"])

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

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

x_train = pad_sequences(x_train, maxlen=max_len)
x_test = pad_sequences(x_test, maxlen=max_len)
x_val = pad_sequences(x_val, maxlen=max_len)

После этого все последовательности будут либо обрезаны, либо дополнены нулями до длины max_len.

А теперь, собственно самое важное, код нашей модели:

model = Sequential()
model.add(Embedding(input_dim=max_words, output_dim=128, input_length=max_len))
model.add(Conv1D(128, 3))
model.add(Activation("relu"))
model.add(GlobalMaxPool1D())
model.add(Dense(num_classes))
model.add(Activation('softmax'))

Первым слоем у нас идет Embedding, который переводит целые числа (на самом деле one-hot вектора, в которых место единицы соответствует номеру слова в словаре) в плотные вектора. В нашем примере размер embedding-пространства (длина вектора) составляет 128, количество слов в словаре max_words, и количество слов в последовательности — max_len, как мы уже знаем из кода выше.

После embedding идет одномерный сверточный слой Conv1D. Количество фильтров в нем — 128, а ширина окна для фильтров равна 3. Активация должна быть понятна — это всеми любимый ReLU.

После ReLU идет слой GlobalMaxPool1D. «Global» в данном случае означает, что он берется по всей длине входящей последовательности, то есть это ни что иное, как вышеупомянавшийся Max Over Time Pooling. Кстати, почему он называется Over Time? Потому что последовательность слов у нас имеет естественный порядок, некоторые слова приходят к нам раньше в потоке речи/текста, то есть раньше по времени.

Вот какая модель у нас получилась в итоге:

На картинке можно заметить интересную особенность: после сверточного слоя длина последовательности стала 38 вместо 40. Почему так? Потому что мы с вами не разговаривали и не применяли padding, технику, позволяющую виртуально «добавить» данных в исходную матрицу, чтобы светка могла выйти за ее пределы. А без этого свертка длины 3 с шагом равным 1 сможет сделать по матрице шириной 40 только 38 шагов.

Ладно, что же у нас получилось в итоге? На моих тестах этот классификатор дал качество 0.57, что, конечно, немного. Но вы легко сможете улучшить мой результат, если приложите немного усилий. Дерзайте.

P.S.: Спасибо за помощь в написании этой статьи Евгению Васильеву somesnm и Булату Сулейманову khansuleyman.

Литература


[1] Bai, S., Kolter, J. Z., & Koltun, V. (2018). An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling. arxiv.org/abs/1803.01271
[2] Kim, Y. (2014). Convolutional Neural Networks for Sentence Classification. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP 2014), 1746–1751.

[3] Heigold, G., Neumann, G., & van Genabith, J. (2016). Neural morphological tagging from characters for morphologically rich languages. arxiv.org/abs/1606.06640
[4] Character-level Convolutional Networks for Text Classification. Xiang Zhang, Junbo Zhao, Yann LeCun arxiv.org/abs/1509.01626
[5] Very Deep Convolutional Networks for Text Classification. A Conneau, H Schwenk, L Barrault, Y Lecun arxiv.org/abs/1606.01781
[6] A Practitioners’ Guide to Transfer Learning for Text Classification using Convolutional Neural Networks. T Semwal, G Mathur, P Yenigalla, SB Nair arxiv.org/abs/1801.06480

Сервисы на базе нейросетей для дизайнеров / Хабр

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

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

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

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

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

Еще один сервис на базе нейросети от команды uKit Group. Фишкой сервиса является функция оценки привлекательности сайта.

Ребята из uKit Group прошерстили Интернет и сформировали выборку из 12 000 сайтов: от очень старых страниц до лендингов мировых ИТ-флагманов.

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

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

В итоге оценка системы стала точнее, чем оценки её учителей, а нейросеть самостоятельно выделила еще 1000 признаков привлекательности сайта.

Сейчас WebScore AI умеет выставлять странице общий балл и находится в публичном доступе для продолжения обучения.

Какие сайты умеет обрабатывать WebScore AI?

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

При анализе дизайн-параметров WebScore AI использует скриншот сайта: если страница сильно анимирована и система запомнила не лучший кадр, это может привести к снижению балла.

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

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

Уникальность инструмента в том, что он позволяет перенести зарисовки с листа бумаги в рабочий адаптивный прототип, который в дальнейшем вы можете передать дизайнеру или программисту. Также готовый прототип можно импортировать в Sketch, Figma и Adobe XD.

В данный момент сервис находится в beta-тестировании. Не упустите возможность стать первым пользователем!

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

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

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

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

Бывало ли у вас такое, что понравилась картинка и очень хочется залить её в свой профиль или на сайт, а она ужасно плохого качества? Эту проблему решили опытные разработчики из Украины! Теперь больше не нужно мучиться из-за ужасных фотографий и картинок низкого разрешения, только шикарные сгенерированные с нуля High Resolution изображения! Генеративная нейросеть способна увеличивать до 512 мегапикселей, улучшая разрешение и чёткость изображений.

Сервис платный, но при регистрации у вас будет возможность протестировать его до 5 раз!

Лайфхак! Привязки к ip у сервиса нет, следовательно, вы можете постоянно регистрироваться на нём для получения дополнительных 5 бесплатных увеличений изображения.

REMOVE.BG

Шикарный инструмент, в котором нейросеть сама определяет и вырезает необходимые объекты всего за 5 секунд. Если нужно что-то вырезать, а времени мало — REMOVE.BG в помощь!

Программа работает как в онлайн режиме, так и имеет программное обеспечение. Работает на Windows / Mac / Linux.

Также команда, разработавшая данный инструмент, предусмотрела плагин для самого популярного редактора фотографий Adobe Photoshop.

Сервис условно бесплатный. В бесплатной версии имеется возможность вырезать объекты, сохраняя один раз изображение с оригинальным разрешением, а далее png с разрешением не более 500×500 пикселей.

Лайфхак! Привязки к ip у сервиса нет, следовательно, вы можете постоянно регистрироваться на нём для получения 1 бесплатного сохранения полноформатного, вырезанного объекта.

Ну как же без мемов

FACE APP, REFLECT, DOUBLICAT

Самые популярные сервисы для изменения внешности и возраста. Хотите повеселить коллег или родственников? Велком!

[В закладки] Зоопарк архитектур нейронных сетей. Часть 1

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

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

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

Следует отметить, что не все (хотя и большинство) из используемых здесь сокращений общепринятых. Под RNN иногда понимают рекурсивные нейронные сети (рекурсивные нейронные сети), но обычно эта аббревиатура означает рекуррентную нейронную сеть (рекуррентную нейронную сеть). Во многих источниках вы встретите RNN как обозначение для любой рекуррентной архитектуры, включая LSTM, GRU и даже варианты двунапра.Иногда похожая путаница происходит с AE: VAE, DAE и им подобные могут называть просто AE. Многие сокращения содержат разное количество N в конце: можно сказать «сверточная нейронная сеть» — CNN (сверточная нейронная сеть), а можно и просто «сверточная сеть» — CN.

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

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


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

Rosenblatt, Франк. «Персептрон: вероятностная модель хранения и организации информации в мозгу». Психологический обзор 65.6 (1958): 386.

»Оригинал статьи PDF


Сети радиально-базисных функций (радиально-базисная функция, RBF) — это FFNN с радиально-базисной функцией в качестве функции активации.Больше здесь нечего добавить. Мы не хотим сказать, что она не используется, но другие функции включения обычно не выделяют в отдельных группах.

Брумхед, Дэвид С. и Дэвид Лоу. Радиальные базисные функции, функциональная интерполяция с несколькими переменными и адаптивные сети. № RSRE-MEMO-4148. КОРОЛЕВСКИЕ СИГНАЛЫ И РАДАРНОЕ УЧРЕЖДЕНИЕ МАЛВЕРН (ВЕЛИКОБРИТАНИЯ), 1988.

»Оригинальный документ PDF


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

Хопфилд, Джон Дж. «Нейронные сети и физические системы с новыми коллективными вычислительными возможностями». Труды национальной академии наук 79.8 (1982): 2554-2558.

»Оригинальный документ PDF


Цепи Маркова (Цепи Маркова, MC или Цепи Маркова с дискретным временем, DTMC) — своего рода предшественники машин Больцмана (BM) и сетей Хопфилда (HN).В цепях Маркова мы задаем вероятности перехода из текущего состояния в соседние. Кроме того, это цепи не имеют памяти: последующее состояние зависит только от текущего и не зависит от всех прошлых состояний. Хотя Маркова цепь нельзя назвать нейронной сетью, она близка к ним и формирует теоретическую основу для BM и HN. Цепи Маркова также не всегда являются полносвязными.

Хейс, Брайан. «Первые звенья в цепи Маркова». American Scientist 101.2 (2013): 252.

»Оригинальный документ PDF


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

Хинтон, Джеффри Э. и Терренс Дж. Сейновски. «Обучение и высвобождение в машинах Больцмана». Параллельная распределенная обработка: исследования микроструктуры познания 1 (1986): 282-317.

»Оригинал бумаги PDF


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

Смоленский, Павел. Обработка информации в динамических системах: Основы теории гармонии. № CU-CS-321-86. COLORADO UNIV AT BOULDER DEPT OF COMPUTER SCIENCE, 1986.

»Исходный документ PDF


Автоэнкодеры (автокодеры, AE) — нечто подобное FFNN, это скорее другой способ использования FFNN, чем принципиально новая архитектура. Основная идея автоэнкодеров — автоматическое кодирование (как при атакии, а не при шифровании) информации, отсчета и название.Сеть напоминает по форме песочные часы, так как скрытый слой меньше, чем входной и выходной; к же она симметрична таким средним слоям (одного или двух, в от четности / нечетности общего количества слоев). Самый маленький слой почти всегда средний, в нем информация максимально сжата. Все, что расположено до середины — кодирующая часть, выше середины — декодирующая, а в середине (вы не поверите) — код. AE обучают методом обратного распространения, подавая входные данные и задаваемую разницу между входом и выходом.AE можно построить симметричными и с точки зрения весов, выставляя кодирующие веса равными декодирующими.

Бурлар, Эрве и Ив Камп. «Автоассоциация многослойными перцептронами и разложение по сингулярным числам». Биологическая кибернетика 59.4-5 (1988): 291-294.

»Исходный документ PDF


Разреженный автоэнкодер (Sparse autoencoder, AE) — в некоторой степени антипод AE. Вместо того, чтобы обучать сеть представлением блоки информации на меньшем «пространстве», мы кодируем информацию так, чтобы она занимала больше места.И вместо того, чтобы заставлять систему сходиться в центре, а затем снова расширять до исходного размера, мы, наоборот, увеличиваем средние слои. Сети этого типа правила для извлечения множества маленьких деталей из набора данных. Если бы мы стали обучать SAE тем же методом, что и AE, мы получили бы в большинстве случаев абсолютно бесполезную сеть, где на выходе получается ровно то же, что и на входе. Чтобы этого избежать, мы вместо входных данных выдаем на выходе входные данные за количество активированных нейронов в скрытом слое.Это в какой-то мере напоминает биологическую нейронную сеть (возбуждающую нейронную сеть), при которой все нейроны постоянно находятся в возбужденном состоянии.

Марк’Аурелио Ранзато, Кристофер Поултни, Сумит Чопра и Янн ЛеКун. «Эффективное изучение разреженных представлений с помощью модели, основанной на энергии». Труды НИПС. 2007.

»Оригинал статьи PDF


Архитектура вариационных автоэнкодеров (VAE) такие же, как и у обычных, но обучают их другому — приблизительному вероятностному распределению входных образцов.Это в какой-то степени возвращение к истокам, так как VAE немножко ближе к машинем Больцмана. Тем не менее, они опираются на Байесовскую математику касательно вероятностных суждений и независимости, интуитивно понятны, но требуют сложных вычислений. Базовый принцип можно сформулировать так: принимать в расчет одного события на другое. Это событие не обязательно связано. Это сообщение связано с распространением ошибки.Это полезный подход, как нейронные сети — своего рода огромные графы.

Кингма, Дидерик П. и Макс Веллинг. «Автоматическое кодирование вариационного байеса». Препринт arXiv arXiv: 1312.6114 (2013).

»Исходный документ PDF


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

Винсент, Паскаль и др. «Извлечение и создание надежных функций с помощью автоэнкодеров шумоподавления». Материалы 25-й международной конференции по машинному обучению. ACM, 2008.

»Оригинальная статья PDF


Глубокие сети доверия (Deep Believe Networks, DBN) — сети, представляющие собой композицию нескольких RBM или VAE.Такие сети эффективно обучаются одна за другой, когда каждая сеть должна научиться кодировать предыдущую. Этот метод также называют «жадным обучением», он является принятым на данный момент решением, чтобы получить подходящий, но, возможно, не лучший результат. DBN могут обучаться методами контрастной дивергенции или обратным распространением ошибки и учатся данные в виде вероятностной модели, в точности как RBM или VAE. Одна обученную и приведенную к стационарному состоянию модель можно использовать для генерации новых данных.

Bengio, Yoshua, et al. «Жадное послойное обучение глубоких сетей». Достижения в системах обработки нейронной информации 19 (2007): 153.

»Оригинал статьи PDF


Свёрточные нейронные сети (сверточные нейронные сети, CNN) и глубокие свёрточные нейронные сети (глубокие сверточные нейронные сети, DCNN) кардинально отличаются от других сетей. Они используются в основном для обработки изображений, иногда для аудио и других видов входных данных.Типичным применением CNN является классификация изображений: если на вход подается изображение кошки, сеть выдаст «кошка», если картинка собаки — «собака». Такие сети обычно используют «сканер», не обрабатывающий все данные за один раз. Например, если у вас есть изображение 200х200, вы захотите построить слой сети из 40 тысяч узлов. Вместо этого сеть считает квадрат размера 20х20 (обычно из левого верхнего угла), затем сдвинется на 1 пиксель и считает новый квадрат, и т.д. Заметьте, что мы не разбиваем изображение на квадраты, а скорее ползем по нему.Эти входные данные передаются через свёрточные слои, в которых не все узлы соединены между собой. Вместо этого каждый узел соединен только со своими ближайшими соседями. Эти слои имеют свойство сжиматься с глубиной, причём обычно они уменьшаются на какой-нибудь из делителей количества входных данных (например, 20 узлов в последующем превратятся в 10, в следующем — в 5), часто используются степени двойки. Кроме сверточных слоев есть также называемые слои объединения (объединения слоев).Объединение — это способ уменьшить размер получаемых данных, например, из квадрата 2х2 выбирается и передается наиболее красный пиксель. На практике к концу CNN прикрепляют FFNN для дальнейшей обработки данных. Такие сети называются глубокими (DCNN), но названия их обычно взаимозаменяемы.

LeCun, Yann, et al. «Градиентное обучение применимо к распознаванию документов». Протоколы IEEE 86.11 (1998): 2278-2324.

»Исходный документ PDF


Развёртывающие нейронные сети (деконволюционные сети, DN) , также называемые обратными графическими сетями, — это свёрточные нейронные сети наоборот.Представьте, что вы передаёте сети слово «кошка» и обучаете ее генерировать картинки кошек путем сравнения получаемых картинок с реальными кошек. DNN тоже можно объединить с FFNN. Стоит заметить, что в большинстве случаев сети передаётся не строка, а бинарный классифицирующий вектор: например, — это кошка, — собака, а — и кошка, и собака. Вместо объединения, которые часто встречаются в CNN, здесь присутствуют аналогичные обратные операции, обычно интерполяцию или экстраполяцию.

Zeiler, Matthew D., et al. «Деконволюционные сети». Компьютерное зрение и распознавание образов (CVPR), Конференция IEEE 2010 г. IEEE, 2010.

»Оригинал статьи PDF


Читать продолжение.

О, а приходите к нам работать? 🙂 wunderfund.io — молодой фонд, которым занимается высокочастотной алгоритоторговлей. Высокочастотная торговля — это непрерывное соревнование лучших программистов и математиков всего мира. Присоединившись к нам, вы станете частью этой увлекательной схватки.

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

Присоединяйтесь к нашей команде: wunderfund.io

.

[В закладки] Зоопарк архитектур нейронных сетей. Часть 2

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

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

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

Название « Глубокие сверточные обратные глубинные сети (Сети глубокой сверточной обратной графики, DCIGN) » может достичь в заблуждение, так как на самом деле это вариационные автоэнкодеры со сверточными и развертывающими сетями в качестве кодирующей и декодирующей частей соответственно. в виде вероятностей и могут научиться строить изображение кошки и собаки вместе, взглянув лишь на картинки с кошками и только с собаками.. Разработчики также применяли, что DCIGN может моделировать различные преобразования изображений, например, изменение источника света или поворот 3D объектов. Такие сети обычно обучают методом обратного распространения.

Kulkarni, Tejas D., et al. «Глубокая сверточная инверсная графическая сеть.”Достижения в системах обработки нейронной информации. 2015.
Исходный документ PDF


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

Гудфеллоу, Ян и др. «Генеративные состязательные сети». Достижения в системах обработки нейронной информации. 2014.
Исходный документ PDF


Рекуррентные нейронные сети (Рекуррентные нейронные сети, RNN) — это те же сети прямого распространения, но со смещением во времени: нейроны получают не информацию только от предыдущего слоя, но и от себя в результате предыдущего прохода.Следовательно, здесь важен порядок, в котором мы подаем информацию и обучаем сеть: мы получим разные результаты, если сначала скормим ей «», а затем «печеньки», или если сначала «печеньки», а потом уже «молоко». У RNN есть одна большая проблема — это проблема исчезающего градиента: в зависимости от используемой функции активации информация со временем теряется, так же как и в очень глубоких сетях прямого распространения. Казалось бы, это не такая уж серьезная проблема, так как это касается только весов, а не состояния нейронов, но именно в весах хранится информация о прошлом; если вес достигнет значения 0 или 1 000 000, то информация о прошлом состоянии станет не слишком информативной.RNN Сообщают в самых разнообразных областях, так как даже данные, связанные с течением времени. Картинка или строка текста может быть на вход по одному письелю или символу, так что вес будет 1 для предыдущего сообщения, а не для того, что случилось X секунд назад. В общем случае, рекуррентные сети хороши для продолжения или дополнения информации, например, автодополнения.

Элман, Джеффри Л.«Найти структуру во времени». Когнитивная наука 14.2 (1990): 179-211.
Оригинал статьи PDF


Долгая краткосрочная память (Long short term memory, LSTM) — попытка побороть проблему взрывного градиента, используя фильтры (ворота) и блоки памяти (ячейки памяти). Эта идея пришла, скорее, из области схемотехники, а не биологии. У каждого нейрона есть три фильтра: входной фильтр (входной вентиль), выходной фильтр (выходной вентиль) и фильтр забывания (забыть вентиль). Задача этих фильтров — останавливая и возобновляя ее поток.Входной фильтр определяет количество информации с предыдущего шага, которое будет храниться в блоке памяти. Выходной фильтр занят тем, что определяет, сколько информации в текущем состоянии узла получает следующий слой. Наличие фильтра забывания на первый взгляд кажется странным, но иногда забывать оказывается полезно: если нейросеть запоминает книгу, в начале новой главы может быть необходимо забыть некоторых героев из предыдущей. Показано, что LSTM может обучаться действительно сложным последовательностям, например, подражать Шекспиру или сочинять простую музыку.Стоит отметить, что так как каждый фильтр хранит свой вес относительно предыдущего нейрона, такие сети достаточно ресурсоемки.

Хохрайтер, Зепп и Юрген Шмидхубер. «Долговременная кратковременная память». Нейронные вычисления 9.8 (1997): 1735-1780.
Исходный документ PDF


Управляемые рекуррентные нейроны (Gated recurrent units, GRU) — разновидность LSTM. У них на один фильтр меньше, и они немного иначе соединены: вместо входного, выходного фильтров и фильтра здесь используется фильтр обновления (update gate).Этот фильтр определяет и сколько информации сохранить от последнего состояния, и сколько информации получить от предыдущего слоя. Фильтр сброса состояния (reset gate) работает почти так же, как фильтр забывания, но расположен немного иначе. На следующие слои отправляется полная информация о состоянии — выходного фильтра здесь нет. В большинстве случаев GRU работают так же, как LSTM, что GRU немного быстрее и проще в эксплуатации (однако обладает немного меньшими возможностями).

Chung, Junyoung, et al. «Эмпирическая оценка стробированных рекуррентных нейронных сетей при моделировании последовательности». Препринт arXiv arXiv: 1412.3555 (2014).
Исходный документ PDF


Нейронные машины Тьюринга (Нейронные машины Тьюринга, NMT) можно определить как абстракцию над LSTM и попытаться «достать» нейросети из «черного ящика», давая нам представление о том, что происходит внутри. Блок памяти здесь не встроен в нейрон, а отделен от него. Это позволяет объединить возможности обычного цифрового хранилища данных с производственной и разнообразной сетью.Идея заключается в использовании адресуемой по содержимому памяти и нейросети, которая может читать из этой памяти и писать в нее. Они называются нейронными машинами Тьюринга, так как являются полными по Тьюриингу: возможность читать, писать и читать состояние на основании прочитанного позволяет выполнять все, что умеет выполнять универсальная машина Тьюринга.

Грейвс, Алекс, Грег Уэйн и Иво Данихелка. «Нейронные машины Тьюринга». Препринт arXiv arXiv: 1410.5401 (2014).
Исходный документ PDF


Двунаправленные RNN, LSTM и GRU (BiRNN, BiLSTM и BiGRU) не изображены на схеме, так как выглядят в точности так же, как их однонаправленные коллеги.Разница лишь в том, что эти нейросети связаны не только с прошлым, но и с будущим. Например, однонаправленная LSTM может научиться прогнозировать слово «рыба», получая на вход буквы по одной. Двунаправленная LSTM будет получать также следующий букву во время обратного прохода, открывая таким образом доступ к будущей информации. А значит, нейросеть можно обучить не только дополняющие информацию, но и заполнять пробелы, вместо расширения рисунка по краям, может дорисовывать недостающие фрагменты в середине.

Шустер, Майк и Кулдип К. Паливал. «Двунаправленные рекуррентные нейронные сети». IEEE Transactions по обработке сигналов 45.11 (1997): 2673-2681.
Исходный документ, PDF


Глубокие остаточные сети (Глубокие остаточные сети, DRN) — это очень глубокие FFNN с дополнительными связями между слоями, обычно от двух до пяти, соединяющими не только соседние слои, но и более отдаленные. Вместо того, чтобы искать способ найти соответствующие исходным данным входные данные через, скажем, пять слоев, сеть обучена ставить в соответствие входному блоку пару «выходной блок + входной блок».Таким образом входные данные проходят через все слои, нейросети и подаются на блюдечке последним слоям. Было показано, что такие сети могут обучаться образцам глубиной до 150 слоев, что намного больше, чем можно ожидать от обычной 2-5-слойной нейросети. Тем не менее, было доказано, что сети этого типа на самом деле просто RNN без явного использования времени, а также их часто сравнивают с LSTM без фильтров.

He, Kaiming, et al. «Глубокое остаточное обучение для распознавания изображений». Препринт arXiv arXiv: 1512.03385 (2015).
Исходный документ PDF


Нейронные эхо-сети (Echo State Network, ESN) — еще один вид рекуррентных нейросетей. Они выделяются тем, что связи между нейронами в них случайны, не организованы в аккуратные слои, и обучаются они по-другому. Вместо подачи на вход и обратного распространения, мы передаем данные, обновляем состояния нейронов и в некотором времени следим за выходными данными. Входной и выходной слой служат нестандартной ролью, так как входной слой для инициализации системы, выходной слой — в качестве наблюдателя за порядком активации нейронов, который проявляется со временем.Во время обучения изменяются связи между наблюдателем и скрытыми слоями.

Йегер, Герберт и Харальд Хаас. «Использование нелинейности: прогнозирование хаотических систем и экономия энергии при беспроводной связи». наука 304.5667 (2004): 78-80.
Исходный документ PDF


Экстремальные обучающие машины (ELM) — это те же FFNN, но со случайными связями между нейронами. Они очень похожи на LSM и ESN, но используются скорее сетям прямого распространения, и они не связаны не с тем, что они не являются рерентными или импульсными, а с тем, что их обучают методом обратного распространения ошибки.

Cambria, Erik, et al. «Экстремальные обучающиеся машины [тенденции и противоречия]». IEEE Intelligent Systems 28.6 (2013): 30-59.
Исходный документ PDF


Машины неустойчивых состояний (Liquid State Machines, LSM) подобны ESN. Главное их отличие в том, что LSM — это разновидность импульсных нейронных сетей: на замену сигмоидальной кривой приходят пороговые функции, и каждый нейрон также является накопительным блоком памяти. Когда состояние нейрона обновляется, значение рассчитывается не как сумма его соседей, а складывается с самим собой.Как только порог превышен, энергия освобождения и нейрон посылает импульс другим нейронам.

Маасс, Вольфганг, Томас Начлегер и Генри Маркрам. «Вычисления в реальном времени без стабильных состояний: новая структура для нейронных вычислений на основе возмущений». Нейронные вычисления 14.11 (2002): 2531-2560.
Оригинальный документ PDF


Метод опорных векторов (Support vector machine, SVM) служит для нахождения оптимальных решений в задачах классификации. В классическом смысле метод категоризировать линейно разделяемые данные: например, определить, на каком рисунке изображен Гарфилд, а на каком — Снупи.В процессе обучения сеть как бы размещает всех Гарфилдов и Снупи на 2D-графике и пытается разделить данные прямого линией так, чтобы с каждой стороны были данные только одного класса и чтобы расстояние от линии до линии было максимальным. Используя трюк с ядром, можно классифицировать данные размерности n. Построив 3D граф, мы сможем отличить Гарфилда от Снупи и от кота Саймона, и чем выше размерность, тем больше мультяшных персонажей можно классифицировать. Этот метод не всегда рассматривается как нейронная сеть.

Кортес, Коринна и Владимир Вапник. «Сети опорных векторов». Машинное обучение 20.3 (1995): 273-297.
Оригинал бумаги PDF


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

Кохонен, Теуво. «Самоорганизованное формирование топологически правильных карт признаков». Биологическая кибернетика 43.1 (1982): 59-69.
Оригинал статьи PDF


Прочитать и первую часть тоже. .

Нейросети и трейдинг. Практическая реализация / Хабр

Продолжение этой статьи здесь .

Мода на трейдинг переживает взлеты и падение вместе с курсом Биткоина. Сейчас эта тема в нижней точке после невероятного роста в 2018 году. Многие за это время успели познакомиться с криптобиржами — вникали в тему, учились, трейдили, теряли деньги и даже иногда зарабатывали. В итоге, мода прошла, а опыт остался, пусть и негативный. Слова «лонг», «шорт», «спред», «дивер» можно услышать от тех, от кого уж точно этого не ожидаешь.Но не только торговля «руками» приковывала к себе внимание, есть еще торговые боты. Что у нас в этой области, о чем говорит опыт последних 2-3 лет?

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

Остается последняя надежда — нейросети. Тут уж точно должно получиться, ведь нейросеть учится как человек и сама подстраивается под рынок. Как дела в этой области? Ну… вы уже догадались. Все плохо, разговоров много, а работающих решений нет. Все очень плохо! Яркий пример тому пример магазин приложений сообщества MQL5. За брендом MQL5 стоит платформа для трейдинга — MetaTrader5 плюс огромное сообщество трейдеров и программистов. Так вот в этом магазине есть раздел для решений на основе нейросетей, там много ботов, но ни одного настоящего.Добавить туда бота использующего нейросети запрещенных правил. В это трудно поверить, но это так. Запрет на подключение внешнего API исключает возможность использования нейросетей, встроенные в MQL5 средства на практике не работают. Этот вопрос я обсуждал с техподдержкой MQL5, внятного ответа так и не получил. В, на рынке нет ничего реально работающего из коробки, выложенные на гитхабе решения из серии «обучи сам» в расчет не берутся.

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

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

С нейросетью надо как с ребенком, смотреть на мир ее глазами и начинать с простых задач. Самый простой вопрос который можно задать — «куда пойдет через Х свечей, вверх или вниз?».Не важно на сколько сильно изменится цена и не важно, что ответ нельзя будет превратить в торговую стратегию. Забудьте про торговлю, сейчас главная задача хоть чему-то обучить сеть, просто получить правильный ответ.

У меня эта начальная задача решилась после 100500 подборов входных данных. Использовал TensoFlow плюс Keras, сеть Sequental Dense. Входной датасет на 200-300 тыс примеров, входной вектор 250-350 фичь. Из поставленной сети вытекает и форма ответа — бинарная классификация «вверх» или «вниз».Входные данные готовил ботом на MQL5. Бот пробегая история формирует обычный csv фаил, каждую строку — вектор. В конце каждого правильного ответа ввиде 1: 0, если вверх, 0: 1, если вниз.

Вот несколько советов тем, кто попробует это сделать:

  1. Хорошо обучается в пределах прогноза от 15 минут до 60 минут. На меньшем периоде растет хаотичность движения цены, на большем увеличивается внешнее влияние — новости и прочее, 15-60 минут самая «техничная» зона.
  2. Лучше всего обучение проходит на BTCUSD, второе место в EURUSD.Почему так — не знаю.
  3. Не забивайте голову вопросом типа «а что если цена не изменилась? тогда это третий вариант ответа? ». При сборе данных я просто не включал их в датасет, задача надо упрощать.
  4. При прогоне на тестовом участке ответы сети на первый взгляд будут казаться хаотичными с практически случайным, приближающимся к 50% уровню результативности. Это серьезная проблема, ниже поясню, как я ее решил.

Надо понимать с каким мы имеем дело.Рынок это на 95% хаос. Когда мы подаем сети данные для обучения и правильный ответ, на самом деле мы кормим ее хаосом. Это как пытаться обучить нейросеть отличать кошку от собаки, а на обучении ей бабочек, звезды и знаки зодиака, результат не будет. Так и здесь, но, к счастью, рынок дает примерно 5% работающих сетей, которые работают в ее ответах. Поэтому внимательнее относитесь к анализу тестов тестирования.

Используя такой подход получил следующий результат:
примерно в 2% ответов сеть угадывает дальнейшее движение в направлении 2 правильного ответа к 1 неправильному.При тесте на реальном рынке именно так и получается, но возникает другая проблема. У нас ведь всего 2% вопросов имеют ответ, остальное игнорируем. Т.е. запускаем нейро на реальном рынке на таймфрейме 5 минут и ждем… при 2% — это только каждая 50ая свеча будет с ответом, один ответ за 4 часа! И что с этим делать? Ладно если бы ответ был «купи / продай», тогда 6 сделок в сутки нормально, а тут абстрактные «вверх / вниз» и то неточно, полное разочарование.

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

Подведем итог, теперь есть, что можно запустить на реальном рынке и иметь сигналы «вверх / вниз» со средней отработкой. Уже веселее, но практического толку по-прежнему ноль.

Пара слов о реализации. У меня это работало на связке MQL5 плюс Керас.Ботенный запущенный в MetaTrader5 на каждой свече готовые данные для нейросети и через сокеты передавал скрипту на питоне, который по очереди опрашивал все модели и при прохождении ответом допустимого порога отправлял сигнал в Телеграм канал.

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

Долго ли, коротко ли, но после всех переделок стало получать единые ответы нейросети на каждую свече выраженные в процентах ожидаемой отаботки от -100% до + 100%.Знак отражает ожидаемое направление движения «вверх / вниз». Стало видно, что теперь смысл есть в каждом ответе. Оно работает! Я сам имею опыт трейдинга и видел как поведение сети на глазах становилось осмысленным. Иногда ее логика была понятна, иногда нет, но всегда за ее ответами чувствовалось какое то свое, часто парадоксальное, видение рынка. В добавок к этому, нужнилось, что чем выше уверенность в сети тем ближе к тому сроку ожидаемой отработка и наоборот. Низкая уверенность как бы говорила «что будет через 15 минут не знаю, но тренд вверх».

С этого места, я понял, что пытаться все это формализовать в сигналы «купи / продай» это как микроскопом забивать гвозди. Нужен был какой то инструмент для визуализации сигналов нейросети — графического отображения на каждой свече уровня «уверенности». Широкий набор инструментов MQL5 позволил все это собрать в «Эксперт» для MetaTrader5. «Эксперт» через API получает ответы нейросети и занимается только отрисовкой. Вот пример его работы на BTCUSD M1:

Цветная область вверху — прогноз «вниз», область внизу — прогноз «вверх», толщина — степень уверенности.

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

В итоге, на сегодняшний день есть Expert к MetaTrader5 с двумя видами прогнозов — кроткосрочным и долгосрочным. Постепенно накапливается статистика, есть обратная связь с трейдерами. Полученный результат вдохновляет на дальнейшую работу, теперь надо подбираться к заветным «купи / продай» команду.Сделать это можно увеличив качество прогноза. Дальше вижу такой путь развития:

  1. Надо подготовить еще десяток прогнозов в промежутке между 15 и 60 минутами. Т.е. предсказывать «вверх / вниз» для 20, 25, 30, 35 минут и так до 60. Каждый прогноз, напомню, строится из ответов примерно 20 моделей.
  2. Имея такой объем информации на каждой минутной свече, можно и нужно анализировать ее другой нейросетью. Связьзов между собой на разных временных отрезках может оказаться совсем нетривиальной, поэтому нейросеть тут будет уместна.
  3. Датасет для этой нейросети не будет так зашумнен как у младших товарищей, поэтому ее надо обучать не банальному «вверх / вниз», а это уже прямой выход на «купить / продать».

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

Кстати, этот эксперт для MetaTrader5 распространяю бесплатно, если хотите увидеть работу нейросети на реальном рынке обращайтесь.

П.С.
1) сайт проекта ENNRO.com ;
2) продолжение этой статьи здесь .

.

Разбираемся с войной нейронных сетей (GAN) / Хабр

Генеративные состязательные сети (GAN) пользуются все большей популярностью. Многие говорят о них, кто-то даже уже использует… но, как выясняется, пока мало кто даже из тех кто пользуется, понимает и может объяснить. 😉
Давайте разберем на самом простом примере, как они работают, чему учатся и что на самом деле порождают.

Для начала рекомендую всем прочитать отличную статью «Фальшивомонетчики против банкиров: стравливаем состязательные сети в Theano».Тем более, что пример мы возьмем как раз из нее.

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

Соперничающие сети

Итак, у нас есть две нейронные сети.Первая сеть, порождающая, обозначим ее как функцию y G = G (z) , значение на входе она принимает некое z , а на выходе выдает значение y G . Вторая сеть, различающая, и мы ее обозначим как функцию y D = D (х) , то есть на входе — x , на выходе — y D .

Порождающая сеть должна научиться генерировать такие образцы y G , что различающая сеть D не сможет их отличить от неких настоящих, эталонных образцов.А различающая сеть, в свою очередь, должна, наоборот, научиться отличать эти сгенерированные образцы от настоящих.

Изначально сети не знают ничего, поэтому их надо обучить. Но как? Ведь для обучения обычных сетей нужен специальный набор обучающих данных — (X i , Y i ) . На вход сети последовательно подаются X i и рассчитываются y i = N (X i ) . Затем по разнице между Y, и (реальное значение) и y и (результат работы сети) перерассчитываются коэффициенты сети и так по кругу.

Так, да не так. На самом деле на каждом шаге обучения вычисляется значение функций потерь (функция потерь), по градиенту которой пересчитываются коэффициенты сети. А вот функция потерь уже тем или иным образом учитывает отличие Y i от y i . Но, строго говоря, это совсем не обязательно. Во-первых, функция потерь может быть устроена иным образом, например, учитываются функции каких-либо других функций.Во-вторых, вместо минимизации функций потерь в ходе обучения сети можно решать оптимизационную задачу, например, максимизации функции успеха. И это как раз используется в GAN.

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

Обучение второй, различающей, сети заключается в максимизации работы D (x) (1 — D (G (z))) . Огрубляя, она (сеть, есть функция D () ) должна выдавать «единички» для эталонных образцов и «нолики» для образцов, сгенерированных порождающей сетью.
Причем сеть ничего не знает о том, что ей подано на вход: эталон или подделка.Об этом «знает» только функционал. Однако сеть учится в сторону градиента этого функционала, который «как бы» прозрачно намекает ей, насколько она хороша.
Обратите внимание, на каждом шаге обучения различающей сети один различается результат работы порождающей сети и два раза — результат работы различающей сети: в первый раз на вход предоставляется эталонный образец, во второй — результат порождающей сети.

В общем, обе сети связаны в неразрывный круг взаимного обучения.И чтобы вся конструкция работала нам нужны эталонные образцы — набор обучающих данных (X i ) . Заметьте, что Y i здесь не нужны. Хотя, понятно, что на самом деле по умолчанию подразумевается, что каждому X i соответствует Y i = 1 .

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

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

Разбираем код

Теперь заглянем в код, поскольку там тоже не все так просто.

Сначала импортируем все нужные модули:

  import numpy as np
импортная лазанья
импортировать теано
импортировать theano.tensor как T
из lasagne.nonlinearities import rectify, sigmoid, linear, tanh
  

Определим функцию, возвращающую равномерный шум на отрезке [-5,5], который будет далее подавать на вход порождающей сети.

  def sample_noise (M):
    return np.float32 (np.linspace (-5.0, 5.0, M) + np.random.random (M) * 0.01) .reshape (M, 1)
  

Создадим символьную переменную, которая будет являться входом порождающей сети:

  G_input = T.matrix ('Gx')
  

И опишем саму сеть:

  G_l1 = lasagne.layers.InputLayer ((None, 1), G_input)
G_l2 = lasagne.layers.DenseLayer (G_l1, 10, нелинейность = исправление)
G_l3 = lasagne.layers.DenseLayer (G_l2, 10, нелинейность = исправление)
G_l4 = лазанья.Layers.DenseLayer (G_l3, 1, нелинейность = линейная)
G = G_l4
G_out = lasagne.layers.get_output (G)
  

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

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

  D1_input = T.matrix ('D1x')
  

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

  D1_target = T.matrix ('D1y')
D1_l1 = lasagne.layers.InputLayer ((Нет, 1), D1_input)
D1_l2 = lasagne.layers.DenseLayer (D1_l1, 10, нелинейность = tanh)
D1_l3 = лазанья.Layers.DenseLayer (D1_l2, 10, нелинейность = tanh)
D1_l4 = lasagne.layers.DenseLayer (D1_l3, 1, нелинейность = сигмоид)
D1 = D1_l4
  

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

  D2_l1 = лазанья.Layers.InputLayer ((Нет, 1), G_out)
D2_l2 = lasagne.layers.DenseLayer (D2_l1, 10, нелинейность = tanh, W = D1_l2.W, b = D1_l2.b)
D2_l3 = lasagne.layers.DenseLayer (D2_l2, 10, нелинейность = tanh, W = D1_l3.W, b = D1_l3.b)
D2_l4 = lasagne.layers.DenseLayer (D2_l3, 1, nonlinearity = sigmoid, W = D1_l4.W, b = D1_l4.b)
D2 = D2_l4
  

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

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

  D1_out = lasagne.layers.get_output (D1)
D2_out = lasagne.layers.get_output (D2)
  

Вот мы и добрались до задания оптимизационных функций:

  G_obj = (T.log (D2_out)). Mean ()
D_obj = (T.log (D1_out) + T.log (1 - D2_out)). Mean ()
  

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

Далее создаем функцию обучения порождающей сети:

  G_params = lasagne.layers.get_all_params (G, trainable = True)
G_lr = theano.shared (np.array (0,01, dtype = theano.config.floatX))
G_updates = lasagne.updates.nesterov_momentum (1 - G_obj, G_params, learning_rate = G_lr, импульс = 0,6)
G_train = theano.function ([G_input], G_obj, updates = G_updates)
  

В G_params будет список всех коэффициентов всех слоев порождающей сети.
В G_lr будет храниться скорость обучения.
G_updates — собственно, функция обновления коэффициентов методом градиентного спуска. Обратите внимание, первым параметром она принимает все-таки функцию потерь, то есть она не максимизирует G_obj , а минимизирует (1-G_obj) (но это всего лишь особенность Theano). Вторым параметром ей передаются все коэффициенты сети, а скорость обучения и константа со значением параметраса (которое нужно только потому что в качестве метода градиентного спуска выбрано методса Нестерова).
В G_train мы получим функцию обучения сети, входящую в которую используется G_input , результатом является расчет G_obj , то есть оптимизационный функционал для порождающей сети.

Теперь все то же самое для различающей сети:

  D_params = lasagne.layers.get_all_params (D1, trainable = True)
D_lr = theano.shared (np.array (0.1, dtype = theano.config.floatX))
D_updates = lasagne.updates.nesterov_momentum (1 - D_obj, D_params, скорость обучения = D_lr, импульс = 0.6)
D_train = theano.function ([G_input, D1_input], D_obj, updates = D_updates)
  

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

Наконец-то запускаем обучение. В цикле по эпохам:

  для i в диапазоне (эпохах):
  

Сначала обучаем различающую сеть, причем не однократно, а K раз.

  для j в диапазоне (K):
  

х — эталонные образцы (в данном случае из нормального распределения с использованием mu и sigma ):
z — случайный шум

  x = np.float32 (np.random.normal (mu, sigma, (M, 1)))
        z = sample_noise (M)
  

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

  D_train (z, x)
  

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

  z = sample_noise (M)
    G_train (z)
  

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

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

  если i% 10 == 0:
        G_lr * = 0,999
        D_lr * = 0,999
  

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *