Искусственный интеллект и все-все-все
Очень часто люди, не имеющие дела с искуственным интеллектом лично, думают, что "искусственный интеллект", "машинное обучение" и "глубокое обучение" - взаимо заменяемые словосочетания. Однако, это не совсем так.
Давайте посмотрим, какое определение искусственному интеллекту дает толковый словарь по искусственному интеллекту:
Интеллект Искусственный - научное направление, в рамках которого ставятся и решаются задачи аппаратного или программного моделирования тех видов человеческой деятельности, которые традиционно считаются интеллектуальными.
То есть это самый общий термин из всех трех, он, как можно догадаться, включает в себя все остальные, и обозначает целую область знаний.
Стоит заметить, что в обиходе под искусственным интеллектом обычно понимается умение машины выполнять какие-то действия наравне с человеком (или даже лучше). Здесь лучше подойдет второе определение:
Интеллект Искусственный - свойство интеллектуальных систем выполнять функции (творческие), которые традиционно считаются прерогативой человека.
С искусственным интеллектом все вроде бы понятно. Этот термин можно почти безошибочно применять ко всему, что нам кажется достаточно умным для машины :) Перейдем к машинному обучению. Что это такое? Вот определение, которое я для себя вывела.
Машинное обучение - огромный подраздел искусственного интеллекта, характерной чертой которого является то, что алгоритм поиска решения некоторой задачи строится не на том, что мы пишем определенную последовательность команд, выполнение которых приводит к ответу, а на том, что машина сама находит закономерности в предоставленных ей данных и на основании этих закономерностей делает предсказания, каким может быть ответ.
Чтобы запомнить, что машинное обучение - только подраздел искуственного интеллекта, упомяну несколько других таких же подразделов:
- Интеллектуальная робототехника
- Экспертные системы
- Машинное творчество и т.д.
Конечно, зачастую эти подразделы переплетаются между собой. Главное, что отличает машинное обучение от остальных подразделов - самостоятельное получение машиной новых знаний.
Теперь глубокое обучение (deep learning). Глубокое обучение - один из видов машинного обучения. Это такой способ извлечения и обработки данных, который базируется на многослойных нейронных сетях.
Как это работает? Если в двух словах, то каждый слой сети состоит из нескольких нейронов. Каждый нейрон получает на вход данные от нейронов предыдущего уровня, обрабатывает полученную информацию, и передает обработанные данные нейронам из следующего слоя.
Это очень коротко и непонятно, но подробнее напишу об этом позже. Пока достаточно запомнить, что помимо глубокого обучения, есть еще такие виды машинного обучения, как:
- Классические методы обучения (с учителем/без учителя)
- Ансамблевые методы (Стеккинг, Беггинг, Бустинг)
- Обучение с подкреплением
Различных методов очень много и классифицировать их можно по-разному. Основное, что отличает глубокое обучение от остальных методов, это то, что обучение происходит на нейронных сетях с несколькими слоями.
Искусственный интеллект уже стал частью нашей повседневной жизни. Далее привожу примеры успешного использования ИИ.
Компьютерное зрение:
- Распознавание номеров автомобилей
- Распознавание лиц
- Беспилотные автомобили
- Поиск фотографий на телефоне по таким запросам, как "закат", "пикник", "Новый год" и т.д.
В медицине:
- Диагностирование рака
- Нахождение различных патологий на рентгеновских снимках, МРТ и др.
Обработка естественного языка:
- Распознавание речи ("Привет, Алиса", "Ок, Google" и т.п.)
- Классификация документов по темам
- Поддержание разоговора, ответы на вопросы (различные чат-боты)
- Генерация текста
А так же:
Рекомендательные системы: Расположение ссылок в поисковиках по релевантности, подбор фильмов, "Вам также может понравиться...", контекстная реклама и вот это всё.
Игры: Искуственный интеллект уже обыграл человека в шахматы и Го, а помимо этого умеет проходить много других игр.
На видео: программист из Австралии научил ИИ играть в динозаврика из Chrome. Видео длинное, но посмотреть любопытно.
И многое-многое другое... ИИ врывается во многие сферы жизни, и мы сами уже не замечаем, что встречаемся с ним ежедневно.
Представим ситуацию: нам нужно отправить большой архив фотографий бабушке, но при этом не хотим, чтобы она увидела, что кто-то из её любимых внуков завел дома удава. Руками перебирать все фотографии очень долго, поэтому мы хотим написать такую программу, которая сама могла бы определить, есть ли на фото удав или нет. Время выхода нейронной сети на сцену!
Мы хотим, чтобы общая концепция была такая: скармливаем фото программе, она что-то с ней делает, а нам только выдает результат: "Все отлично, удава здесь нет".
На самом деле, программе не достаточно получить только фотографию, она еще хочет получить параметры - набор значений для её внутренних переменных, чтобы она точно знала, что делать с входными данными - искать удава или искать закат. То, что мы получим на выходе, напрямую зависит от этих самых параметров.
Откуда нам взять параметры?
С разными параметрами наша модель (модель - программа, поведение которой определяется параметрами) и предсказывает по-разному. Чтобы достичь максимума точности в таком непростом деле, как детектирование удава, было бы неплохо, если бы она сама умела сравнивать эффективность при разных параметрах и запоминать лучшие. А еще мы бы хотели, чтобы она сама умела подбирать параметры так, чтобы её точность повышалась.
Например, подаем мы ей на вход параметры (а1, а2, а3, ... ,аn) и набор фотографий с пометками о наличии на них удава. Модель берет фотографию и говорит: "Здесь есть удав с вероятностью 60%". Потом смотрит в ответы и видит, что удав тут и на самом деле есть. Тогда она думает: "Хм, параметр а10 сбил меня с мысли, а ведь параметры а11 и а25 мне говорили, что тут точно есть удав". Берет следующую фотографию. Точно так же делает предположение, сверяет с ответом, смотрит, какие параметры надо поменять. Когда она проделает это со всеми поданными на вход фотографиями, она определяет точность, с которой она сейчас умеет определять удава. Например, она находит удава на фото в 75% случаев. Теперь она предлагает поменять определенные параметры, например, а10 уменьшить, а а11 и а25 увеличить.Теперь с этими параметрами она снова берет все фотографии и проделывает все то же самое. И оп! С такими параметрами она находит удава в 83% случаев. Опять корректирует значения и так далее. Прелесть в том, что модель делает все это без нашей помощи и учится на своих ошибках.
При этом модели важно не просто то, что она сказала, что "здесь есть удав", но и еще и то, с каким качеством она это сделала, насколько она уверена в своих результатах. И её цель - повысить именно это качество, стать увереннее в себе :), а не просто выдать какой-то ответ.
Когда нам нравится качество, с которым модель предсказывает результаты, мы сохраняем параметры, при которых оно достигается. Теперь наша модель уже обучена. В следующий раз нам не придется заново учить её опознавать удавов - мы загружаем ей свои фотографии (уже без ответов), а она, пользуясь параметрами, полученными в прошлый раз, сразу выдает результат.
Внесем ясность:
Получается, обучение модели (fit, train) - подбор параметров таким образом, чтобы на помеченных данных точность предсказаний была максимальной.
Заметим, что модель состоит из некоторой функции (архитектуры) и параметров.
В качестве архитектуры модели тут как раз будут использоваться нейронные сети.
В качестве метода улучшения параметров - функции оптимизации - часто выступает SGD (стохастический градиентный спуск).
Результаты, которые выдает модель, называются предсказаниями (predictions).
Полное прохождение всех входных данных одного цикла называется эпохой (epoch).
Функция, с помощью которой измеряется качество, называется функцией потерь (loss). Функция потерь выбирается так, чтобы её понимала сама модель и на её основании делала вывод, какие параметры как поменять. Если же мы уже обучили нейросеть и хотим похвастаться другу, как она хороша, или если мы хотим более точно понимать, насколько хороша модель в конце каждой эпохи и какое качество она показывает на валидационной выборке (что это такое будет ниже), мы используем метрики. Метрика - понятная для человека функция, показывающая эффективность модели.
А правильные ответы, которые мы загружаем вместе с фотографиями при обучении модели и которые пытается отгадать модель, по-английски называются labels или targets, а в русском языке я их названий точно не знаю, может, таргеты или лейблы :)
Итак, повторим еще раз:
В архитектуру загружаются входные данные (например, фотографии) и параметры. Архитектура делает предсказания. Затем они сверяются с таргетами и функция потерь выдает качество модели. С помощью функции оптимизации улучшаем параметры и снова загружаем их в архитектуру вместе в входными данными. Следующая эпоха.
Примечание: Думаю, очевидно, что после обучения модель сможет распознавать только такие шаблоны, которые встречала во входных данных. Если она училась только на фотографиях кошек, то она не сможет распознать кошку, нарисованную от руки.
Представим ситуацию: мы выдали модели большое число помеченных фотографий с удавами и без, обучение проходит идеально: точность 100%. Сохраняем эти параметры и на радостях загружаем фотографию, где мы обнимаемся с удавом. И вдруг результат: на этой фотографии удава нет. Как же так? Ведь модель обещала нам стопроцентную точность! Скорее всего, дело в том, что модель во время обучения просто запомнила все наши картинки и их таргеты, поэтому и выдавала к ним все время верные ответы, а саму суть (то, как выглядит удав) так и не поняла. Говорят, что модель ПЕРЕобучилась (overfitting). Чтобы этого избежать, обычно перед обучением входные помеченные данные делят на две группы - обучающая выборка (trainig set) и проверочная выборка (validation set). Обычно для проверки используют 20-30% всех данных. Процесс обучения проходит только на обучающей выборке, а эффективность модели в конце каждой эпохи оценивается на проверочной, потому что эти данные модель раньше точно не видела и точно не могла их выучить. Причем каждый раз эта валидационная выборка, однажды выбранная, должна оставаться одной и той же. В большинстве случаев данные, входящие в эту выборку выбираются из общего числа данных случайным образом, но в некоторых случаях оценка точности на случайной выборке не является адекватным критерием эффективности. Например, мы хотим каким-то образом научить модель предсказывать ближайший рост или падение акций компании N на основе имеющейся у нас истории поведения стоимости её акций за прошлые 10 лет. Если мы в валидационную выборку включим случайные даты из последних 10 лет, то модель может догадаться, сколько стоили акции на основе предыдущего и последующего дней. Однако в реальности у нас нет этого "последующего" дня: мы хотим угадать стоимость акций завтра, но не знаем, сколько они будут стоить послезавтра. Поэтому для проверки реальной эффективности, логичнее в валидиционную выборку включить, например, последние 2 месяца из имеющейся у нас истории и посмотреть, насколько предсказания модели соответствуют действительности. То есть если наши предсказания будут каким-то образом упорядочены по оси времени, то к формированию проверочной выборки надо относиться аккуратнее!
Примечание: Несмотря на то, что мы заблаговременно разделили наши данные на обучающие и проверочные, мы все равно можем столкнуться с проблемой запоминания данных. Но так мы хотя бы сможем установить этот факт уже в процессе обучения, а не после: точность на обучающей выборке будет расти, в то время как точность на валидационной выборке будет ухудшаться.
Обычно присутствует еще тестовая выборка (test set), для самой финальной проверки. Её модель не видит ни разу за время обучения, и ею проверяют точность на самой последней стадии работы. Например, на соревнованиях эту выборку не видят участники, она доступна только для проверки сданных работ(моделей). Или если вам делают модель на заказ, то часть размеченных данных заказчик может оставить себе, не показывая разработчику, и уже при приемке готовой работы проверить точность модели на этих данных.
Конечно, модель можно полностью написать самому. Но если вы не тот самый человек, который готов потратить огромное количество времени на написание собственной модели, не будучи уверенным, что она даст сильный выигрыш по времени, то будет гораздо удобнее взять уже готовые модели и дообучать их на своем конкретном случае. Такие модели называются предобученными, так как они уже обучились на каких-то больших наборах данных (dataset). Таких готовых моделей существует очень много. Например, для классификации изображений существуют такие готовые модели, как ResNet или VGG. Они обучены уже на огромном датасете ImageNet и уже умеют находить на изображении множество разных шаблонов.
ImageNet - один из самых известных бесплатных больших дасатетов. Он насчитывает наборы изображений для более, чем 100000 классов. Для каждого класса предоставляется в среднем 1000 картинок. Пометки о том, к какому классу относится изображение, сделаны людьми, и качество данных контролируется.
Для задач компьютерного зрения используются сверточные нейронные сети, сокращенно - CNN (Convolutional neural network). Как несложно догадаться, они используют операцию свертки. О том, как именно они работают будет в одной из следующих статей.
При работе с изображениями перед обучением данные обычно обрабатывают различными способами, чтобы получить еще больше данных. Например, увеличивают яркость, вращают, растягивают, добавляют шум и т.д. Английский термин для этого - data augmentation. Но в любом случае перед загрузкой в модель все файлы приводят к одинаковому размеру. Обычно можно увидеть приведение к размеру 224x224, но число 224 не несет в себе особой смысловой нагрузки. Так сложилось исторически и не более чем формальность - вы можете выбрать другой размер. Чем больше размер - тем лучших результатов можно достичь, правда, ценой будет более долгий процесс обучения и бОльшие требуемые мощности.
На сегодня, пожалуй, хватит. В этой статье я ввела множество основных терминов, но не углублялась в теорию. Если у вас есть вопросы или замечания, пишите в комментариях, а я пошла готовить следующую статью. До новых встреч!
Photo by Jan Tinneberg on Unsplash