[БЕЗ_ЗВУКА] Мы продолжаем изучение нейронных сетей и сейчас рассмотрим один из самых известных способов обучения многослойных сетей — это метод обратного распространения ошибки. Будем рассматривать двухслойную сеть. Это означает, что на входе сети мы имеем n значений признаков, будем считать, что все признаки у нас вещественные. Дальше эти признаки подаются на вход нейронов скрытого слоя. Он называется скрытым, потому что он находится между слоем входных значений и выходным слоем. Будем считать, что число нейронов скрытого слоя — это H, у каждого нейрона скрытого слоя в общем случае может быть своя функция активации, которую мы обозначаем σ(h). Дальше выходы нейронов скрытого слоя можно понимать как признаки или входы для нейронов следующего слоя. Для нас в двухслойной сети сейчас следующий слой он же будет и выходным, но в общем случае таких слоев можно поставить сколько угодно. И вот для того чтобы поддержать эту общность, мы будем сейчас рассматривать многомерный выход на втором слое. Ну, это даже имеет некоторые практические приложения, например, если нам нужно прогнозировать сразу много временных рядов, то мы можем строить вот такую двухслойную сеть, у которой будет число выходов равно числу рядов, для которых нужно одновременно спрогнозировать значения. Итак, мы имеем вот такую вот суперпозицию, которая непосредственно записана на слайде, и кажется, что это достаточно сложная функция, потому что в ней есть нелинейная в общем случае функция активации. Под ними находятся те самые весовые коэффициенты w, которые нам нужно оптимизировать. И нам нужно ставить оптимизационную задачу нахождения вот этих весовых коэффициентов по информации из обучающей выборки. Подчеркну, что очень важно, чтобы функции активации были нелинейными, потому что суперпозиция линейных функций снова окажется линейной, и мы не получим эффекта, того ожидаемого эффекта от нейронной сети, потому что, по сути, это останется линейная модель классификации или регрессии. Еще отмечу, что мы можем единообразно сейчас рассматривать задачи регрессии и классификации. Все зависит от того, какую функцию потерь мы выберем. Итак, давайте рассмотрим вот эту сложную задачу. Мы ее будем решать с помощью метода стохастического градиента, который мы с вами уже ранее рассмотрели на более простом случае линейных моделей регрессии и классификации. Итак, если у нас имеется функционал, который представляет себе сумму по всем объектам выборки функции потерь, то процесс заключается в том, что мы после некоторой инициализации начинаем в случайном порядке выбирать объекты обучающей выборки, вычисляем функцию потерь на выбранном объекте и делаем градиентный шаг. То есть нам важно, чтобы весь вот этот вот функционал Q мы могли продифференцировать по параментам модели. Ну а параметрами модели в случае двухслойной нейронной сети является вся совокупность параметров. Можно посчитать сколько их, и, в общем-то, это достаточно много. H — это число нейронов скрытого слоя умножить на сумму числа входных признаков и числа выходов нейронной сети +1. Как же решать эту задачу? Самое нетривиальное в ней — это каким образом вычислить градиент функции потери по всей совокупности весовых коэффициентов. И казалось бы, эта задача очень должна быть вычислительно сложной, потому что если представить себе функцию от многих переменных, от, скажем, k переменных, то обычно градиент — это вектор размерности k, если мы имеем некую сложность вычисления данной функции, то сложность вычисления градиента, казалось бы, должна быть в k раз больше. Ну вот метод обратного распространения ошибки основан на таком интересном приеме дифференцирования, который приводит к очень эффективному вычислению градиента суперпозиции, и оказывается, что градиент мы можем вычислять за число операций, сопоставимых с вычислением самой функции. То есть с однократным прогоном объекта через нейронную сеть в получении выходов по входам. Итак, как происходит это чудо? Давайте рассмотрим нашу двухслойную суперпозицию, обозначив через значения, которые появляются на нейронах скрытого слоя. То есть h-тый нейрон скрытого слоя на выходе дает значение на объекте xi-том. Ну вот тогда у нас как бы запись суперпозиции разрывается на две очень похожие функции, каждая из которых представляет собой линейную модель с нелинейной функцией активации, и далее мы будем рассматривать задачу минимизации суммарной потери на объектах обучающей выборки. Но поскольку у нас метод стохастического градиента, мы берем один отдельный i-тый объект и берем квадратичную функцию потерь просто для простоты, могли бы рассмотреть и любую другую. Но нам будет проще сейчас проиллюстрировать метод обратного распространения ошибки именно для этого случая. Суммирование производится здесь по выходам второго выходного слоя. То есть какова у нас размерность вектора a, столько у нас слагаемых вот в этой функции потерь. Итак, давайте решим промежуточную задачу, найдем частные производные функции потерь для i-того объекта по выходу, по значению на выходе нейрона выходного слоя и нейрона промежуточного скрытого слоя. Ну, казалось бы, это нетривиальный ход. Не понятно, почему именно эти частные производные надо считать в первую очередь, но сейчас будет понятно почему. Итак, частые производные по выходным значениям сети вычисляются очень просто — это, оказывается, ошибка на m-том выходе и i-том объекте, то есть разность правильного значения yi-тое m-тая размерность и того значения, которое предсказывает нам выходной нейрон. Итак, это ошибка на выходном слое. Теперь если продифференцировать функцию потерь по выходному значению на скрытом слое, ну буквально в одну строку делается эта операция, и вот это вот выражение давайте чисто формально тоже будем называть ошибкой на скрытом слое. Но если посмотреть на то, как вычисляется это выражение, можно заметить, что это очень похоже на то, как будто мы пропускаем значение ошибок выходного слоя через скрытый слой задом наперед, то есть в обратном направлении. И отсюда название метода: метод обратного распространения ошибки. После того, как объект 1 раз прошел через сеть слева направо, мы его еще раз пропускаем справа налево через скрытый слой. Оказывается, что вот эта вот хитрость с сохранением промежуточных величин ошибок на скрытом слое позволяет очень эффективно вычислять градиент функции потерь по весовым коэффициентам в первом и втором слоях. Если мы теперь выпишем частные производные функции потерь по весам в нейронах и применим правила вычисления частных производных, то окажется, что это очень простая величина. Она вычисляется через вот эти самые ошибки εm и εh. Еще в этой формуле фигурирует производная функции активации, причем аргумент этой функции активации я здесь для краткости записи не написал, но это на самом деле ровно то значение, при котором вычислялась сама функция активации при прямом проходе объекта через нейронную сеть. Все, мы имеем выражение для градиента функции потерь по параметрам модели, по весовым коэффициентами и на первом слое, и на втором. Давайте теперь соберем все это вместе в метод стохастического градиента и поймем, какие вычисления здесь надо делать и насколько они затратны по времени. Итак, алгоритм обучения нейронной сети двухслойной по обучающей выборке на входе принимает обучающую выборку, каждый объект — это вектор из Rn, а каждый ответ — это вектор из RM. То есть мы одновременно прогнозируем M величин. Ну и будут какие-то параметры, смысл которых мы поймем по ходу. Вот он алгоритм. Для начала мы должны инициализировать веса, и то, как это сделать, мы рассмотрим чуточку позже. Затем, повторяя логику работы метода стохастического градиента, мы выбираем, ну например, случайным образом, объект обучающей выборки и делаем прямой ход. Прямой ход — это не что иное, как вычисление... выходов нейронной сети по входам. В общем-то тривиальная операция, нужно вычислить ту самую суперпозицию функции, которая с самого начала была записана, ничего сложного. На выходе мы получим некие ошибки, εi. Это разности между правильным значением yi, и тем значением, которое на i-том объекте предсказало сеть, ai. И если мы просуммируем квадрат этих ошибок, то получим значение функции потерь при текущем значении параметров модели. На этом прямой ход закончен. Теперь обратный ход. Просто применяем ту формулу для εh, которую мы вывели, и которую мы и назвали обратным ходом, из-за того, что она похожа на пропускание ошибок выходного слоя через скрытый промежуточный слой в обратном направлении. Итак, мы вычислили все величины, которые нам нужны, чтобы сделать градиентный шаг. И теперь градиентный шаг делается по тем самым формулам, которые мы вывели с помощью частных производных по правилу дифференцирования суперпозиции функции. Ну и последнее, то, что осталось от метода стохастического градиента, нам нужно каким-то образом усреднить по последним итерациям текущее значение функционала качества, чтобы понять, когда оно стабилизируется, и когда нужно прекратить процесс. Здесь используется та же самая формула экспоненциального скользящего среднего, которое мы с вами подробно рассмотрели и разобрали, когда говорили про метод стохастического градиента для линейных моделей. Итак, вот такой вот он метод обратного распространения ошибки. Он имеет несомненное преимущество в том, что он очень быстро вычисляет градиент. Это самый быстрый способ вычисления градиента. Это происходит за счет правильного сохранения промежуточных результатов вычислений. Метод легко обобщается на произвольные функции потерь и произвольные функции активации. И исследователь, который с помощью многослойной нейронной сети пытается решить ту или иную задачу машинного обучения, вправе сам выбирать эти функции. Что очень важно понимать, что как и в любых методах стохастического градиента мы можем обучаться потоково. То есть когда на нас идет поток объектов, и мы каждый объект по очереди рассматриваем и по нему обновляем вектор весов. Поэтому можно решать задачи на сверх больших выборках и надеяться, что даже еще не увидев всю выборку целиком, мы получим более-менее сносно работающую модель. Ну и возможность распараллеливания, потому что можно одновременно настраивать все нейроны скрытого слоя. Сколько у нас нейронов в скрытом слое, столько можно сделать параллельных потоков. Но, однако, недостатки этого метода тоже есть, они являются обратной стороной достоинств. Так же, как и в методах стохастического градиента, возможна медленная сходимость, надо очень внимательно следить за начальным приближением, за застреванием в локальных минимумах. Еще появляются специфические проблемы, так называемый паралич сети, который возникает, когда мы используем функции активации с горизонтальными асимптотами. В таком случае, если у нас, например, из-за переобучения, мультиколлинеарности, коэффициенты, веса w стали очень большими и попали на горизонтальные участки функции активации, то производная будет почти равна нулю, и мы не сможем из этой мертвой зоны выбраться обратно. Поэтому не рекомендуют использовать функцию активации с горизонтальными асимптотами. Ну и наконец проблемы выбора структуры сети. Сколько слоев, сколько нейронов в каждом слое. Эти проблемы мы с вами обсудим в следующей лекции. [ЗАСТАВКА]