Задачи машинного обучения – Открытый курс машинного обучения. Тема 3. Классификация, деревья решений и метод ближайших соседей / Open Data Science corporate blog / Habr

Содержание

Машинное обучение — Википедия

Материал из Википедии — свободной энциклопедии

Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 2 августа 2019; проверки требуют 13 правок. Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 2 августа 2019; проверки требуют 13 правок.

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

Различают два типа обучения:

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

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

Многие методы индуктивного обучения разрабатывались как альтернатива классическим статистическим подходам. Многие методы тесно связаны с извлечением информации (англ. information extraction, information retrieval), интеллектуальным анализом данных (data mining).

Общая постановка задачи обучения по прецедентам[править | править код]

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

функционал качества.

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

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

  1. Искусственная нейронная сеть
    1. Глубокое обучение
  2. Метод коррекции ошибки
  3. Метод обратного распространения ошибки
  4. Метод опорных векторов
  • Обучение без учителя — для каждого прецедента задаётся только «ситуация», требуется сгруппировать объекты в кластеры, используя данные о попарном сходстве объектов, и/или понизить размерность данных:
  1. Альфа-система подкрепления
  2. Гамма-система подкрепления
  3. Метод ближайших соседей
  1. Генетический алгоритм.
  • Активное обучение — отличается тем, что обучаемый алгоритм имеет возможность самостоятельно назначать следующую исследуемую ситуацию, на которой станет известен верный ответ:
  • Обучение с частичным привлечением учителя (англ. semi-supervised learning) — для части прецедентов задается пара «ситуация, требуемое решение», а для части — только «ситуация»
  • Трансдуктивное обучение — обучение с частичным привлечением учителя, когда прогноз предполагается делать только для прецедентов из тестовой выборки
  • Многозадачное обучение (англ. multi-task learning) — одновременное обучение группе взаимосвязанных задач, для каждой из которых задаются свои пары «ситуация, требуемое решение»
  • Многовариантное обучение (англ. multiple-instance learning) — обучение, когда прецеденты могут быть объединены в группы, в каждой из которых для всех прецедентов имеется «ситуация», но только для одного из них (причем, неизвестно какого) имеется пара «ситуация, требуемое решение»
  • Бустинг (англ. boosting — улучшение) — это процедура последовательного построения композиции алгоритмов машинного обучения, когда каждый следующий алгоритм стремится компенсировать недостатки композиции всех предыдущих алгоритмов.
  • Байесовская сеть

Классические задачи, решаемые с помощью машинного обучения[править | править код]

  • Признаковое описание объектов или матрица объекты-признаки — наиболее распространённый случай. Каждый объект описывается набором признаков.
  • Матрица расстояний между объектами. Каждый объект описывается расстояниями до всех остальных объектов обучающей выборки, чаще всего отношениями попарного сходства.
  • Временной ряд или сигнал. Последовательность измерений во времени, которое может представляться числом, вектором, а в общем случае — признаковым описанием в данный момент времени.
  • Изображение или видеоряд.
  • При обучении с учителем — функционал качества может определяться как средняя ошибка ответов. Предполагается, что искомый алгоритм должен его минимизировать. Для предотвращения переобучения в минимизируемый функционал качества часто в явном или неявном виде добавляют регуляризатор.
  • При обучении без учителя — функционалы качества могут определяться по-разному, например, как отношение средних межкластерных и внутрикластерных расстояний.
  • При обучении с подкреплением — функционалы качества определяются физической средой, показывающей качество приспособления агента.

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

Машинное обучение имеет широкий спектр приложений[источник не указан 2273 дня]:

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

  • Айвазян С. А., Енюков И. С., Мешалкин Л. Д. Прикладная статистика: основы моделирования и первичная обработка данных. — М.: Финансы и статистика, 1983.
  • Айвазян С. А., Енюков И. С., Мешалкин Л. Д. Прикладная статистика: исследование зависимостей. — М.: Финансы и статистика, 1985.
  • Айвазян С. А., Бухштабер В. М., Енюков И. С., Мешалкин Л. Д.
    Прикладная статистика: классификация и снижение размерности. — М.: Финансы и статистика, 1989.
  • Вапник В. Н. Восстановление зависимостей по эмпирическим данным. — М.: Наука, 1979.
  • Журавлев Ю. И., Рязанов В. В., Сенько О. В. «Распознавание». Математические методы. Программная система. Практические применения. — М.: Фазис, 2006. ISBN 5-7036-0108-8.
  • Загоруйко Н. Г. Прикладные методы анализа данных и знаний. — Новосибирск: ИМ СО РАН, 1999. ISBN 5-86134-060-9.
  • Флах П. Машинное обучение. — М.: ДМК Пресс, 2015. — 400 с. — ISBN 978-5-97060-273-7.
  • Шлезингер М., Главач В. Десять лекций по статистическому и структурному распознаванию. — Киев: Наукова думка, 2004. ISBN 966-00-0341-2.
  • Hastie, T., Tibshirani R., Friedman J. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. — 2nd ed. — Springer-Verlag, 2009. — 746 p. — ISBN 978-0-387-84857-0..
  • Mitchell T. Machine Learning. — McGraw-Hill Science/Engineering/Math, 1997. ISBN 0-07-042807-7.
  • Ryszard S. Michalski, Jaime G. Carbonell, Tom M. Mitchell (1983), Machine Learning: An Artificial Intelligence Approach, Tioga Publishing Company, ISBN 0-935382-05-4 (Machine Learning: An Artificial Intelligence Approach в «Книгах Google»).
  • Vapnik V. N. Statistical learning theory. — N.Y.: John Wiley & Sons, Inc., 1998. [1]
  • Bernhard Schölkopf, Alexander J. Smola Learning with Kernels. Support Vector Machines, Regularization, Optimization, and Beyond. — MIT Press, Cambridge, MA, 2002 ISBN 978-0-262-19475-4 [2]
  • I. H. Witten, E. Frank Data Mining: Practical Machine Learning Tools and Techniques (Second Edition). — Morgan Kaufmann, 2005 ISBN 0-12-088407-0 [3]
  • Liang Wang, Li Cheng, Guoying Zhao. Machine Learning for Human Motion Analysis. — IGI Global, 2009. — 318 p. — ISBN 978-1-60566-900-7.

Машинное обучение — это легко / Habr

В данной статье речь пойдёт о машинном обучении в целом и взаимодействии с датасетами. Если вы начинающий, не знаете с чего начать изучение и вам интересно узнать, что такое «датасет», а также зачем вообще нужен Machine Learning и почему в последнее время он набирает все большую популярность, прошу под кат. Мы будем использовать Python 3, так это как достаточно простой инструмент для изучения машинного обучения.

