Нейросети пример: распознавание образов и изображений c помощью ИИ

Содержание

21 сайт, где можно протестировать работу нейросетей

Среди них — генерирование котов, создание рисунков из каракулей, поиск ответов в Библии и озвучка голосами знаменитостей.

296 175

просмотров

Отретушировать изображение — Nvidia InPainting

На сайте пользователь может отретушировать фотографию с помощью «умной» кисти. Алгоритмы умеют заменять изображения или убирать ненужные детали на фотографии. Для этого нужно загрузить фотографию и с помощью кисти создать маску нужного объекта.

Сгенерировать человека — ThisPersonDoesNotExist

Нейросеть создаёт реалистичное изображение человеческого лица. Новое изображение появляется при каждом открытии или обновлении страницы. В основе алгоритма лежит генеративная нейросеть StyleGAN от Nvidia.

Разработчик — сотрудник Uber Филипп Ван.

Создать кота — ThisCatDoesNotExist

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

Этот сервис тоже создал сотрудник Uber Филипп Ван.

Поиграть в тетрис — Sematris

Мини-игра от Google работает двумя способами: вдумчивый тетрис или интенсивная аркада.

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

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

Создать рисунок из каракулей — AutoDraw

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

Нарисовать реалистичное изображение — Smart Sketch

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

Разработку называли «Paint эпохи искусственного интеллекта». Однако на момент написания заметки сайт приложения не работал.

Распознать рисунок — Quick, Draw!

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

Все данные остаются в публичном доступе.

Описать фотографию — CaptionBot

Сервис от Microsoft составляет описание к любой фотографии. В его основе лежит три отдельных алгоритма: Computer Vision API, Bing Image Search API и Emotion API. Если на изображении есть лица, сервис показывает эмоции людей с помощью эмоджи. После анализа приложение предлагает оценить, насколько точно он составил описание.

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

Поговорить с книгой — Talk to Books

Приложение работает на базе алгоритмов Google AI. Нейросеть отвечает на вопросы пользователя цитатами из книг. Она умеет обрабатывать абстрактные вопросы, например, «в чём смысл жизни?» и «что значит быть человеком?».

Сервис не распознаёт вопросы на русском языке.

Создать резюме — This resume does not exist

Нейросеть использует шаблоны для резюме, созданные Enhancv для своих клиентов. Фотографии генерируются с помощью алгоритма StyleGAN от Nvidia, а тексты — TextgenRNN. Источником данных послужила информация с портала Indeed, где опубликовано 120 млн резюме. Создать новое резюме можно каждые 10 секунд.

Сервис создали разработчики болгарского сервиса по созданию резюме Enhancv.

Сделать логотип — Logojoy

Чтобы создать логотип, пользователю нужно ввести название компании, выбрать её специализацию, понравившиеся логотипы, цветовые гаммы и изображения.

Сервис использует алгоритмы TensorFlow от Google.

Написать стихотворение — «Яндекс.Автопоэт»

Алгоритм «Яндекса» составляет собственные стихи из заголовков «Яндекс.Новостей». Сервис автоматически определяет стихотворный размер фразы по чередованию ударных и безударных слогов, составляет фонетические транскрипции и рифмует созвучные фразы.

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

Превратить фотографию в портрет из стихов — PoemPortraits

Проект — результат сотрудничества Google Arts и Culture Lab. На старте пользователю необходимо ввести любое слово, которое будет содержаться в стихотворении. Затем — предоставить доступ к камере и сфотографироваться, после чего нейросеть наложит стихи на фотографию.

The Verge

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

Удалить фон с фотографии — remove.bg

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

Раскрасить чёрно-белую фотографию — Colorize

Приложение разработано российской компанией G-Core Labs. В его основе — проект с открытым исходным кодом DeOldify. Бесплатно пользователь может загрузить до 50 фотографий, на каждой из них будет написано «Создано с помощью Colorize.cc». Чтобы получить фото, нужно оставить электронный адрес. Время ожидания — от 30 секунд.

Платная версия стоит $10, она убирает надпись и увеличивает лимит до 10 тысяч загрузок.

Найти ответ в Библии — Digital Bible

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

Сайт работает на английском языке.

Озвучить текст голосом знаменитости — Voices by Headliner

Приложение преобразовывает текст на английском языке в речь и затем предлагает создать видео. Оно работает на базе Microsoft Custom Voice.

Среди вариантов озвучки — голоса Марка Цукерберга, Дональда Трампа, Моргана Фримена, Ким Кардашьян, Тейлор Свифт и других знаменитостей.

Заменить лицо на фотографии — Reflect

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

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

В планах сервиса — заменять тела и лица на видео.

Обучить нейросеть — Teachable Machine

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

Нарисовать портрет — AI Portraits

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

Нейронные сети — математический аппарат

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

Искусственный нейрон

Несмотря на большое разнообразие вариантов нейронных сетей, все они имеют общие черты.{-ax}}$, (3)

Основное достоинство этой функции в том, что она дифференцируема на всей оси абсцисс и имеет очень простую производную:

$f’\,(x) = \alpha f(x)\,\bigl(1\,-\,f\,(x)\bigr)$, (4)

При уменьшении параметра a сигмоид становится более пологим, вырождаясь в горизонтальную линию на уровне 0,5 при a=0. При увеличении a сигмоид все больше приближается к функции единичного скачка.

Нейронные сети обратного распространения

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

Нейронная сеть обратного распространения состоит из нескольких слоев нейронов, причем каждый нейрон слоя i связан с каждым нейроном слоя i+1, т.2$, (5)

где

yj – значение j-го выхода нейросети,

dj – целевое значение j-го выхода,

p – число нейронов в выходном слое.

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

$\Delta\,w_{ij} = -\,\eta\,\cdot\,\frac{\partial\,E}{\partial\,w_{ij}}$, (6)

где h – параметр, определяющий скорость обучения.

$\frac{\partial\,E}{\partial\,w_{ij}} = \frac{\partial\,E}{\partial\,y_i}\,\cdot\,\frac{dy_i}{dS_j}\,\cdot\,\frac{\partial\,S_j}{\partial\,w_{ij}}$, (7)

где

yj – значение выхода j-го нейрона,

Sj – взвешенная сумма входных сигналов, определяемая по формуле (1).

При этом множитель

$\frac{\partial\,S_j}{\partial\,w_{ij}} = x_i$, (8)

где

xi – значение i-го входа нейрона.{(n)}\,(t\,-\,1)$ , (13.1)

Дополнительным преимуществом от введения момента является способность алгоритма преодолевать мелкие локальные минимумы.

Представление входных данных

Основное отличие НС в том, что в них все входные и выходные параметры представлены в виде чисел с плавающей точкой обычно в диапазоне [0..1]. В то же время данные предметной области часто имеют другое кодирование. Так, это могут быть числа в произвольном диапазоне, даты, символьные строки. Таким образом данные о проблеме могут быть как количественными, так и качественными. Рассмотрим сначала преобразование качественных данных в числовые, а затем рассмотрим способ преобразования входных данных в требуемый диапазон.

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

нет

ожирение

алкоголь

курение

гипертония

А также возможным примером может быть, например, возраст больного:

до 25 лет

25-39 лет

40-49 лет

50-59 лет

60 и старше

Опасность каждого фактора возрастает в таблицах при движении слева направо.

В первом случае мы видим, что у больного может быть несколько факторов риска одновременно. В таком случае нам необходимо использовать такое кодирование, при котором отсутствует ситуация, когда разным комбинациям факторов соответствует одно и то же значение. Наиболее распространен способ кодирования, когда каждому фактору ставится в соответствие разряд двоичного числа. 1 в этом разряде говорит о наличии фактора, а 0 о его отсутствии. Параметру нет можно поставить в соответствии число 0. Таким образом для представления всех факторов достаточно 4-х разрядного двоичного числа. Таким образом число 10102 = 1010 означает наличие у больного гипертонии и употребления алкоголя, а числу 00002 соответствует отсутствие у больного факторов риска. Таким образом факторы риска будут представлены числами в диапазоне [0..15].

Во втором случае мы также можем кодировать все значения двоичными весами, но это будет нецелесообразно, т.к. набор возможных значений будет слишком неравномерным. В этом случае более правильным будет установка в соответствие каждому значению своего веса, отличающегося на 1 от веса соседнего значения. Так, число 3 будет соответствовать возрасту 50-59 лет. Таким образом возраст будет закодирован числами в диапазоне [0..4].

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

Литература

  • Dirk Emma Baestaens, Willem Max Van Den Bergh, Douglas Wood, «Neural Network Solution for Trading in Financial Markets», Pitman publishing
  • R. M. Hristev, «Artifical Neural Networks»
  • С. Короткий, «Нейронные сети: Алгоритм обратного распространения»
  • С. Короткий, «Нейронные сети: Основные положения»

Классификация данных при помощи нейронных сетей

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

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

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

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

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

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

Особенности применения НС в качестве классификаторов

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

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

Тем не менее, можно выделить ряд преимуществ использования НС в качестве классификаторов:

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

Рисунок 1. Линейная разделимость классов

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

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

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

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

Подготовка исходных данных

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

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

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

Например, в задаче классификации заёмщиков на «плохих» и «хороших» можно оставить всего два признака «Доход» и «Возраст». Тогда весьма вероятно, что два заёмщика с одним и тем же возрастом и доходом окажутся в разных классах. Чтобы сделать заёмщиков различимыми нужно добавить ещё один признак, например, число иждивенцев. Таким образом, отбор признаков для обучения классификатора на основе НС является поиском компромисса.

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

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

Кодирование выходных значений

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

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

При этом отношение объекта к классу определяется установкой в 1 соответствующего элемента выходного вектора (i-го элемента для j-го класса), в то время, как остальные элементы устанавливаются в 0. Тогда, например, второму классу будет соответствовать единица на 2-м выходе сети и 0 на остальных (рис. 2).

Рисунок 2. Представление нескольких классов на выходе сети

Для кодирования могут использоваться и другие значения кроме 1. Но при интерпретации результата обычно считается, что класс определяется номером выхода сети, на котором появилось максимальное значение. Например, если на выходе сети был сформирован вектор выходных значений (0.2, 0.6, 0.4), то максимальное значение имеет второй компонент вектора. Следовательно, класс, к которому относится этот пример, будет 2.

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

Например, для рассмотренного выше примера уверенность сети в том, что пример относится ко второму классу, определится как разность между второй и третьей компонентой вектора и равна 0.6−0.4=0.2. Соответственно чем выше уверенность, тем больше вероятность того, что сеть дала правильный ответ. Этот метод кодирования является самым простым, но не всегда самым эффективным способом представления классов на выходе сети.

Например, в другом способе представления, номер класса кодируется в двоичной форме в выходном векторе сети. Тогда если число классов равно 5, то для их представления будет достаточно трёх выходных нейронов, а код, соответствующий, скажем, 3-му классу будет 011. Недостатком подхода является отсутствие возможности использования показателя уверенности, поскольку разность между любыми элементами выходного вектора всегда равна 0 или 1.{n}=\frac{k!}{n!(k-n)!}=\frac{k!}{2!(k-2)!}=\frac{k(k-1)}{2}

Тогда, например, для задачи с четырьмя классами мы имеем 6 выходов (подзадач) распределенных следующим образом:

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

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

Выбор размера сети

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

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

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

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

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

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

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

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

Выбор архитектуры сети

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

При этом основным показателем для выбора является объем обучающего множества и достижения обобщающей способности сети. Обычно используется алгоритм обучения Back Propagation (обратного распространения) с валидационным множеством.

Алгоритм построения классификатора

