26.08.2017

Перевод «Создай свою нейросеть» — 2

Продолжаю перевод замечательной книги «Создай свою нейросеть».

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

Вы можете скачать PDF версию перевода.

Приятного чтения!

Оглавление

1 Глава. Как они работают.

1.3 Классификация это почти что предсказание

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

Посмотрите на график ниже. Каждая точка на этом графике соответствует заранее замеренной длине и ширине насекомых в саду.

Длина и ширина жуков в саду

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

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

Линейные функции оттого и называются линейными, потому что на графике они представляют собой прямые. Постоянный коэффициент ​\( C \)​ определяет наклон прямой.

Давайте нанесем какую-нибудь прямую на наш график с размерами жуков:

Длина и ширина жуков в саду

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

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

Давайте попробуем какую-нибудь другую прямую.

Длина и ширина насекомых в саду

Новая прямая не имеет никакой ценности, так как она вообще не разделяет гусениц и божьих коровок!

Еще одна попытка:

Длина и ширина насекомых в саду

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

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

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

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

К какому виду относится неизвестный жук?

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

Мы пропустили один очень важный процесс. Как именно мы настраиваем правильный наклон прямой? Как скорректировать не совсем удачный результат?

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

1.4 Тренировка простого классификатора

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

Как это сделать?

Вместо разработки математической теории давайте просто пойдем напролом. Так будет проще.

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

Пример Ширина Длина Жук
1 3.0 1.0 божья коровка
2 1.0 3.0 гусеница

У нас есть божья говорка и мы знаем ее размеры: 3 в ширину и 1 в длину. У нас также есть гусеница с размерами: 1 в ширину и 3 в длину.

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

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

Обучающая выборка для классификатора жуков

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

\[ y = Ax \]

Тут мы намерено использовали обозначения ​\( y \)​ и ​\( x \)​ вместо длины и ширины, потому что, строго говоря, здесь линейная функция не выполняет предсказательной роли. Она не переводит ширину в длину, как в примере с функцией, переводящей километры в мили. Здесь эта функция определяет прямую на графике. Это классификатор.

Вы также можете заметить, что в функции ​\( y=Ax \)​ мы опустили свободный член, ведь в общем виде линейная функция должна записываться в виде ​\( y=Ax+B \)​. ​\( B\neq0 \)​ означает, что прямая не проходит через начало координат. Но давайте не будем усложнять нашу задачу и примем ​\( B=0 \)​, то есть наша прямая проходит через начало координат.

Мы уже знаем, что параметр ​\( A \)​ отвечает за наклон прямой. Чем больше ​\( A \)​, тем круче наклон.

Для начала пусть ​\( A=0.25 \)​. Уравнение нашей разделяющей прямой следующее: ​\( y=0.25x \)​. Давайте нарисуем разделяющую прямую, которая соответствует этому уравнению. Рисовать будем на том же графике.

Обучающая выборка для классификатора жуков

Без всяких вычислений сразу можно сказать, что эта прямая ​\( y=0.25x \)​ — плохой классификатор. Она не разделяет жуков в саду. Мы не можем сказать, что если точка размеров нашего жука выше прямой, то это гусеница, так как и божья коровка тоже находится выше этой прямой.

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

Давайте посмотрим на первый пример из нашей обучающей выборки: божья коровка с шириной = 3 и длиной = 1. Подставим ширину за место ​\( x \)​ в уравнение нашей разделяющей прямой:

\[ y=(0.25)\times(3.0)=0.75 \]

Функция, в которой постоянный коэффициент ​\( A=0.25 \)​ мы выбрали случайным образом предполагает, что если ширина найденного в саду жука равна 3, то его длина должна быть равна 0.75. Но исходя из обучающей выборки мы знаем, что этого недостаточно и длина жука должна равняться 1.

Мы опять получаем погрешность, прямо как и в случае с машиной, переводящей километры в мили. Там мы подбирали коэффициент ​\( C \)​. Здесь нам нужно подобрать коэффициент ​\( A \)​.

Прежде чем приступать к подбору ​\( A \)​ важно прояснить один момент. Какое именно значение ​\( y \)​ (то есть длины жука) мы хотим получить? Если, мы хотим, чтобы ​\( y=1 \)​, то наша прямая будет проходить прямо через точку с размерами божьей коровки ​\( (3,1) \)​. Может показаться, что именно это нам и надо, но это не так. Нам нужно, чтобы прямая проходила выше этой точки. Почему? Потому что мы хотим, чтобы все размеры божьих коровок находились под прямой, а не на ее пути. Ведь нам нужна прямая, разделяющая гусениц и божьих коровок, а не предсказательная машина, которая выдает нам длину жука, основываясь на его ширине.