Для кого эта статья?


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

В цифрах


С каждым годом растёт потребность в изучении больших данных как для компаний, так и для активных энтузиастов. В таких крупных компаниях, как Яндекс или Google, всё чаще используются такие инструменты для изучения данных, как язык программирования R, или библиотеки для Python (в этой статье я привожу примеры, написанные под Python 3). Согласно Закону Мура (а на картинке — и он сам), количество транзисторов на интегральной схеме удваивается каждые 24 месяца. Это значит, что с каждым годом производительность наших компьютеров растёт, а значит и ранее недоступные границы познания снова «смещаются вправо» — открывается простор для изучения больших данных, с чем и связано в первую очередь создание «науки о больших данных», изучение которого в основном стало возможным благодаря применению ранее описанных алгоритмов машинного обучения, проверить которые стало возможным лишь спустя полвека. Кто знает, может быть уже через несколько лет мы сможем в абсолютной точности описывать различные формы движения жидкости, например.

Анализ данных — это просто?


Да. А так же интересно. Наряду с особенной важностью для всего человечества изучать большие данные стоит относительная простота в самостоятельном их изучении и применении полученного «ответа» (от энтузиаста к энтузиастам). Для решения задачи классификации сегодня имеется огромное количество ресурсов; опуская большинство из них, можно воспользоваться средствами библиотеки Scikit-learn (SKlearn). Создаём свою первую обучаемую машину:
clf = RandomForestClassifier()
clf.fit(X, y)

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

— Если все так просто, почему до сих пор не каждый предсказывает, например, цены на валюту?

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

Ближе к делу


— Получается, зарабатывать на этом деле я не сразу смогу?

Да, до решения задач за призы в $100 000 нам ещё далеко, но ведь все начинали с чего-то простого.

Итак, сегодня нам потребуются:

  • Python 3 (с установленной pip3)
  • Jupyter
  • SKlearn, NumPy и matplotlib

Если чего-то нет: ставим всё за 5 минутДля начала, скачиваем и устанавливаем Python 3 (при установке не забудьте поставить pip и добавить в PATH, если скачали установщик Windows). Затем, для удобства был взят и использован пакет Anaconda, включающий в себя более 150 библиотек для Python (ссылка на скачивание). Он удобен для использования Jupyter, библиотек numpy, scikit-learn, matplotlib, а так же упрощает установку всех. После установки, запускаем Jupyter Notebook через панель управления Anaconda, или через командную строку(терминал): «jupyter notebook».

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

Как обычно, импортируем необходимые для работы библиотеки:

import numpy as np
from pandas import read_csv as read

— Ладно, с Numpy всё понятно. Но зачем нам Pandas, да и еще read_csv?

Иногда бывает удобно «визуализировать» имеющиеся данные, тогда с ними становится проще работать. Тем более, большинство датасетов с популярного сервиса Kaggle собрано пользователями в формате CSV.

А вот так выглядит визуализированный pandas’ом датасет
Здесь колонка Activity показывает, идёт реакция или нет (1 при положительном, 0 при отрицательном ответе). А остальные колонки — множества признаков и соответствующие им значения (различные процентные содержания веществ в реакции, их агрегатные состояния и пр.)

— Помнится, ты использовал слово «датасет». Так что же это такое?

Датасет — выборка данных, обычно в формате «множество из множеств признаков» → «некоторые значения» (которыми могут быть, например, цены на жильё, или порядковый номер множества некоторых классов), где X — множество признаков, а y — те самые некоторые значения. Определять, например, правильные индексы для множества классов — задача классификации, а искать целевые значения (такие как цена, или расстояния до объектов) — задача ранжирования. Подробнее о видах машинного обучения можно прочесть в статьях и публикациях, ссылки на которые, как и обещал, будут в конце статьи.

Знакомимся с данными


Предложенный датасет можно скачать здесь. Ссылка на исходные данные и описание признаков будет в конце статьи. По представленным параметрам нам предлагается определять, к какому сорту относится то или иное вино. Теперь мы можем разобраться, что же там происходит:
path = "%путь к файлу%/wine.csv"
data = read(path, delimiter=",")
data.head()

Работая в Jupyter notebook, получаем такой ответ:
Это значит, что теперь нам доступны данные для анализа. В первом столбце значения Grade показывают, к какому сорту относится вино, а остальные столбцы — признаки, по которым их можно различать. Попробуйте ввести вместо data.head() просто data — теперь для просмотра вам доступна не только «верхняя часть» датасета.

Простая реализация задачи на классификацию


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

Посмотрим на реализацию (каждая выдержка из кода — отдельный Cell в notebook):
X = data.values[::, 1:14]
y = data.values[::, 0:1]

from sklearn.cross_validation import train_test_split as train
X_train, X_test, y_train, y_test = train(X, y, test_size=0.6)

from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=100, n_jobs=-1)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)

Создаем массивы, где X — признаки (с 1 по 13 колонки), y — классы (0ая колонка). Затем, чтобы собрать тестовую и обучающую выборку из исходных данных, воспользуемся удобной функцией кросс-валидации train_test_split, реализованной в scikit-learn. С готовыми выборками работаем дальше — импортируем RandomForestClassifier из ensemble в sklearn. Этот класс содержит в себе все необходимые для обучения и тестирования машины методы и функции. Присваиваем переменной clf (classifier) класс RandomForestClassifier, затем вызовом функции fit() обучаем машину из класса clf, где X_train — признаки категорий y_train. Теперь можно использовать встроенную в класс метрику score, чтобы определить точность предсказанных для X_test категорий по истинным значениям этих категорий y_test. При использовании данной метрики выводится значение точности от 0 до 1, где 1 100% Готово!Про RandomForestClassifier и метод кросс-валидации train_test_split

При инициализации clf для RandomForestClassifier мы выставляли значения n_estimators=100, n_jobs = -1, где первый отвечает за количество деревьев в лесу, а второй — за количество участвующих в работе ядер процессора (при -1 задействованы все ядра, по умолчанию стоит 1). Так как мы работаем с данным датасетом и нам негде взять тестирующую выборку, используем train_test_split для «умного» разбиения данных на обучающую выборку и тестирующую. Подробнее про них можно узнать, выделив интересующий Вас класс или метод и нажав Shift+Tab в среде Jupyter.


— Неплохая точность. Всегда ли так получается?

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

— Слишком легко. Больше мяса!

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


