Как учится машина. Революция в области нейронных сетей и глубокого обучения - Ян Лекун
Данный принцип применим не только к простым моделям, таким как перцептрон, в которых обучается лишь последний слой, но и почти ко всем контролируемым методам обучения, в частности к многослойным нейронным сетям с непрерывным обучением, о которых мы поговорим в следующей главе.
Таким образом, обучение путем минимизации функции стоимости является ключевым элементом функционирования искусственного интеллекта.
Функция стоимости
Повторим еще раз: обучение – это настройка алгоритма, то есть постепенное уменьшение количества ошибок, которые делает система. Она пытается, она ошибается, она корректирует себя. Каждая перенастройка параметров перезаписывает предыдущие значения этих параметров. Для любого обучающего примера, например, изображения x, связанного с выходом y, ошибка представляет собой простое число, которое измеряет расстояние между выходом, произведенным машиной yp = f (x, w), и желаемым выходом y. Для справки, w – это вектор параметров. Для каждого обучающего примера или каждой пары (x, y) ошибка измеряется функцией стоимости C (x, y, w). Один из способов выразить эту стоимость – возвести в квадрат разницу между выходом, произведенным системой, и желаемым выходом y:
c = (y – f(x, w)) ** 2
Есть много типов функций стоимости. Предыдущая формула применима, если машина имеет только один выход, то есть если yp и y – это просто числа.
Если нам нужна система, которая может расклассифицировать изображения на собак, кошек и птиц, нам нужно три выхода. Затем выход выражается в виде вектора, а не числа. Каждый из этих выходов дает оценку по каждой из трех категорий. Например, если первый результат соответствует категории «собака», второй – «кошка», а третий – «птица», вектор выхода со значениями [0.4, 0.9, 0.2] означает, что система распознала кошку, так как категория «кошка» получила наивысшую оценку. Во время обучения желаемый выход для категории собак будет [1, 0, 0], для кошки [0, 1, 0] и для птицы [0, 0, 1].
Рис. 4.1. Классификатор с тремя категориями
Машина выдает три оценки – по одной для каждой категории – в виде трехмерного вектора. В данном примере машина создает вектор оценок [0.4, 0.9, 0.2] и поэтому классифицирует изображение как «кошка», однако желаемый (оптимальный) результат для категории «кошка» – вектор [0, 1, 0].
Стоимость должна измерять расстояние между произведенным и желаемым выходами, например, сумму квадратов ошибок для трех выходов:
yp = f(x, w) # yp – это трехмерный вектор
c = (y[0] – yp[0]) ** 2 + (y[1] – yp[1])** 2 + (y[2] – yp[2]) ** 2
На практике для многоклассовой классификации модель часто строится таким образом, чтобы получить оценки, которые могут быть сопоставимы с вероятностями (оценки от 0 до 1, и сумма которых равна 1), и используется другая функция стоимости, называемая «перекрестной энтропией», которая подталкивает выход желаемой категории к 1, а остальные – к 0. Но принцип остается прежним.
Данную функцию стоимости C(x, y, w) можно вычислить с помощью небольшой функции в Python[46], например:
# функция расчета стоимости для примера
# x: вектор входа
# y: вектор желаемого выхода
# w: вектор параметров
def C(x, y, w):
yp = f(x, w) # вычислить выход
c = 0 # задать начальную стоимость
for j in range (len(y)): # выходной цикл
c = c + (y[j] – yp[j]) ** 2 # накопить стоимость
return c # возврат результирующей стоимости
Поскольку набор обучения с примерами p является вектором X (каждый элемент которого сам по себе является вектором входа):
[X[0], X[1], X[2],…, X[p-1]]
а вектор Y (каждый элемент которого сам по себе является желаемым вектором выхода)
[Y[0], Y[1], Y[2],…, Y[p-1]]
то к такой функции можно обратиться для расчета стоимости любого обучающего примера (в данном случае под номером 3):
c = C(X[3], Y[3], w)
Необходимо рассчитать стоимость обучения, которая является средним значением данной функции стоимости по обучающей выборке:
L(X, Y, w)=1/p*(C(X[0], Y[0], w)+C(X[1], Y[1], w)+…C(X[p-1], Y[p-1], w))
Опять же, мы можем написать для этого небольшую программу:
# функция расчета средней стоимости на наборе примеров
# X: таблица записей набора данных
# Y: массив желаемых выходов
# w: вектор параметров
def L(X, Y, w):
p = len(X) # p – количество примеров
s = 0 # переменная для накопления суммы стоимости
for i in range (p) # цикл примеров
s = s + C(X[i], Y[i], w) # накопить стоимость
return s/p # вернуть среднюю стоимость
Можно рассчитать стоимость обучения по множеству х, у, записав:
cout = L(X, Y, w)
В этой функции цикл for проходит через все обучающие примеры и накапливает (суммирует) стоимость каждого примера в переменной s. В конце функция возвращает накопленную сумму, деленную на количество примеров p. Значение, вычисляемое этой программой, зависит от вектора параметров w через функцию C(x, y, w), которая сама по себе зависит от f(х, w), которая сама по себе зависит от w.
Процедура обучения будет пытаться минимизировать данную стоимость, регулируя параметры системы w, то есть находя значение w, которое дает наименьшее возможное значение L. Для данного набора примеров обучения каждая конфигурация параметров w соответствует значению стоимости обучения.
Современные обучаемые системы обладают миллионами, если не миллиардами регулируемых параметров. Другими словами, вектор w может иметь несколько миллионов или миллиардов компонентов. В общем – скромные цифры… по сравнению с количеством синапсов в человеческом мозгу.
Как спуститься на дно долины
Как найти минимум функции стоимости? Для простоты представим себе машину, имеющую только два обучаемых параметра: w[0] и w[1]. Для данного обучающего набора каждая точка координат (w[0], w[1]) соответствует значению стоимости.
Изначально веса устанавливаются произвольно. До начала обучения стоимость, вероятно, будет высокой. Сеть скорректирует свои параметры, чтобы снизить стоимость.
Учитывая сохраненный обучающий набор[47] в X и Y, мы можем поместить значения 6.0 в w[0] и 5.0 в w[1] и рассчитать соответствующую стоимость обучения следующим образом:
w[0] = 6.0
w[1] = 5.0
стоимость = L (X, Y, w)