Автор книги: Ян Лекун
Жанр: Техническая литература, Наука и Образование
Возрастные ограничения: +12
сообщить о неприемлемом содержимом
Текущая страница: 6 (всего у книги 25 страниц) [доступный отрывок для чтения: 8 страниц]
Найти функцию f(х), которая предсказывает у на основе х
Представим идеального водителя, у которого обучающие примеры расположены по линии, показанной на рис. 3.1. Поскольку кажется, что в расположении этих точек есть какая-то закономерность, нам нужно найти функцию, график которой проходит через все эти точки. Кстати, мы только что совершили несколько произвольный выбор функции, априори решив, что это прямая, угол наклона которой нам и нужно найти.
Эта функция записывается следующим образом:
f(x) = w * x
Я использую здесь обозначения, применяемые в информатике, где символ * обозначает умножение. Данная функция представляет собой прямую, проходящую через 0, наклон которой определяется числом w. Удобнее рассматривать f как функцию с двумя переменными, x и w. Чтобы запрограммировать эту функцию на компьютере с языком Python[38]38
Python – очень гибкий и простой в использовании язык программирования, наиболее часто используемый практиками машинного обучения (www.python.org).
[Закрыть], следует написать следующее:
def f(x, w): return w * x
Рис. 3.1. Взаимосвязь между отклонением автомобиля от полосы движения и углом поворота рулевого колеса, необходимый для возврата автомобиля в середину полосы
Абсцисса соответствует положению автомобиля относительно центра полосы движения на автостраде (в метрах), а ордината – углу поворота рулевого колеса, необходимому для возврата автомобиля в центр полосы (в градусах). Для отрицательного значения положения (слева от центра полосы движения) к рулевому колесу следует приложить отрицательный угол (в данном случае – по часовой стрелке). Здесь отклонение в 1 м исправляется поворотом руля на угол 4°.
Символы w и x представляют собой переменные, функция которых вычисляет произведение, обозначенное w * x. Понятие переменной в информатике означает своего рода «ящик» или ячейку в памяти компьютера, где можно хранить число. Например, можно создать переменную w и поместить в нее значение 4, а затем создать переменную x, имеющую значение 2:
w = 4
x = 2
Символы w и x – это просто названия соответствующих ячеек памяти. Чтобы вычислить функцию с этими значениями x и w, следует написать:
yp = f(x, w)
где символ yp обозначает прогноз y, произведенный нашей моделью.
Рис. 3.2. Прямая, которая проходит как можно ближе к точкам, которые не выровнены
Три из четырех точек лежат на одной прямой. Прямая с коэффициентом наклона 4 проходит через эти три точки, но не через четвертую. Проблема в том, как найти компромисс: прямую, которая проходит «как можно ближе» ко всем четырем точкам. При этом она может не проходить ни через одну из заданных точек.
После произведенного вычисления переменная yp будет содержать значение 8 (4 раза по 2).
Чтобы применить функцию к обучающему примеру № 3, необходимо выполнить следующее: присвоить переменным x и y значения X[3] и Y[3] и вычислить результирующее значение функции f(x, w).
x = X[3]
y = Y[3]
yp = f(x, w)
Поиск прямой, проходящей через точки, сводится к поиску правильного значения параметра w этой функции. Предположим, у нас есть только две тренировочные точки, A = [[0.0, 0.0], [0.9, 3.6]][39]39
Мы пишем в этой книге числа в английском формате, с десятичной точкой вместо запятой, как это принято в языках программирования.
[Закрыть].
Через эти две точки проходит одна прямая. В этом случае правильное значение w равно 4, поскольку 4 * 0.9 = 3.6. Добавим третью точку (–0.8, –3.2). Три точки принадлежат одной прямой, и правильное значение w всегда равно 4.
Но это идеальная ситуация, в реальной жизни так обычно не бывает.
Поставим четвертую точку (1.9, 5.4).
Если мы используем то же значение 4.0 для w, значение, предсказанное нашей функцией yp = f(x, w), будет не 5.4, а 7.6 = 4 * 1.9. Как указывалось ранее, символ yp обозначает прогноз y, произведенный нашей моделью. Данная точка находится не справа, потому что она не совмещена с первыми тремя точками. Что тогда делать?
Должен быть компромисс: нужно выбрать прямую, которая проходит как можно ближе ко всем точкам, с небольшими ошибками.
Как минимизировать ошибку?
При значении w = 4.0 значение, предсказанное справа, равно 7.6. Но значение, наблюдаемое в примере 4, равно 5.4. Четвертая точка выдает ошибку –2.2 = 5.4 – 7.6. Меняя w, мы можем переместить прямую ближе к этой четвертой точке, но тогда мы отодвинемся от остальных трех. Поскольку невозможно пройти через все точки, лучшим компромиссом в нашем примере является прямая, наклон которой составляет примерно 3.2.
При заданном значении w для каждой из точек возникает ошибка между предсказанным функцией yp (на новой прямой) и наблюдаемым у (в каждом примере обучения).
Мы можем измерить среднюю ошибку по всем этим четырем точкам. Для каждой точки ошибка может быть положительной или отрицательной; важно расстояние между предсказанным значением yp и наблюдаемым значением y, независимо от его знака. Чтобы определить это расстояние, необходимо использовать квадрат этой ошибки, но также можно использовать его абсолютное значение (которое всегда положительно).
Для заданного значения w ошибка в примере, скажем (X[3], Y[3]), равна (Y[3] – w * X[3]) ** 2, поскольку значение предсказано для X[3], это yp = w * X[3]. (Мы используем обозначение из информатики: ** 2 для возведения в квадрат[40]40
В языке Python оператор возведения в степень пишется как **. Например, «x в квадрате» записывается «x**2».
[Закрыть].)
Мерой неточности системы L(w) является среднее значение всех этих ошибок на обучающих примерах:
L(w) = ¼ * ((Y[0] – w * X[0]) ** 2 + (Y[1] – w * X[1]) ** 2 + (Y[2] – w * X[2]) ** 2 + (Y[3] – w * X[3]) ** 2)
Данная величина зависит от w: иначе говоря, это функция от w. Мы называем это функцией стоимости, и w – единственный регулируемый параметр этой функции. Чем меньше значение L(w), тем меньше средняя ошибка, тем точнее наше приближение. Следовательно, мы должны найти значение w, которое минимизирует эту функцию стоимости L(w) (см. рисунок 3.3).
Вместе с точками обучения p функция стоимости обозначается с использованием греческой буквы «сигма» для обозначения суммы членов для всех значений индекса i от 0 до p-1:
Эта формула включает квадрат w. Следовательно, это многочлен второй степени; другими словами, парабола.
Есть способ сделать это, он называется «стохастический градиентный спуск», или SGD (Stochastic Gradient Descent). Идея его состоит в том, чтобы взять точку обучения и немного скорректировать линию, чтобы она приблизилась к рассматриваемой точке. Затем следует перейти к следующей точке обучающего набора и провести небольшую корректировку, чтобы приблизиться и к этой новой точке. Корректировка должна быть такой же незначительной, как и ошибка. Другими словами, корректировка будет пропорциональна ошибке. Допустим, если мы возьмем пример № 3, корректировка для w будет следующей:
w = w + e * 2 * (Y[3] – w * X[3]) * X[3]
Рис. 3.3. Парабола, являющаяся графиком квадратичной функции стоимости
Когда функция стоимости представляет собой многочлен второй степени по отношению к w, она принимает форму параболы с единственным минимумом. Решение, то есть значение w, которое дает минимальное значение стоимости, обозначено на графике значком
Это не математическая формула, а обозначение, заимствованное из информатики: оно означает, что мы заменяем переменную w (слева от знака равенства) ее текущим значением (справа от знака равенства), суммированным с результатом выражения, расположенного справа от знака плюс.
Давайте рассмотрим эту формулу. Переменная e называется «шагом градиента». Она должна содержать небольшое положительное число, которое определит размер приращения w. Если число X[3] положительно, а линия находится ниже точки (X[3], Y[3]), то есть разница (Y[3] – w * X[3]) положительна, тогда необходимо увеличить значение w. Именно это и делает приведенная формула. И наоборот, если линия проходит над точкой, разница будет отрицательной и значение w будет уменьшаться. Скорость, с которой линия приближается к точке, уменьшается по мере приближения линии к точке, останавливаясь при прохождении через точку. Когда X[3] отрицательно, формула меняет знак приращения на противоположный: слишком маленький наклон приводит к положительной ошибке, и наоборот.
Повторяя примеры один за другим и каждый раз немного меняя наклон прямой, в конечном итоге мы стабилизируем прямую по отношению к значению w, которое минимизирует L(w), при условии постепенного уменьшения значения e. Этот метод, получивший название «стохастическая аппроксимация», был изобретен в 1951 г. американскими статистиками Гербертом Роббинсом и Саттоном Монро.
В скобках – для математиков
Обобщим метод стохастического градиентного спуска.
Обозначим через C(x, y, w) функцию стоимости для данного примера.
В нашем примере C(x, y, w) = (y – w * x) ** 2 для заданной точки (x, y), тогда обновление w в соответствии со стохастическим градиентным спуском будет следующим:
w = w – e * dC(x, y, w) / dw
где e – шаг градиента, а dC(x, y, w) / dw – производная (также называемая градиентом) C относительно w.
Производная от (y – w * x) ** 2 относительно w равна –2 * (y – w * x) * x, а формула обновления принимает следующий вид:
w = w + 2 * e * (y – w * x) * x
идентично тому, что мы видели выше. Это можно понять интуитивно: если наклон (производная) C(x, y, w) положительный, необходимо уменьшить w. Если наклон отрицательный, w необходимо увеличить. После нескольких итераций w в конечном итоге упадет до нижней части C(x, y, w). Мы хотим минимизировать L(w), который представляет собой среднее значение C(x, y, w) для всех точек:
Роббинс и Монро продемонстрировали, что процедура сходится к минимуму L(w), если ее применять многократно ко всем точкам, при условии, что е постепенно уменьшается.
Стохастический градиентный спуск на сегодняшний день является наиболее широко используемым методом обучения современных систем машинного обучения. Вот почему я счел полезным описать его здесь. Мы еще вернемся к нему, когда будем обсуждать перцептрон, Adaline и многослойные нейронные сети.
Но в нашем случае для того, чтобы заставить прямую пройти как можно ближе к набору точек, стохастический градиентный спуск оказывается медленным и бесполезным на практике методом. Параболическая функция стоимости может быть преобразована следующим образом:
Нам известно, что эта функция представляет собой многочлен второй степени относительно w, и теперь у нас есть коэффициенты. Минимум этого многочлена – это значение W, для которого его производная равна нулю:
Подведем итоги
Основные принципы любой машины, управляемой обучением с учителем, заключаются в следующем:
1. Собираем обучающий набор
A = {(X[0], Y[0]),…,(X[p-1], Y[p-1])}
2. Предлагаем модель, т. е. первую функцию f(x, w) с параметрами w. Их может быть очень много, миллионы. В этом случае мы называем их по отдельности w[0], w[1], w[2] … и вместе: w.
3. Предлагаем функцию стоимости C(x, y, w), которая измеряет ошибку для обучающего примера, например C(x, y, w) = (yf (x, w)) ** 2, а L(w) – его среднее значение по обучающей выборке.
4. Находим значение параметров функции f(x, w), которые минимизируют функцию стоимости L(w), обычно с помощью стохастического градиентного спуска:
w = w – e * dC(X[i], Y[i], w) / dw
Галилей и Пизанская башня
Функция f(x, w) может быть не только линейной. Скорость камня, падающего вертикально вниз, увеличивается пропорционально квадрату времени падения. Представьте себе, как Галилей поднимается на Пизанскую башню. Он останавливается на первом этаже. Он бросает вниз камешек и измеряет время, за которое камешек упадет на землю. Он поднимается еще на один этаж. Он снова бросает камень и измеряет время падения. Он повторяет этот опыт снова и снова, на каждом следующем этаже.
Существует закономерность, связывающая переменные x – время падения, и y – высоту падения камня.
Таким образом, зная время падения, можно вычислить высоту падения в зависимости от времени. Это квадратичная функция, график этой функции – парабола.
Формула, связывающая x (время падения) с y (высота падения): y = 0.5 * g * x ** 2, где g – ускорение свободного падения, или 9,81 м/с2. Благодаря своим наблюдениям Галилей смог установить этот закон, который позволяет, зная время падения предмета с высоты, вычислять высоту падения. И предсказать время падения в зависимости от высоты, приведя формулу к соответствующему виду.
Таким образом, Галилей заложил основы научного метода, который устанавливает законы, связывающие одну переменную с другой математической формулой. Иначе говоря, он выводил законы из наблюдений и предсказывал явления на основе этих законов.
В этом и состоит принцип машинного обучения.
Распознавание изображений или еще чего-нибудь
Принцип обнаружения основного правила также применим и к распознаванию изображений. Вход x – это изображение. Но изображение – это не более чем большой набор чисел. Например, черно-белая фотография размером 1000 × 1000 пикселей выражается в виде 1 млн чисел, каждое из которых указывает значение оттенка серого для каждого пикселя. Если это цветное изображение, каждый пиксель описывается уже не одним, а сразу тремя значениями, уровнями яркости трех основных цветов: красного, зеленого и синего.
Ответ машины y (распознавание изображений) можно выразить одним числом или серией чисел. Я предоставляю машине изображение кошки (x) и прошу ее ответить: «Это кошка» (y). Считаем, что y = 1 – кошка, а y = –1 – это не кошка. Фактически, мы просим функцию классифицировать изображения, представленные как входные данные, на две категории.
Таким же образом можно обучить автомобиль, оснащенный камерой, ездить самостоятельно. В этом случае дело обстоит немного сложнее, потому что вход x, который подается в систему, представляет собой изображение, которое включает в себя миллионы чисел, из которых нужно оценить положение автомобиля на дороге. Выход yp – это угол поворота рулевого колеса и показатели усилий на педалях. Если машина должна научиться отличать изображение автомобиля от изображения самолета, мы собираем тысячи изображений автомобилей и тысячи изображений самолетов. Вводим изображение автомобиля. Если машина дает правильный ответ, ничего не меняем. Если машина дает неверный ответ, необходимо настроить параметры системы так, чтобы ее ответ приблизился к правильному. Другими словами, нужно изменить настройки, чтобы минимизировать ошибку.
Все системы обучения с учителем работают по одному и тому же принципу, а именно:
Вход x. Это может быть изображение (таблица чисел в компьютерной программе); речевой сигнал (последовательность чисел на выходе аналого-цифрового преобразователя, преобразующего в цифровой вид аналоговый сигнал от микрофона); текст для перевода (также представленный серией чисел)… Ниже мы будем говорить об этом подробнее.
Желаемый выход у. Это идеальный желаемый результат для входа x.
Выход yp. Это ответ машины, который требуется (или не требуется) корректировать.
Фрэнк Розенблатт, Берни Уидроу и перцептрон
Давайте остановимся на самом простом типе машины, «линейном классификаторе», который мы рассмотрим на примере перцептрона.
Этот предок самообучающихся машин был разработан в 1957 г. американским психологом Фрэнком Розенблаттом в авиационной лаборатории Корнельского университета в Буффало (США). В те годы часть ученых в области ИИ исследовала феномен обучения, характерный для интеллекта человека и животных.
Изобретателя перцептрона вдохновили открытия в области нейробиологии своего времени. Затем психологи и биологи работали над тем, как работает мозг и как нейроны соединяются друг с другом. Они представили биологический нейрон как своего рода разветвленную звезду. Все ветви нейрона, кроме одной, образуют входы, или дендриты, которые соединяют этот нейрон с вышестоящими нейронами через контактную зону – синапс. Последняя ветвь, аксон, является единственным выходом для нижестоящих нейронов. Нейрон принимает электрические сигналы, излучаемые выше по потоку, обрабатывает их и передает, если необходимо, один сигнал ниже по потоку. Этот сигнал состоит из последовательности электрических импульсов, называемых потенциалами действия или «спайками» (от англ. spike – пик на графике), частота которых представляет собой интенсивность активности нейрона. Данная частота может быть выражена числом.
В 1943 г. два американских кибернетика и нейробиолога Уоррен Маккалок и Уолтер Питтс предложили очень упрощенную математическую модель биологического нейрона – чуть ли даже не его карикатуру, по мнению некоторых. Этот «искусственный нейрон» вычислял взвешенную сумму чисел, представляющих активность восходящих нейронов. Если эта сумма меньше определенного порога, нейрон становился неактивным. Если, наоборот, сумма выше порога, нейрон активировался и производил серию импульсов, распространяющихся вдоль его аксона в направлении нижестоящих нейронов. Частота импульсов также выражалась определенным числом.
В модели Маккаллока и Питтса выход являлся двоичным: активным или неактивным, т. е. +1 или –1. Каждый бинарный нейрон вычисляет взвешенную сумму выходов вышестоящих нейронов, с которыми он связан. Он дает на выходе +1, если сумма больше порогового значения, и –1 в противоположном случае. В нашем примере данный порог равен 0.
Это выражается следующей формулой:
s = w[0] * x[0] + w[1] * x[1], …, w[n-1] * x[n-1]
где s – взвешенная сумма, x[0], x[1], x[2],…, x[n-1] – входы, а w[0], w[1], w[2],…, w[n-1] – веса, то есть коэффициенты, входящие в взвешенную сумму. Такой набор из n чисел называется «n-мерным вектором». В векторе пронумеровано каждое число. В системе математических обозначений мы запишем эту формулу более компактно:
Такая операция между векторами называется скалярным произведением. На компьютере мы можем написать программу (на языке Python), которая выполняет следующие вычисления:
def dot(w, x):
s = 0
for i in range (len(w)):
s = s + w[i] * x[i]
return s
Данный код определяет функцию dot(w, x), аргументы которой – два вектора w и x. Функция вычисляет скалярное произведение между w и x и возвращает результат. Оператор for – это цикл, который накапливает в переменной s сумму произведений членов w и x; число итераций цикла равно размерности w и получено с помощью len(w). Последний оператор возвращает значение s вызывающей программе.
w = [–2, 3, 4]
x = [1, 0, 1]
s = dot(w, x)
Который поместит число 2 в переменную s, то есть результат будет выглядеть так:
– 2 * 1 + 3 * 0 + 4 * 1 = 2.
Поскольку порог равен 0, выход нейрона будет равен +1, если s строго больше 0, и –1, если s меньше 0 или равно 0. Небольшая программа в Python может это вычислить:
def sign(s):
if s > 0: return +1
else: return –1
def neurone(w, x):
s = dot(w, x)
return sign(s)
Функция sign, определенная выше, возвращает +1, если ее аргумент s больше 0, и –1 в противном случае.
Согласно Маккалоку и Питтсу, их бинарные нейроны выполняют логические вычисления, а мозг можно рассматривать как машину логического вывода[41]41
Warren S. McCulloch, Walter Pitts. A logical calculus of the ideas immanent in nervous activity, The Bulletin of Mathematical Biophysics, 1943, 5 (4), p. 115–133.
[Закрыть].
Эта гипотеза вдохновила психолога Фрэнка Розенблатта. Его перцептрон использовал бинарные пороговые нейроны Маккаллока и Питтса. Он основан на принципе передачи сигнала нейрону, который вычисляет взвешенную сумму своих входов и активируется, когда эта сумма больше 0. Но Розенблатт пошел дальше в копировании биологического нейрона. Воодушевленный идеей, что обучение изменяет синаптическую эффективность в мозге, он разработал процедуру, которая позволяет машине адаптироваться путем исправления ошибок посредством изменения весов, составляющих взвешенную сумму. Последняя мысль восходит еще к работе испанского нейроанатома Сантьяго Рамона-и-Кахала, опубликованной в конце XIX в.
Розенблатт также читал работы канадского психолога Дональда Хебба, который в 1949 г. в своей книге «Организация поведения»[42]42
Donald Olding Hebb, The Organization of Behavior: A Neuropsychological Theory, Wiley, 1949.
[Закрыть] предложил идею о том, что синапс, соединяющий два нейрона, усиливается, когда эти два нейрона активируются одновременно. Гипотеза была подтверждена в 1960-х гг., а в 1970-х Эрик Кандел, изучая ставшую знаменитой аплизию, объяснил биохимические механизмы адаптации нейронов.
Перцептрон в своей простейшей форме представляет собой нейрон Маккаллока и Питтса, который обучается посредством изменения своего веса. На этапе обучения оператор показывает машине, например, изображение буквы C, и указывает ожидаемый выход: +1 для буквы C (и –1 для другой буквы). Затем машина регулирует веса входов так, чтобы ее выход приблизительно соответствовал ожидаемому. Эту процедуру необходимо было повторить с несколькими изображениями буквы C и других букв. Путем регулировки весовая конфигурация становится способной распознавать любую (или почти любую) букву C.
Чтобы убедиться в том, что машина обучена должным образом, мы тестируем ее, показывая ей изображения буквы C и изображения других букв, которые она не видела во время обучения. Если распознавание работает, то можно считать, что машина обучена и готова к практическому применению.
В 1957 г. в Буффало машина Фрэнка Розенблатта выглядела как большой металлический шкаф, из которого во все стороны торчали провода. У него была своего рода искусственная сетчатка, сеть фотоэлементов, которые принимали входное изображение, и сотни автоматизированных приводов, немного похожих на ручки регулировки громкости на усилителе, управлявших показателями весов. Каждый привод представлял собой переменный резистор, подключенный к небольшому электродвигателю. Электронная схема вычисляла взвешенную сумму напряжения входов на сетчатке, задаваемую переменными резисторами. Если эта взвешенная сумма превышала пороговое значение, загорался выходной индикатор. Если сумма не превышала пороговое значение, индикатор не загорался.
Новизна перцептрона заключалась именно в его способности к самообучению: он автоматически регулировал свои веса после демонстрации каждого нового изображения, приводя их в соответствие с желаемым выходом. На самом деле, идея корректировки параметров модели на основе данных существовала на протяжении многих веков. Инновация Розенблатта заключалась в применении этой идеи для машинного распознавания образов.
Правообладателям!
Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.Читателям!
Оплатили, но не знаете что делать дальше?