Да, с уменьшением количества признаков, падает и точность распознавания. И график получился не особенно-то красивым, но это и не решающее в простом анализе: вполне наглядно видно, как машина выделила обучающую выборку (точки) и сравнила её с предсказанными (заливка) значениями.Реализация здесь
from sklearn.preprocessing import scale
X_train_draw = scale(X_train[::, 0:2])
X_test_draw = scale(X_test[::, 0:2])

clf = RandomForestClassifier(n_estimators=100, n_jobs=-1)
clf.fit(X_train_draw, y_train)

x_min, x_max = X_train_draw[:, 0].min() - 1, X_train_draw[:, 0].max() + 1
y_min, y_max = X_train_draw[:, 1].min() - 1, X_train_draw[:, 1].max() + 1

h = 0.02

xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
            np.arange(y_min, y_max, h))

pred = clf.predict(np.c_[xx.ravel(), yy.ravel()])
pred = pred.reshape(xx.shape)

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])

plt.figure()
plt.pcolormesh(xx, yy, pred, cmap=cmap_light)
plt.scatter(X_train_draw[:, 0], X_train_draw[:, 1], 
            c=y_train, cmap=cmap_bold)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())

plt.title("Score: %.0f percents" % (clf.score(X_test_draw, y_test) * 100))
plt.show()


Предлагаю читателю самостоятельно узнать почему и как он работает.

Последнее слово


Надеюсь, данная статья помогла хоть чуть-чуть освоиться Вам в разработке простого машинного обучения на Python. Этих знаний будет достаточно, чтобы продолжить интенсивный курс по дальнейшему изучению BigData+Machine Learning. Главное, переходить от простого к углубленному постепенно. А вот полезные ресурсы и статьи, как и обещал:

Материалы, вдохновившие автора на создание данной статьи


Исторические очерки:
Подробнее про машинное обучение:
Изучаем python, или до работы с данными:
Однако для наилучшего освоения библиотеки sklearn пригодится знание английского: в этом источнике собраны все необходимые знания (так как это API reference).

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

Где брать данные, или «хранилище датасетов» — здесь собрано огромное количество данных от самых разных источников. Очень полезно тренироваться на реальных данных.

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

Введение в машинное обучение / Habr

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



Выход новых лекций запланирован каждые 2-3 дня.

Интервью с Себастьяном Труном, CEO Udacity


— И снова всем привет, с вами я, Пейдж и сегодня со мной гость — Себастьян.
— Привет, я Себастьян!
— … человек у которого невероятная карьера, успевшего сделать множество потрясающих вещей! Вы являетесь со-основателем Udacity, вы основали Google X, вы професcор в Стэнфорде. Вы занимались невероятными исследованиями и глубоким обучением на всём протяжении своей карьеры. Что приносило вам наибольшее удовлетворение и в какой из областей вы получали наибольшее вознаграждение за проделанную работу?
— Скажу честно, я очень люблю находиться в Кремниевой долине! Мне нравится находится рядом с людьми, которые значительно умнее меня, и я всегда рассматривал технологии, как инструмент менющий правила игры различными способами — начиная от образования и заканчивая логистикой, здравохранением и т.д. Всё это меняется настолько быстро, и возникает невероятное желание быть участником этих изменений, наблюдать за ними. Ты смотришь на окружающее тебя и понимаешь, что большинство из того, что ты видишь вокруг, не работает так, как это должно — всегда можно изобрести нечто новое!
— Ну что ж, это очень оптимистичный взгляд на технологии! Какой момент на протяжении всей вашей карьеры был самой большой «эврикой»?
— Господи, их было так много! Помню один из дней, когда Ларри Пейдж позвонил мне и предложил создать автопилотируемые автомобили, которые смогли бы проезжать по всем улицам Калифорнии. В то время я считался экспертом, меня к таковым причисляли и, я был тем самым человеком, который сказал «нет, этого нельзя сделать». После этого Ларри убедил меня, что, в принципе, это возможно сделать, стоит только начать и сделать попытку. И мы сделали это! Это был момент, когда я осознал, что даже эксперты ошибаются и говоря «нет» мы на 100% становимся пессимистами. Я думаю мы должны быть более открыты новому.
— Или, например, если вам звонит Ларри Пейдж и говорит, — «Хэй, сделай крутую вещь вроде Google X» и получается нечто достаточно крутое!
— Да, это точно, жаловаться не приходится! Я имею ввиду, что всё это — процесс, который проходит через множество обсуждений на пути к реализации. Мне, действительно, повезло работать и я горжусь этим, в Google X и над другими проектами.
— Потрясающе! Итак, этот курс полностью о работе с TensorFlow. У вас есть опыт использования TensorFlow или может быть вы знакомы (слышали) с ним?
— Да! Я, в буквальном смысле, люблю TensorFlow, конечно! В моей собственной лаборатории мы используем его часто и много, одна из самых значимых работ на основе TensorFlow вышла около двух лет назад. Мы узнали, что iPhone и Android могут быть эффективнее в определении рака кожи, чем лучшие дерматологи в мире. Своё исследование мы опубликовали в Nature и это произвело своего рода переполох в медицине.
— Звучит потрясающе! Значит вы знаете и любите TensorFlow, что само по себе здорово! Вы уже успели поработать с TensorFlow 2.0?
— Нет, к сожалению пока не успел.
— Он будет просто восхитителен! Все студенты этого курса будут работать с этой версией.
— Я завидую им! Обязательно попробую!
— Прекрасно! На нашем курсе очень много студентов, которые в своей жизни ни разу не занимались машинным обучение, от слова «совсем». Для них область может быть нова, возможно для кого-то само программирование будет вновинку. Какой у вас совет для них?
— Я бы пожелал им оставаться открытыми — к новым идеям, методикам, решениям, позициям. Машинное обучение, на самом деле, проще, чем программирование. В процессе программирования вам необходимо учитывать каждый случай в исходных данных, адаптировать под него логику программы и правила. В это самое время, используя TensorFlow и машинное обучение вы, по сути, тренируете компьютер используя примеры, предоставляя компьютеру самому находить правила.
— Это невероятно интересно! Мне не терпится рассказать студентам этого курса немного больше о машинном обучении! Себастьян, благодарю, что нашел время и пришёл сегодня к нам!
— Благодарю! Оставайтесь на связи!

Что такое машинное обучение?


Итак, давайте начнём со следующей задачи — даны входные и выходные значения.

Когда в качестве входного значения у вас значение 0, то в качестве выходного значения — 32. Когда в качестве входного значения у вас 8, то в качестве выходного значения — 46.4. Когда в качестве входного значения у вас 15, то в качестве выходного значения — 59 и так далее.

Присмотритесь к этим значениям и позвольте мне задать вам вопрос. Можете ли вы определить, каким будет выходное значение, если на входе мы получим 38?

Если вы ответили 100.4, то оказались правы!

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

Где С — градусы Цельсия (входные значения), F — Фаренгейта (выходные значения).

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

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

Давайте разберём на примере. Представим себе, что мы хотим разработать программу, которая будет преобразовывать градусы Цельсия в градусы Фаренгейта используя формулу F = C * 1.8 + 32.

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

Итак, что мы имеем? Функция принимает входное значение C, затем вычисляет выходное значение F используя явно заданный алгоритм, а затем возвращает вычисленное значение.

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

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

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

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

Мы тренируем нейронную сеть через повторяющиеся попытки сопоставить входные значения выходным.

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

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

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

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

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

А вот одна крутая вещь над которой стоит задуматься! Если вы решили задачу преобразования градусов Цельсия в Фаренгейты, которая обозначена в видео и в тексте ниже, вы, вероятно, решили её потому, что обладали неким предыдущим опытом или знанием, как производить подобного рода преобразования из градусов Цельсия в Фаренгейты. Например, вы могли просто знать, что 0 градусов Цельсия соответствуют 32 градусам по Фаренгейту. С другой стороны, системы основанные на машинном обучении не обладают предыдущими вспомогательными знаниями для решения поставленной задачи. Они учатся решать подобного рода задачи не основываясь на предыдущих знаниях и при их полном отсутствии.

Довольно разговоров — переходим к практической части лекции!

CoLab: преобразуем градусы Цельсия в градусы Фаренгейта


Русская версия CoLab исходного кода и английская версия CoLab исходного кода.

Основы: обучение первой модели


Добро пожаловать в CoLab, где мы будем тренировать нашу первую модель машинного обучения!

Мы постараемся сохранять простоту преподносимого материала и ввести только базовые понятия необходимые для работы. Последующие CoLabs будут содержать более продвинутые техники.

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

Безусловно, было бы проще просто написать функцию конвертации на Python или любом другом языке программирования, которая бы выполняла непосредственные вычисления, но в таком случае это не было бы машинным обучением 🙂

Вместо этого мы подадим на вход TensorFlow имеющиеся у нас входные значения градусов Цельсия (0, 8, 15, 22, 38) и их соответствующие градусы по Фаренгейту (32, 46, 59, 72, 100). Затем мы натренируем модель таким образом, чтобы та примерно соответствовала приведённой выше формуле.

Импорт зависимостей


Первым делом импортируем TensorFlow. Здесь и в последующем мы сокращённо называем его tf. Мы так же настраиваем уровень логгирования — только ошибки.

Далее, импортируем NumPy как np. Numpy помогает нам представить наши данные в виде высокоэффективных списков.

from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
tf.logging.set_verbosity(tf.logging.ERROR)

import numpy as np

Подготовка данных для тренировки


Как мы уже видели ранее, методика машинного обучения с учителем основывается на поиске алгоритма преобразования входных данных в выходные. Так как задачей этого CoLab является создание модели, которая может выдать результат преобразования градусов Цельсия в градусы Фаренгейта, создадим два списка — celsius_q и fahrenheit_a, которые мы используем при обучении нашей модели.
celsius_q    = np.array([-40, -10, 0, 8, 15, 22, 38], dtype=float)
fahrenheit_a = np.array([-40, 14, 32, 46, 59, 72, 100], dtype=float)

for i,c in enumerate(celsius_q):
  print("{} градусов Цельсия = {} градусов Фаренгейта".format(c, fahrenheit_a[i]))

-40.0 градусов Цельсия = -40.0 градусов Фаренгейта
-10.0 градусов Цельсия = 14.0 градусов Фаренгейта
0.0 градусов Цельсия = 32.0 градусов Фаренгейта
8.0 градусов Цельсия = 46.0 градусов Фаренгейта
15.0 градусов Цельсия = 59.0 градусов Фаренгейта
22.0 градусов Цельсия = 72.0 градусов Фаренгейта
38.0 градусов Цельсия = 100.0 градусов Фаренгейта

Некоторая терминология машинного обучения:
  • Свойство — входное(ые) значение нашей модели. В данном случае единичное значение — градусы Цельсия.
  • Метки — выходные значения, которые наша модель предсказывает. В данном случае единичное значение — градусы Фаренгейта.
  • Пример — пара входных-выходных значений используемых для тренировки. В данном случае это пара значений из celsius_q и fahrenheit_a под определённым индексом, например, (22,72).

Создаём модель


Далее мы создаём модель. Мы будем использовать максимально упрощенную модель — модель полносвязной сети (Dense-сеть). Так как задача достаточно тривиальна, то и сеть будет состоять из единственного слоя с единственным нейроном.
Строим сеть

Мы назовём слой l0 (layer и ноль) и создадим его, инициализировав tf.keras.layers.Dense со следующими параметрами:
  • input_shape=[1] — этот параметр определяет размерность входного параметра — единичное значение. Матрица размером 1×1 с единственным значением. Так как это первый (и единственный) слой, то и размерность входных данных соответствует размерности всей модели. Единственное значение — значение с плавающей запятой, представляющее градусы Цельсия.
  • units=1 — этот параметр определяет количество нейронов в слое. Количество нейронов определяет то, как много внутренних переменных слоя будет использовано для обучения при поиске решения поставленной задачи. Так как это последний слой, то его размерность равна размерности результата — выходного значения модели — единственного числа с плавающей запятой представляющего собой градусы Фаренгейта. (В многослойной сети размеры и форма слоя input_shape должны соответствовать размерам и формам следующего слоя).
l0 = tf.keras.layers.Dense(units=1, input_shape=[1])

Преобразуем слои в модель

Как только слои определены их необходимо преобразовать в модель. Sequential-модель принимает в качестве аргументов перечень слоёв в том порядке в котором их необходимо применять — от входного значения до выходного значения.

У нашей модели всего один слой — l0.

model = tf.keras.Sequential([l0])

Примечание
Достаточно часто вы будете сталкиваться с определением слоёв прямо в функции модели, нежели с их предварительным описанием и последующим использованием:
model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=1, input_shape=[1])
])

Компилируем модель с функцией потерь и оптимизаций


Перед тренировкой модель должна быть скомпилирована (собрана). При компиляции для тренировки необходимы:
  • функция потерь — способ измерения того, насколько далеко предсказываемое значение от желаемого выходного значения (измеримая разница называется «потерей»).
  • функция оптимизации — способ корректировки внутренних переменных для уменьшения потерь.