Принимая во внимание все вышесказанное давайте установим за желаемый результат ​\( y=1.1 \)​ при ​\( x=3 \)​. Это чуть-чуть выше, чем 1. Вообще никто не мешает выбрать ​\( y=1.2 \)​ или даже ​\( y=1.3 \)​. Главное не брать слишком высоко, так как в этом случае может получиться, что и божьи коровки, и гусеницы окажутся под прямой.

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

\[ \text{погрешность} = \text{желаемый результат} — \text{полученный результат} \]

Подставляем числа:

\[ E = 1.1 — 0.75 = 0.35 \]

Сделайте паузу и внимательно изучите рисунок ниже. Убедитесь, что вы все понимаете.

Но как использовать погрешность ​\( E \)​ для получения более точного значения ​\( A \)​? Это важный вопрос.

Давайте рассуждать. Мы хотим использовать погрешность ​\( E \)​ для подбора значения постоянного коэффициента ​\( E \)​. Тогда нам нужно знать связь между ​\( E \)​ и ​\( A \)​. Если бы мы отыскали эту связь, то смогли бы понять, как изменение одного влияет на другое.

Уравнение нашего классификатора:

\[ y=Ax \]

Давайте обозначим желаемое значение ​\( y \)​ за ​\( t \)​. Для получения этого значения ​\( t \)​ нам надо как-то несильно изменить постоянный коэффициент ​\( A \)​. Математики используют символ ​\( \Delta \)​ (дельта) для обозначения небольшого изменения. Итак:

\[ t = (A + \Delta A)x \]

Проиллюстрируем вышесказанное. Мы видим, что для достижения желаемого результата ​\( t \)​ в точке с ​\( x=3 \)​ нам нужен новый постоянный коэффициент ​\( A + \Delta A \)​, который отвечает за новый наклон разделяющей прямой.

Вы помните, что погрешность равна разнице между желаемым и полученным результатами. Желаемый результат мы обозначили за ​\( t = (A+\Delta A)x \)​. Текущий получаемый результат мы получаем с помощью уравнения ​\( y=Ax \)​. Разница ​\( t-y \)​ и есть наша погрешность:

\[ E = t-y = (A+\Delta A)x — Ax \]

Раскрываем скобки и упрощаем:

\[ \begin{gather*} E = t — y = Ax + \Delta Ax — Ax \\ E = \Delta Ax \end{gather*} \]

Вот это да! Мы получили простую зависимость между погрешностью ​\( E \)​ и небольшим изменением постоянного коэффициента ​\( \Delta A \)​. Да, это действительно так просто.

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

Мы ищем, насколько надо изменить ​\( A \)​ для улучшения наклона разделяющей прямой в зависимости от текущей погрешности ​\( E \)​. Мы уже нашли зависимость между ​\( E \)​ и ​\( A \)​:

\[ E = \Delta A x \]

Теперь делим обе части равенства на ​\( x \)​:

\[ \Delta A = \frac{E}{x} \]

Вот то самое магическое выражение, на поиск которого мы потратили столько сил! Теперь мы точно знаем, насколько надо изменять коэффициент ​\( A \)​ при данной ошибке ​\( E \)​.

Давайте сделаем это — давайте улучшим наклон разделяющей прямой.

\( E = 0.35 \)​ и ​\( x=3 \)​. Считаем ​\( \Delta A \)​:

\[ \Delta A = \frac{E}{x} = \frac{0.35}{3}= 0.1167 \]

Это означает, что мы должны добавить к текущему значению ​\( A=0.25 \)​ еще ​\( 0.1167 \)​.

\[ A = 0.25 + 0.1167 = 0.3667 \]

Теперь получаемый ​\( y=Ax \)​ с коэффициентом ​\( A=0.3667 \)​ при ​\( x=3 \)​ равен 1.1, как мы и хотели.

Вот и все! Мы сделали это! Мы подобрали постоянный коэффициент ​\( A \)​ в зависимости от имеющейся погрешности.

Но это еще далеко не все.

У нас в обучающей выборке есть еще один пример — гусеница с шириной (​\( x=1 \)​) и длиной (​\( y=3 \)​). Давайте посмотрим, что мы получим при подстановке ​\( x=1 \)​ в нашу линейную функцию с постоянным коэффициентом ​\( A=0.3667 \)​:

\[ y=0.3667\times1 = 0.3667 \]

Даже не близко к ​\( y=3 \)​.

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

Посчитаем текущую погрешность:

\[ E = 2.9-0.3667 = 2.5333 \]

Она может показаться большой. Но это не так странно, ведь мы настраивали коэффициент ​\( A \)​ основываясь только на первом примере из обучающей выборки.