Построение классификатора на основе нейронной сети содержит ряд шагов.

  1. Подготовка данных
    1. Составить базу данных из примеров, характерных для данной задачи
    2. Разбить всю совокупность данных на два множества: обучающее и тестовое (возможно разбиение на 3 множества: обучающее, тестовое и валидационное)
  2. Предобработка данных
    1. Произвести отбор признаков, значимых с точки зрения задачи классификации.
    2. Выполнить трансформацию и при необходимости очистку данных (нормализацию, исключение дубликатов и противоречий, подавление выбросов и т.д.). В результате желательно получить линейно разделяемое по классам пространство множества примеров.
    3. Выбрать систему кодирования выходных значений (классическое кодирование, «2 на 2»-кодирование и т.д.)
  3. Конструирование, обучение и оценка качества сети
    1. Выбрать топологию сети: количество слоев, число нейронов в слоях и т.д.
    2. Выбрать активационную функцию нейронов (например, логистическую, гипертангенс и др.)
    3. Выбрать алгоритм обучения сети
    4. Оценить качество работы сети на основе валидационного множества, или другого критерия, оптимизировать архитектуру (уменьшение весов, прореживание пространства признаков)
    5. Остановится на варианте сети, который обеспечивает наилучшую способность к обобщению и оценить качество работы по тестовому множеству
  4. Использование и диагностика
    1. Выяснить степень влияния различных факторов на принимаемое решение (эвристический подход)
    2. Убедиться, что сеть обеспечивает требуемую точность классификации (число неправильно распознанных примеров мало)
    3. При необходимости вернуться на этап 2, изменив способ представления примеров или изменив базу данных
    4. Практически использовать сеть для решения задачи

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

 

Другие материалы по теме:

Алгоритмы кластеризации на службе Data Mining

Loginom Community Edition — аналитика, доступная каждому

Изучаем нейронные сети за четыре шага

Рассказывает Per Harald Borgen 


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

Шаг 1. Нейроны и метод прямого распространения

Так что же такое «нейронная сеть»? Давайте подождём с этим и сперва разберёмся с одним нейроном.

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

Круг ниже обозначает искусственный нейрон. Он получает 5 и возвращает 1. Ввод — это сумма трёх соединённых с нейроном синапсов (три стрелки слева).

В левой части картинки мы видим 2 входных значения (зелёного цвета) и смещение (выделено коричневым цветом).

Входные данные могут быть численными представлениями двух разных свойств. Например, при создании спам-фильтра они могли бы означать наличие более чем одного слова, написанного ЗАГЛАВНЫМИ БУКВАМИ, и наличие слова «виагра».

Входные значения умножаются на свои так называемые «веса», 7 и 3 (выделено синим).

Теперь мы складываем полученные значения со смещением и получаем число, в нашем случае 5 (выделено красным). Это — ввод нашего искусственного нейрона.

Потом нейрон производит какое-то вычисление и выдает выходное значение. Мы получили 1, т.к. округлённое значение сигмоиды в точке 5 равно 1 (более подробно об этой функции поговорим позже).

Если бы это был спам-фильтр, факт вывода 1 означал бы то, что текст был помечен нейроном как спам.

Иллюстрация нейронной сети с Википедии.

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

Я очень рекомендую посмотреть серию видео от Welch Labs для улучшения понимания процесса.

Шаг 2. Сигмоида

После того, как вы посмотрели уроки от Welch Labs, хорошей идеей было бы ознакомиться с четвертой неделей курса по машинному обучению от Coursera, посвящённой нейронным сетям — она поможет разобраться в принципах их работы. Курс сильно углубляется в математику и основан на Octave, а я предпочитаю Python. Из-за этого я пропустил упражнения и почерпнул все необходимые знания из видео.

Сигмоида просто-напросто отображает ваше значение (по горизонтальной оси) на отрезок от 0 до 1.

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

Но на одних видео далеко не уедешь. Для полного понимания я решил закодить её самостоятельно. Поэтому я начал писать реализацию алгоритма логистической регрессии (который использует сигмоиду).

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

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

Шаг 3. Метод обратного распространения ошибки

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

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

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

Скриншот из руководства Мэтта Мазура по методу обратного распространения ошибки.

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

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

Шаг 4. Создание своей нейронной сети

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

Ещё одной полезной статьёй оказалась A Neural Network in 11 lines of Python от IAmTrask. В ней содержится удивительное количество знаний, сжатых до 11 строк кода.

Скриншот руководства от IAmTrask

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

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

После этого можно ознакомиться с руководством Wild ML от Denny Britz, в котором разбираются нейронные сети посложнее.

Скриншот из руководства WildML

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

Для поиска хороших наборов данных можете посетить мой сайт Datasets.co и выбрать там подходящий.

Так или иначе, теперь вам лучше начать свои эксперименты, чем слушать мои советы. Лично я сейчас изучаю Python-библиотеки для программирования нейронных сетей, такие как Theano, Lasagne и nolearn.

Удачи!

Перевод статьи «Learning How To Code Neural Networks»

Нейронные сети, или Как обучить искусственный интеллект — Интернет изнутри

Машинное обучение является не единственным, но одним из фундаментальных разделов искусственного интеллекта, занимающимся вопросами самостоятельного извлечения знаний интеллектуальной системой в процессе ее работы. Основу машинного обучения составляют так называемые искусственные нейронные сети, принцип работы которых напоминает работу биологических нейронов нервной системы животных и человека.
Технологии искусственного интеллекта все активнее используются в самых различных областях – от производственных процессов до финансовой деятельности. Популярные услуги техгигантов, такие как «Яндекс.Алиса», Google Translate, Google Photos и Google Image Search (AlexNet, GoogleNet) основаны на работе нейронных сетей.
Что такое нейронные сети и как они работают – об этом пойдет речь в статье.

Введение

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

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

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

Рис. 1. Основные типы нейронов.

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

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

Рис. 2. Модель искусственного нейрона.

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

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

Таблица 1. Популярные разновидности активационных функций искусственного нейрона

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

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

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

  1. Ввод и обработка информации. Распознавание текстов на фотографиях и различных документах, распознавание голосовых команд, голосовой ввод текста.
  2. Безопасность. Распознавание лиц и различных биометрических данных, анализ трафика в сети, обнаружение подделок.
  3. Интернет. Таргетинговая реклама, капча, составление новостных лент, блокировка спама, ассоциативный поиск информации.
  4. Связь. Маршрутизация пакетов, сжатие видеоинформации, увеличение скорости кодирования и декодирования информации.

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

Архитектуры нейронных сетей

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

Персептрон

Рис. 3. Пример архитектуры персептрона.

Персептрон – это простейшая модель нейросети, состоящая из одного нейрона. Нейрон может иметь произвольное количество входов (на рис. 3 изображен пример вида персептрона с четырьмя входами), а один из них обычно тождественно равен 1. Этот единичный вход называют смещением, его использование иногда бывает очень удобным. Каждый вход имеет свой собственный вес. При поступлении сигнала в нейрон, как и было описано выше, вычисляется взвешенная сумма сигналов, затем к сигналу применяется функция активации и сигнал передается на выход. Такая
простая на первый взгляд сеть, всего из одного-единственного нейрона, способна, тем не менее, решать ряд задач: выполнять простейший прогноз, регрессию данных и т.п., а также моделировать поведение несложных функций. Главное для эффективности работы этой сети – линейная разделимость данных.

Для читателей, немного знакомых с таким разделом как логика, будут знакомы логическое И (умножение) и логическое ИЛИ (сложение). Это булевы функции, принимающие значение, равное 0, всегда, кроме одного случая, для умножения, и, наоборот, значения, равные 1, всегда, кроме одного случая, для сложения. Для таких функций всегда можно провести прямую (или гиперплоскость в многомерном пространстве), отделяющие 0 значения от 1. Это и называют линейной разделимостью объектов. Тогда подобная модель сможет решить поставленную задачу классификации и сформировать базовый логический элемент. Если же объекты линейно неразделимы, то сеть из одного нейрона с ними не справится. Для этого существуют более сложные архитектуры нейронных сетей, в конечном счете, тем не менее, состоящие из множества таких персептронов, объединенных в слои.

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

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

Рис. 4. Архитектура многослойного персептрона.

Отличительные признаки многослойного персептрона:

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

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

Сверточная нейронная сеть (convolution neural network)

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

Рис. 5. Архитектура сверточной нейронной сети.

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

Сверточные нейронные сети решают следующие задачи:

  • Классификация. Пример: нейронная сеть определяет, что или кто находится на изображении.
  • Детекция. Пример: нейронная сеть определяет, что/кто и где находится на изображении.
  • Сегментация. Пример: нейронная сеть может определить каждый пиксель изображения и понять, к чему он относится.

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

Рекуррентная нейронная сеть

Рекуррентная нейронная сеть – сеть, соединения между нейронами которой образуют ориентированный цикл. Т.е. в сети имеются обратные связи. При этом информация к нейронам может передаваться как с предыдущих слоев, так и от самих себя с предыдущей итерации (задержка). Пример схемы первой рекуррентной нейронной сети (НС Хопфилда) представлен на рис. 6.

Рис. 6. Архитектура рекуррентной нейронной сети.

Характеристики сети:

  • Каждое соединение имеет свой вес, который также является приоритетом.
  • Узлы подразделяются на два типа: вводные (слева) и скрытые (1, 2, … K).
  • Информация, находящаяся в нейронной сети, может передаваться как по прямой, слой за слоем, так и между нейронами.

Такие сети еще называют «памятью» (в случае сети Хопфилда – автоассоциативной; бывают также гетероассоциативные (сеть Коско – развитие сети Хопфилда) и другие). Почему? Если подать данной сети на вход некие «образцы» – последовательности кодов (к примеру, 1000001, 0111110 и 0110110) — и обучить ее на запоминание этих образцов, настроив веса синапсов сети определенным образом при помощи правила Хебба3, то затем, в процессе функционирования, сеть сможет «узнавать» запомненные образы и выдавать их на выход, в том числе исправляя искаженные поданные на вход образы. К примеру, если после обучения такой сети я подам на вход 1001001, то сеть узнает и исправит запомненный образец, выдав на выходе 1000001. Правда, эта нейронная сеть не толерантна к поворотам и сдвигам образов, и все же для первой нейронной сети своего класса сеть весьма интересна.

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

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

Самоорганизующаяся нейронная сеть

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

Рис. 7. Архитектура самоорганизующейся нейронной сети.

Алгоритмы обучения нейронных сетей

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

Рис. 8. Процесс обучения нейронной сети.

Алгоритмы обучения для нейронной сети бывают с
учителем и без.

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

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

Рекуррентные сети на примерах Google и «Яндекса»

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

Сеть долговременной краткосрочной памяти (Long shortterm memory – LSTM) – сеть, которая появилась в результате развития RNN-сетей. Это интересная модификация RNN-сетей, позволяющая сети не просто «держать контекст», но и умеющая «видеть» долговременные зависимости. Поэтому LSTM подходит для прогнозирования различных изменений при помощи экстраполяции (выявление тенденции на основе данных), а также в любых задачах, где важно умение «держать контекст», особенно хорошо подвластное для данной нейросети.

Рис. 9. Модули рекуррентной нейронной сети.

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

Рис. 10. Модуль LSTM-сети.