model.compile(loss='mean_squared_error',
              optimizer=tf.keras.optimizers.Adam(0.1))

Функция потерь и функция оптимизации используются во время тренировки модели (model.fit(...) упоминаемая ниже) для выполнения первичных вычислений в каждой точке и последующей оптимизации значений.

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

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

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

Что полезно знать об этих параметрах:

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

На что стоит обратить внимание, так это на функцию оптимизации и параметр — коэффициент скорости обучения (learning rate), который в нашем примере равен 0.1. Это используемый размер шага при корректировке внутренних значений переменных. Если значение слишком маленькое — понадобится слишком много обучающих итераций для обучения модели. Слишком большое — точность падает. Нахождение хорошего значения коэффициента скорости обучения требует некоторых проб и ошибок, оно обычно находится в интервале от 0.01 (по-умолчанию) до 0.1.

Тренируем модель

Тренировка модели осуществляется методом fit.

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

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

history = model.fit(celsius_q, fahrenheit_a, epochs=500, verbose=False)
print("Завершили тренировку модели")

В последующих видео мы погрузимся в детали того, каким образом это всё работает и как именно работают полносвязные слои (Dense-слои) «под капотом».
Отображаем статистику тренировок

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

Для визуализации воспользуемся Matplotlib. Как вы можете увидеть, наша модель улучшается очень быстро в самом начале, а затем приходит к стабильному и медленному улучшению до тех пор, пока результаты не становятся «около»-идеальными в самом конце обучения.

import matplotlib.pyplot as plt
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.plot(history.history['loss'])

Используем модель для предсказаний

Теперь у нас есть модель, которая была обучена на входных значениях celsius_q и выходных значениях fahrenheit_a для определения взаимосвязи между ними. Мы можем воспользоваться методом предсказания для вычисления тех значений градусов Фаренгейта по которым ранее нам неизвестны были соответствующие градусы Цельсия.

Например, сколько будет 100.0 градусов Цельсия по Фаренгейту? Попробуйте угадать перед тем как запускать код ниже.

print(model.predict([100.0]))

Вывод:

[[211.29639]]

Правильный ответ 100×1.8+32=212, так что наша модель справилась достаточно хорошо!

Ревью

  • Мы создали модель с использованием Dense-слоя
  • Мы обучили её на 3500 примерах (7 пар значений, 500 обучающих итераций)

Наша модель подогнала значения внутренних переменных (весов) в Dense-слое таким образом, чтобы возвращать правильные значения градусов Фаренгейта на произвольное входное значение градусов Цельсия.

Смотрим на веса


Давайте отобразим значения внутренних переменных Dense-слоя.
print("Это значения переменных слоя: {}".format(l0.get_weights()))

Вывод:
Это значения переменных слоя: [array([[1.8261501]], dtype=float32), array([28.681389], dtype=float32)]

Значение первой переменной близко к ~1.8, а второй к ~32. Эти значения (1.8 и 32) являются непосредственными значениями в формуле конвертации градусов Цельсия в градусы Фаренгейта.

Это действительно очень близко к фактическим значениям в формуле! Мы рассмотрим этот момент подробнее в последующих видео, где мы покажем, каким образом работает Dense-слой, а пока стоит знать лишь то, что один нейрон с единственным входом и выходом, содержит в себе простую математику — y = mx + b (как уравнение прямой), которая представляет собой не что иное, как нашу с вами формулу преобразования градусов Цельсия в градусы Фаренгейта, f = 1.8c + 32.

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

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

Немного экспериментов

Ради веселья! Что будет, если мы создадим больше Dense-слоёв с большим количеством нейронов, которые, в свою очередь, будут содержать больше внутренних переменных?
l0 = tf.keras.layers.Dense(units=4, input_shape=[1])
l1 = tf.keras.layers.Dense(units=4)
l2 = tf.keras.layers.Dense(units=1)
model = tf.keras.Sequential([l0, l1, l2])
model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(0.1))
model.fit(celsius_q, fahrenheit_a, epochs=500, verbose=False)
print("Закончили обучение модели")
print(model.predict([100.0]))
print("Модель предсказала, что 100 градусов Цельсия соответствуют {} градусам Фаренгейта".format(model.predict([100.0]))) 
print("Значения внутренних переменных слоя l0: {}".format(l0.get_weights()))
print("Значения внутренних переменных слоя l1: {}".format(l1.get_weights()))
print("Значения внутренних переменных слоя l2: {}".format(l2.get_weights()))

Вывод:
Закончили обучение модели
[[211.74748]]
Модель предсказала, что 100 градусов Цельсия соответствуют [[211.74748]] градусам Фаренгейта
Значения внутренних переменных слоя l0: [array([[-0.5972079 , -0.05531882, -0.00833384, -0.10636603]],
      dtype=float32), array([-3.0981746, -1.8776944,  2.4708805, -2.9092448], dtype=float32)]
Значения внутренних переменных слоя l1: [array([[ 0.09127654,  1.1659832 , -0.61909443,  0.3422218 ],
       [-0.7377194 ,  0.20082018, -0.47870865,  0.30302727],
       [-0.1370897 , -0.0667181 , -0.39285263, -1.1399261 ],
       [-0.1576551 ,  1.1161333 , -0.15552482,  0.39256814]],
      dtype=float32), array([-0.94946504, -2.9903848 ,  2.9848468 , -2.9061244 ], dtype=float32)]
Значения внутренних переменных слоя l2: [array([[-0.13567649],
       [-1.4634581 ],
       [ 0.68370366],
       [-1.2069695 ]], dtype=float32), array([2.9170544], dtype=float32)]

Как вы могли уже заметить, текущая модель тоже способна достаточно хорошо предсказывать соответствующие значения градусов Фаренгейта. Однако, если взглянуть на значения внутренних переменных (веса) нейронов по слоям, то никаких значений похожих на 1.8 и 32 мы уже не увидим. Добавленная сложность модели скрывает «простую» форму преобразования градусов Цельсия в градусы Фаренгейта.

Оставайся на связи и в следующей части мы рассмотрим то, каким образом работают Dense-слои «под капотом».

Краткое резюме


Поздравляем! Вы только что обучили свою первую модель. Мы на практике увидели, каким образом по входным и выходным значениям модель научилась умножать входное значение на 1.8 и прибавлять к нему 32 для получения корректного результата.

Это было по-настоящему впечатляюще, учитывая то, сколько строчек кода нам понадобилось написать:

l0 = tf.keras.layers.Dense(units=1, input_shape=[1]) 
model = tf.keras.Sequential([l0])
model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(0.1))
history = model.fit(celsius_q, fahrenheit_a, epochs=500, verbose=False)
model.predict([100.0])

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

Процесс тренировки


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

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

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

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

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

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

Этот процесс оптимизации носит название градиентного спуска. Конкретный алгоритм оптимизации используется для вычисления нового значения для каждой внутренней переменной при вызове метода model.compile(...). В приведённом выше примере мы использовали алгоритм оптимизации Adam.

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

К этому моменты вы уже должны быть знакомы со следующими терминами:

  • Свойство: входное значение нашей модели;
  • Примеры: пары входное+выходное значений;
  • Метки: выходные значения модели;
  • Слои: коллекция узлов объединенных вместе в рамках нейронной сети;
  • Модель: представление вашей нейронной сети;
  • Плотный и полностью связный: каждый узел в одном слое связан с каждым узлом из предыдущего слоя.
  • Веса и смещения: внутренние переменные модели;
  • Потери: разница между желаемым выходным значением и фактическим выходным значением модели;
  • MSE: среднеквадратичное отклонение, тип функции потерь, которые считают малое количество больших ошибок вариантом хуже, чем большое количество малых.
  • Градиентный спуск: алгоритм, который изменяет внутренние переменные по-немногу при каждой итерации с целью уменьшения значения функции потерь;
  • Оптимизатор: конкретная реализация алгоритма градиентного спуска;
  • Коэффициент скорости обучения: размер «шага» при снижении потерь во время градиентного спуска;
  • Серия: набор данных для обучения нейронной сети;
  • Эпоха: полный проход по всей серии исходных данных;
  • Прямое распространение: вычисление выходных значение по входным значениям;
  • Обратное распространение: вычисление значений внутренних переменных согласно алгоритму оптимизации, начинающегося с выходного слоя и по направлению к входному слою через все промежуточные слои.

Dense-слои


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

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

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

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

Чтобы создать приведенную выше нейронную сеть нам достаточно следующих выражений:

hidden = tf.keras.layers.Dense(units=2, input_shape=[3])
output = tf.keras.layers.Dense(units=1)
model = tf.keras.Sequential([hidden, output])

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

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

Представим, что наша модель принимает на вход три параметра — х1, х2, х3, а а1, а2 и а3 — нейроны нашей сети. Помните мы говорили, что у нейрона есть внутренние переменные? Так вот, w* и b* являются теми самыми внутренними переменными нейрона, так же известными как веса и смещения. Именно значения этих переменных подвергаются корректировке в процессе обучения для получения максимально точных результатов сопоставления входных значений выходным.

Что обязательно стоит иметь ввиду — внутренняя математика нейрона остаётся неизменной. Другими словами, в процессе тренировки меняются только веса и смещения.

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

Давайте теперь вернёмся к нашему примеру конвертации градусов Цельсия в градусы Фаренгейта.

С единственным нейроном у нас есть только один вес и одно смещение. Знаете что? Это именно то, как выглядит формула конвертации градусов Цельсия в градусы Фаренгейта. Если мы подставим под w11 значение 1.8, а вместо b132, то получим конечную модель преобразования!

Если мы вернёмся к результатам работы нашей модели из практической части, то обратим внимание на то, что показатели веса и смещения были «откалиброваны» таким образом, что примерно соответствуют значениям из формулы.

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

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

Оставайтесь на связи, потому что сейчас начнётся самое интересное!

Итоги


В этом уроке мы научились базовым подходам в машинном обучении и узнали как работают полносвязные слои (Dense-слои). Вы обучили свою первую модель преобразовывать градусы Цельсия в градусы Фаренгейта. Вы так же изучили основные термины используемые в машинном обучении, такие как свойства, примеры, метки. Вы, ко всему прочему, написали основные строчки кода на Python, которые являются костяком любого алгоритма машинного обучения. Вы увидели, что в несколько строчек кода можно создать, обучить и запросить предсказание у нейронной сети с использованием TensorFlow и Keras.

… и стандартные call-to-action — подписывайся, ставь плюс и делай share 🙂

Видео-версия статьи



YouTube: https://youtube.com/channel/ashmig
Telegram: https://t.me/ashmig
ВКонтакте: https://vk.com/ashmig

Must-have алгоритмы машинного обучения / Habr

Хабр, привет.

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

Метод главных компонент (PCA)/SVD


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

SVD — это способ вычисления упорядоченных компонентов.

Полезные ссылки:


Вводный гайд:

Метод наименьших квадратов


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

Используйте этот алгоритм, чтобы соответствовать простым кривым/регрессии.

Полезные ссылки:


Вводный гайд:

Ограниченная линейная регрессия


Метод наименьших квадратов может смутить выбросами, ложными полями и т. д. Нужны ограничения, чтобы уменьшить дисперсию линии, которую мы помещаем в набор данных. Правильное решение состоит в том, чтобы соответствовать модели линейной регрессии, которая гарантирует, что веса не будут вести себя “плохо”. Модели могут иметь норму L1 (LASSO) или L2 (Ridge Regression) или обе (elastic regression).

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

Полезная ссылка:


Вводные гайды:

Метод k-средних


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

Полезная ссылка:


Вводные гайды:

Логистическая регрессия


Логистическая регрессия ограничена линейной регрессией с нелинейностью (в основном используется сигмоидальная функция или tanh) после применения весов, следовательно, ограничение выходов приближено к + / — классам (что равно 1 и 0 в случае сигмоида). Функции кросс-энтропийной потери оптимизированы с использованием метода градиентного спуска.

Примечание для начинающих: логистическая регрессия используется для классификации, а не регрессии. В целом, она схожа с однослойной нейронной сетью. Обучается с использованием методов оптимизации, таких как градиентный спуск или L-BFGS. NLP-разработчики часто используют её, называя “классификацией методом максимальной энтропии”.

Используйте LR для обучения простых, но очень “крепких” классификаторов.

Полезная ссылка:


Вводный гайд:

SVM (Метод опорных векторов)


SVM – линейная модель, такая как линейная/логистическая регрессия. Разница в том, что она имеет margin-based функцию потерь. Вы можете оптимизировать функцию потерь, используя методы оптимизации, например, L-BFGS или SGD.

Одна уникальная вещь, которую могут выполнять SVM – это изучение классификаторов классов.

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

Полезная ссылка:


Вводные гайды:

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


В основном, это многоуровневые классификаторы логистической регрессии. Многие слои весов разделены нелинейностями (sigmoid, tanh, relu + softmax и cool new selu). Также они называются многослойными перцептронами. FFNN могут быть использованы для классификации и “обучения без учителя” в качестве автоэнкодеров.

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

