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

Основы нейронных сетей. Превращаем километры в мили

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

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

основы-нейронных-сетей-0

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

основы-нейронных-сетей-1

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

основы-нейронных-сетей-2

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

Нейронные сети состоят из множества взаимосвязанных элементов, называемых нейронами. Эти элементы организованы в слои, и каждый нейрон в одном слое взаимодействует с нейронами в иных слоев.

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

основы-нейронных-сетей-3

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

Существование линейного соотношения между километрами и милями дает нам ключ к разгадке формулы для вычислений. Она должна иметь следующий вид:

Мили = Километры х С,

где С — констан­та, величину которой мы пока что не знаем.

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

ПримерКилометрыМили
100
210062.37

Как нам найти недостающую константу? Давайте попробуем подставить в формулу случайное число. Например, предположим, что С = 0,5, и посмотрим, что получится.

Мили = 100 х 0.5 = 50

Это не так уж плохо, учитывая, что значение С=0.5 было выбрано случайно. Однако мы знаем, что оно не совсем точное, поскольку пример 2 показывает, что правильный ответ составляет 62.137 мили.

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

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

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

Мили = 100 х 0.6 = 60

Уже лучше! Теперь ошибка составляет всего лишь 2.137 мили. Вместо того чтобы вычислять точное значение поправки, на которую нужно изменить константу С, мы продолжим использовать метод, основанный на постепенном уточнении этой константы.

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

Давайте повторим уже знакомые шаги. Наш текущий выходной результат, равный 60, все еще слишком мал. Давайте снова немного изменим константу С, увеличив ее значение с 0.6 до 0.7.

Мили = 100 х 0.7 = 70

Мы перестарались и получили результат, превышающий правильный ответ. Предыдущая ошибка была равна 2.137 мили, а теперь она составляет -7.683 мили. Знак “минус” просто свидетельствует о том, что вместо недооценки истинного результата произошла его пере­оценка.
Итак,С=0.б было гораздо лучше, чем С=0.7. Продвинемся еще чуть дальше. Почему бы нам не попытаться ввести очень малую поправку и увели­ чить значение С с 0.6 до 0.61?

Мили = 100 х 0.61 = 61

Это позволяет нам достичь более точных результатов, чем раньше. Теперь разница между выходным значением 61 и правильным значением 62.137 составляет всего лишь 1.137 мили.

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

Основы нейронных сетей. Гусеницы или божьи коровки?

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

основы-нейронных-сетей-5

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

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

основы-нейронных-сетей-6

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

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

введение-в-нейронные-сети-10

В этот раз линия оказалась такой же бесполезной. Сделаем еще один заход.

основы-нейронных-сетей-8

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

Мы предполагаем, что здесь представлены все известные виды насекомых. Это необходимо для наглядного объяснения работы простого классификатора.

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

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

основы-нейронных-сетей-9

Однако есть один важный момент, который мы упустили из виду. Как нам определить подходящий угол наклона прямой? Как изменить положение линии, если она не разделяет должным образом два вида насекомых?

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

Основы нейронных сетей. Ошибки нужно исправлять

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

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

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

ПримерШиринаДлинаНасекомое
13.01.0Божья коровка
21.03.0Гусеница

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

основы-нейронных-сетей-10

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


у = Ах

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

Возможно, вы обратили внимание на то, что уравнение прямой линии имеет неполный вид. Полное уравнение прямой выглядит следующим образом: у=Ах+В. Ненулевое значение константы В смещает линию выше или ниже начала координат, что на данном этапе не имеет значения.

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

у=0.25х

Отобразим эту линию на рисунке.

основы-нейронных-сетей-11

Как мы видим, линия у=0.25х не очень хорошо разделяет насекомых. Она не позволяет четко отделить один тип от другого. Очевидно, что правый край линии следует немного поднять. Однако для достижения наилучшего результата нам необходимо выработать определённый математический алгоритм.
Обратимся к первому тренировочному примеру, соответствующе­му божьей коровке: ширина — 3.0 и длина — 1.0. Если бы мы те­стировали функцию у=Ах с этим примером, в котором х =3.0, то получили бы следующий результат:

y = 0.25 * 3.0 = 0.75

Функция, в которой для параметра А было установлено начальное значение, равное 0.25, сообщает, что длина насекомого шириной 3.0 должна составлять 0.75. Однако мы знаем, что это слишком маленькое значение, так как согласно тренировочным данным длина божьей коровки равна 1.0.

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

Однако, прежде чем приступить к построению линии, давайте обсудим, каким должно быть значение у. Если мы выберем у = 1.0, то линия пройдет через точку с координатами (х, у) = (3.0; 1.0), которая соответствует божьей коровке.

основы-нейронных-сетей-12

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

Давайте рассмотрим значение y = 1.1 при x = 3.0. Это значение лишь немного больше 1.0. Вместо него можно было бы выбрать значение 1.2 или 1.3, но не 10 или 100, так как это с большой вероятностью приведёт к тому, что прямая будет проходить над всеми насекомыми, включая божьих коровок и гусениц, и станет совершенно бесполезной в качестве разделителя.
Следовательно, мы выбираем целевое значение 1.1 и определяем ошибку Е с помощью следующей формулы:

