#1 Нейронные сети для начинающих. Решение задачи классификации Ирисов Фишера |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2022-08-10 17:15 На хабре было множество публикаций по данной теме, но все они говорят о разных вещах. Решил собрать всё в одну кучку и рассказать людям. Нейро?нная сеть — математическая модель, а также её программное или аппаратное воплощение, построенная по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма (в частности, мозга). ? Виды нейронных сетей: Есть десятки видов нейросетей, которые отличаются архитектурой, особенностями функционирования и сферами применения. При этом чаще других встречаются сети трёх видов. Нейронные сети прямого распространения (Feed forward neural networks, FFNN). Прямолинейный вид нейросетей, при котором соседние узлы слоя не связаны, а передача информации осуществляется напрямую от входного слоя к выходному. FFNN имеют малую функциональность, поэтому часто используются в комбинации с сетями других видов. Свёрточные нейронные сети (Convolutional neural network, CNN). Состоят из слоёв пяти типов:
Каждый слой выполняет определённую задачу: например, обобщает или соединяет данные. Свёрточные нейросети применяются для классификации изображений, распознавания объектов, прогнозирования, обработки естественного языка и других задач. Рекуррентные нейронные сети (Recurrent neural network, RNN). Используют направленную последовательность связи между узлами. В RNN результат вычислений на каждом этапе используется в качестве исходных данных для следующего. Благодаря этому, рекуррентные нейронные сети могут обрабатывать серии событий во времени или последовательности для получения результата вычислений. RNN применяют для языкового моделирования и генерации текстов, машинного перевода, распознавания речи и других задач. ? Типы задач, которые решают нейронные сети Выделяют несколько базовых типов задач, для решения которых могут использоваться нейросети.
Как выглядит простая нейронная сеть? Выяснив, как же она выглядит, мы перед тем, как разобрать её строение: что, зачем и почему — разберёмся, где же они применяются и что с помощью них можно сделать. Вот примерный список областей, где решение такого рода задач имеет практическое значение уже сейчас:
Теперь разберём подробнее самую простую модель искусственного нейрона — перцептрон: Вы уже могли видеть подобные иллюстрации на просторах интернета: Но что же это всё означает? Давайте по порядку: Х1, Х2, Х3, ..., Хn — входные классы, данные, которые мы подаём на вход нашей сети. Т.е. здесь у нас идут те данные, которые пришли к нам от клиента или же от нашего сервиса, который каким-то образом собирает/парсит данные , далее эти данные умножаются на случайные веса (стандартное обозначение W1, ..., Wn) и суммируются с так называемым нейроном смещения или bias нейрон в «Сумматоре» (из названия следует, что данные, Хn * Wn , суммируются друг с другом). Далее результат ?(Хn * Wn * b) подаётся в функцию активации, о которой поговорим далее. Данные метаморфозы проиллюстрированы на следующем слайде: ? Задача классификации Проговорив в общих чертах строение «базовой нейронной сети», плавно перейдём к рассмотрению задачи классификации — основной задачи нейронных сетей. Примитивно эту задачу можно проиллюстрировать следующим образом: Мы с вами, с лёгкостью можем понять, что ответ будет следующий: Но а что на это скажет компьютер? Для него это лишь набор пикселей/байтов, который ему ни о чём не говорит. По-простому — это 0 и 1. Подробнее про это, можете почитать здесь. Для того, чтобы компьютер понял, что происходит внутри предложенных ему данных, мы должны «объяснить» ему всё и дать какой-то алгоритм, т.е. написать программу. ? Функции активации — ФА Но это будет не просто программа, помимо базового кода, нам необходимо ввести так называемую математическую модель или же функцию активации, что же это такое? Давайте рассмотрим некоторые распространённые ФА: Первое, что приходит в голову, это вопрос о том, что считать границей активации для активационной функции. Если значение Y больше некоторого порогового значения, считаем нейрон активированным. В противном случае говорим, что нейрон неактивен. Такая схема должна сработать, но сначала давайте её формализуем. Функция А = активирована, если Y > граница, иначе нет. Другой способ: A = 1, если Y > граница, иначе А = 0. Функция, которую мы только что создали, называется ступенчатой. Функция принимает значение 1 (активирована), когда Y > 0 (граница), и значение 0 (не активирована) в противном случае. Пользуясь определением, становится понятно, что ReLu возвращает значение х, если х положительно, и 0 в противном случае. ReLu нелинейна по своей природе, а комбинация ReLu также нелинейна! (На самом деле, такая функция является хорошим аппроксиматором, так как любая функция может быть аппроксимирована комбинацией ReLu). Это означает, что мы можем стэкать слои. Область допустимых значений ReLu — [ 0,inf ]. ReLu менее требовательно к вычислительным ресурсам, так как производит более простые математические операции. Поэтому имеет смысл использовать ReLu при создании глубоких нейронных сетей. Сигмоида выглядит гладкой и подобна ступенчатой функции. Рассмотрим её преимущества. Во-первых, сигмоида — нелинейна по своей природе, а комбинация таких функций производит тоже нелинейную функцию. Ещё одно достоинство такой функции — она не бинарна, что делает активацию аналоговой, в отличие от ступенчатой функции. Для сигмоиды также характерен гладкий градиент. Если вы заметили, в диапазоне значений X от -2 до 2 значения Y меняется очень быстро. Это означает, что любое малое изменение значения X в этой области влечёт существенное изменение значения Y. Такое поведение функции указывает на то, что Y имеет тенденцию прижиматься к одному из краёв кривой. Сигмоида действительно выглядит подходящей функцией для задач классификации. Она стремится привести значения к одной из сторон кривой (например, к верхнему при х=2 и нижнему при х=-2). Такое поведение позволяет находить чёткие границы при предсказании. Другое преимущество сигмоиды над линейной функцией заключается в следующем. В первом случае имеем фиксированный диапазон значений функции — [0,1], тогда как линейная функция изменяется в пределах (-inf, inf). Такое свойство сигмоиды очень полезно, так как не приводит к ошибкам в случае больших значений активации. Сегодня сигмоида является одной из самых частых активационных функций в нейросетях. Как же обучить нейронную сеть? Теперь перейдём к другим немаловажным терминам.
Цель обучения нейронной сети — найти такие параметры сети, при которых нейронная сеть будет ошибаться наименьшее количество раз. Ошибка нейронной сети — отличие между предсказанным значением и правильным. Самая простая функция потерь — Евклидово Расстояние или функция MSE:
yi – правильный результат.
??????(?) — функция, возвращающая элемент вектора, где достигается минимум. Градиентный спуск — метод нахождения локального минимума или максимума функции при помощи движения вдоль градиента. Для вычисления градиентного спуска нам надо посчитать частные производные функции ошибки, по всем обучаемым параметрам нашей модели.
Пресловутые «Ирисы Фишера» Теперь немного уйдём от голой теории и сделаем простую программу, решив базовую задачу классификации. Это базовая задача для специалистов, начинающих свой путь в нейронных сетях, своеобразный «Hello world!», для этого направления. Ирисы Фишера — это набор данных для задачи классификации, на примере которого, Рональд Фишер в 1936 году продемонстрировал работу разработанного им метода дискриминантного анализа. Иногда его также называют ирисами Андерсона, так как данные были собраны американским ботаником Эдгаром Андерсоном. Этот набор данных стал уже классическим, и часто используется в литературе для иллюстрации работы различных статистических алгоритмов. Вот так распределяются данные в датасете: Ирисы Фишера состоят из данных о 150 экземплярах ириса, по 50 экземпляров из трёх видов:
Для каждого экземпляра измерялись четыре характеристики (в сантиметрах):
Конструкция нейронной сети: На входе у нас есть 4 класса(характеристики) — Х, также нам понадобится всего один внутренний слой — Н, в нём будет 10 нейронов (выбирается методом подбора), далее на выходе мы имеем 3 класса, которые зависят от характеристики цветов — Z. Получается вот такая конструкция сети: Далее распишем математическое обоснование для нашей задачи:Ура-а-а-а! Наконец-то код! Нам потребуется:
Для начала нам необходимо импортировать библиотеки numpy и random:
Теперь пропишем некоторые гиперпараметры:
Теперь зададим входной вектор и его веса (вначале рандомим данные, для получения реальной картины весов):
Расписываем вложенный слой — наше математическое обоснование:
Точно также сделаем и для остальных. Теперь обернём наш код в функцию:
Оформим функцию relu():
Теперь добавим softmax():
Добавим вызов функции predict(), также class_names — имена выходных классов и вывод результатов предсказания:
Наш код здесь нарандомит значения входных коэффициентов и весов, поэтому и результат будет случайный. Для тех, кто хочет весь код сразу:
Вот теперь добавим полученные после обучения веса и входные данные:
Опять же для любителей всего кода в одном месте:
И в итоге мы получим нужное нам предсказание Полноценный код можно также посмотреть в моём github-репозитории по ссылке. Ну что же, мы с вами написали свой «Hello world» с нейронными сетями! Эта задача показывает одно из самых популярных направлений в DataSciense — направление классификации данных. Этим мы приоткрыли дверь в большой и быстроразвивающийся мир человекоподобных технологий. Дальше больше! А какие примеры классификации и интересные задачи из направления DataSciense вы знаете? Пишите свой вариант в комментариях! Источник: habr.com Комментарии: |
|