Полезные ссылки:


Вводные гайды:

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


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

Полезные ссылки:


Вводные гайды:

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


RNNs моделируют последовательности, применяя один и тот же набор весов рекурсивно к состоянию агрегатора в момент времени t и вход в момент времени t. Чистые RNN редко используются сейчас, но его аналоги, например, LSTM и GRU являются самыми современными в большинстве задач моделирования последовательности. LSTM, который используется вместо простого плотного слоя в чистой RNN.

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

Полезные ссылки:


Вводные гайды:

Условные случайные поля (CRFs)


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

Используйте CRF для связки последовательностей (в тексте, изображении, временном ряду, ДНК и т. д.).

Полезная ссылка:


Вводные гайды:

Деревья принятия решений и случайные леса


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

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

Полезные ссылки:


Вводные гайды:
Больше информации о машинном обучении и Data Science вы узнаете подписавшись на мой аккаунт на Хабре и Telegram-канал Нейрон. Не пропускайте будущих статей.

Всем знаний!

Вероятностная интерпретация классических моделей машинного обучения / Habr

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



Классические задачи машинного обучения

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


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

Задача классификации — это задача присвоения меток объектам. Например, если объекты — это фотографии, то метками может быть содержание фотографий: содержит ли изображение пешехода или нет, изображен ли мужчина или женщина, какой породы собака изображена на фотографии. Обычно есть набор взаимоисключающих меток и сборник объектов, для которых эти метки известны. Имея такую коллекцию данных необходимо автоматически расставлять метки на произвольных объектах того же типа, что были в изначальной коллекции. Давайте формализуем это определение.
Допустим, есть множество объектов . Это могут быть точки на плоскости, рукописные цифры, фотографии или музыкальные произведения. Допустим также, что есть конечное множество меток . Эти метки могут быть пронумерованы. Мы будем отождествлять метки и их номера. Таким образом в нашей нотации будет обозначаться как . Если , то задача называется задачей бинарной классификации, если меток больше двух, то обычно говорят, что это просто задача классификации. Дополнительно, у нас есть входная выборка . Это те самые размеченные примеры, на которых мы и будем обучаться проставлять метки автоматически. Так как мы не знаем классов всех объектов точно, мы считаем, что класс объекта — это случайная величина, которую мы для простоты тоже будем обозначать . Например, фотография собаки может классифицироваться как собака с вероятностью 0.99 и как кошка с вероятностью 0.01. Таким образом, чтобы классифицировать объект, нам нужно знать условное распределение этой случайной величины на этом объекте .

Задача нахождения при данном множестве меток и данном наборе размеченных примеров называется задачей классификации.


Вероятностная постановка задачи классификации

Чтобы решить эту задачу, удобно переформулировать ее на вероятностном языке. Итак, есть множество объектов и множество меток . — случайная величина, представляющая собой случайный объект из . — случайная величина, представляющая собой случайную метку из . Рассмотрим случайную величину с распределением , которое является совместным распределением объектов и их классов. Тогда, размеченная выборка — это сэмплы из этого распределения . Мы будем предполагать, что все сэмплы независимо и одинаково распределены (i.i.d в англоязычной литературе).

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


Классификация двух нормальных распределений

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


Рис. 1. Плотности распределения и .

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

Найдем условную вероятность классов:


Т.е.

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


Рис. 2. Плотности распределения , и . там, где две гауссианы пересекаются.

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


Метод максимизации правдоподобия

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

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


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



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


Задачу максимизации можно переписать как задачу минимизации:


Последняя величина называется кросс-энтропией распределений и . Именно ее и принято оптимизировать для решения задач обучения с подкреплением (supervised learning).

Минимизацию на протяжении этого цикла статей мы будем проводить с помощью Stochastic Gradient Descent (SGD), а точнее, его расширения на основе адаптивных моментов, пользуясь тем, что сумма градиентов по подвыборке (так называемому “минибатчу”) является несмещенной оценкой градиента минимизируемой функции.


Классификация двух нормальных распределений логистической регрессией

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

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

def input_batch(dataset_params, batch_size):
    input_mean = tf.constant(dataset_params.input_mean, dtype=tf.float32)
    input_stddev = tf.constant(dataset_params.input_stddev,dtype=tf.float32)
    count = len(dataset_params.input_mean)
    labels = tf.contrib.distributions.Categorical(probs=[1./count] * count)
        .sample(sample_shape=[batch_size])
    components = []
    for i in range(batch_size):
        components
            .append(tf.contrib.distributions.Normal(
                loc=input_mean[labels[i]],
                scale=input_stddev[labels[i]])
            .sample(sample_shape=[1]))
    samples = tf.concat(components, 0)
    return labels, samples

Определим наш классификатор. Он будет простейшей нейронной сетью без скрытых слоев:

def discriminator(input):
    output_size = 1
    param1 = tf.get_variable(
        "weights",
        initializer=tf.truncated_normal([output_size], stddev=0.1)
    )
    param2 = tf.get_variable(
        "biases",
        initializer=tf.constant(0.1, shape=[output_size])
    )
    return input * param1 + param2

И запишем функцию потерь — кросс-энтропию между распределениями реальных и предсказанных меток:

labels, samples = input_batch(dataset_params, training_params.batch_size)
predicted_labels = discriminator(samples)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
    labels=tf.cast(labels, tf.float32),
    logits=predicted_labels)
)

Ниже приведены графики обучения двух моделей: базовой и с L2-регуляризацией:


Рис. 3. Кривая обучения логистической регрессии.

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


Рис. 4. Процесс обучения логистический регрессии.

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


Регрессия

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



Регрессия линейно зависимых величин с нормальным шумом

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




Рис. 5. Линия регрессии задачи про линейно зависимые величины с шумом.


Решение задачи регрессии методом максимального правдоподобия

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




Состоятельной и несмещенной оценкой этого матожидания будет среднее по выборке


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


Регрессия величины линейной регрессией

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

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

def input_batch(dataset_params, batch_size):
    samples = tf.random_uniform([batch_size], 0., 10.)
    noise = tf.random_normal([batch_size], mean=0., stddev=1.)
    labels = (dataset_params.input_param1 * samples + dataset_params.input_param2 + noise)
    return labels, samples

Определим нашу модель. Она будет простейшей нейронной сетью без скрытых слоев:

def predicted_labels(input):
    output_size = 1
    param1 = tf.get_variable(
        "weights",
        initializer=tf.truncated_normal([output_size], stddev=0.1)
    )
    param2 = tf.get_variable(
        "biases",
        initializer=tf.constant(0.1, shape=[output_size])
    )
    return input * param1 + param2