LSTM также имеет цепочечную структуру. Отличие состоит в том, что сеть имеет четыре слоя, а не один (рис. 10). Главным отличием LSTM-сети является ее клеточное состояние (или состояние ячейки), которое обозначается горизонтальной линией в верхней части диаграммы и по которой проходит информация (рис. 11). Это самое состояние ячейки напоминает ленту конвейера: она проходит напрямую через всю цепочку, участвуя в некоторых преобразованиях. Информация может как «течь» по ней, не подвергаясь изменениям, так и быть подвергнута преобразованиям со стороны нейросети7. (Представьте себе линию контроля на конвейере: изделия продвигаются на ленте перед сотрудником контроля, который лишь наблюдает за ними, но если ему что-то покажется важным или подозрительным, он может вмешаться).

Рис. 11. Клеточное состояние LSTM-модуля.

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

Рис. 12. Вентиль.

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

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

Мы рассмотрели основные типы нейронных систем и познакомились с принципами их работы. Остановимся теперь на их практическом применении в системах Google Translate, «Яндекс.Алиса», Google Photos и Google Image Search (AlexNet, GoogleNet).

LSTM в Google Translate

Google-переводчик в настоящее время основан на методах машинного обучения и использует принцип работы LSTM-сетей. Система производит вычисления, чтобы понять значение слова или фразы, основываясь на предыдущих значениях в последовательности (контексте). Такой алгоритм помогает системе понимать контекст предложения и верно подбирать перевод среди различных вариантов. Еще несколько лет назад Google Translate работал на основе статистического машинного перевода – это разновидность перевода, где перевод генерируется на основе статистических моделей (бывают: по словам, по фразам, по синтаксису и т.д.), а параметры этих моделей являются результатами анализа корпусов текстов двух выбранных для перевода языков. Эти статистические модели обладали большим быстродействием, однако их эффективность ниже. Общий прирост качества перевода после внедрения системы на основе нейросетей в Google-переводчик составил, казалось бы, не очень много – порядка 10%, однако для отдельных языковых пар эффективность перевода достигла 80-90%,
вплотную приблизившись к оценкам качества человеческого перевода. «Платой» за такое качество перевода является сложность построения, обучения и перенастройки системы на основе нейросети: она занимает недели. Вообще для современных глубоких нейронных сетей, использующихся в таких крупных проектах, в порядке вещей обучение, занимающее дни и недели.

Рис. 13. Рекуррентная двунаправленная нейронная сеть Google-переводчика.

Рассмотрим LSTM-сеть переводчика (GNMT) подробнее. Нейронная сеть переводчика имеет разделение на два потока (см. рис. 13). Первый поток нейронной сети (слева) является анализирующим и состоит из восьми слоев. Данный поток помогает разбивать фразы или предложения на несколько смысловых частей, а после производит их анализ. Сеть позволяет читать предложения в двух направлениях, что помогает лучше понимать контекст. Также она занимается формированием модулей внимания, которые позволяют второму потоку определять ценности отдельно взятых смысловых фрагментов.

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

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

LSTM в «Яндекс.Алисе»

Компания «Яндекс» также использует нейросеть типа LSTM в продукте «Яндекс.Алиса». На рисунке 14 изображено взаимодействие пользователя с системой. После вопроса пользователя информация передается на сервер распознавания, где она преобразуется в текст. Затем текст поступает в классификатор интентов (интент (от англ. intent) – намерение, цель пользователя, которое он вкладывает в запрос), где при помощи машинного обучения анализируется. После анализа интентов они поступают на семантический теггер (tagger) – модель, которая позволяет выделить полезную и требующуюся информацию из предложения. Затем полученные результаты структурируются и передаются в модуль dialog manager, где обрабатывается полученная информация и генерируется ответ.

Рис. 14. Процесс работы сервиса «Яндекс.Алиса».

LSTM-сети применяются в семантическом теггере. В этом модуле используются двунаправленные LSTM с attention. На этом этапе генерируется не только самая вероятная гипотеза, потому что в зависимости от диалога могут потребоваться и другие. От состояния диалога в dialog manager происходит повторное взвешивание гипотез. Сети с долговременной памятью помогают лучше вести диалог с пользователем, потому что могут помнить предыдущие сообщения и более точно генерировать ответы, а также они помогают разрешать много проблемных ситуаций. В ходе диалога нейронная сеть может убирать слова, которые не несут никакой важной информации, а остальные анализировать и предоставлять ответ9. Для примера на рис. 14 результат работы системы будет следующим. Сначала речь пользователя в звуковом формате будет передана на сервер распознавания, который выполнит лексический анализ (т.е. переведет сказанное в текст и разобьет его на слова – лексемы), затем классификатор интентов выполнит уже роль семантического анализа (понимание смысла того, что было сказано; в данном случае – пользователя интересует погода), а семантический теггер выделит полезные элементы информации: теггер выдал бы, что завтра – это дата, на которую нужен прогноз погоды. В итоге данного анализа запроса пользователя будет составлено внутреннее представление запроса – фрейм, в котором будет указано, что интент – погода, что погода нужна на +1 день от текущего дня, а где – неизвестно. Этот фрейм попадет в диалоговый менеджер, который хранит тот самый контекст беседы и будет принимать на основе хранящегося контекста решение, что делать с этим запросом. Например, если до этого беседа не происходила, а для станции с «Яндекс.Алисой» указана геолокация г. Москва, то менеджер получит через специальный интерфейс (API) погоду на завтра в Москве, отправит команду на генерацию текста с этим прогнозом, после чего тот будет передан в синтезатор речи помощника. Если же Алиса до этого вела беседу с пользователем о достопримечательностях Парижа, то наиболее вероятно, что менеджер учтет это и либо уточнит у пользователя информацию о месте, либо сразу сообщит о погоде в Париже. Сам диалоговый менеджер работает на основе скриптов (сценариев обработки запросов) и правил, именуемых form-filling. Вот такой непростой набор технических решений, методов, алгоритмов и систем кроется за фасадом, позволяющим пользователю спросить и узнать ответ на простой бытовой вопрос или команду.

Свёрточные нейронные сети, используемые для классификации изображений, на примере Google Photos и Google Image Search

Задача классификации изображений – это получение на вход начального изображения и вывод его класса (стол, шкаф, кошка, собака и т.д.) или группы вероятных классов, которая лучше всего характеризует изображение. Для людей это совершенно естественно и просто: это один из первых навыков, который мы осваиваем с рождения. Компьютер лишь «видит» перед собой пиксели изображения, имеющие различный цвет и интенсивность. На сегодня задача классификации объектов, расположенных на изображении, является основной для области компьютерного зрения. Данная область начала активно развиваться с 1970-х, когда компьютеры стали достаточно мощными, чтобы оперировать большими объёмами данных. До развития нейронных сетей задачу классификации изображений решали с помощью специализированных алгоритмов. Например, выделение границ изображения с помощью фильтра Собеля и фильтра Шарра или использование гистограмм градиентов10. С появлением более мощных GPU, позволяющих значительно эффективнее обучать нейросеть, применение нейросетей в сфере компьютерного зрения значительно возросло.

В 1988 году Ян Лекун предложил свёрточную архитектуру нейросети, нацеленную на классификацию изображений. А в 2012 году сеть AlexNet, построенная по данной архитектуре, заняла первое место в конкурсе по распознаванию изображений ImageNet, имея ошибку распознавания равную 15,3%12. Свёрточная архитектура нейросети использует некоторые особенности биологического распознавания образов, происходящих в мозгу человека. Например, в мозгу есть некоторые группы клеток, которые активируются, если в определённое поле зрения попадает горизонтальная или вертикальная граница объекта. Данное явление обнаружили Хьюбель и Визель в 1962 году. Поэтому, когда мы смотрим на изображение, скажем, собаки, мы можем отнести его к конкретному классу, если у изображения есть характерные особенности, которые можно идентифицировать, такие как лапы или четыре ноги. Аналогичным образом компьютер может выполнять классификацию изображений через поиск характеристик базового уровня, например, границ и искривлений, а затем — с помощью построения более абстрактных концепций через группы сверточных слоев.

Рис. 15. Архитектура свёрточной сети AlexNet.

Рассмотрим подробнее архитектуру и работу свёрточной нейросети (convolution neural network) на примере нейросети AlexNet (см. рис. 15). На вход подаётся изображение 227х227 пикселей (на рисунке изображено желтым), которое необходимо классифицировать (всего 1000 возможных классов). Изображение цветное, поэтому оно разбито по трём RGB-каналам. Наиболее важная операция – операция свёртки.

Операция свёртки (convolution) производится над двумя матрицами A и B размера [axb] и [cxd], результатом которой является матрица С размера

, где s – шаг, на который сдвигают матрицу B. Вычисляется результирующая матрица следующим образом:

см. рис. 16.

Рисунок 16. Операция свёртки15: Исходная матрица A обозначена голубым цветом (имеет большую размерность), ядро свертки – матрица B — обозначена темно-синим цветом и перемещается по матрице A; результирующая матрица изображена зеленым, при этом соответствующая каждому шагу свертки результирующая ячейка отмечена темно-зеленым.

Рис. 16. Операция свёртки.

Чем больше результирующий элемент ci,j,, тем более похожа область матрицы A на матрицу B. A называют изображением, а B – ядром или фильтром. Обычно шаг смещения B равен s = 1. Если увеличить шаг смещения, можно добиться уменьшения влияния соседних пикселей друг на друга в сумме (уменьшить рецептивное поле восприятия нейросети), в подавляющем большинстве случаев шаг оставляют равным 1. На рецептивное поле также влияет и размер ядра свёртки. Как видно из рис. 16, при свёртке результат теряет в размерности по сравнению с матрицей A. Поэтому, чтобы избежать данного явления, матрицу A дополняют ячейками (padding). Если этого не сделать, данные при переходе на следующие слои будут теряться слишком быстро, а информация о границах слоя будет неточной.

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

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

Эта на первый взгляд непростая с математической точки зрения процедура нужна для выделения тех самых границ и искривлений – контуров изображения, при помощи которых, по аналогии с мозгом человека, сеть должна понять, что же изображено на картинке. Т.е. на карте признаков будут содержаться выделенные характеристические очертания детектированных объектов. Эта карта признаков будет являться результатом работы чередующихся слоев свертки и пулинга (от англ. pooling, или иначе – subsampling layers). Помните, в разделе описания концепции архитектуры сверточных сетей мы говорили, что эти слои чередуются и их наборы могут повторяться несколько раз (см. рис. 5)? Для чего это нужно? После свертки, как мы знаем, выделяются и «заостряются» некие характеристические черты анализируемого изображения (матрицы пикселей) путем увеличения значений соответствующих ядру ячеек матрицы и «занулению» значений других. При операции субдискретизации, или пулинга, происходит уменьшение размерности сформированных отдельных карт признаков. Поскольку для сверточных нейросетей считается, что информация о факте наличия искомого признака важнее точного знания его координат на изображении, то из нескольких соседних нейронов карты признаков выбирается максимальный и принимается за один нейрон уплотнённой карты признаков меньшей размерности. За счёт данной операции, помимо ускорения дальнейших вычислений, сеть становится также более инвариантной к масштабу входного изображения, сдвигам и поворотам изображений. Данное чередование слоев мы видим и для данной сети AlexNet (см. рис. 15), где слои свертки (обозначены CONV) чередуются с пулингом (обозначены эти слои как POOL), при этом следует учитывать, что операции свертки тем ресурсозатратнее, чем больше размер ядра свертки (матрицы B на рис. 16), поэтому иногда, когда требуется свертка с ядром достаточно большой размерности, ее заменяют на две и более последовательных свертки с ядром меньших
размерностей. (Об этом мы поговорим далее.) Поэтому на рис. 15 мы можем увидеть участок архитектуры AlexNet, на котором три слоя CONV идут друг за другом.

