Нейронные сети с нуля. Обзор курсов и статей на русском языке, бесплатно и без регистрации
На Хабре периодически появляются обзоры курсов по машинному обучению. Но такие статьи чаще добавляют в закладки, чем проходят сами курсы. Причины для этого разные: курсы на английском языке, требуют уверенного знания матана или специфичных фреймворков (либо наоборот не описаны начальные знания, необходимые для прохождения курса), находятся на других сайтах и требуют регистрации, имеют расписание, домашнюю работу и тяжело сочетаются с трудовыми буднями. Всё это мешает уже сейчас с нуля начать погружаться в мир машинного обучения со своей собственной скоростью, ровно до того уровня, который интересен и пропускать при этом неинтересные разделы.В этом обзоре в основном присутствуют только ссылки на статьи на хабре, а ссылки на другие ресурсы в качестве дополнения (информация на них на русском языке и не нужно регистрироваться). Все рекомендованные мною статьи и материалы я прочитал лично. Я попробовал каждый видеокурс, чтобы выбрать что понравится мне и помочь с выбором остальным. Большинство статей мною были прочитаны ранее, но есть и те на которые я наткнулся во время написания этого обзора.
Обзор состоит из нескольких разделов, чтобы каждый мог выбрать уровень с которого можно начать.
Для крупных разделов и видео-курсов указаны приблизительные временные затраты, необходимые знания, ожидаемые результаты и задания для самопроверки.
Большинство статей не было написано в рамках единого курса, поэтому информация может дублироваться. Если вы видите, что знаете какую-то часть статьи, то можете её смело пропустить, если вы не разорались с этой информацией в предыдущей статье, то у вас есть шанс прочитать тоже самое, но другими словами, что должно помочь усвоению материала.
Вводные статьи
Требуемый уровень: школьное образование, знание русского языка.
Требуемое время: несколько часов.
Казалось бы, что стоит начать изучение со статьи Искусственная нейронная сеть на википедии, но я не рекомендую. Наискучнейшее описание отбивает всё желание изучать нейронные сети.
Нейронки за 5 минут (слишком упрощённое описание, для гуманитариев, зато потребуется всего 5 минут)
Искусственные нейронные сети простыми словами (лучше потратить 15 минут на эту статью)
Основы ИНС (одна из четырёх статей из Учебник — Нейронные сети)
Нейронные сети для начинающих. Часть 1 и Часть 2
Нейронные сети, фундаментальные принципы работы, многообразие и топология
Искусственные нейронные сети и миниколонки реальной коры (девятая часть из курса Логика сознания)
Расширяем горизонты
Требуемый уровень: базовое понимание работы нейронных сетей.
Требуемое время: несколько часов.
Краткий курс машинного обучения или как создать нейронную сеть для решения скоринг задачи
Самое главное о нейронных сетях. Лекция в Яндексе (рекомендую посмотреть только видео на 1 час, читать статью показалось тяжеловато)
Что такое свёрточная нейронная сеть
Свёрточная нейронная сеть, часть 1: структура, топология, функции активации и обучающее множество
Зоопарк архитектур нейронных сетей. Часть 1 и Часть 2 (Особо вчитываться не надо, достаточно посмотреть красивые картинки и прочитать описание по диагонали)ЗаданиеПеречислите основные:
- типы задач, которые решают нейронные сети
- типы архитектур нейронных сетей
- функции активации
- типы нейронов / слоёв
Углубляем знания
Требуемый уровень: понимание работы нейронных сетей, знание базовых архитектур.
Требуемое время: несколько десятков часов.
Материалы открытого курса OpenDataScience и Mail.Ru Group по машинному обучению (10 видеороликов, 20 часов, будет сложно)
Лекции Техносферы. Нейронные сети в машинном обучении (14 видеороликов, 25 часов, будет скучно)
Чтобы определиться самому и помочь с выбором остальным хабровчанам, я построил график падения интереса к курсу на основе падения количества просмотров каждого следующего ролика. Выводы неутешительные — мало кто доходит до конца. Самый большой процент дошедших до конца — у курса от АФТИ НГУ.
(График падения количества просмотров составлялся пару месяцев назад и текущая картина может немного отличаться).
Примеры применения на практике
Сюда вошли в основном только те статьи, после которых прочитавшие их люди смогут сами воспроизвести описанные результаты (есть ссылки на исходники или онлайн сервисы)
ТОП30 самых впечатляющих проектов по машинному обучению за прошедший год (v.2018)
Улучшение качества изображения с помощью нейронной сети
Детектирование частей тела с помощью глубоких нейронных сетей
Классификация объектов в режиме реального времени
Раскрашиваем чёрно-белую фотографию с помощью нейросети
Смена пола и расы на селфи с помощью нейросетей
Как различать британскую и американскую литературу с помощью машинного обучения
Разделение текста на предложения с помощью Томита-парсера
Анализ Корана при помощи AI
Сколько нужно нейронов, чтобы узнать, разведён ли мост Александра Невского?
Сколько котов на хабре?
Торговля знает, когда вы ждете ребенка
Стэнфордская нейросеть определяет тональность текста с точностью 85%
Топливо для ИИ: подборка открытых датасетов для машинного обучения
Другие материалы
Статьи и курсы, которые не вошли в мой обзор, но возможно вам понравятся.
Нейронные сети в картинках: от одного нейрона до глубоких архитектур (python, numpy)
Базовые принципы машинного обучения на примере линейной регрессии (python, numpy, матан)
Сверточная нейронная сеть, часть 2: обучение алгоритмом обратного распространения ошибки (матан)
Курс по машинному обучению на Coursera от Яндекса и ВШЭ (курс доступен только после регистрации, NumPy, Pandas, Scikit-Learn)
Deep Learning For Coders (7 видеороликов, 15 часов, английский язык)
Курс Deep Learning от Google на udacity (английский язык)
Курс Структурирование проектов по машинному обучению на Coursera (платный, английский язык)
Другие статьи-обзоры на хабре по изучению машинного обучения
Где и как изучать машинное обучение? (английский язык)
Что читать о нейросетях 10 книг (английский язык)
Обучаемся самостоятельно: подборка видеокурсов по Computer Science (английский язык)
10 курсов по машинному обучению на лето (английский/русский язык, платно/бесплатно)
Прочтение этих статей и подтолкнуло меня написать свою собственную, в которой были бы материалы только на русском языке, без регистрации и требования 5 лет матана.
Надеюсь, что у моей статьи будет меньше комментариев вида:
«Закинул в закладки. Смотреть я их, конечно, не буду.»
Прошу всех заинтересованных лиц ответить на опросы после статьи, ну и подписывайтесь, чтобы не пропустить мои следующие статьи, ставьте лайки, чтобы мотивировать меня на их написание и пишите в комментариях вопросы (опечатки лучше в личку).
Традиционное предупреждение: я не отвечаю на сообщения в личку/соцсетях/телеграмме и т.д. Если у вас есть вопрос, то задавайте его в комментариях.
13 бесплатных курсов по нейронным сетям и машинному обучению
Консультант поисковика онлайн-курсов Class Central Дэвид Вентури в своем блоге поделился списком лучших онлайн-курсов, посвященных разным видам нейронных сетей и глубокому обучению. Многие из этих курсов можно пройти бесплатно, с каждым уроком получая знания от главных исследователей машинного обучения нашего времени. Предлагаем читателям AppTractor.ru список курсов из его статьи.
Каждый день все больше заголовков посвящено тому, как глубокое обучение меняет мир. Хотите узнать, о чем весь этот шум? Или улучшить свою карьеру? Существует множество курсов, которые вы можете пройти бесплатно или почти бесплатно.
Образовательный портал GeekBrains на Факультете Искусственного интеллекта обучает Data Science с нуля. У вас будут все необходимые ресурсы и инструменты, плюс целая программа по высшей математике — и не абстрактная, как в обычных вузах, а построенная на практике. GeekBrains познакомит вас с технологиями машинного обучения и нейронными сетями, научит решать настоящие бизнес-задачи!
Ознакомьтесь с программой на сайте GeekBrains →
Креативное применение глубокого обучения с TensorFlow
Курс рассказывает о базовых компонентах глубокого обучения, как оно работает, и о разработке необходимого кода для построения различных алгоритмов. Главный фокус этого курса — не только понимание того, как создавать необходимые компоненты, но и как их можно творчески применить. Доступны бесплатные и платные опции.
Нейронные сети для машинного обучения
Изучение искусственных нейронных сетей и их применения в машинном обучении: распознавании речи и объекта, сегментации изображений, моделировании языка и человеческого движения. Внимание уделяется как самим алгоритмам, так и практическим советам для их лучшей работы. Есть бесплатная и платная версия.
Глубокое обучение на практике для программистов, Часть 1
Этот семинедельный курс создан для всех, у кого есть хотя бы год опыта в кодинге и знания из математики старшей школы. Вы начнете с первого шага, создания подходящего GPU сервера, и пройдете весь путь создания реальных моделей для компьютерного зрения, обработки естественного языка и систем рекомендаций. Бесплатный курс.
6.S191: Введение в глубокое обучение
Недельное введение в методы глубокого обучения с применением машинного перевода, распознавания изображений, игр, создания изображений. Курс, сочетающий практику в TensorFlow и брейнсторминг с лекциями. Бесплатный курс.
6.S094: Глубокое обучение для самоуправляемых машин
Этот курс — введение в практику глубокого обучения через тему создания беспилотных автомобилей. Он создан для новичков в машинном обучении, но может быть полезным для опытных исследователей для обзора методов глубокого обучения и их применения. Бесплатный курс.
Глубокое обучение
В этом курсе от Google вы получите ясное понимание движущей силы глубокого обучения и создадите умные системы, которые учатся на больших или сложных объемах данных. Вы научитесь решать новые виды проблем, которые раньше казались слишком сложными, и придете к лучшему пониманию сложной природы человеческого ума при решении этих проблем. Бесплатный курс.
Глубокое обучение для обработки естественного языка
Это прикладной курс, концентрирующийся на текущих достижениях в анализе и генерировании речи и текста и использующий рекуррентные нейронные сети. В программу обучения входят математические определения релевантных моделей машинного обучения и связанные с ними алгоритмы оптимизации. Этот бесплатный курс ведет Фил Блансом, а создан он в партнерстве с группой исследования естественного языка DeepMind.
CS224n: Обработка естественного языка при помощи глубокого обучения
Курс предоставляет детальное введение в последние исследования в глубоком обучение, применимые к обработке естественного языка. Он покрывает векторные представления слов, метод окон для нейронных сетей, рекуррентные нейронные сети, модели коротко- и долгосрочной памяти, рекурсивные и сверточные нейронные сети. Обучение ведется при помощи лекций и заданий по программированию. Бесплатный курс.
Машинное обучение
На основе нейронауки и статистики этот курс знакомит с базовыми знаниями о нейронных сетях, методом обратного распространения ошибки, машинами Больцмана, автоэнкодерами, сверточными и рекуррентными нейронными сетями. Он иллюстрирует, как глубокое обучение влияет на наше понимание разумности и вклад в создание умных машин. Бесплатный курс.
Летняя школа по машинному обучению 2015 и 2016
Эта школа направлена на выпускников, инженеров и исследователей, у которых уже есть представление о машинном обучении (необязательно о глубоком) и которые хотят узнать больше об этом быстро растущем поле знаний. Она доступна не в форме традиционного онлайн-курса, но организаторы и лекторы делают эти видео золотой жилой контента по глубокому обучению. Бесплатный курс.
Онлайн курс по нейронным сетям
Курс рассчитан на слушателей уровня выпускников институтов и покрывает как основные виды нейронных сетей, так и более сложные темы. Бесплатен.
Обучение TensorFlow и глубокое обучение без степени доктора
Этот трехчасовой курс от Google, состоящий из видео и презентаций, предлагает разработчикам быстрое введение в основы глубокого обучения с некоторым материалом по TensorFlow. Бесплатный курс.
Глубокое обучение на Python
В этом курсе вы получите практические знания по использованию библиотеки для Python Keras 2.0 для нейронных сетей и глубокого обучения. Частично бесплатен.
На платформе Udemy также доступны несколько курсов по глубокому обучению. Цены на курсы различаются, часто курс можно приобрести за $10.
Курсы на Udemy (по убыванию рейтинга и количества голосов):
А у Udacity есть целая Nanodegree — курс и соответствующий экзамен для получения нано-степени.
Если вы нашли опечатку — выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать [email protected].Лучший видеокурс по нейронным сетям на русском
Искусственные нейронные сети упакованы в удобный видеокурс, который научит новичков и освежит знания тех, кто уже давно прошел базис.
Когда используют нейронные сети, и как они работают? Первый урок состоит из ответов на эти вопросы. Работа нейронной сети объясняется с помощью удобных схем, и проводится аналогия с человеческим мозгом. Стоит отметить, что каждый видеоурок дополнен выводами и заданиями.
Сравнение с биологической НС при рассмотрении нейрона и синапса позволит понять, как работают искусственные нейронные сети, изучить механизм изнутри. Это все еще относится к разделу базиса и подойдет тем, кто только начал изучать ИНС.
В уроке затрагивается структура биологических сетей, их мерность, строение ИНС и описание каждого из ее слоев.
Нейрон объясняется на примерах, а также рассказывается, что необходимо предпринять, чтобы обучение и работа нейронной сети были корректными.
В уроке подробно разобраны этапы работы НС и затрагиваются рекуррентные и feedforward сети, разница между которыми представлена схематически.
Здесь курс проходит переломный момент, когда больший упор делается на практические знания: нормализация и масштабирование, метод «один из N», организация сети, принцип работы скрытого слоя и влияние количества нейронов на результат.
Автор курса расскажет о двух этапах жизни ИНС, двух типах ее обучения, проанализирует их с использованием схем и разберет память, без которой искусственные нейронные сети бесполезны.
Самая обширная тема разбита на две части. В первой акцент делается на методе наискорейшего спуска. Сюда включены графики, расчет погрешности и визуализированное представление ошибки.
Во второй части автор коснется метода обратного распространения ошибки, расскажет об обучающей выборке и начальных значениях весов.
Подборка материалов по нейронным сетям
10 примеров машинного обучения на JS
27 шпаргалок по машинному обучению и Python в 2017
Машинное обучение за год
Нейронные сети для начинающих. Часть 1 / Хабр
Привет всем читателям Habrahabr, в этой статье я хочу поделиться с Вами моим опытом в изучении нейронных сетей и, как следствие, их реализации, с помощью языка программирования Java, на платформе Android. Мое знакомство с нейронными сетями произошло, когда вышло приложение Prisma. Оно обрабатывает любую фотографию, с помощью нейронных сетей, и воспроизводит ее с нуля, используя выбранный стиль. Заинтересовавшись этим, я бросился искать статьи и «туториалы», в первую очередь, на Хабре. И к моему великому удивлению, я не нашел ни одну статью, которая четко и поэтапно расписывала алгоритм работы нейронных сетей. Информация была разрознена и в ней отсутствовали ключевые моменты. Также, большинство авторов бросается показывать код на том или ином языке программирования, не прибегая к детальным объяснениям.
Поэтому сейчас, когда я достаточно хорошо освоил нейронные сети и нашел огромное количество информации с разных иностранных порталов, я хотел бы поделиться этим с людьми в серии публикаций, где я соберу всю информацию, которая потребуется вам, если вы только начинаете знакомство с нейронными сетями. В этой статье, я не буду делать сильный акцент на Java и буду объяснять все на примерах, чтобы вы сами смогли перенести это на любой, нужный вам язык программирования. В последующих статьях, я расскажу о своем приложении, написанном под андроид, которое предсказывает движение акций или валюты. Иными словами, всех желающих окунуться в мир нейронных сетей и жаждущих простого и доступного изложения информации или просто тех, кто что-то не понял и хочет подтянуть, добро пожаловать под кат.
Первым и самым важным моим открытием был плейлист американского программиста Джеффа Хитона, в котором он подробно и наглядно разбирает принципы работы нейронных сетей и их классификации. После просмотра этого плейлиста, я решил создать свою нейронную сеть, начав с самого простого примера. Вам наверняка известно, что когда ты только начинаешь учить новый язык, первой твоей программой будет Hello World. Это своего рода традиция. В мире машинного обучения тоже есть свой Hello world и это нейросеть решающая проблему исключающего или(XOR). Таблица исключающего или выглядит следующим образом:
a | b | c |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Что такое нейронная сеть?
Нейронная сеть — это последовательность нейронов, соединенных между собой синапсами. Структура нейронной сети пришла в мир программирования прямиком из биологии. Благодаря такой структуре, машина обретает способность анализировать и даже запоминать различную информацию. Нейронные сети также способны не только анализировать входящую информацию, но и воспроизводить ее из своей памяти. Заинтересовавшимся обязательно к просмотру 2 видео из TED Talks: Видео 1, Видео 2). Другими словами, нейросеть это машинная интерпретация мозга человека, в котором находятся миллионы нейронов передающих информацию в виде электрических импульсов.
Какие бывают нейронные сети?
Пока что мы будем рассматривать примеры на самом базовом типе нейронных сетей — это сеть прямого распространения (далее СПР). Также в последующих статьях я введу больше понятий и расскажу вам о рекуррентных нейронных сетях. СПР как вытекает из названия это сеть с последовательным соединением нейронных слоев, в ней информация всегда идет только в одном направлении.
Для чего нужны нейронные сети?
Нейронные сети используются для решения сложных задач, которые требуют аналитических вычислений подобных тем, что делает человеческий мозг. Самыми распространенными применениями нейронных сетей является:
Классификация — распределение данных по параметрам. Например, на вход дается набор людей и нужно решить, кому из них давать кредит, а кому нет. Эту работу может сделать нейронная сеть, анализируя такую информацию как: возраст, платежеспособность, кредитная история и тд.
Предсказание — возможность предсказывать следующий шаг. Например, рост или падение акций, основываясь на ситуации на фондовом рынке.
Распознавание — в настоящее время, самое широкое применение нейронных сетей. Используется в Google, когда вы ищете фото или в камерах телефонов, когда оно определяет положение вашего лица и выделяет его и многое другое.
Теперь, чтобы понять, как же работают нейронные сети, давайте взглянем на ее составляющие и их параметры.
Что такое нейрон?
Нейрон — это вычислительная единица, которая получает информацию, производит над ней простые вычисления и передает ее дальше. Они делятся на три основных типа: входной (синий), скрытый (красный) и выходной (зеленый). Также есть нейрон смещения и контекстный нейрон о которых мы поговорим в следующей статье. В том случае, когда нейросеть состоит из большого количества нейронов, вводят термин слоя. Соответственно, есть входной слой, который получает информацию, n скрытых слоев (обычно их не больше 3), которые ее обрабатывают и выходной слой, который выводит результат. У каждого из нейронов есть 2 основных параметра: входные данные (input data) и выходные данные (output data). В случае входного нейрона: input=output. В остальных, в поле input попадает суммарная информация всех нейронов с предыдущего слоя, после чего, она нормализуется, с помощью функции активации (пока что просто представим ее f(x)) и попадает в поле output.
Важно помнить, что нейроны оперируют числами в диапазоне [0,1] или [-1,1]. А как же, вы спросите, тогда обрабатывать числа, которые выходят из данного диапазона? На данном этапе, самый простой ответ — это разделить 1 на это число. Этот процесс называется нормализацией, и он очень часто используется в нейронных сетях. Подробнее об этом чуть позже.
Что такое синапс?
Синапс это связь между двумя нейронами. У синапсов есть 1 параметр — вес. Благодаря ему, входная информация изменяется, когда передается от одного нейрона к другому. Допустим, есть 3 нейрона, которые передают информацию следующему. Тогда у нас есть 3 веса, соответствующие каждому из этих нейронов. У того нейрона, у которого вес будет больше, та информация и будет доминирующей в следующем нейроне (пример — смешение цветов). На самом деле, совокупность весов нейронной сети или матрица весов — это своеобразный мозг всей системы. Именно благодаря этим весам, входная информация обрабатывается и превращается в результат.
Важно помнить, что во время инициализации нейронной сети, веса расставляются в случайном порядке.
Как работает нейронная сеть?
В данном примере изображена часть нейронной сети, где буквами I обозначены входные нейроны, буквой H — скрытый нейрон, а буквой w — веса. Из формулы видно, что входная информация — это сумма всех входных данных, умноженных на соответствующие им веса. Тогда дадим на вход 1 и 0. Пусть w1=0.4 и w2 = 0.7 Входные данные нейрона Н1 будут следующими: 1*0.4+0*0.7=0.4. Теперь когда у нас есть входные данные, мы можем получить выходные данные, подставив входное значение в функцию активации (подробнее о ней далее). Теперь, когда у нас есть выходные данные, мы передаем их дальше. И так, мы повторяем для всех слоев, пока не дойдем до выходного нейрона. Запустив такую сеть в первый раз мы увидим, что ответ далек от правильно, потому что сеть не натренирована. Чтобы улучшить результаты мы будем ее тренировать. Но прежде чем узнать как это делать, давайте введем несколько терминов и свойств нейронной сети.
Функция активации
Функция активации — это способ нормализации входных данных (мы уже говорили об этом ранее). То есть, если на входе у вас будет большое число, пропустив его через функцию активации, вы получите выход в нужном вам диапазоне. Функций активации достаточно много поэтому мы рассмотрим самые основные: Линейная, Сигмоид (Логистическая) и Гиперболический тангенс. Главные их отличия — это диапазон значений.
Линейная функция
Эта функция почти никогда не используется, за исключением случаев, когда нужно протестировать нейронную сеть или передать значение без преобразований.
Сигмоид
Это самая распространенная функция активации, ее диапазон значений [0,1]. Именно на ней показано большинство примеров в сети, также ее иногда называют логистической функцией. Соответственно, если в вашем случае присутствуют отрицательные значения (например, акции могут идти не только вверх, но и вниз), то вам понадобиться функция которая захватывает и отрицательные значения.
Гиперболический тангенс
Имеет смысл использовать гиперболический тангенс, только тогда, когда ваши значения могут быть и отрицательными, и положительными, так как диапазон функции [-1,1]. Использовать эту функцию только с положительными значениями нецелесообразно так как это значительно ухудшит результаты вашей нейросети.
Тренировочный сет
Тренировочный сет — это последовательность данных, которыми оперирует нейронная сеть. В нашем случае исключающего или (xor) у нас всего 4 разных исхода то есть у нас будет 4 тренировочных сета: 0xor0=0, 0xor1=1, 1xor0=1,1xor1=0.
Итерация
Это своеобразный счетчик, который увеличивается каждый раз, когда нейронная сеть проходит один тренировочный сет. Другими словами, это общее количество тренировочных сетов пройденных нейронной сетью.
Эпоха
При инициализации нейронной сети эта величина устанавливается в 0 и имеет потолок, задаваемый вручную. Чем больше эпоха, тем лучше натренирована сеть и соответственно, ее результат. Эпоха увеличивается каждый раз, когда мы проходим весь набор тренировочных сетов, в нашем случае, 4 сетов или 4 итераций.
Важно не путать итерацию с эпохой и понимать последовательность их инкремента. Сначала n
раз увеличивается итерация, а потом уже эпоха и никак не наоборот. Другими словами, нельзя сначала тренировать нейросеть только на одном сете, потом на другом и тд. Нужно тренировать каждый сет один раз за эпоху. Так, вы сможете избежать ошибок в вычислениях.
Ошибка
Ошибка — это процентная величина, отражающая расхождение между ожидаемым и полученным ответами. Ошибка формируется каждую эпоху и должна идти на спад. Если этого не происходит, значит, вы что-то делаете не так. Ошибку можно вычислить разными путями, но мы рассмотрим лишь три основных способа: Mean Squared Error (далее MSE), Root MSE и Arctan. Здесь нет какого-либо ограничения на использование, как в функции активации, и вы вольны выбрать любой метод, который будет приносить вам наилучший результат. Стоит лишь учитывать, что каждый метод считает ошибки по разному. У Arctan, ошибка, почти всегда, будет больше, так как он работает по принципу: чем больше разница, тем больше ошибка. У Root MSE будет наименьшая ошибка, поэтому, чаще всего, используют MSE, которая сохраняет баланс в вычислении ошибки.
MSE
Root MSE
Arctan
Принцип подсчета ошибки во всех случаях одинаков. За каждый сет, мы считаем ошибку, отняв от идеального ответа, полученный. Далее, либо возводим в квадрат, либо вычисляем квадратный тангенс из этой разности, после чего полученное число делим на количество сетов.
Задача
Теперь, чтобы проверить себя, подсчитайте результат, данной нейронной сети, используя сигмоид, и ее ошибку, используя MSE.
Данные: I1=1, I2=0, w1=0.45, w2=0.78 ,w3=-0.12 ,w4=0.13 ,w5=1.5 ,w6=-2.3.
Решениеh2input = 1*0.45+0*-0.12=0.45
h2output = sigmoid(0.45)=0.61
h3input = 1*0.78+0*0.13=0.78
h3output = sigmoid(0.78)=0.69
O1input = 0.61*1.5+0.69*-2.3=-0.672
O1output = sigmoid(-0.672)=0.33
O1ideal = 1 (0xor1=1)
Error = ((1-0.33)^2)/1=0.45
Результат — 0.33, ошибка — 45%.
Большое спасибо за внимание! Надеюсь, что данная статья смогла помочь вам в изучении нейронных сетей. В следующей статье, я расскажу о нейронах смещения и о том, как тренировать нейронную сеть, используя метод обратного распространения и градиентного спуска.
Использованные ресурсы:
— Раз
— Два
— Три
Спартанское обучение нейронных сетей / Хабр
Одна из проблем обучения нейронных сетей — переобучение. Это когда алгоритм научился хорошо работать с данными, которые он видел, а на других он справляется хуже. В статье мы рассказываем, как попытались решить эту проблему, совместив обучение градиентным спуском и эволюционным подходом.
Если кто-то хочет лучше понимать, о чем будет речь ниже, то можно прочитать эти статьи на хабре: статья1 и статья2
( далее добавление шума будем называть словом мутация, не потому что модно, а потому что в одно слово, а все зашумленные сети являются потомками родителя )
Мы решили учить спуском на одной части датасета, а эволюцией на другом, что в теории должно помочь модели улучшить обобщающую способность. Также у каждой части были разные функции для оптимизации.
В процессе у нас появилось несколько идей и гипотез, в следствие чего мы разделились на два независимых эксперимента с общей идей, но с разными подходами к эволюции. Первый эксперимент будет описан Егором, второй мной.
P.S. так как мы разводим потомков модели, чтобы выбрать лучшую и обучать ее дальше, чтобы снова сделать потомков и тд., то у меня возникла ассоциация со Спартой, где слабых детей выбрасывали, а других обучали как воинов. Поэтому назвали спартанским обучением.
Общая идея:
Инициализируем либо загружаем веса модели-родителя
- Обучаем N эпох модель-родителя
- Создаем K потомков разными мутациями
- Считаем фитнес-функцию по потомкам
- Объявляем нового родителя (об этом будет каждый эксперимент)
- goto 1
Общие детали эксперимента:
Датасет — CIFAR10
Модели — resnet18 с нуля и предобученная
Оптимизатор — SGD
Функция потери — CrossEntropyLoss
Функция оценки качества модели и ее потомков — accuracy
Мутации каждые 5 эпох
Обучение шло 50 эпох, эволюция засчитывалась за эпоху
На каждую мутацию 40-50 потомков
Примечание: в ходе обучения не использовались никакие дополнительные техники как уменьшение шага обучения, регуляризации и т.д.
Эксперимент №1. Метод случайных градиентов.
А в процессе того пока мы над этим работали это стало напоминать метод отжига.
Похожие штуки пробовали в статьях: Adding Gradient Noise Improves Learning for Very Deep Networks, Evolutionary Stochastic Gradient Descent for Optimization of Deep Neural Networks.
For i in range(N):
Обучаем N эпох модель-родителя
Градиентным методом с SGD
# часть с мутациями
For k in range(K):
Создаем потомка добавлением шума
Если он оказался лучше родителя делаем его родителем.
В результате за счет части с мутациями у нас или улучшения или в худшем случае ничего не поменялось, если ни одно из прибавлений шума не улучшило модель.
А теперь Gо в детали.
Чтобы все заработало нужно было решить следующие вопросы:
- Было непонятно как выбирать лучшего потомка, по целевой метрике или по лоссу, ведь он тоже менялся.
- Как видно ниже (Картинка 1) улучшения не такие хорошие как хотелось бы. И в то время как скор за счет шума растет на трейне он каждый раз чуть — чуть падает на валидации. Делаем вывод что метод не работает?
- Просто добавление шума самом собой не заработало и пришлось много шаманить.
Сейчас я подробно расскажу про эти три пункта.
По какой метрике оценивать, по лоссу или по целевой. Мы попробовали и по лоссу и по целевой метрике accuracy в нашем случае, в результате, всегда работает только по лоссу. Вот еще пример где лучшего потомка выбирали по лоссу. (Картинка 2).
После мутаций метрика на валидации становится хуже.
Получалось что после каждого этапа мутаций скор падал на валидации? Делаем вывод что ничего не работает? Как оказалось все не так просто. При этом скор чуть чуть быстрее рос при проходе SGD на мутировавших (зашумленных) потомках. В итоге финальный скор был чуть лучше. Это было удивительно, приятно и абсолютно не понятно.
Буквально чуть лучше:
Accuracy 47.81% — наш велосипед с шумом.
Accuracy 47.72% — просто SGD.
Тут надо пояснить что этап с мутациями мы считали как одну эпоху. Мы делали 40 мутаций каждую пятую эпоху. Поэтому общее число итераций у SGD больше. Но при этом финальный скор все равно лучше.
В такой постановке мы сделали 4 эксперимента, предобученый и не предобученный resnet18 выбор потомка по лоссу и по accuracy. Улучшений не было на не предобученном при выборе потомка по accuracy. В остальных случаях было чуть чуть лучше.
А теперь о том как получилось заставить это работать. Собственно про шум.
Мы долго пробовали добавлять разный шум, но получалось с переменным успехом. В основном случайные шум очень редко улучшал лосс или целевую метрику, а чаще просто ухудшал.
В итоге мы решили добавлять не совсем случайный шум, а брать шум который был бы похож на шаг градиента.
Т.е. мы считали градиент, умножали его шум из равномерного распределения и на шаг обучения. И так обновляли веса. Еще мы ввели некоторый параметр температуры, что бы шаг обновления был тем меньше чем целевая метрика лучше.
Собственно поэтому этот велосипед мы и назвали метод случайных градиентов.
Плюсы:
- Итераций меньше, а скор чуть лучше.
- Это работает как регуляризация для вала. Во всех случаях скор на трейне у нас был всегда хуже, а на вале в итоге почти всегда лучше.
Минусы
- Много танцев с бубном ради очень маленького прироста. Появляется еще куча гипер параметров которые надо подбирать.
- Для шума нужно делать backward.
Эксперимент №2. Эволюционные стратегии
Для мутаций я использовал алгоритм описанный OpenAI в работе Evolution Strategies as a Scalable Alternative to Reinforcement Learning, реализация алгоритма была взята из репозитория https://github.com/staturecrane/PyTorch-ES
For i in range(N):
Обучаем N эпох модель-родителя с помощью SGD
For k in range(K):
Создаем потомка добавлением шума
Высчитываем его скор
Сохраняем потомка и его скор
Получаем нового родителя
Создание потомков
Создание потомков стандартно для эволюционных алгоритмов — к родительским весам прибавляется случайный шум. Шум генерировался равномерным распределением от -1 до 1 и умножался на σ, чтобы избежать большого разброса.
Получение нового родителя
normalized_rewards = (rewards - np.mean(rewards)) / np.std(rewards)
for index, param in enumerate(self.weights):
A = np.array([p[index] for p in population])
rewards_pop = torch.from_numpy(np.dot(A.T,normalized_rewards).T).float()
param.data = param.data + LEARNING_RATE/(POPULATION_SIZE * SIGMA) * rewards_pop
Здесь уже начинается интересное. После вычисления фитнес-функции не выбирается лучший потомок. Скор каждого потомка нормализуется, после чего вектор нормализованных скоров умножается на шум. После чего прибавляется к родительским весам по формуле выше.
Результаты эксперимента
Рыжий/Красный — SGD+эволюция
Голубой/Синий — SGD
Loss — За время обучения после каждой эволюции значение функции всегда увеличивалось, что не удивительно. Поэтому на тренировочном датасете под конец обучения у классического SGD значение лучше, но для нас это не так важно, так как это не наша финальная метрика.
Validation — здесь можно посмотреть прогресс моделей на валидационном датасете по метрике accuracy. Можно заметить, что где-то на 5к итерации значение для варианта с классическим SGD стало падать, что говорит о том, что модель начала переобучаться на тренировочном датасете, когда как график SGD+эволюция продолжил расти
Final score — показывает рост метрики accuracy на тестовом датасете и здесь происходило примерно тоже самое, что и на валидации.
Вывод: использование эволюционной стратегии в связке с SGD позволило избежать проблем с переобучением и на тестовом датасете дало наибольший скор как при обучении с нуля, так и при обучении c предобученной моделью.
Думаю, если бы было больше потомков на шаге эволюции, то и результат был бы лучше, но тут уже идет вопрос о доступных мощностях и скорости обучения, так как обучать несколько тысяч потомков в данный момент позволяют себе только Google и другие корпорации.
Финальная таблица по accuracy на тесте
Итог:
- Не удалось заставить работать с Adam, возможно, у нас просто закончился энтузиазм. Во всех экспериментах с ним эволюционные методы чуть чуть проигрывали.
- Можно было сделать мутации частью оптимизатора, а не писать отдельную оболочку для этого
- Ушло в несколько раз больше времени, чем мы планировали
Будем рады обратной связи не только по контенту, но и по самой статье в целом. Если занимаетесь этой темой или интересовались, то тоже пишите, было бы здорово пообщаться, может мы что-то упустили.
Полезные ссылки
- Adding Gradient Noise Improves Learning for Very Deep Networks
- Evolutionary Stochastic Gradient Descent for Optimization of Deep Neural Networks
- Evolution Strategies as a Scalable Alternative to Reinforcement Learning
Нейронные сети для начинающих. Часть 2 / Хабр
Добро пожаловать во вторую часть руководства по нейронным сетям. Сразу хочу принести извинения всем кто ждал вторую часть намного раньше. По определенным причинам мне пришлось отложить ее написание. На самом деле я не ожидал, что у первой статьи будет такой спрос и что так много людей заинтересует данная тема. Взяв во внимание ваши комментарии, я постараюсь предоставить вам как можно больше информации и в то же время сохранить максимально понятный способ ее изложения. В данной статье, я буду рассказывать о способах обучения/тренировки нейросетей (в частности метод обратного распространения) и если вы, по каким-либо причинам, еще не прочитали первую часть, настоятельно рекомендую начать с нее. В процессе написания этой статьи, я хотел также рассказать о других видах нейросетей и методах тренировки, однако, начав писать про них, я понял что это пойдет вразрез с моим методом изложения. Я понимаю, что вам не терпится получить как можно больше информации, однако эти темы очень обширны и требуют детального анализа, а моей основной задачей является не написать очередную статью с поверхностным объяснением, а донести до вас каждый аспект затронутой темы и сделать статью максимально легкой в освоении. Спешу расстроить любителей “покодить”, так как я все еще не буду прибегать к использованию языка программирования и буду объяснять все “на пальцах”. Достаточно вступления, давайте теперь продолжим изучение нейросетей.
Перед тем как начать нашу основную тему, мы должны ввести понятие еще одного вида нейронов — нейрон смещения. Нейрон смещения или bias нейрон — это третий вид нейронов, используемый в большинстве нейросетей. Особенность этого типа нейронов заключается в том, что его вход и выход всегда равняются 1 и они никогда не имеют входных синапсов. Нейроны смещения могут, либо присутствовать в нейронной сети по одному на слое, либо полностью отсутствовать, 50/50 быть не может (красным на схеме обозначены веса и нейроны которые размещать нельзя). Соединения у нейронов смещения такие же, как у обычных нейронов — со всеми нейронами следующего уровня, за исключением того, что синапсов между двумя bias нейронами быть не может. Следовательно, их можно размещать на входном слое и всех скрытых слоях, но никак не на выходном слое, так как им попросту не с чем будет формировать связь.
Нейрон смещения нужен для того, чтобы иметь возможность получать выходной результат, путем сдвига графика функции активации вправо или влево. Если это звучит запутанно, давайте рассмотрим простой пример, где есть один входной нейрон и один выходной нейрон. Тогда можно установить, что выход O2 будет равен входу h2, умноженному на его вес, и пропущенному через функцию активации (формула на фото слева). В нашем конкретном случае, будем использовать сигмоид.
Из школьного курса математики, мы знаем, что если взять функцию y = ax+b и менять у нее значения “а”, то будет изменяться наклон функции (цвета линий на графике слева), а если менять “b”, то мы будем смещать функцию вправо или влево (цвета линий на графике справа). Так вот “а” — это вес h2, а “b” — это вес нейрона смещения B1. Это грубый пример, но примерно так все и работает (если вы посмотрите на функцию активации справа на изображении, то заметите очень сильное сходство между формулами). То есть, когда в ходе обучения, мы регулируем веса скрытых и выходных нейронов, мы меняем наклон функции активации. Однако, регулирование веса нейронов смещения может дать нам возможность сдвинуть функцию активации по оси X и захватить новые участки. Иными словами, если точка, отвечающая за ваше решение, будет находиться, как показано на графике слева, то ваша НС никогда не сможет решить задачу без использования нейронов смещения. Поэтому, вы редко встретите нейронные сети без нейронов смещения.
Также нейроны смещения помогают в том случае, когда все входные нейроны получают на вход 0 и независимо от того какие у них веса, они все передадут на следующий слой 0, но не в случае присутствия нейрона смещения. Наличие или отсутствие нейронов смещения — это гиперпараметр (об этом чуть позже). Одним словом, вы сами должны решить, нужно ли вам использовать нейроны смещения или нет, прогнав НС с нейронами смешения и без них и сравнив результаты.
ВАЖНО знать, что иногда на схемах не обозначают нейроны смещения, а просто учитывают их веса при вычислении входного значения например:
input = h2*w1+h3*w2+b3
b3 = bias*w3
Так как его выход всегда равен 1, то можно просто представить что у нас есть дополнительный синапс с весом и прибавить к сумме этот вес без упоминания самого нейрона.
Ответ прост — нужно ее обучать. Однако, насколько бы прост не был ответ, его реализация в плане простоты, оставляет желать лучшего. Существует несколько методов обучения НС и я выделю 3, на мой взгляд, самых интересных:
- Метод обратного распространения (Backpropagation)
- Метод упругого распространения (Resilient propagation или Rprop)
- Генетический Алгоритм (Genetic Algorithm)
Об Rprop и ГА речь пойдет в других статьях, а сейчас мы с вами посмотрим на основу основ — метод обратного распространения, который использует алгоритм градиентного спуска.
Это способ нахождения локального минимума или максимума функции с помощью движения вдоль градиента. Если вы поймете суть градиентного спуска, то у вас не должно возникнуть никаких вопросов во время использования метода обратного распространения. Для начала, давайте разберемся, что такое градиент и где он присутствует в нашей НС. Давайте построим график, где по оси х будут значения веса нейрона(w) а по оси у — ошибка соответствующая этому весу(e).
Посмотрев на этот график, мы поймем, что график функция f(w) является зависимостью ошибки от выбранного веса. На этом графике нас интересует глобальный минимум — точка (w2,e2) или, иными словами, то место где график подходит ближе всего к оси х. Эта точка будет означать, что выбрав вес w2 мы получим самую маленькую ошибку — e2 и как следствие, самый лучший результат из всех возможных. Найти же эту точку нам поможет метод градиентного спуска (желтым на графике обозначен градиент). Соответственно у каждого веса в нейросети будет свой график и градиент и у каждого надо найти глобальный минимум.
Так что же такое, этот градиент? Градиент — это вектор который определяет крутизну склона и указывает его направление относительно какой либо из точек на поверхности или графике. Чтобы найти градиент нужно взять производную от графика по данной точке (как это и показано на графике). Двигаясь по направлению этого градиента мы будем плавно скатываться в низину. Теперь представим что ошибка — это лыжник, а график функции — гора. Соответственно, если ошибка равна 100%, то лыжник находиться на самой вершине горы и если ошибка 0% то в низине. Как все лыжники, ошибка стремится как можно быстрее спуститься вниз и уменьшить свое значение. В конечном случае у нас должен получиться следующий результат:
Представьте что лыжника забрасывают, с помощью вертолета, на гору. На сколько высоко или низко зависит от случая (аналогично тому, как в нейронной сети при инициализации веса расставляются в случайном порядке). Допустим ошибка равна 90% и это наша точка отсчета. Теперь лыжнику нужно спуститься вниз, с помощью градиента. На пути вниз, в каждой точке мы будем вычислять градиент, что будет показывать нам направление спуска и при изменении наклона, корректировать его. Если склон будет прямым, то после n-ого количества таких действий мы доберемся до низины. Но в большинстве случаев склон (график функции) будет волнистый и наш лыжник столкнется с очень серьезной проблемой — локальный минимум. Я думаю все знают, что такое локальный и глобальный минимум функции, для освежения памяти вот пример. Попадание в локальный минимум чревато тем, что наш лыжник навсегда останется в этой низине и никогда не скатиться с горы, следовательно мы никогда не сможем получить правильный ответ. Но мы можем избежать этого, снарядив нашего лыжника реактивным ранцем под названием момент (momentum). Вот краткая иллюстрация момента:
Как вы уже наверное догадались, этот ранец придаст лыжнику необходимое ускорение чтобы преодолеть холм, удерживающий нас в локальном минимуме, однако здесь есть одно НО. Представим что мы установили определенное значение параметру момент и без труда смогли преодолеть все локальные минимумы, и добраться до глобального минимума. Так как мы не можем просто отключить реактивный ранец, то мы можем проскочить глобальный минимум, если рядом с ним есть еще низины. В конечном случае это не так важно, так как рано или поздно мы все равно вернемся обратно в глобальный минимум, но стоит помнить, что чем больше момент, тем больше будет размах с которым лыжник будет кататься по низинам. Вместе с моментом в методе обратного распространения также используется такой параметр как скорость обучения (learning rate). Как наверняка многие подумают, чем больше скорость обучения, тем быстрее мы обучим нейросеть. Нет. Скорость обучения, также как и момент, является гиперпараметром — величина которая подбирается путем проб и ошибок. Скорость обучения можно напрямую связать со скоростью лыжника и можно с уверенностью сказать — тише едешь дальше будешь. Однако здесь тоже есть определенные аспекты, так как если мы совсем не дадим лыжнику скорости то он вообще никуда не поедет, а если дадим маленькую скорость то время пути может растянуться на очень и очень большой период времени. Что же тогда произойдет если мы дадим слишком большую скорость?
Как видите, ничего хорошего. Лыжник начнет скатываться по неправильному пути и возможно даже в другом направлении, что как вы понимаете только отдалит нас от нахождения правильного ответа. Поэтому во всех этих параметрах нужно находить золотую середину чтобы избежать не сходимости НС (об этом чуть позже).
Вот мы и дошли до того момента, когда мы можем обсудить, как же все таки сделать так, чтобы ваша НС могла правильно обучаться и давать верные решения. Очень хорошо МОР визуализирован на этой гифке:
А теперь давайте подробно разберем каждый этап. Если вы помните то в предыдущей статье мы считали выход НС. По другому это называется передача вперед (Forward pass), то есть мы последовательно передаем информацию от входных нейронов к выходным. После чего мы вычисляем ошибку и основываясь на ней делаем обратную передачу, которая заключается в том, чтобы последовательно менять веса нейронной сети, начиная с весов выходного нейрона. Значение весов будут меняться в ту сторону, которая даст нам наилучший результат. В моих вычисления я буду пользоваться методом нахождения дельты, так как это наиболее простой и понятный способ. Также я буду использовать стохастический метод обновления весов (об этом чуть позже).
Теперь давайте продолжим с того места, где мы закончили вычисления в предыдущей статье.
Данные задачи из предыдущей статьиДанные: I1=1, I2=0, w1=0.45, w2=0.78 ,w3=-0.12 ,w4=0.13 ,w5=1.5 ,w6=-2.3.
h2input = 1*0.45+0*-0.12=0.45
h2output = sigmoid(0.45)=0.61
h3input = 1*0.78+0*0.13=0.78
h3output = sigmoid(0.78)=0.69
O1input = 0.61*1.5+0.69*-2.3=-0.672
O1output = sigmoid(-0.672)=0.33
O1ideal = 1 (0xor1=1)
Error = ((1-0.33)^2)/1=0.45
Результат — 0.33, ошибка — 45%.
Так как мы уже подсчитали результат НС и ее ошибку, то мы можем сразу приступить к МОРу. Как я уже упоминал ранее, алгоритм всегда начинается с выходного нейрона. В таком случае давайте посчитаем для него значение δ (дельта) по формуле 1.
Так как у выходного нейрона нет исходящих синапсов, то мы будем пользоваться первой формулой (δ output), следственно для скрытых нейронов мы уже будем брать вторую формулу (δ hidden). Тут все достаточно просто: считаем разницу между желаемым и полученным результатом и умножаем на производную функции активации от входного значения данного нейрона. Прежде чем приступить к вычислениям я хочу обратить ваше внимание на производную. Во первых как это уже наверное стало понятно, с МОР нужно использовать только те функции активации, которые могут быть дифференцированы. Во вторых чтобы не делать лишних вычислений, формулу производной можно заменить на более дружелюбную и простую формула вида:
Таким образом наши вычисления для точки O1 будут выглядеть следующим образом.РешениеO1output = 0.33
O1ideal = 1
Error = 0.45
δO1 = (1 — 0.33) * ( (1 — 0.33) * 0.33 ) = 0.148
На этом вычисления для нейрона O1 закончены. Запомните, что после подсчета дельты нейрона мы обязаны сразу обновить веса всех исходящих синапсов этого нейрона. Так как в случае с O1 их нет, мы переходим к нейронам скрытого уровня и делаем тоже самое за исключение того, что формула подсчета дельты у нас теперь вторая и ее суть заключается в том, чтобы умножить производную функции активации от входного значения на сумму произведений всех исходящих весов и дельты нейрона с которой этот синапс связан. Но почему формулы разные? Дело в том что вся суть МОР заключается в том чтобы распространить ошибку выходных нейронов на все веса НС. Ошибку можно вычислить только на выходном уровне, как мы это уже сделали, также мы вычислили дельту в которой уже есть эта ошибка. Следственно теперь мы будем вместо ошибки использовать дельту которая будет передаваться от нейрона к нейрону. В таком случае давайте найдем дельту для h2:Решениеh2output = 0.61
w5 = 1.5
δO1 = 0.148
δh2 = ( (1 — 0.61) * 0.61 ) * ( 1.5 * 0.148 ) = 0.053
Теперь нам нужно найти градиент для каждого исходящего синапса. Здесь обычно вставляют 3 этажную дробь с кучей производных и прочим математическим адом, но в этом и вся прелесть использования метода подсчета дельт, потому что в конечном счете ваша формула нахождения градиента будет выглядеть вот так:
Здесь точка A это точка в начале синапса, а точка B на конце синапса. Таким образом мы можем подсчитать градиент w5 следующим образом:Решениеh2output = 0.61
δO1 = 0.148
GRADw5 = 0.61 * 0.148 = 0.09
Сейчас у нас есть все необходимые данные чтобы обновить вес w5 и мы сделаем это благодаря функции МОР которая рассчитывает величину на которую нужно изменить тот или иной вес и выглядит она следующим образом:
Настоятельно рекомендую вам не игнорировать вторую часть выражения и использовать момент так как это вам позволит избежать проблем с локальным минимумом.
Здесь мы видим 2 константы о которых мы уже говорили, когда рассматривали алгоритм градиентного спуска: E (эпсилон) — скорость обучения, α (альфа) — момент. Переводя формулу в слова получим: изменение веса синапса равно коэффициенту скорости обучения, умноженному на градиент этого веса, прибавить момент умноженный на предыдущее изменение этого веса (на 1-ой итерации равно 0). В таком случае давайте посчитаем изменение веса w5 и обновим его значение прибавив к нему Δw5.
РешениеE = 0.7Α = 0.3
w5 = 1.5
GRADw5 = 0.09
Δw5(i-1) = 0
Δw5 = 0.7 * 0.09 + 0 * 0.3 = 0.063
w5 = w5 + Δw5 = 1.563
Таким образом после применения алгоритма наш вес увеличился на 0.063. Теперь предлагаю сделать вам тоже самое для h3.Решениеh3output = 0.69
w6 = -2.3
δO1 = 0.148
E = 0.7
Α = 0.3
Δw6(i-1) = 0
δh3 = ( (1 — 0.69) * 0.69 ) * ( -2.3 * 0.148 ) = -0.07
GRADw6 = 0.69 * 0.148 = 0.1
Δw6 = 0.7 * 0.1 + 0 * 0.3 = 0.07
w6 = w6 + Δw6 = -2.2
И конечно не забываем про I1 и I2, ведь у них тоже есть синапсы веса которых нам тоже нужно обновить. Однако помним, что нам не нужно находить дельты для входных нейронов так как у них нет входных синапсов.Решениеw1 = 0.45, Δw1(i-1) = 0
w2 = 0.78, Δw2(i-1) = 0
w3 = -0.12, Δw3(i-1) = 0
w4 = 0.13, Δw4(i-1) = 0
δh2 = 0.053
δh3 = -0.07
E = 0.7
Α = 0.3
GRADw1 = 1 * 0.053 = 0.053
GRADw2 = 1 * -0.07 = -0.07
GRADw3 = 0 * 0.053 = 0
GRADw4 = 0 * -0.07 = 0
Δw1 = 0.7 * 0.053 + 0 * 0.3 = 0.04
Δw2 = 0.7 * -0.07 + 0 * 0.3 = -0.05
Δw3 = 0.7 * 0 + 0 * 0.3 = 0
Δw4 = 0.7 * 0 + 0 * 0.3 = 0
w1 = w1 + Δw1 = 0.5
w2 = w2 + Δw2 = 0.73
w3 = w3 + Δw3 = -0.12
w4 = w4 + Δw4 = 0.13
Теперь давайте убедимся в том, что мы все сделали правильно и снова посчитаем выход НС только уже с обновленными весами.РешениеI1 = 1
I2 = 0
w1 = 0.5
w2 = 0.73
w3 = -0.12
w4 = 0.13
w5 = 1.563
w6 = -2.2
h2input = 1 * 0.5 + 0 * -0.12 = 0.5
h2output = sigmoid(0.5) = 0.62
h3input = 1 * 0.73 + 0 * 0.124 = 0.73
h3output = sigmoid(0.73) = 0.675
O1input = 0.62* 1.563 + 0.675 * -2.2 = -0.51
O1output = sigmoid(-0.51) = 0.37
O1ideal = 1 (0xor1=1)
Error = ((1-0.37)^2)/1=0.39
Результат — 0.37, ошибка — 39%.
Как мы видим после одной итерации МОР, нам удалось уменьшить ошибку на 0.04 (6%). Теперь нужно повторять это снова и снова, пока ваша ошибка не станет достаточно мала.
Нейросеть можно обучать с учителем и без (supervised, unsupervised learning).
Обучение с учителем — это тип тренировок присущий таким проблемам как регрессия и классификация (им мы и воспользовались в примере приведенном выше). Иными словами здесь вы выступаете в роли учителя а НС в роли ученика. Вы предоставляете входные данные и желаемый результат, то есть ученик посмотрев на входные данные поймет, что нужно стремиться к тому результату который вы ему предоставили.
Обучение без учителя — этот тип обучения встречается не так часто. Здесь нет учителя, поэтому сеть не получает желаемый результат или же их количество очень мало. В основном такой вид тренировок присущ НС у которых задача состоит в группировке данных по определенным параметрам. Допустим вы подаете на вход 10000 статей на хабре и после анализа всех этих статей НС сможет распределить их по категориям основываясь, например, на часто встречающихся словах. Статьи в которых упоминаются языки программирования, к программированию, а где такие слова как Photoshop, к дизайну.
Существует еще такой интересный метод, как обучение с подкреплением (reinforcement learning). Этот метод заслуживает отдельной статьи, но я попытаюсь вкратце описать его суть. Такой способ применим тогда, когда мы можем основываясь на результатах полученных от НС, дать ей оценку. Например мы хотим научить НС играть в PAC-MAN, тогда каждый раз когда НС будет набирать много очков мы будем ее поощрять. Иными словами мы предоставляем НС право найти любой способ достижения цели, до тех пор пока он будет давать хороший результат. Таким способом, сеть начнет понимать чего от нее хотят добиться и пытается найти наилучший способ достижения этой цели без постоянного предоставления данных “учителем”.
Также обучение можно производить тремя методами: стохастический метод (stochastic), пакетный метод (batch) и мини-пакетный метод (mini-batch). Существует очень много статей и исследований на тему того, какой из методов лучше и никто не может прийти к общему ответу. Я же сторонник стохастического метода, однако я не отрицаю тот факт, что каждый метод имеет свои плюсы и минусы.
Вкратце о каждом методе:
Стохастический (его еще иногда называют онлайн) метод работает по следующему принципу — нашел Δw, сразу обнови соответствующий вес.
Пакетный метод же работает по другому. Мы суммируем Δw всех весов на текущей итерации и только потом обновляем все веса используя эту сумму. Один из самых важных плюсов такого подхода — это значительная экономия времени на вычисление, точность же в таком случае может сильно пострадать.
Мини-пакетный метод является золотой серединой и пытается совместить в себе плюсы обоих методов. Здесь принцип таков: мы в свободном порядке распределяем веса по группам и меняем их веса на сумму Δw всех весов в той или иной группе.
Гиперпараметры — это значения, которые нужно подбирать вручную и зачастую методом проб и ошибок. Среди таких значений можно выделить:
- Момент и скорость обучения
- Количество скрытых слоев
- Количество нейронов в каждом слое
- Наличие или отсутствие нейронов смещения
В других типах НС присутствуют дополнительные гиперпараметры, но о них мы говорить не будем. Подбор верных гиперпараметров очень важен и будет напрямую влиять на сходимость вашей НС. Понять стоит ли использовать нейроны смещения или нет достаточно просто. Количество скрытых слоев и нейронов в них можно вычислить перебором основываясь на одном простом правиле — чем больше нейронов, тем точнее результат и тем экспоненциально больше время, которое вы потратите на ее обучение. Однако стоит помнить, что не стоит делать НС с 1000 нейронов для решения простых задач. А вот с выбором момента и скорости обучения все чуточку сложнее. Эти гиперпараметры будут варьироваться, в зависимости от поставленной задачи и архитектуры НС. Например, для решения XOR скорость обучения может быть в пределах 0.3 — 0.7, но в НС которая анализирует и предсказывает цену акций, скорость обучения выше 0.00001 приводит к плохой сходимости НС. Не стоит сейчас заострять свое внимание на гиперпараметрах и пытаться досконально понять, как же их выбирать. Это придет с опытом, а пока что советую просто экспериментировать и искать примеры решения той или иной задачи в сети.
Сходимость говорит о том, правильная ли архитектура НС и правильно ли были подобраны гиперпараметры в соответствии с поставленной задачей. Допустим наша программа выводит ошибку НС на каждой итерации в лог. Если с каждой итерацией ошибка будет уменьшаться, то мы на верном пути и наша НС сходится. Если же ошибка будет прыгать вверх — вниз или застынет на определенном уровне, то НС не сходится. В 99% случаев это решается изменением гиперпараметров. Оставшийся 1% будет означать, что у вас ошибка в архитектуре НС. Также бывает, что на сходимость влияет переобучение НС.
Переобучение, как следует из названия, это состояние нейросети, когда она перенасыщена данными. Это проблема возникает, если слишком долго обучать сеть на одних и тех же данных. Иными словами, сеть начнет не учиться на данных, а запоминать и “зубрить” их. Соответственно, когда вы уже будете подавать на вход этой НС новые данные, то в полученных данных может появиться шум, который будет влиять на точность результата. Например, если мы будем показывать НС разные фотографии яблок (только красные) и говорить что это яблоко. Тогда, когда НС увидит желтое или зеленое яблоко, оно не сможет определить, что это яблоко, так как она запомнила, что все яблоки должны быть красными. И наоборот, когда НС увидит что-то красное и по форме совпадающее с яблоком, например персик, она скажет, что это яблоко. Это и есть шум. На графике шум будет выглядеть следующим образом.
Видно, что график функции сильно колеблется от точки к точке, которые являются выходными данными (результатом) нашей НС. В идеале, этот график должен быть менее волнистый и прямой. Чтобы избежать переобучения, не стоит долго тренировать НС на одних и тех же или очень похожих данных. Также, переобучение может быть вызвано большим количеством параметров, которые вы подаете на вход НС или слишком сложной архитектурой. Таким образом, когда вы замечаете ошибки (шум) в выходных данных после этапа обучения, то вам стоит использовать один из методов регуляризации, но в большинстве случаев это не понадобиться.
Надеюсь эта статья смогла прояснить ключевые моменты такого нелегко предмета, как Нейронные сети. Однако я считаю, что сколько бы ты статей не прочел, без практики такую сложную тему освоить невозможно. Поэтому, если вы только в начале пути и хотите изучить эту перспективную и развивающуюся отрасль, то советую начать практиковаться с написания своей НС, а уже после прибегать к помощи различных фреймворков и библиотек. Также, если вам интересен мой метод изложения информации и вы хотите, чтобы я написал статьи на другие темы связанные с Машинным обучением, то проголосуйте в опросе ниже за ту тему которую вам интересна. До встречи в будущих статьях 🙂
НОУ ИНТУИТ | Основы теории нейронных сетей
Форма обучения:
дистанционная
Стоимость самостоятельного обучения:
бесплатно
Доступ:
свободный
Документ об окончании:
Уровень:
Специалист
Длительность:
13:49:00
Выпускников:
1009
Качество курса:
4.37 | 4.06
Одним из популярных направлений Artificial Intelligence является теория нейронных сетей (neuron nets). Данный курс является систематизированным вводным курсом в это направление. Нашей целью является познакомить слушателей с основными нейроно-сетевыми парадигмами, показать область применения этого направления.
Людей всегда интересовало их собственное мышление. Это самовопрошение, думанье мозга о себе самом является, возможно, отличительной чертой человека. Нейробиологи и нейроанатомы достигли в этой области значительного прогресса. Усердно изучая структуру и функции нервной системы человека, они многое поняли в «электропроводке» мозга, но мало узнали о его функционировании. В процессе накопления ими знаний выяснилось, что мозг имеет ошеломляющую сложность. Сотни миллиардов нейронов, каждый из которых соединен с сотнями или тысячами других, образуют систему, далеко превосходящую наши самые смелые мечты о суперкомпьютерах. На сегодняшний день существуют две взаимно обогащающие друг друга цели нейронного моделирования: первая – понять функционирование нервной системы человека на уровне физиологии и психологии и вторая – создать вычислительные системы (искусственные нейронные сети), выполняющие функции, сходные с функциями мозга. Именно эта последняя цель и находится в центре внимания данного курса. В лекциях курса рассматриваются такие классические нейроно-сетевые парадигмы как персептроны, сети Хопфилда и Хэмминга, сети встречного распространения, двунаправленная ассоциативная память, теория адаптивного резонанса, когнитроны и неокогнитроны. Для каждой рассматриваемой сети дается описание ее архитектуры, алгоритмов обучения, анализируются проблемы емкости и устойчивости сети.
ISBN: 978-5-9556-0049-9
Теги: .net, алгоритмы, АРТ, выходной слой, искусственная жизнь, искусственные нейронные сети, исследования, когнитрон, компоненты, локальные минимумы, нейронные сети, обучение, персептрон, поиск, процедуры, сеть хопфилда, синапс, сходимость, фотографии, целевая функцияПредварительные курсы
Дополнительные курсы
2 часа 30 минут
—
Основы искусственных нейронных сетей
В лекции рассматриваются общие положения теории искусственных нейронных сетей. Описана структура однослойных и многослойных нейронных сетей, введено понятие обучения нейронной сети и дана классификация алгоритмов обучения.—
Персептроны. Представимость и разделимость
В лекции дается определение персептрона, рассматривается его архитектура. Описывается класс задач, решаемых с помощью персептрона, доказывается, какие задачи невозможно решить с его помощью.—
Персептроны. Обучение персептрона
В лекции рассматриваются алгоритм обучения персептрона, вопросы сходимости алгоритма обучения и подбора количественных характеристик весовых коэффициентов. Исследуются многослойные персептроны и возможности их обучения.—
Сети встречного распространения
В лекции изложены архитектура, функционирование и методы обучения сетей встречного распространения. В качестве примера использования данной сети рассматриваются методы сжатия данных.—
Стохастические методы обучения нейронных сетей
В лекции дается обзор основных стохастических методов, используемых для обучения нейронных сетей: метод отжига металла, больцмановское обучение, обучение Коши, метод искусственной теплоемкости.—
Нейронные сети Хопфилда и Хэмминга
В лекции рассматривается архитектура сети Хопфилда и ее модификация — сеть Хэмминга, затрагиваются вопросы устойчивости сети Хопфилда. В заключении лекции рассматриваются понятие ассоциативности памяти и задача распознавания образов.—
Обобщения и применения модели Хопфилда
В лекции рассматриваются вероятностные обобщения модели Хопфилда и статистическая машина. Описывается аналого-цифровой преобразователь — как модель сети с обратным распределением. В качестве примера приводится представление информации в сети Хопфилда, решающей задачу коммивояжера.—
Двунаправленная ассоциативная память
В лекции рассматриваются архитектура и принципы работы нейронной сети ДАП. Затронуты вопросы емкости данной сети. Дается обзор некоторых модификаций этой сети.—
Теория адаптивного резонанса. Реализация
В лекции рассматривается процесс функционирования АРТ. Приводится пример обучения сети АРТ. Обсуждаются основные характеристики АРТ. Дается обзор модификаций сети АРТ.—
Когнитрон
В лекции рассматривается архитектура, процедура обучения и функционирование когнитрона. Описан пример функционирования четырехслойного когнитрона распознавания образов.—
Неокогнитрон
В лекции рассматривается архитектура, процедура обучения и функционирования неокогнитрона. Отмечается его сходство и отличие от когнитрона.—
Алгоритмы обучения
В данной лекции рассматриваются различные методы обучения нейронных сетей. Некоторые из этих методов частично приводились на предыдущих лекциях, но отмечены снова для создания у слушателей целостного представления об изучаемой области.—
Бесплатный онлайн-курс: нейронные сети и глубокое обучение от Coursera
Лучшие онлайн-курсы за все время (издание 2020 г.)
Посмотреть Закрыть Класс Центральный ПредметыСубъектов
Компьютерная наука
Здоровье и медицина
Математика
Бизнес
Гуманитарные науки
Инженерное дело
Наука
Образование и обучение
Социальные науки
Художественный дизайн
Data Science
Программирование
Личное развитие
- Все предметы
Ежемесячные отчеты о курсе
- Начиная с этого месяца
- Новые онлайн-курсы
- Самостоятельный темп
- Самый популярный
Меню
Компьютерная наука
Компьютерная наука
- Искуственный интеллект
- Алгоритмы и структуры данных
- Интернет вещей
- Информационные технологии
- Кибер-безопасности
- Компьютерная сеть
- Машинное обучение
- DevOps
- Глубокое обучение
- Блокчейн и криптовалюта
- Квантовые вычисления
- Посмотреть все компьютерные науки
Здоровье и медицина
Здоровье и медицина
- Питание и благополучие
- Болезни и расстройства
- Здравоохранение
- Здравоохранение
- Уход
- Анатомия
- Ветеринарная наука
- Посмотреть все Здоровье и медицина
Математика
Математика
- Статистика и вероятность
- Основы математики
- Исчисление
- Алгебра и геометрия
- Посмотреть всю математику
Бизнес
Бизнес
- Менеджмент и лидерство
- Финансы
- Предпринимательство
- Развитие бизнеса
- Маркетинг
- Стратегический менеджмент
- Специфическая отрасль
- Бизнес-аналитика
- Бухгалтерский учет
- Отдел кадров
- Управление проектом
- Продажи
- Дизайн-мышление
- Реклама
- Программное обеспечение для бизнеса
- Посмотреть все Бизнес
Гуманитарные науки
Гуманитарные науки
- История
- Литература
- Иностранный язык
- Грамматика и письмо
- Философия
- Религия
- ESL
- Культура
- Виды спорта
- Журналистика
- Этика
- Лингвистика
- Просмотреть все гуманитарные науки
Инженерное дело
Инженерное дело
- Электротехника
- Механическая инженерия
- Гражданское строительство
- Робототехника
- Нанотехнологии
- ГИС
- Текстиль
- Производство
- BIM
- CAD
- Химическая инженерия
- Посмотреть все разработки
Наука
Наука
- Химия
- Физика
- Наука об окружающей среде
- Астрономия
- Биология
- Квантовая механика
- сельское хозяйство
- Термодинамика
- Материаловедение
- Просмотреть все науки
Образование и обучение
Образование и обучение
- K12
- Высшее образование
- STEM
- Профессиональное развитие учителей
- Развитие курса
Бесплатный онлайн-курс: нейронные сети для машинного обучения от Coursera
Лучшие онлайн-курсы за все время (издание 2020 г.)
Посмотреть Закрыть Класс Центральный ПредметыСубъектов
Компьютерная наука
Здоровье и медицина
Математика
Бизнес
Гуманитарные науки
Инженерное дело
Наука
Образование и обучение
Социальные науки
Художественный дизайн
Data Science
Программирование
Личное развитие
- Все предметы
Ежемесячные отчеты о курсе
- Начиная с этого месяца
- Новые онлайн-курсы
- Самостоятельный темп
- Самый популярный
Меню
Компьютерная наука
Компьютерная наука
- Искуственный интеллект
- Алгоритмы и структуры данных
- Интернет вещей
- Информационные технологии
- Кибер-безопасности
- Компьютерная сеть
- Машинное обучение
- DevOps
- Глубокое обучение
- Блокчейн и криптовалюта
- Квантовые вычисления
- Посмотреть все компьютерные науки
Здоровье и медицина
Здоровье и медицина
- Питание и благополучие
- Болезни и расстройства
- Здравоохранение
- Здравоохранение
- Уход
- Анатомия
- Ветеринарная наука
- Посмотреть все Здоровье и медицина
Математика
Математика
- Статистика и вероятность
- Основы математики
- Исчисление
- Алгебра и геометрия
- Посмотреть всю математику
Бизнес
Бизнес
- Менеджмент и лидерство
- Финансы
- Предпринимательство
- Развитие бизнеса
- Маркетинг
- Стратегический менеджмент
- Специфическая отрасль
- Бизнес-аналитика
- Бухгалтерский учет
- Отдел кадров
- Управление проектом
- Продажи
- Дизайн-мышление
- Реклама
- Программное обеспечение для бизнеса
- Посмотреть все Бизнес
Гуманитарные науки
Гуманитарные науки
- История
- Литература
- Иностранный язык
- Грамматика и письмо
- Философия
- Религия
- ESL
- Культура
- Виды спорта
- Журналистика
- Этика
- Лингвистика
- Просмотреть все гуманитарные науки
Инженерное дело
Инженерное дело
- Электротехника
- Механическая инженерия
- Гражданское строительство
- Робототехника
- Нанотехнологии
- ГИС
- Текстиль
- Производство
- BIM
- CAD
- Химическая инженерия
- Посмотреть все разработки
Наука
Наука
- Химия
- Физика
- Наука об окружающей среде
- Астрономия
- Биология
- Квантовая механика
- сельское хозяйство
- Термодинамика
- Материаловедение
- Просмотреть все науки
Образование и обучение
Образование и обучение
- K12
- Высшее образование
- STEM
- Профессиональное развитие учителей
- Развитие курса
- Онлайн-образование
- Подготовка к тесту
- Просмотреть все Образование и обучение