И запишем функцию потерь — L2-расстояние между распределениями реальных и предсказанных значений:

labels, samples = input_batch(dataset_params, training_params.batch_size)
predicted_labels = discriminator(samples)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(
    labels=tf.cast(labels, tf.float32),
    logits=predicted_labels)
)

Ниже приведены графики обучения двух моделей: базовой и с L2-регуляризацией:


Рис. 6. Кривая обучения линейной регрессии.


Рис. 7. График изменения первого параметра с шагом обучения.


Рис. 8. График изменения второго параметра с шагом обучения.

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


Рис. 9. Процесс обучения линейной регрессии.

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


Другие задачи

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


Генеративные модели

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


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

Спасибо Olga Talanova за ревью этой статьи. Спасибо Sofya Vorotnikova за комментарии, редактирование и проверку английской версии. Спасибо Andrei Tarashkevich за помощь в верстке.

Введение в машинное обучение / Habr

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

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

Что, если я скажу: «Машины тоже могут учиться»?

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

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

Что такое машинное обучение

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

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

Это происходит в 3 этапа:
1) Анализ данных
2) Нахождение шаблонов
3) Предсказание на основе шаблона

Применение машинного обучения

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

  • Здравоохранение: прогнозирование диагнозов пациентов для врачей
  • Социальная сеть: прогнозирование совместимости на сайте знакомств
  • Финансы: прогнозирование мошеннической деятельности по кредитным картам
  • Электронная коммерция: прогнозирование оттока клиентов
  • Биология: поиск закономерностей генных мутаций, которые могут вызвать рак

Как машины учатся?

Не хочу вас запутать, поэтому просто скажу, что машины учатся, находя похожие данные в больших массивах данных. Чем больше данных передается машине, тем «умнее» она становится.

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

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

Типы машинного обучения

Существует три основные категории машинного обучения:

Supervised learning (обучение с учителем): Машина учится по выбранным данным. Обычно, данные отмечаются людьми.

Unsupervised learning (обучение без учителя): Машина учится не по выбранным данным. Смысл в том, что среди данных нет «правильного» ответа, машина должна найти зависимость между объектами.

Reinforcement learning (обучение с подкреплением): Машина учится через систему на основе вознаграждения.

1. Supervised learning (обучение с учителем)

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

Задача регрессии:

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

Задача классификации:

Если требуется спрогнозировать дискретные значения, например классифицировать что-либо по категориям, используйте классификацию. Вопрос «Будет ли человек делать покупку», имеет ответ, который попадает в две конкретные категории: да или нет. Число допустимых ответов конечно.

2. Unsupervised learning (обучение без учителя)

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

Задача кластеризации:

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

Задача поиска ассоциациативных правил:

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

3. Reinforcement learning (обучение с подкреплением)

Этот тип машинного обучения требует использования системы вознаграждения/штрафа. Цель — вознаградить машину, когда она учится правильно, и наказать машину, когда она учится неправильно.

Примеры обучения с подкреплением

— Обучение машины, как научиться играть (Chess, Go)
— Super Mario , как учиться и играть

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

Перевод статьи A Beginner’s Guide to Machine Learning 🙂

Ограничения машинного обучения / Habr

Привет, Хабр! Представляю вашему вниманию перевод статьи “The Limitations of Machine Learning“ автора Matthew Stewart.

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


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

В наше время гипербола о машинном обучении и искусственном интеллекте повсеместна. Возможно, это правильно, учитывая, что потенциал для этой области огромен. За последние несколько лет число консалтинговых агентств по ИИ возросло, и, согласно отчету Indeed, количество рабочих мест, связанных с ИИ, увеличилось на 100% в период с 2015 по 2018 годы.

По состоянию на декабрь 2018 года Forbes обнаружил, что 47% бизнеса имеют по крайней мере одну возможность использования ИИ в своем бизнес-процессе, a в отчете Deloitte говорится, что уровень проникновения корпоративного программного обеспечения со встроенным ИИ и облачных сервисов разработки ИИ, достигнет примерно 87 и 83 процентов соответственно. Эти цифры впечатляют — если вы планируете сменить карьеру в ближайшее время, ИИ кажется неплохой областью.

Все кажется великолепным, верно? Компании счастливы, и, по-видимому, потребители тоже счастливы, иначе компании не использовали бы ИИ.

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

Ограничение 1 – Этика


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

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

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

Наиболее часто обсуждаемый случай в сегодняшнее время – это самоуправляемые автомобили: как мы решаем, как транспортное средство должно реагировать в случае фатального столкновения? Будет ли у нас в будущем возможность выбрать этические рамки при покупке, которым следовал бы наш самоуправляемый автомобиль?

Кто виноват, если моя самоуправляемая машина кого-то убьет на дороге?

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

Ограничение 2 — Детерминированные проблемы


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

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

Однако все становится немного интереснее, когда дело доходит до компьютерного моделирования.

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

Хорошими примерами этого являются MM5 и WRF, которые представляют собой численные модели прогнозирования погоды, которые используются для исследований климата и для предоставления вам прогнозов погоды в утренних новостях. Интересно, что синоптики делают весь день? Запустите и изучите эти модели.

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

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

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

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

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

Ограничение 3 – Данные


Это самое очевидное ограничение. Если вы плохо «кормите» модель, то это даст только плохие результаты. Это может проявляться двумя причинами: нехватка данных и нехватка достоверных данных. Если у вас таких проблем нет, то вы смело можете изучать обработку больших массивов данных на Телеграм-канале «Big Data Books», где публикуются различные книги и ресурсы по Big Data.

Недостаток данных


Многие алгоритмы машинного обучения требуют больших объемов данных, прежде чем они начнут давать полезные результаты. Хорошим примером этого является нейронная сеть. Нейронные сети – это data-eating машины, которые требуют большого количества обучающих данных. Чем больше архитектура, тем больше данных требуется для получения жизнеспособных результатов. Повторное использование данных — плохая идея, всегда предпочтительнее иметь больше данных.
Если вы можете получить данные, то используйте их.

Недостаток хороших данных


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

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

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

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

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

Ограничение 4 — Неправильное применение


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

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

Для стохастических (случайных) систем все немного менее очевидно. Кризис машинного обучения для случайных систем проявляется двумя способами:

  • P-hacking
  • Объем анализа

p-hacking


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

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

Объем анализа


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

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

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

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

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

Ограничение 5 – Интерпретируемость


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

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

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

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

Вывод


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

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

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

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

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