Самая интересная часть в сети – полносвязный слой в конце. В этом слое по вводным данным (которые пришли с предыдущих слоев) строится и выводится вектор длины N, где N – число классов, по которым мы бы хотели классифицировать изображение, из них программа выбирает нужный. Например, если мы хотим построить сеть по распознаванию цифр, у N будет значение 10, потому что цифр всего 10. Каждое число в этом векторе представляет собой вероятность конкретного класса. Например, если результирующий вектор для распознавания цифр это [0 0.2 0 0.75 0 0 0 0 0.05], значит существует 20% вероятность, что на изображении «1», 75% вероятность – что «3», и 5% вероятность – что «9». Если мы хотим сеть по распознаванию букв латинского алфавита, то N должно быть равным 26 (без учета регистра), а если и буквы, и цифры вместе, то уже 36. И т.д. Конечно, это очень упрощенные примеры. В сети AlexNet конечная размерность выхода (изображена на рис. 15 зеленым) — 1000, а перед этим идут еще несколько полносвязных слоев с размерностями входа 9216 и выхода 4096 и обоими параметрами 4096 (изображены оранжевым и отмечены FC – full connected — на рисунке).

Способ, с помощью которого работает полносвязный слой, – это обращение к выходу предыдущего слоя (который, как мы помним, должен выводить высокоуровневые карты свойств) и определение свойств, которые больше связаны с определенным классом. Поэтому в результате работы окончания сверточной сети по поданному на вход изображению с лужайкой, на которой, скажем, собака гоняется за птичкой, упрощенно можно сказать, что результатом может являться следующий вывод:
[dog (0.6), bird (0.35), cloud (0.05)].

Свёрточная нейронная сеть GoogleNet

В 2014 году на том же соревновании ImageNet, где была представлена AlexNet, компания Google показала свою свёрточную нейросеть под названием GoogleNet. Отличительная особенность этой сети была в том, что она использовала в 12 раз меньше параметров (почувствуйте масштабы: 5 000 000 против 60 000 000) и её архитектура структурно была не похожа на архитектуру AlexNet, в которой было восемь слоёв, причём данная сеть давала более точный результат – 6,67% ошибки против 16,4%16.

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

Проанализируем приём, на который пошли разработчики компании Google для оптимизации скорости и использования памяти. В нейросети GoogleNet свёртка с размером фильтра 7×7 используется один раз в начале обработки изображения, далее максимальный размер – 5×5. Так как количество параметров при свёртке растёт квадратично с увеличением размерности ядра, нужно стараться заменять одну свёртку на несколько свёрток с меньшим размером фильтра, вместе с этим пропустить промежуточные результаты через ReLU (функция активации, возвращающая 0, если сигнал отрицателен, и само значение сигнала, если нет), чтобы внести дополнительную нелинейность. Например, свёртку с размером фильтра 5×5 можно заменить двумя последовательными операциями с размером ядра 3×3. Такая оптимизация позволяет строить более гибкие и глубокие сети. На хранение промежуточных свёрток тратится память, и использовать их более разумно в слоях, где размер карты признаков небольшой. Поэтому в начале сети GoogleNet вместо трёх свёрток 3×3 используется одна 7×7, чтобы избежать избыточного использования памяти.

Рис. 17. Первая реализация блока Inception.

Схему архитектуры сети целиком мы приводить здесь не будем, она слишком громоздка и на ней трудно что-либо разглядеть, кому это будет интересно, могут ознакомиться с ней на официальном ресурсе16. Отличительной особенностью нейросети от компании Google является использование специального модуля – Inception (см. рис. 17). Данный модуль, по своей сути, является небольшой локальной сетью. Идея данного блока состоит в том, что на одну карту признаков накладывается сразу несколько свёрток разного размера, вычисляющихся параллельно. В конце все свёртки объединяются в единый блок. Таким образом, можно из исходной карты признаков извлечь признаки разного размера, увеличив эффективность сети и точность обработки признаков. Однако при использовании данной реализации (см. рис. 17) нужно выполнить колоссальный объём вычислений, между тем, при включении данных модулей друг за другом размерность блока будет только расти. Поэтому разработчики во второй версии добавили свёртки, уменьшающие размерность (см. рис. 18).

Рис. 18. Вторая реализация блока Inception.

Жёлтые свёртки размера 1×1 введены для уменьшения глубины блоков, и благодаря им, значительно снижается нагрузка на память. GoogleNet содержит девять таких Inception-модулей и состоит из 22 слоёв.

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

Рис. 19. Вспомогательный модуль GoogleNet, использующийся при обучении сети.

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

В 2015 году разработчики из Google представили модифицированный модуль Inception v2, в котором свёртка 5×5 была заменена на две свёртки 3×3, по причинам, приведённым выше, вдобавок потери информации в картах признаков при таком действии происходят незначительные, так как соседние ячейки имеют между собой сильную корреляционную связь. Также, если заменить свёртку 3×3 на две последовательные свёртки 3×1 и 1×3, то это будет на 33% эффективнее, чем стандартная свёртка, а две свёртки 2×2 дадут выигрыш лишь в 11%17. Данная архитектура нейросети давала ошибку 5,6%, а потребляла ресурсов в 2,5 раза меньше.

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

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

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

К недостаткам данной архитектуры можно отнести следующие: состав сети (количество её слоёв, функция активации, размерность свёрток, размерность pooling-слоёв, очередность слоёв и т.п.) необходимо подбирать эмпирически к определённому размеру и виду
изображения; сложность обучения: нейросети с хорошим показателем ошибки должны тренироваться на мощных GPU долгое время; и, наверное, главный недостаток – атаки на данные нейросети. Инженеры Google в 2015 году показали, что к картинке можно подмешать невидимый для человеческого зрения градиент, который приведёт к неправильной классификации.

7 шалостей с нейросетями: алгоритмы ищут пьяных, гоняют котов, сочиняют песни

Интригующие заголовки, речи «под Обаму» и машинный «Гарри Поттер»

Норвежский программист Ларс Эйднес решил добавить компьютеру творческую искру. Для начала он научил нейронную сеть писать броские интернет-заголовки в духе «Семь секретов долголетия, о которых молчат тибетские ламы». Для этого он загрузил примерно 2 млн примеров с сайтов — корифеев жанра: BuzzFeed, Gawker, Jezebel, The Huffington Post и Upworthy. После тренировки сеть стала выдавать заголовки, в большинстве из которых была верная грамматика, а кое-где даже мелькал смысл. Потом Эйднес запустил целый новостной сайт, целиком написанный нейронными сетями. Новые заметки на нем выходят раз в 20 минут, а главная страница формируется исходя из просмотров статей и голосов читателей. Сегодня Click-o-Tron передает, что Джеймс Кэмерон защищает возможные проблемы с геями, Майли Сайрус исполнилось 13 лет, и вдобавок предлагает почитать о 16 самых подходящих городах для ресторана на кухне.

Что-то подобное проделал и журналист технологического сайта Engadget Аарон Суппурис. Он запрограммировал бота на основе той же нейронной сети, что была у Эйднеса, и загрузил туда тексты Engadget. К третьей версии бот научился копировать стилистику авторов сайта и выдавал более-менее вразумительные заметки. Правда, Суппурис полагает, что без чудесных инноваций нейронные сети никогда не заменят живого журналиста, зато пригодятся как удобный вспомогательный инструмент.

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

Нейронные сети научились лучше искать сужения кровеносных сосудов



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


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


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


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


Сравнение параметров нескольких нейросетей показало, что самая точная нейросеть может анализировать по три картинки в секунду с точностью 95 процентов, а самая быстрая обрабатывает по 38 изображений в секунду с точностью 83 процента. Оптимальным вариантом оказалась нейросеть, за секунду анализирующая по десять снимков с точностью 94 процента. В зависимости от нужд оператора можно использовать как более быстрые, так и более точные модели.




«Данные исследования, помимо обнаружения стенозов, могут быть использованы для автоматизированной оценки степени поражений и гемодинамики артерий сердца. Архитектура нейросети и использованные методы машинного обучения позволили добиться 95-процентной точности при работе в реальном времени. В дальнейшем мы планируем разработать программу, чтобы направлять действия хирургов во время имплантации биопротеза клапана аорты», — поделился Евгений Овчаренко, кандидат технических наук, руководитель проекта по гранту РНФ, заведующий лабораторией новых биоматериалов Научно-исследовательского института комплексных проблем сердечно-сосудистых заболеваний.




В коллектив авторов работы вошли Владимир Ганюков, Кирилл Клышников, Антон Кутихин и Евгений Овчаренко из НИИ Комплексных проблем сердечно-сосудистых заболеваний, Ольга Гергет и Вячеслав Данилов из Томского политехнического университета и сотрудник Университета Лидса Алехандро Франжи.


нейронных сетей для начинающих: популярные типы и приложения | by Jay Shah

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

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

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

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

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

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

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

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

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

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

Автоэнкодеры

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

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

Давайте рассмотрим два интересных практических применения автокодировщиков:

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

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

Уменьшение размерности для визуализации данных пытается уменьшить размерность с помощью таких методов, как анализ основных компонентов (PCA) и t-распределенное стохастическое соседнее встраивание (t-SNE).Они использовались в сочетании с обучением нейронной сети для повышения точности прогнозирования модели. Кроме того, точность прогнозирования нейронной сети MLP сильно зависела от архитектуры нейронной сети, предварительной обработки данных и типа проблемы, для решения которой была разработана сеть.

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

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

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

Источник иллюстраций

Калибровочные сети также были добавлены в каскад для ускорения обнаружения и улучшения качества ограничивающей рамки.

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

Обсуждения:
Hacker News (63 балла, 8 комментариев), Reddit r / programming (312 баллов, 37 комментариев)

Переводы: Испанский, Французский

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

Мотивация

Я не специалист по машинному обучению. По образованию я инженер-программист и мало общался с ИИ.Я всегда хотел глубже погрузиться в машинное обучение, но так и не смог найти то, что мне нужно. Вот почему, когда в ноябре 2015 года Google открыл TensorFlow, я был очень взволнован и понял, что пора начать обучение. Не звучит драматично, но для меня это было похоже на то, как Прометей передает человечеству огонь с Олимпа машинного обучения. У меня в голове была идея, что вся область больших данных и технологий, таких как Hadoop, значительно ускорилась, когда исследователи Google выпустили свой документ Map Reduce.На этот раз это не бумага, а реальное программное обеспечение, которое они используют внутри компании после многих лет эволюции.

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

Начните здесь

Начнем с простого примера. Допустим, вы помогаете другу, который хочет купить дом. Ей было предложено 400000 долларов за дом площадью 2000 квадратных футов (185 метров). Это хорошая цена или нет?

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

Площадь (кв.м) (x) Цена (у)
2,104 399 900
1,600 329 900
2,400 369 000

Лично я первым делом хотел получить среднюю цену за квадратный фут.Получается 180 долларов за кв. Фут.

Добро пожаловать в вашу первую нейронную сеть! Сейчас он еще не совсем на уровне Siri, но теперь вы знаете фундаментальный строительный блок. А это выглядит так:

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

Умножение 2000 квадратных футов на 180 дает нам 360 000 долларов.Вот и все, что нужно сделать на этом уровне. Расчет прогноза — это простое умножение. Но перед этим нам нужно было подумать о весе, на который мы будем умножать. Здесь мы начали со среднего, позже мы рассмотрим более совершенные алгоритмы, которые можно масштабировать по мере того, как мы получаем больше входных данных и более сложные модели. Определение веса — это наш «тренировочный» этап. Поэтому всякий раз, когда вы слышите о том, что кто-то «тренирует» нейронную сеть, это просто означает нахождение весов, которые мы используем для расчета прогноза.

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

Давайте визуализируем этот процесс (для простоты переключим нашу единицу цены с 1 доллара на 1000 долларов. Теперь наш вес равен 0,180, а не 180):

Жестче, лучше, быстрее, сильнее

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

Немного желтого. Желтый — это плохо. Желтый — ошибка. Мы хотим уменьшить желтый цвет, насколько это возможно.

Площадь (x) Цена (1000 $) (г_) Прогноз (г) г_ (г_-г) ²
2,104 399.9 379 21 449
1,600 329,9 288 42 1756
2,400 369 432-63 3969
Среднее: 2,058

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

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

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

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

Наши линии могут лучше аппроксимировать наши значения теперь, когда мы добавили это значение b к формуле линии. В этом контексте мы называем это «предвзятостью». Это делает нашу нейронную сеть такой:

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

На этом графике W и b — это значения, которые мы находим в процессе обучения.X — это входные данные, которые мы подставляем в формулу (в нашем примере площадь в квадратных футах). Y — прогнозируемая цена.

При вычислении прогноза теперь используется эта формула:

Итак, наша текущая модель вычисляет прогнозы, подставляя площадь дома как x в эту формулу:

Приручите дракона

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

Автоматика

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

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

Как градиентный спуск узнает, где должен быть следующий шаг? Исчисление. Видите ли, зная функцию, которую мы минимизируем (наша функция потерь, среднее значение (y_ — y) ² для всех наших точек данных), и зная текущие входные данные в нее (текущий вес и смещение), производные от Функция потерь сообщает нам, в каком направлении нужно сдвинуть W и b, чтобы минимизировать ошибку.

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

А потом было два

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

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

Площадь (кв.м) (x1) Ванные комнаты (x2) Цена (у)
2,104 3 399 900
1,600 3 329 900
2,400 3 369 000
1,416 2 232 000
3 000 4 539 900
1,985 4 299 900
1,534 3 314 900
1,427 3 198 999
1,380 3 212 000
1,494 3 242 500

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

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

Расчет Y выглядит так:

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

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

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

Характеристики

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

Здесь важно отметить, что мы не скармливаем сети вслепую все, что знаем о наших примерах. Мы должны быть избирательны в том, какие функции мы добавляем в модель. Выбор / обработка функций — это целая дисциплина со своим собственным набором передовых практик и соображений. Если вы хотите увидеть пример процесса изучения набора данных, чтобы выбрать, какие функции использовать в модели прогнозирования, посмотрите «Путешествие через Титаник». Это записная книжка, в которой Омар Эль Габри описывает свой процесс решения проблемы Титаника Каггла.Kaggle предоставляет доступ к манифесту пассажира Титаника, включая такие данные, как имя, пол, возраст, каюта, а также выжил человек или нет. Задача состоит в том, чтобы построить модель, которая предсказывает, выжил человек или нет, учитывая другую информацию.

Классификация

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

Площадь (кв.м) (x1) Ванные комнаты (x2) Наклейка (у)
2,104 3 Хорошо
1,600 3 Хорошо
2,400 3 Хорошо
1,416 2 Плохо
3 000 4 Плохо
1,985 4 Хорошо
1,534 3 Плохо
1,427 3 Хорошо
1,380 3 Хорошо
1,494 3 Хорошо

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

Все нейронные сети, с которыми мы экспериментировали до сих пор, выполняют «регрессию» — они вычисляют и выводят «непрерывное» значение (на выходе может быть 4 или 100.6, или 2143.342343). Однако на практике нейронные сети чаще используются в задачах типа «классификация». В этих задачах вывод нейронной сети должен быть из набора дискретных значений (или «классов»), таких как «Хорошо» или «Плохо». Как это работает на практике, так это то, что у нас будет модель, которая скажет, что она на 75% уверена, что дом «хороший», а не просто выплюнет «хороший» или «плохой».

Приложение TensorFlow, которое я обсуждал в своем предыдущем посте, является хорошим примером модели классификации на практике.

Один из способов преобразовать рассмотренную нами сеть в классификационную сеть — это заставить ее выводить два значения — по одному для каждого класса (наши классы теперь «хорошие» и «плохие»). Затем мы передаем эти значения через операцию под названием «softmax». Результатом softmax является вероятность каждого класса. Например, скажем, что уровень сети выводит 2 для «хорошо» и 4 для «плохо», если мы передадим [2, 4] в softmax, он вернет [0.11, 0.88] в качестве вывода. Что переводит значения, чтобы сказать, что сеть на 88% уверена, что введенное значение «плохое» и нашему другу не понравится этот дом.

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

выход
softmax ([1]) [1]
softmax ([1, 1]) [0.5, 0,5]
softmax ([0, 1]) [0,26, 0,73]
softmax ([2, 4]) [0,11, 0,88]
softmax ([5, 10]) [0,007, 0,993]
softmax ([-1, 0, 1]) [0,09, 0,24, 0,66]
softmax ([1, 2, 4]) [0,04, 0,11, 0,84]

Как вы можете видеть в последних двух строках, softmax распространяется на любое количество входов.Итак, теперь, если наш друг добавит третий ярлык (скажем: «Хорошо, но мне нужно сделать Airbnb одну комнату»), softmax масштабируется в соответствии с этим изменением.

Найдите секунду, чтобы изучить форму сети, варьируя количество функций (x1, x2, x3… и т. Д.) (Это может быть площадь, количество ванных комнат, цена, близость к школе / работе… и т. Д.) И варьировать количество классов (y1, y2, y3… и т. д.) (которые могут быть «слишком дорого», «выгодно», «хорошо, если я использую airbnb», «слишком мало»):

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

Истинная мотивация

Если вы зашли так далеко, я должен раскрыть вам еще одну мою мотивацию написать этот пост. Этот пост задуман как еще более мягкое введение в учебные пособия по TensorFlow. Если вы начнете работать с MNIST For ML Beginners сейчас и натолкнетесь на этот график:

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

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

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

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

Отличные учебные ресурсы включают:

Благодарности

Благодарю Ясмин Альфузан, Аммар Аламмар, Халид Алнуайм, Фахад Альхазми, Мазен Мелибари и Хадил Аль-Негхеймиш за их помощь в рассмотрении предыдущих версий этого поста.

Пожалуйста, свяжитесь со мной в Твиттере с любыми исправлениями или отзывами.

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

Как разновидность искусственного интеллекта, глубокое обучение лежит в основе различных инноваций: беспилотных автомобилей, обработки естественного языка, распознавания изображений и так далее. Компании, которые поставляют решения DL (такие как Amazon, Tesla, Salesforce), находятся в авангарде фондовых рынков и привлекают впечатляющие инвестиции. По данным Statista, общий объем финансирования стартапов в области искусственного интеллекта во всем мире в 2014–2019 годах составляет более 26 миллиардов долларов.Такой высокий интерес можно объяснить удивительными преимуществами глубокого обучения и его архитектур — искусственных нейронных сетей.

Что такое глубокое обучение?

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

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

Основные архитектуры глубокого обучения:

  • Сверточные нейронные сети
  • Рекуррентные нейронные сети
  • Генеративные состязательные сети
  • Рекурсивные нейронные сети

Мы поговорим о них подробнее позже в этом тексте.

Разница между машинным обучением и глубоким обучением

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

Однако с глубоким обучением все обстоит иначе:

Алгоритм

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

Преимущества глубокого обучения

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

  • В 2015 году группа инженеров Google проводила исследование того, как NN выполняет задачи классификации. Случайно они также заметили, что нейронные сети могут галлюцинировать и производить довольно интересное искусство.
  • Способность определять закономерности и аномалии в больших объемах необработанных данных позволяет глубокому обучению эффективно предоставлять точные и надежные результаты анализа профессионалам. Например, у Amazon более 560 миллионов товаров на сайте и 300+ миллионов пользователей.Ни один бухгалтер-человек или даже целая армия бухгалтеров не сможет отслеживать такое количество транзакций без инструмента искусственного интеллекта.
  • Глубокое обучение не так сильно зависит от человеческого опыта, как традиционное машинное обучение. DL позволяет нам делать открытия в данных, даже когда разработчики не уверены, что они пытаются найти. Например, вы хотите, чтобы ваши алгоритмы могли предсказывать удержание клиентов, но вы не уверены, какие характеристики клиента позволят системе сделать это предсказание.

Проблемы глубокого обучения

  • Сбор больших объемов качественных данных требует значительных ресурсов. В течение многих лет самой большой и лучше всего подготовленной коллекцией образцов была ImageNet с 14 миллионами различных изображений и более чем 20 000 категорий. Она была основана в 2012 году, и только в прошлом году Tencent выпустила более крупную и универсальную базу данных.
  • Еще одна сложность технологии глубокого обучения заключается в том, что она не может обосновать свои выводы.Следовательно, трудно оценить производительность модели, если вы не знаете, каким должен быть результат. В отличие от традиционного машинного обучения, вы не сможете протестировать алгоритм и выяснить, почему ваша система решила, что, например, на картинке изображен кот, а не собака.
  • Создание алгоритмов глубокого обучения очень дорого. Это невозможно без квалифицированного персонала, обученного работе со сложной математикой. Более того, глубокое обучение — это ресурсоемкая технология.Для обучения моделей требуются мощные графические процессоры и много памяти. Требуется много памяти для хранения входных данных, весовых параметров и функций активации, когда входные данные распространяются по сети. Иногда алгоритмы глубокого обучения становятся настолько энергоемкими, что исследователи предпочитают использовать другие алгоритмы, даже жертвуя точностью прогнозов.

Однако во многих случаях глубокое обучение невозможно заменить.

Как можно применить DL к реальным проблемам?

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

  • Распознавание речи. Все основные коммерческие системы распознавания речи (такие как Microsoft Cortana, Alexa, Google Assistant, Apple Siri) основаны на глубоком обучении.
  • Распознавание образов. Системы распознавания образов уже способны давать более точные результаты, чем человеческий глаз, в медицинской диагностике.
  • Обработка естественного языка. Нейронные сети использовались для реализации языковых моделей с начала 2000-х годов. Изобретение LSTM помогло улучшить машинный перевод и языковое моделирование.
  • Открытие новых лекарств. Например, нейронная сеть AtomNet использовалась для предсказания новых биомолекул, которые потенциально могут лечить такие болезни, как лихорадка Эбола и рассеянный склероз.
  • Рекомендательные системы. Сегодня глубокое обучение используется для изучения предпочтений пользователей во многих областях. Netflix — один из ярких примеров в этой области.

Что такое искусственные нейронные сети?

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

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

Определение ИНС

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

ИНС может иметь миллионы нейронов, соединенных в одну систему, что делает ее чрезвычайно успешной при анализе и даже запоминании различной информации.

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

Компоненты нейронных сетей

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

Нейроны

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

Все нейроны в сети делятся на три группы:

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

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

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

Подождите, а как нейроны общаются? Через синапсы.

Синапсы и веса

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

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

Смещение

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

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

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

Как работают ИНС

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

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

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

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

Как тренировать алгоритм?

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

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

Итерация

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

Эпоха

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

Партия

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

В чем разница между итерацией и эпохой?

  • одна эпоха — это один проход вперед и один проход назад всех обучающих примеров;
  • количество итераций — это количество проходов, каждый проход использует [размер пакета] количество примеров.Чтобы было ясно, один проход равен одному проходу вперед + одному проходу назад (мы не считаем прямой проход и обратный проход как два разных прохода).

А что с ошибками?

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