Посчитаем обновленный коэффициент ​\( A \)​. Для этого нам нужно вновь найти добавку ​\( \Delta A \)​:

\[ \Delta A = \frac{E}{x} = \frac{2.5333}{1} = 2.5333 \]

Получим новое значение ​\( A \)​:

\[ A = 0.3667 + 2.5333 = 2.9 \]

Теперь для ​\( x=1 \)​ мы будем получать ​\( y=2.9 \)​. Именно этого мы и добивались.

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

Стоп! Что произошло?! Какой-то странный наклон у нас получился. Он вовсе не делит область пополам между гусеницами и божьими коровками.

Ну, вообще-то мы получили то, чего добивались. Мы скорректировали наклон нашей прямой для получения желаемого ​\( y \)​. Тогда что пошло не так? Если мы и дальше продолжим работать в таком духе, то мы всегда будем получать результат, заточенный на последний пример, под который мы проводили корректировку. Фактически, мы выбрасываем из головы нашего классификатора то, чему он научился на предыдущих примерах и учим его только на самом последнем.

Как это исправить?

Просто. И в этом решении состоит одна из основных идей машинного обучения. Мы регулируем изменения. Под регуляцией я подразумеваю их смягчение. Вместо того, чтобы бросаться сломя голову к каждому новому значению коэффициента ​\( A \)​, мы намеренно немного уменьшаем добавку ​\( \Delta A \)​. Таким образом мы не скачком приходим к результату, а как-бы двигаемся в его направлении, с уважением относясь к предыдущим достигнутым результатам. Мы уже встречались со смягчением изменений ранее, когда создавали машину по переводу километров в мили. Там мы понемногу меняли коэффициент ​\( C \)​.

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

Давайте вернемся к нашему классификатору и введем идею регулировки изменений в алгоритм его работы:

\[ \Delta A = L\left(\frac{E}{x}\right) \]

Регулировку изменений часто называют коэффициентом скорости обучения. Примем ​\( L=0.5 \)​ для начала. Получается, что изменение коэффициента (​\( \Delta A \)​) будет вдвое более слабым, чем оно было бы без регулировки изменений.

Повторим процесс обучения классификатора. Изначально ​\( A=0.25 \)​. Первый пример из обучающей выборки дает нам следующий ​\( y \)​:

\[ y = 0.25\times3 = 0.75 \]

Желаемый результат равен 1.1, а значит ошибка равна 0.35. Считаем добавку к ​\( A \)​:

\[ \Delta A = L\left(\frac{E}{x}\right)=0.5\times\frac{0.35}{3}=0.0583 \]

Считаем ​\( A \)​:

\[ A = 0.25 + 0.0583 = 0.3083 \]

Давайте протестируем полученное значение ​\( A \)​:

\[ y = Ax = 0.3083 \times 3 = 0.9250 \]

Теперь разделяющая прямая проходит немного ниже нашей божьей коровки. Да, ​\( 0.9250 \neq 1.1 \)​, но это все равно отличный результат если относиться к нему, как к первому шагу в обучении нашего классификатора.

Теперь продолжим тренировку на втором примере из обучающей выборки, когда ​\( x=1 \)​.

\[ y = 0.3083 \times 1 = 0.3083 \]

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

\( E = 2.9 — 0.3083 = 2.5917 \)

Считаем добавку к ​\( A \)​:

\[ \Delta A = L\left(\frac{E}{x}\right) = 0.5\times\frac{2.5917}{1} = 1.2958 \]

Более совершенное значение ​\( A \)​:

\[ A = 0.3083 + 1.2958 = 1.6041 \]

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

А вот это уже круто!

2 примеров из обучающей выборки и относительно простого правила по регулировке изменений с применением коэффициента скорости обучения нам с лихвой хватило для получения отличной разделяющей прямой с постоянным коэффициентом ​\( A=1.6041 \)​.

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

Великолепно!

Ключевые моменты:

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

Как вам эти два раздела? Все ли понятно? Любые вопросы можно задать на форуме.

Делитесь своими впечатлениями в комментариях! 🙂

Аватара автора Петр Радько

Петр Радько

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

Комментарии

disko23
disko23

На графиках вертикальная ось обозначена как высота, а в тексте как длина животного.

Большое спасибо за перевод, жду с нетерпением продолжения.

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

Спасибо за перевод! Ждём дальнейших глав, а также 5ой главы по учебнику. Из всего, что я до сих пор видел — это лучший обучающий материал.

wpDiscuz
Вставить формулу как
Блок
Строка
Дополнительные настройки
Цвет формулы
Цвет текста
#333333
Используйте LaTeX для набора формулы
Предпросмотр
\({}\)
Формула не набрана
Вставить

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: