Введение в нейросети |
||||||||||||||||||||||||||||||||||||||||||||||||||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2017-11-15 10:51 Искусственные нейронные сети сейчас находятся на пике популярности. Можно задаться вопросом, сыграло ли громкое название свою роль в маркетинге и применении этой модели. Я знаю некоторых бизнес-менеджеров, радостно упоминающих об использовании в их продуктах «искусственных нейронных сетей» и «глубокого обучения». Так ли рады были бы они, если бы их продукты использовали «модели с соединёнными кругами» или «машины „совершишь ошибку — будешь наказан“»? Но, вне всяких сомнений, искусственные нейросети — стоящая вещь, и это очевидно благодаря их успеху во множестве областей применения: распознавание изображений, обработка естественных языков, автоматизированный трейдинг и автономные автомобили. Я специалист по обработке и анализу данных, но раньше не понимал их, поэтому чувствовал себя мастером, не освоившим свой инструмент. Но наконец я выполнил своё «домашнее задание» и написал эту статью, чтобы помочь другим преодолеть те же самые препятствия, которые встретились мне в процессе моего (всё ещё продолжающегося) обучения.
Код на R для примеров, представленных в этой статье, можно найти здесь в Библии задач машинного обучения. Кроме того, после прочтения этой статьи стоит изучить часть 2, Neural Networks – A Worked Example, в которой приведены подробности создания и программирования нейросети с нуля. Мы начнём с мотивирующей задачи. У нас есть набор изображений в градациях серого, каждое из которых является сеткой пикселей 2?2, в которой каждый пиксель имеет значение яркости от 0 (белый) до 255 (чёрный). Наша цель — создать модель, которая будет находить изображения с паттерном «лестницы». Предварительная обработка В каждом изображении мы помечаем пиксели , , , и генерируем входной вектор , который будет являться входными данными нашей модели. Мы ожидаем, что наша модель будет прогнозировать True (изображение содержит паттерн лестницы) или False (изображение не содержит паттерна лестницы).
Однослойный перцептрон (итерация модели 0) Мы можем построить простую модель, состоящую из однослойного перцептрона. Перцептрон использует взвешенную линейную комбинацию входных данных для возврата оценки прогноза. Если оценка прогноза превышает выбранный порог, то перцептрон прогнозирует True. В противном случае он прогнозирует False. Если более формально, тоДавайте выразим это иначе Здесь — наша оценка прогноза. Графически мы можем представить перцептрон как входные узлы, передающие данные выходному узлу.
Случай A Начнём с изображения x = [100, 0, 0, 125]. Увеличим с 0 до 60.Случай B Начнём с предыдущего изображения, x = [100, 0, 60, 125]. Увеличим с 60 до 120.У нашего линейного перцептрона есть и другие проблемы, но давайте сначала решим эти две. Однослойный перцептрон с сигмоидной функцией активации (итерация модели 1) Мы можем решить проблемы 1 и 2, обернув наш перцептрон в сигмоиду (с последующим выбором других весов). Стоит напомнить, что функция «сигмоида» — это S-образная кривая, ограниченная по вертикальной оси между 0 и 1, благодаря чему она часто используется для моделирования вероятности двоичного события.Продолжим с нашим примером задачи и будем считать, что у нас получилась следующая подобранная модель: Понаблюдаем, как эта модель ведёт себя на тех же примерах изображений из предыдущего раздела. Случай A Начнём с изображения [100, 0, 0, 100]. Увеличим " с 0 до 50.Случай B Начнём с изображения [100, 0, 50, 100]. Увеличим " с 50 до 100.Заметьте, как кривизна сигмоиды заставляет случай A «сработать» (быстро увеличиться) с увеличением , но темп замедляется при продолжении увеличения . Это соответствует нашему интуитивному пониманию, что случай A должен отражать бОльшее увеличение вероятности паттерна лестницы, чем случай B. К сожалению, эта модель по-прежнему имеет проблемы.
Многослойный перцептрон с сигмоидной функцией активации (итерация модели 2) Мы можем решить обе вышеуказанные проблемы, добавив в нашу модель перцептрона ещё один слой. Мы создадим несколько базовых моделей, похожих на представленные выше, но мы будем передавать выходные данные каждой базовой модели на вход другого перцептрона. Эта модель на самом деле является «ванильной» нейронной сетью. Давайте посмотрим, как она может работать в разных примерах.Пример 1: распознавание паттерна лестницы
Пример 2: распознать лестницы светлого оттенка
Примечание о терминологии Однослойный перцептрон имеет один выходной слой. То есть построенные нами модели будут называться двуслойными перцептронами, потому что у них есть выходной слой, являющийся входом другого выходного слоя. Однако мы можем называть те же самые модели нейронными сетями, и в этом случае сети имеют три слоя — входной слой, скрытый слой и выходной слой.Альтернативные функции активации В наших примерах мы использовали сигмоидную функцию активации. Однако можно применять и другие функции активации. Часто применяются tanh и relu. Функция активации должна быть нелинейной, в противном случае нейронная сеть упростится до аналогичного однослойного перцептрона.Многоклассовая классификация Мы с лёгкостью можем расширить нашу модель, чтобы она работала в многоклассовой классификации, с помощью использования нескольких узлов в конечном выходном слое. Идея здесь заключается в том, что каждый выходной узел соответствует одному из классов , которые мы стремимся спрогнозировать. Вместо сужения выхода с помощью сигмоиды, которая отражает элемент из в элемент из интервала [0, 1] мы можем использовать функцию softmax, которая отражает вектор в в вектор в таким образом, что сумма элементов получившегося вектора равна 1. Иными словами, мы можем создать такую сеть, которая даёт на выходе вектор [, , …, ].Использование трёх и более слоёв (глубокое обучение) Вы можете задаться вопросом — можно ли расширить нашу «ванильную» нейронную сеть так, чтобы её выходной слой передавался на четвёртый слой (а потом на пятый, шестой и т.д.)? Да. Обычно это называется «глубоким обучением». На практике оно может быть очень эффективным. Однако стоит заметить, что любую сеть, состоящую из более чем одного скрытого слоя, можно имитировать сетью с одним скрытым слоем. И в самом деле, согласно универсальной теореме аппроксимации любую непрерывную функцию можно аппроксимировать с помощью нейронной сети с одним скрытым слоем. Причина частого выбора глубоких архитектур нейронных сетей вместо сетей с одним скрытым слоем заключается в том, что при процедуре подбора они обычно сходятся к решению быстрее.Подбор модели под размеченные обучающие образцы (обратное распространение ошибки обучения) Увы, но мы добрались и до процедуры подбора. До этого мы говорили о том, что нейросети могут работать эффективно, но не обсуждали то, как нейросеть подгоняется под размеченные обучающие образцы. Аналогом этого вопроса может быть такой: «Как можно выбрать наилучшие веса для сети на основании нескольких размеченных обучающих образцов?». Обычным ответом является градиентный спуск (хотя может подойти и ММП). Если продолжить работу над нашим примером задачи, то процедура градиентного спуска может выглядеть примерно так:
По крайней мере, такова основная идея. При реализации на практике возникает множество затруднений. Затруднение 1 – вычислительная сложность В процессе подбора среди прочего нам нужно вычислять градиент с учётом каждого веса. Это сложно, потому что зависит от каждого узла в выходном слое, и каждый из этих узлов зависит от каждого узла в слое перед ним, и так далее. Это значит, что вычисление превращается в настоящий кошмар с формулами сложных производных. (Не забывайте, что многие нейронные сети в реальном мире содержат тысячи узлов в десятках слоёв.) Решить эту задачу можно, заметив, что при применении формулы сложной производной большинство повторно использует одинаковые промежуточные производные. Если вы будете внимательно это отслеживать, то сможете избежать одних и тех же повторных вычислений тысячи раз.Ещё одна хитрость заключается в использовании специальных функций активации, производные которых можно записать как функцию их значения. Например, производная = . Это удобно, потому что во время прямого прохода при вычислении для каждого обучающего образца нам нужно вычислять поэлементно для некоторого вектора . Во время обратного распространения мы можем повторно использовать эти значения для вычисления градиента с учётом весов, что позволит сэкономить время и память. Третья хитрость заключается в разделении обучающих образцов на «минигруппы» и в изменении весов с учётом каждой группы, одной за другой. Например, если мы разделим обучающие данные на {batch1, batch2, batch3}, то первый проход по обучающим данным будет
где градиент повторно вычисляется после каждого изменения. Напоследок стоит упомянуть ещё одну технику — использование вместо центрального процессора видеопроцессора, потому что он лучше подходит для выполнения большого количества параллельных вычислений. Затруднение 2 – у градиентного спуска могут возникать проблемы с поиском абсолютного минимума Это проблема не столько нейросетей, сколько градиентного спуска. Существует вероятность, что во время градиентного спуска веса могут застрять в локальном минимуме. Также возможно, что веса «перепрыгнут» минимум. Один из способов справиться с этим — использовать различные размеры шагов. Ещё один способ — увеличить количество узлов и/или слоёв в сети. (Но стоит опасаться чрезмерно близкой подгонки). Кроме того, могут быть эффективными некоторые эвристические техники, например, использование момента.Затруднение 3 – как выработать общий подход? Как написать генетическую программу, которая сможет подбирать значения для любой нейросети с любым количеством узлов и слоёв? Правильный ответ — никак, нужно использовать Tensorflow. Но если вы хотите попробовать, то самой сложной частью будет вычисление градиента функции потерь. Хитрость здесь в том, чтобы определить, что градиент можно представить как рекурсивную функцию. Нейронная сеть с пятью слоями — это просто нейронная сеть с четырьмя слоями, передающая данные в какие-то перцептроны. Но нейросеть с четырьмя слоями — это просто нейросеть с тремя слоями, передающая данные в какие-то перцептроны и так далее. Более формально это называется автоматическим дифференцированием.Источник: habrahabr.ru Комментарии: |
|||||||||||||||||||||||||||||||||||||||||||||||||