Ошибка(E) = желаемое целевое значение — фактический результат

После подстановки значений:
Е = 1 .1 -0 .7 5 = 0.35

основы-нейронных-сетей-13

Основы нейронных сетей. Учимся считать

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

у = Ах

Нам уже известно, что начальные попытки присвоения пробных значений параметру А привели к неверным значениям у . Давайте вышеописанную формулу линейной функции дополним ещё одним уравнением. Пусть t — правильное целевое значение.. Чтобы получить его, мы должны ввести в А небольшую поправку. Для таких поправок в математике принято использовать символ Δ, означающий “небольшое изменение” . Запишем соответ­ствующее уравнение:

t = (А + ΔА) х

Вот как это выглядит на рисунке:

основы-нейронных-сетей-14

Вспомните, что ошибку Е мы определили как разность между же­лаемым значением у и расчетным значением. Таким образом,

Е = t — у

Запишем это в явном виде:

E = t — у = (А + ΔА) х — Ах

Раскроем скобки. В результате получаем:

E = t — y = Ax+ (ΔА) х — Ах = (ΔА)х

Получается ошибка Е связана с ΔА очень простым со­ отношением.

ΔА = Е / х

Это и есть то выражение, которое мы искали. Теперь мы можем использовать ошибку Е для изменения наклона линии на величину ΔА в нужную сторону.

Когда х был равен 3.0, ошибка была равна 0.35. Таким образом, ΔА = Е /х превращается в (0.35 / 3.0) = 0.1167. Это означает, что те­кущее значение А=0.25 необходимо изменить на величину 0.1167. Отсюда следует, что новое, улучшенное значение А равно (А + ΔА ), т.е. 0.25 + 0.1167 = 0.3667. Не составляет труда убедиться в том, что расчетное значение у при новом значении А равно, как и следовало ожидать, 1.1 — желаемому целевому значению.

y = 0.3667*3.0 = 1.1001

Закончив с первым примером, потренируемся на втором. Он дает нам следующие истинные данные: х = 1 .0 и у = 3 .0 .
Посмотрим, что получится, если вставить х = 1.0 в линейную функ­цию, в которой теперь используется обновленное значение А = 0.3667 . Мы получаем:

у = 0,3667 * 1,0 = 0,3667

Это очень далеко от значения у = 3.0 в тренировочном примере.

Применяя те же рассуждения, что и ранее, когда мы пытались найти линию, которая не пересекалась бы с обучающими данными, а проходила бы над ними или под ними, мы можем установить желаемое целевое значение равным 2.9. В этом случае данные обучающего примера, соответствующего гусеницам, оказываются выше линии, а не на ней. Ошибка Е составляет (2,9 – 0,3667) = 2,5333.

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

Снова обновим параметр А, как делали ранее. Соотношение ΔА = Е / х дает (2.5333 / 1.0) = 2.5333. Это означает, что после очередного обновления параметр А принимает значение 0,3667 + 2.5333 = 2.9. Таким образом, для х = 1.0 функция возвращает ответ 2,9, что и является желаемым целевым значением.

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

основы-нейронных-сетей-15

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

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

Да! Вместо того чтобы каждый раз с заменять А новым значением, мы используем лишь некоторую долю поправки ΔА, а не всю ее целиком. Благодаря этому мы движемся в том направ­лении, которое подсказывает тренировочный пример, но делаем это осторожно.
У такого сглаживания есть еще один полезный эффект. Если тренировочные данные не являются надеж­ными и могут содержать ошибки или шум (а в реальных измерениях обычно присутствуют оба этих фактора), то сглаживание уменьшает их влияние.

Ну что ж, сделаем перерасчет, на этот раз добавив сглаживание в формулу обновления:


ΔА = L (Е / X)

Фактор сглаживания, обозначенный здесь как L, часто называют коэффициентом скорости обучения. Выберем L=0.5 в качестве ра­зумного начального приближения. Это означает, что мы собираем­ся использовать поправку вдвое меньшей величины, чем без сгла­живания.


Повторим все расчеты, используя начальное значение А = 0.25. Первый тренировочный пример дает нам у = 0.75. При це­левом значении 1.1 ошибка равна 0.35. Поправка равна:

ΔА = L (Е / х) = 0.5 * (0.35 / 3.0) = 0.0583.

Обновленное значение:

А = 0.25 + 0.0583 = 0.3083.

Проведение расчетов с этим новым значением А для тренировочно­го примера при х=3.0 дает:

у = 0.3083 * 3.0 = 0.9250

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

Перейдем ко второму набору тренировочных данных при х=1.0. Используя А=0.3083, мы получаем

у= 0.3083 * 1.0 = 0.3083

Желае­мым значением было 2.9, поэтому ошибка составляет (2.9 — 0.3083) = = 2.5917. Поправка

ΔА = L (Е / х) = 0.5 * 2.5917 / 1.0 = 1.2958

Теперь обновленное значение

А = 0.3083 + 1.2958 = 1.6042

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

основы-нейронных-сетей-16

Это действительно великолепный результат!

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

Заключение

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

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

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

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