Ошибка может быть вычислена по-разному, но мы рассмотрим только два основных способа: Arctan и среднеквадратичную ошибку.2} {n} $

Какие существуют нейронные сети?

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

Нейронные сети с прямой связью

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

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

Рекуррентные нейронные сети

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

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

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

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

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

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

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

Чтобы узнать, как работают сверточные нейронные сети, посмотрите это видео Луиса Серрано.

Генеративные состязательные нейронные сети

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

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

Какие проблемы решают сетевые сети?

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

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

Сводка

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

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

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

Что такое нейронные сети? Определение и примеры

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

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

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

Машинное обучение и искусственный интеллект

Машинное обучение является частью ИИ (искусственного интеллекта).Люди обладают способностью «учиться на собственном опыте», термин «машинное обучение» относится к этой способности, когда она существует в машинах.

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

Алгоритмы нейронной сети «учатся» выполнять задачи, рассматривая и анализируя новые данные. Обычно они получают знания, не будучи запрограммированными на это. Другими словами, они улучшаются сами по себе.

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

Нейронные сети — пример машинного обучения

Алгоритмы нейронной сети могут научиться определять фотографии, на которых изображены собаки, путем анализа примеров изображений с метками на них. У некоторых есть этикетка «собака» , а у других метка «без собаки».’

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

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

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

Три способа обучения нейронных сетей

Нейронные сети могут обучаться одним из трех способов:

  • Supervised Learning — набор входов и выходов подается на алгоритмы. Затем они предсказывают результаты после обучения тому, как интерпретировать данные.
  • Обучение без учителя — обучение происходит без помощи человека. Алгоритмы используют данные, которые не маркируются и не классифицируются.Они действуют на основе этих данных без руководства.
  • Обучение с подкреплением — включает в себя соответствующие действия для максимизации вознаграждения в конкретной ситуации. Алгоритмы учатся в зависимости от обратной связи, которую вы им даете. Это немного похоже на помощь кому-то найти что-то, говоря им, становится ли им теплее или холоднее.

Видео — что такое искусственный интеллект

Это видео Market Business News дает краткое и простое объяснение ИИ.


Определение нейронной сети | DeepAI

Что такое нейронная сеть?

Искусственная нейронная сеть , алгоритм обучения , или нейронная сеть , , или просто нейронная сеть

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

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

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

Как работает нейронная сеть?

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

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

(изображение взято из Google Tech Talk Джеффа Дина в кампусе Сеула 7 марта 2016 г.)

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

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

Приложения нейронных сетей

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

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

Машинное обучение

для начинающих: введение в нейронные сети

Вот кое-что, что может вас удивить: нейронные сети не такие уж сложные! Термин «нейронная сеть» часто используется как модное слово, но на самом деле они часто намного проще, чем люди думают.

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

Приступим!

1. Строительные блоки: нейроны

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

Здесь происходит 3 вещи. Сначала каждый вход умножается на вес:

.
x1 → x1 ∗ w1x_1 \ rightarrow x_1 * w_1x1 → x1 ∗ w1
x2 → x2 ∗ w2x_2 \ стрелка вправо x_2 * w_2x2 → x2 ∗ w2

Затем все взвешенные входы складываются вместе со смещением bbb:

(x1 ∗ w1) + (x2 ∗ w2) + b (x_1 * w_1) + (x_2 * w_2) + b (x1 ∗ w1) + (x2 ∗ w2) + b

Наконец, сумма передается через функцию активации:

y = f (x1 ∗ w1 + x2 ∗ w2 + b) y = f (x_1 * w_1 + x_2 * w_2 + b) y = f (x1 ∗ w1 + x2 ∗ w2 + b)

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

Сигмоидальная функция выводит числа только в диапазоне (0,1) (0, 1) (0,1). Вы можете думать об этом как о сжатии (−∞, + ∞) (- \ infty, + \ infty) (- ∞, + ∞) до (0,1) (0, 1) (0,1) — больших отрицательных чисел становятся ~ 000, а большие положительные числа становятся ~ 111.

Простой пример

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

w = [0,1] w = [0, 1] w = [0,1]
б = 4б = 4б = 4

w = [0,1] w = [0, 1] w = [0,1] — это просто способ записи w1 = 0, w2 = 1w_1 = 0, w_2 = 1w1 = 0, w2 = 1 в векторная форма.Теперь давайте дадим нейрону входное значение x = [2,3] x = [2, 3] x = [2,3]. Мы будем использовать скалярное произведение, чтобы писать более кратко:

(w⋅x) + b = ((w1 ∗ x1) + (w2 ∗ x2)) + b = 0 ∗ 2 + 1 ∗ 3 + 4 = 7 \ begin {align}
(w \ cdot x) + b & = ((w_1 * x_1) + (w_2 * x_2)) + b \\
& = 0 * 2 + 1 * 3 + 4 \\
& = 7 \\
\ end {align} (w⋅x) + b = ((w1 ∗ x1) + (w2 ∗ x2)) + b = 0 ∗ 2 + 1 ∗ 3 + 4 = 7
y = f (w⋅x + b) = f (7) = 0,999 y = f (w \ cdot x + b) = f (7) = \ в коробке {0,999} y = f (w⋅x + b) = f (7) = 0,999

Нейрон выдает 0,9990,9990,999 при входных данных x = [2,3] x = [2, 3] x = [2,3].Это оно! Этот процесс передачи входных данных вперед для получения выходных данных известен как с прямой связью .

Кодирование нейрона

Пора реализовать нейрон! Мы будем использовать NumPy, популярную и мощную вычислительную библиотеку для Python, чтобы помочь нам в математических вычислениях:

  импортировать numpy как np

def сигмоид (x):
  
  возврат 1 / (1 + np.exp (-x))

класс Neuron:
  def __init __ (self, weights, bias):
    self.weights = веса
    self.bias = предвзятость

  def feedforward (себя, входы):
    
    всего = np.точка (собственный вес, входные данные) + self.bias
    возвратная сигмовидная (всего)

веса = np.array ([0, 1])
смещение = 4
n = нейрон (веса, смещение)

x = np.array ([2, 3])
печать (n.feedforward (x))  

Узнаете эти числа? Это тот пример, который мы только что сделали! Мы получаем тот же ответ 0,9990,9990,999.

2. Объединение нейронов в нейронную сеть

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

Эта сеть имеет 2 входа: скрытый слой с 2 ​​нейронами (h2h_1h2 и h3h_2h3) и выходной слой с 1 нейроном (o1o_1o1).Обратите внимание, что входы для o1o_1o1 — это выходы из h2h_1h2 и h3h_2h3 — вот что делает эту сеть.

Скрытый слой — это любой слой между входным (первым) и выходным (последним) слоями. Может быть несколько скрытых слоев!

Пример: прогнозирование

Давайте воспользуемся схемой, изображенной выше, и предположим, что все нейроны имеют одинаковые веса w = [0,1] w = [0, 1] w = [0,1], одинаковое смещение b = 0b = 0b = 0 и та же функция активации сигмовидной кишки.Пусть h2, h3, o1h_1, h_2, o_1h2, h3, o1 обозначают выходы нейронов, которые они представляют.

Что произойдет, если мы передадим на вход x = [2,3] x = [2, 3] x = [2,3]?

h2 = h3 = f (w⋅x + b) = f ((0 ∗ 2) + (1 ∗ 3) +0) = f (3) = 0,9526 \ begin {выровнено}
h_1 = h_2 & = f (w \ cdot x + b) \\
& = f ((0 * 2) + (1 * 3) + 0) \\
& = f (3) \\
& = 0,9526 \\
\ end {align} h2 = h3 = f (w⋅x + b) = f ((0 ∗ 2) + (1 ∗ 3) +0) = f (3) = 0,9526.
o1 = f (w⋅ [h2, h3] + b) = f ((0 ∗ h2) + (1 ∗ h3) +0) = f (0,9526) = 0,7216 \ begin {align}
o_1 & = f (w \ cdot [h_1, h_2] + b) \\
& = f ((0 * h_1) + (1 * h_2) + 0) \\
& = f (0.9526) \\
& = \ в коробке {0,7216} \\
\ end {align} o1 = f (w⋅ [h2, h3] + b) = f ((0 ∗ h2) + (1 ∗ h3) +0) = f (0,9526) = 0,7216. Взаимодействие с другими людьми

Выход нейронной сети для входа x = [2,3] x = [2, 3] x = [2,3] составляет 0,72160,72160,7216. Довольно просто, правда?

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

Кодирование нейронной сети: прямая связь

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

  импортировать numpy как np



класс OurNeuralNetwork:
  '' '
  Нейронная сеть с:
    - 2 входа
    - скрытый слой с 2 ​​нейронами (h2, h3)
    - выходной слой с 1 нейроном (o1)
  Каждый нейрон имеет одинаковые веса и смещения:
    - w = [0, 1]
    - b = 0
  '' '
  def __init __ (сам):
    веса = np.массив ([0, 1])
    смещение = 0

    
    self.h2 = Нейрон (веса, смещение)
    self.h3 = Нейрон (веса, смещение)
    self.o1 = нейрон (веса, смещение)

  def feedforward (self, x):
    out_h2 = self.h2.feedforward (x)
    out_h3 = self.h3.feedforward (x)

    
    out_o1 = self.o1.feedforward (np.array ([out_h2, out_h3]))

    return out_o1

network = OurNeuralNetwork ()
x = np.array ([2, 3])
печать (network.feedforward (x))  

Опять получилось 0.72160.72160.7216! Похоже, работает.

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

3. Обучение нейронной сети, часть 1

Допустим, у нас есть следующие размеры:

Имя Вес (фунты) Высота (дюймы) Пол
Алиса 133 65 F
Боб 160 72 M
Чарли 152 70 M
Диана 120 60 F

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

Мы представим мужчину цифрой 000 и женщину 111, а также изменим данные, чтобы упростить использование:

Имя Вес (минус 135) Рост (минус 66) Пол
Алиса-2-1 1
Боб 25 6 0
Чарли 17 4 0
Диана-15-6 1

Я произвольно выбрал количество смен (135135135 и 666666), чтобы числа выглядели красиво.2MSE = n1 i = 1∑n (ytrue −ypred) 2

Давайте разберемся:

  • nnn — это количество выборок, равное 444 (Алиса, Боб, Чарли, Диана).
  • ггг представляет собой прогнозируемую переменную, т. Е. Пол.
  • ytruey_ {true} ytrue — это истинное значение переменной («правильный ответ»). Например, ytruey_ {true} ytrue для Алисы будет 111 (женщина).
  • ypredy_ {pred} ypred — это предсказанное значение переменной. Это то, что выводит наша сеть.2 (ytrue −ypred) 2 известен как ошибка в квадрате . Наша функция потерь просто берет среднее значение по всем квадратам ошибок (отсюда и название означает квадратичную ошибку). Чем лучше наши прогнозы, тем меньше будут наши потери!

    Лучшие прогнозы = меньшие потери.

    Обучение сети = попытка минимизировать ее потери.

    Пример расчета убытков

    Допустим, наша сеть всегда выводит 000 — другими словами, она уверена, что все люди — мужчины 🤔.2 (ytrue −ypred) 2 Алиса 1 0 1 Боб 0 0 0 Чарли 0 0 0 Diana 1 0 1

    MSE = 14 (1 + 0 + 0 + 1) = 0,5 \ text {MSE} = \ frac {1} {4} ( 1 + 0 + 0 + 1) = \ в штучной упаковке {0,5} MSE = 41 (1 + 0 + 0 + 1) = 0,5

    Код: MSE Loss

    Вот код для расчета убытков:

      импортировать numpy как np
    
    def mse_loss (y_true, y_pred):
      
      возврат ((y_true - y_pred) ** 2).иметь в виду()
    
    y_true = np.array ([1, 0, 0, 1])
    y_pred = np.array ([0, 0, 0, 0])
    
    печать (mse_loss (y_true, y_pred))  

    Если вы не понимаете, почему этот код работает, прочтите краткое руководство NumPy по операциям с массивами.

    Ницца. Вперед!

    4. Обучение нейронной сети, часть 2

    Теперь у нас есть четкая цель: минимизировать потери нейронной сети. 2 \\
    \ end {align} MSE = 11 i = 1∑1 (ytrue −ypred) 2 = (ytrue −ypred) 2 = (1 − ypred) 2

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

    .

    Тогда мы можем записать потерю как многомерную функцию:

    L (w1, w2, w3, w4, w5, w6, b1, b2, b3) L (w_1, w_2, w_3, w_4, w_5, w_6, b_1, b_2, b_3) L (w1, w2, w3 , w4, w5, w6, b1, b2, b3)

    Представьте, что мы хотим настроить w1w_1w1. Как изменится потеря LLL, если мы изменим w1w_1w1? На этот вопрос может ответить частная производная ∂L∂w1 \ frac {\ partial L} {\ partial w_1} ∂w1 ∂L. Как рассчитать?

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

    Для начала давайте перепишем частную производную в терминах ∂ypred∂w1 \ frac {\ partial y_ {pred}} {\ partial w_1} ∂w1 ∂ypred вместо этого:

    ∂L∂w1 = ∂L∂ypred ∗ ∂ypred∂w1 \ frac {\ partial L} {\ partial w_1} = \ frac {\ partial L} {\ partial y_ {pred}} * \ frac {\ partial y_ { пред}} {\ partial w_1} ∂w1 ∂L = ∂ypred ∂L ∗ ∂w1 ∂ypred
    Это работает из-за правила цепочки. 2} {\ partial y_ {pred}} = \ boxed {-2 (1 — y_ {pred})} ∂ypred ∂L = ∂ypred ∂ (1 − ypred) 2 = −2 ( 1-год)

    Теперь давайте выясним, что делать с ∂ypred∂w1 \ frac {\ partial y_ {pred}} {\ partial w_1} ∂w1 ∂ypred.Как и раньше, пусть h2, h3, o1h_1, h_2, o_1h2, h3, o1 будут выходами нейронов, которые они представляют. Тогда

    ypred = o1 = f (w5h2 + w6h3 + b3) y_ {pred} = o_1 = f (w_5h_1 + w_6h_2 + b_3) ypred = o1 = f (w5 h2 + w6 h3 + b3)
    е — функция активации сигмовидной кишки, помните?

    Поскольку w1w_1w1 влияет только на h2h_1h2 (не на h3h_2h3), мы можем написать

    ∂ypred∂w1 = ∂ypred∂h2 ∗ ∂h2∂w1 \ frac {\ partial y_ {pred}} {\ partial w_1} = \ frac {\ partial y_ {pred}} {\ partial h_1} * \ frac {\ частичный h_1} {\ partial w_1} ∂w1 ∂ypred = ∂h2 ∂ypred ∗ ∂w1 ∂h2
    ∂ypred∂h2 = w5 ∗ f ′ (w5h2 + w6h3 + b3) \ frac {\ partial y_ {pred}} {\ partial h_1} = \ boxed {w_5 * f ‘(w_5h_1 + w_6h_2 + b_3)} ∂h2 ∂ypred = w5 ∗ f ′ (w5 h2 + w6 h3 + b3)
    Больше цепного правила.

    Проделаем то же самое для ∂h2∂w1 \ frac {\ partial h_1} {\ partial w_1} ∂w1 ∂h2:

    h2 = f (w1x1 + w2x2 + b1) h_1 = f (w_1x_1 + w_2x_2 + b_1) h2 = f (w1 x1 + w2 x2 + b1)
    ∂h2∂w1 = x1 ∗ f ′ (w1x1 + w2x2 + b1) \ frac {\ partial h_1} {\ partial w_1} = \ boxed {x_1 * f ‘(w_1x_1 + w_2x_2 + b_1)} ∂w1 ∂h2 = X1 ∗ f ′ (w1 x1 + w2 x2 + b1)
    Как вы уже догадались, правило цепочки. 2} = f (x) * (1 — f (x)) f ′ (x) = (1 + e − x) 2e − x = f (x) ∗ (1 −f (x))

    Мы будем использовать эту красивую форму для f ′ (x) f ‘(x) f ′ (x) позже.

    Готово! Нам удалось разбить ∂L∂w1 \ frac {\ partial L} {\ partial w_1} ∂w1 ∂L на несколько частей, которые мы можем вычислить:

    ∂L∂w1 = ∂L∂ypred ∗ ∂ypred∂h2 ∗ ∂h2∂w1 \ boxed {\ frac {\ partial L} {\ partial w_1} = \ frac {\ partial L} {\ partial y_ {pred}} * \ frac {\ partial y_ {pred}} {\ partial h_1} * \ frac {\ partial h_1} {\ partial w_1}} ∂w1 ∂L = ∂ypred ∂L ∗ ∂h2 ∂ypred ∗ ∂w1 ∂h2

    Эта система вычисления частных производных путем работы в обратном направлении известна как обратное распространение , или «обратное распространение».

    Уф. Это было много символов — ничего страшного, если вы еще немного запутались. Давайте рассмотрим пример, чтобы увидеть это в действии!

    Пример: расчет частной производной

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

    Имя Вес (минус 135) Высота (минус 66) Пол
    Алиса-2-1 1

    Давайте инициализируем все веса до 111 и все смещения до 000.Если мы сделаем прямой проход через сеть, мы получим:

    h2 = f (w1x1 + w2x2 + b1) = f (−2 + −1 + 0) = 0,0474 \ begin {выровнено}
    h_1 & = f (w_1x_1 + w_2x_2 + b_1) \\
    & = f (-2 + -1 + 0) \\
    & = 0,0474 \\
    \ end {align} h2 = f (w1 x1 + w2 x2 + b1) = f (−2 + −1 + 0) = 0,0474
    h3 = f (w3x1 + w4x2 + b2) = 0,0474h_2 = f (w_3x_1 + w_4x_2 + b_2) = 0,0474h3 = f (w3 x1 + w4 x2 + b2) = 0,0474
    o1 = f (w5h2 + w6h3 + b3) = f (0,0474 + 0,0474 + 0) = 0,524 \ begin {выровнено}
    o_1 & = f (w_5h_1 + w_6h_2 + b_3) \\
    & = f (0,0474 + 0,0474 + 0) \\
    & = 0,524 \\
    \ end {align} o1 = f (w5 h2 + w6 h3 + b3) = f (0.0474 + 0,0474 + 0) = 0,524

    Сеть выводит ypred = 0,524y_ {pred} = 0,524ypred = 0,524, что не слишком благоприятно для Male (000) или Female (111). Вычислим ∂L∂w1 \ frac {\ partial L} {\ partial w_1} ∂w1 ∂L:

    ∂L∂w1 = ∂L∂ypred ∗ ∂ypred∂h2 ∗ ∂h2∂w1 \ frac {\ partial L} {\ partial w_1} = \ frac {\ partial L} {\ partial y_ {pred}} * \ frac {\ partial y_ {pred}} {\ partial h_1} * \ frac {\ partial h_1} {\ partial w_1} ∂w1 ∂L = ∂ypred ∂L ∗ ∂h2 ∂ypred ∗ ∂w1 ∂h2
    ∂L∂ypred = −2 (1 − ypred) = — 2 (1−0,524) = — 0,952 \ begin {align}
    \ frac {\ partial L} {\ partial y_ {pred}} & = -2 (1 — y_ {pred}) \\
    & = -2 (1-0.524) \\
    & = -0,952 \\
    \ end {align} ∂ypred ∂L = −2 (1 − ypred) = — 2 (1−0,524) = — 0,952
    ∂ypred∂h2 = w5 ∗ f ′ (w5h2 + w6h3 + b3) = 1 ∗ f ′ (0,0474 + 0,0474 + 0) = f (0,0948) ∗ (1 − f (0,0948)) = 0,249 \ begin {align}
    \ frac {\ partial y_ {pred}} {\ partial h_1} & = w_5 * f ‘(w_5h_1 + w_6h_2 + b_3) \\
    & = 1 * f ‘(0,0474 + 0,0474 + 0) \\
    & = f (0,0948) * (1 — f (0,0948)) \\
    & = 0,249 \\
    \ end {align} ∂h2 ∂ypred = w5 ∗ f ′ (w5 h2 + w6 h3 + b3) = 1 ∗ f ′ (0,0474 + 0,0474 + 0) = f (0,0948) ∗ (1 − f (0,0948)) = 0,249
    ∂h2∂w1 = x1 ∗ f ′ (w1x1 + w2x2 + b1) = — 2 ∗ f ′ (- 2 + −1 + 0) = — 2 ∗ f (−3) ∗ (1 − f (−3)) = -0.0904 \ begin {align}
    \ frac {\ partial h_1} {\ partial w_1} & = x_1 * f ‘(w_1x_1 + w_2x_2 + b_1) \\
    & = -2 * f ‘(- 2 + -1 + 0) \\
    & = -2 * f (-3) * (1 — f (-3)) \\
    & = -0,0904 \\
    \ end {align} ∂w1 ∂h2 = x1 ∗ f ′ (w1 x1 + w2 x2 + b1) = — 2 ∗ f ′ (- 2 + −1 + 0) = — 2 ∗ f (−3) ∗ (1 − f (−3)) = — 0,0904
    ∂L∂w1 = −0,952 ∗ 0,249 ∗ −0,0904 = 0,0214 \ begin {выровнено}
    \ frac {\ partial L} {\ partial w_1} & = -0,952 * 0,249 * -0,0904 \\
    & = \ в коробке {0,0214} \\
    \ end {align} ∂w1 ∂L = −0,952 ∗ 0,249 ∗ −0,0904 = 0,0214

    Напоминание: мы вывели f ′ (x) = f (x) ∗ (1 − f (x)) f ‘(x) = f (x) * (1 — f (x)) f ′ (x) = f (x) ∗ (1 − f (x)) для нашей сигмовидной функции активации ранее.

    Мы сделали это! Это говорит нам о том, что если бы мы увеличили w1w_1w1, LLL в результате увеличила бы tiiiny бит.

    Обучение: стохастический градиентный спуск

    Теперь у нас есть все необходимые инструменты для обучения нейронной сети! Мы будем использовать алгоритм оптимизации, называемый стохастическим градиентным спуском (SGD), который сообщает нам, как изменить наши веса и смещения, чтобы минимизировать потери. По сути, это просто уравнение обновления:

    w1 ← w1 − η∂L∂w1w_1 \ leftarrow w_1 — \ eta \ frac {\ partial L} {\ partial w_1} w1 ← w1 −η∂w1 ∂L

    η \ etaη — это константа, называемая скоростью обучения , которая контролирует, насколько быстро мы тренируемся.Все, что мы делаем, это вычитаем η∂L∂w1 \ eta \ frac {\ partial L} {\ partial w_1} η∂w1 ∂L из w1w_1w1:

    • Если ∂L∂w1 \ frac {\ partial L} {\ partial w_1} ∂w1 ∂L положительно, w1w_1w1 будет уменьшаться, что приведет к уменьшению LLL.
    • Если ∂L∂w1 \ frac {\ partial L} {\ partial w_1} ∂w1 ∂L отрицательно, w1w_1w1 увеличится, что приведет к уменьшению LLL.

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

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

    1. Выберите один образец из нашего набора данных.Это то, что делает его стохастическим градиентным спуском — мы работаем только с одним образцом за раз.
    2. Вычислить все частные производные потерь по весам или смещениям (например, ∂L∂w1 \ frac {\ partial L} {\ partial w_1} ∂w1 ∂L, ∂L∂w2 \ frac {\ partial L} {\ partial w_2} ∂w2 ∂L и т. д.).
    3. Используйте уравнение обновления для обновления каждого веса и смещения.
    4. Вернитесь к шагу 1.

    Давайте посмотрим на это в действии!

    Код

    : полная нейронная сеть

    Пришло время , наконец, , пора реализовать полную нейронную сеть:

    Имя Вес (минус 135) Рост (минус 66) Пол
    Алиса-2-1 1
    Боб 25 6 0
    Чарли 17 4 0
    Диана-15-6 1
      импортировать numpy как np
    
    def сигмоид (x):
      
      возврат 1 / (1 + np.ехр (-x))
    
    def Deriv_sigmoid (x):
      
      fx = сигмовидная (x)
      вернуть fx * (1 - fx)
    
    def mse_loss (y_true, y_pred):
      
      возврат ((y_true - y_pred) ** 2) .mean ()
    
    класс OurNeuralNetwork:
      '' '
      Нейронная сеть с:
        - 2 входа
        - скрытый слой с 2 ​​нейронами (h2, h3)
        - выходной слой с 1 нейроном (o1)
    
      *** ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ***:
      Приведенный ниже код должен быть простым и обучающим, а НЕ оптимальным.
      Реальный код нейронной сети не выглядит так. НЕ используйте этот код.
      Вместо этого прочтите / запустите его, чтобы понять, как работает эта конкретная сеть.'' '
      def __init __ (сам):
        
        self.w1 = np.random.normal ()
        self.w2 = np.random.normal ()
        self.w3 = np.random.normal ()
        self.w4 = np.random.normal ()
        self.w5 = np.random.normal ()
        self.w6 = np.random.normal ()
    
        
        self.b1 = np.random.normal ()
        self.b2 = np.random.normal ()
        self.b3 = np.random.normal ()
    
      def feedforward (self, x):
        
        h2 = сигмовидная (self.w1 * x [0] + self.w2 * x [1] + self.b1)
        h3 = сигмовидная (self.w3 * x [0] + self.w4 * x [1] + self.b2)
        o1 = сигмовидная (сам.w5 * h2 + self.w6 * h3 + self.b3)
        возврат o1
    
      def train (self, data, all_y_trues):
        '' '
        - данные представляют собой массив (n x 2) numpy, n = # образцов в наборе данных.
        - all_y_trues - это массив из n элементов.
          Элементы в all_y_trues соответствуют элементам в data.
        '' '
        learn_rate = 0,1
        эпох = 1000
    
        для эпохи в диапазоне (эпох):
          для x, y_true в zip (данные, all_y_trues):
            
            sum_h2 = self.w1 * x [0] + self.w2 * x [1] + self.b1
            h2 = сигмовидная (сумма_h2)
    
            sum_h3 = сам.w3 * x [0] + self.w4 * x [1] + self.b2
            h3 = сигмовидная (сумма_h3)
    
            sum_o1 = self.w5 * h2 + self.w6 * h3 + self.b3
            o1 = сигмовидная (сумма_o1)
            y_pred = o1
    
            
            
            d_L_d_ypred = -2 * (y_true - y_pred)
    
            
            d_ypred_d_w5 = h2 * производная_сигмоид (сумма_o1)
            d_ypred_d_w6 = h3 * производная_сигмоид (сумма_o1)
            d_ypred_d_b3 = производный_сигмоид (сумма_o1)
    
            d_ypred_d_h2 = self.w5 * Deriv_sigmoid (сумма_o1)
            d_ypred_d_h3 = self.w6 * Deriv_sigmoid (сумма_o1)
    
            
            d_h2_d_w1 = x [0] * производная_сигмоид (сумма_h2)
            d_h2_d_w2 = x [1] * производная_сигмоид (сумма_h2)
            d_h2_d_b1 = производный_сигмоид (сумма_h2)
    
            
            d_h3_d_w3 = x [0] * производная_сигмоид (сумма_h3)
            d_h3_d_w4 = x [1] * производная_сигмоид (сумма_h3)
            d_h3_d_b2 = производный_сигмоид (сумма_h3)
    
            
            
            себя.w1 - = скорость_учения * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w1
            self.w2 - = скорость обучения * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w2
            self.b1 - = скорость обучения * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b1
    
            
            self.w3 - = скорость обучения * d_L_d_ypred * d_ypred_d_h3 * d_h3_d_w3
            self.w4 - = скорость обучения * d_L_d_ypred * d_ypred_d_h3 * d_h3_d_w4
            self.b2 - = скорость обучения * d_L_d_ypred * d_ypred_d_h3 * d_h3_d_b2
    
            
            self.w5 - = скорость обучения * d_L_d_ypred * d_ypred_d_w5
            себя.w6 - = скорость_учения * d_L_d_ypred * d_ypred_d_w6
            self.b3 - = скорость обучения * d_L_d_ypred * d_ypred_d_b3
    
          
          если эпоха% 10 == 0:
            y_preds = np.apply_along_axis (self.feedforward, 1, данные)
            потеря = mse_loss (all_y_trues, y_preds)
            print ("Эпоха% d потери:% .3f"% (эпоха, потеря))
    
    
    data = np.array ([
      [-2, -1],
      [25, 6],
      [17, 4],
      [-15, -6],
    ])
    all_y_trues = np.array ([
      1,
      0,
      0,
      1,
    ])
    
    
    network = OurNeuralNetwork ()
    network.train (данные, all_y_trues)  

    Вы можете запустить / играть с этим кодом самостоятельно .Он также доступен на Github.

    Наши потери неуклонно сокращаются по мере обучения сети:

    Теперь мы можем использовать сеть для прогнозирования пола:

     
    emily = np.array ([- 7, -3])
    frank = np.array ([20, 2])
    print ("Эмили:% .3f"% network.feedforward (Эмили))
    print ("Франк:% .3f"% network.feedforward (frank))  

    Что теперь?

    Вы сделали это! Краткий обзор того, что мы сделали:

    • Введено нейронов , строительных блоков нейронных сетей.
    • Используется сигмовидная активационная функция в наших нейронах.
    • Видел, что нейронные сети — это просто нейроны, соединенные вместе.
    • Создан набор данных с весом и ростом в качестве входных данных (или с характеристиками ) и полом в качестве выходных данных (или метка ).
    • Узнал о функциях потерь и среднеквадратичной ошибке (MSE) потерь.
    • Понял, что обучение сети сводит к минимуму ее потери.
    • Используется обратного распространения ошибки для вычисления частных производных.
    • Использовал стохастический градиентный спуск (SGD) для обучения нашей сети.

    Еще многое предстоит сделать:

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

    Спасибо за чтение!

    Конкретные примеры нейронных сетей. Давайте сделаем эти нейронные сети… | Фархад Малик | FinTechExplained

    Давайте объединим эти нейронные сети

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

    Если вы хотите понять основы нейронных сетей, прочтите эту статью:

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

    1. Я представлю сценарий вместе с его описанием.
    2. Затем мы вместе настроим нейронную сеть
    3. Наконец, мы будем использовать библиотеку TensorFlow для совместной реализации нейронной сети.

    Фотография Клинта Адэра на Unsplash

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

    Пояснение:

    • Есть два входа: X и Y, которые могут производить выход Z

    Мы собираемся выбрать значение смещения и весов X и Y так, чтобы:

    • Когда либо X, либо Y равно 1, то значение Z равно 1, в противном случае — 0.

    Мы могли бы придумать следующую конфигурацию нейронной сети:

    1. Один входной слой с двумя нейронами . Мы собираемся передать значение X первому нейрону и значение Y второму нейрону во входном слое.
    2. Один выходной слой с одним нейроном . Он вернет значение для Z
    3. Функция активации для выходного слоя будет сигмоид .
    4. В результате:
    • Z = 0, если выходной слой выдает значение меньше 0.5
    • Z = 1, если выходной слой дает значение, большее или равное 0,5

    После проб и ошибок я придумал такую ​​конфигурацию:

    • Смещение = -1
    • Вес X = 2
    • Вес Y = 2

    Давайте проверим:

    Например, когда X = 1 и Y = 0, нейрон вычислит:

    Промежуточный Z = 1 * 2 + 0 * 2 + (-1) = 2–1 = 1

    Z = Sigmoid (1) = 1

    Он вычисляет функцию ИЛИ со 100% точностью.Эта нейронная сеть теперь может имитировать логический элемент ИЛИ. Вот результаты:

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

    Бизнес-сценарий ИЛИ

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

    Пояснение:

    • Есть два входа: X и Y, которые производят выход Z

    Мы собираемся выбрать значение смещения и весов X и Y так, чтобы:

    • Когда и X, и Y равны 1, то значение Z равно 1, в противном случае — 0.

    Мы могли бы придумать следующую конфигурацию нейронной сети:

    1. Один входной слой с двумя нейронами . Мы собираемся передать значение X первому нейрону и значение Y второму нейрону.
    2. Один выходной слой с одним нейроном . Он вернет значение для Z
    3. Функция активации для выходного слоя будет сигмоид .
    4. В результате:
    • Z = 0, если выходной слой выдает значение ниже 0,5
    • Z = 1, если выходной слой дает значение больше или равное 0,5

    После проб и ошибок это конфигурация, которую я придумал:

    • Смещение = -3
    • Вес X = 2
    • Вес Y = 2

    Давайте проверим:

    Например, когда X = 1 и Y = 0 Тогда нейрон вычислит:

    Промежуточный Z = 1 * 2 + 0 * 2 + (-3) = 2–3 = -1

    Z = Sigmoid (-1) = 0

    Он производит AND работают со 100% точностью.Эта нейронная сеть теперь может имитировать логический элемент И. Обратите внимание, единственная разница между нейронной сетью OR и AND — это выбранное значение Bias.

    Смещение играет важную роль в прогнозах.

    Посмотрите подробные результаты:

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

    Бизнес И сценарий

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

    Несколько нейронных сетей могут быть объединены вместе для создания сложной нейронной сети.

    Создайте нейронную сеть со следующей конфигурацией:

    • 2 скрытых слоя, 32 нейрона каждый с функцией активации RELU
    • Выходной слой должен иметь 5 нейронов, использующих функцию активации Softmax
    • Adam Optimizer с потерей функция среднеквадратичной ошибки и скорости обучения как 0.01
    • 5 epocs и размер пакета 100
     импортировать тензорный поток как tf 
    из тензорного потока импортировать kerasx = Layers.Dense (32, Activation = 'relu') (входные данные)
    x = Layers.Dense (32, Activation = 'relu') (x)
    прогнозов = Layers.Dense (5, Activation = 'softmax') (x) model = tf.keras.Model (inputs = inputs, output = predictions) learning_rate = 0.01 # Сконфигурируйте модель для регрессии среднеквадратичных ошибок.
    model.compile (optimizer = tf.train.AdamOptimizer (learning_rate),
    loss = 'mse') # среднеквадратическая ошибка)
    model.fit (данные, метки, эпохи = 5, batch_size = 100)

    Если вы хотите понять, что такое веса и смещения, прочтите:

    Если вы хотите понять, что такое слои нейронной сети, прочтите:

    Если вы Если хотите понять, как работают нейроны нейронной сети, прочтите:

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

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

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