Основные понятия глубокой нейронной сети
Прежде чем изучать принципы обучения модели машинного обучения глубокой нейронной сети (DNN), остановимся на том, чего мы пытаемся достичь. Машинное обучение связано с прогнозированием метки на основе некоторых признаков конкретного наблюдения. Проще говоря, модель машинного обучения — это функция, которая вычисляет y (метку) из x (признаков): f(x)=y.
Простой пример классификации
Предположим, что наблюдение состоит из некоторых измерений пингвина.
В частности, это следующие измерения:
- длина клюва пингвина;
- высота клюва пингвина;
- длина ласты пингвина;
- вес пингвина.
В этом случае признаки (x) являются вектором четырех значений или в математическом выражении — x=[x1,x2,x3,x4].
Предположим, что метка, которую мы пытаемся предсказать (y), является видами пингвинов и что существует три возможных вида, которые могут применяться к метке.
- Adelie
- Папуанский
- Антарктический
Это пример проблемы классификации, когда модель машинного обучения должна прогнозировать наиболее вероятный класс, к которому относится наблюдение. Модель классификации делает это путем прогнозирования метки, состоящей из вероятности для каждого класса. Другими словами, y является вектором трех значений вероятности, по одному для каждого возможного класса: y=[P(0),P(1),P(2)].
Обучение модели машинного обучения происходит с помощью наблюдений, для которых уже известна правильная метка. Например, у вас могут быть следующие измерения признаков для вида Adelie:
x=[37,3, 16,8, 19,2, 30.0]
Вы уже знаете, что это пример Adelie (класс 0), поэтому результатом выполнения идеальной функции классификации должна быть метка, которая означает 100 % вероятность для класса 0 и нулевую вероятность для классов 1 и 2.
y=[1, 0, 0]
Модель глубокой нейронной сети
Так как же мы будем использовать глубокое обучение для создания модели классификации пингвинов? Рассмотрим пример:
Модель глубокой нейронной сети для классификатора состоит из нескольких слоев искусственных нейронов. В нашем случае существует четыре слоя:
- входной слой с нейроном для каждого ожидаемого входного значения (x);
- два так называемых скрытых слоя, каждый из которых содержит пять нейронов;
- выходной слой с тремя нейронами — по одному для каждого значения вероятности класса (y), прогнозируемого моделью.
Из-за многослойной архитектуры сети такой тип модели иногда называют многослойным перцептроном. Кроме того, обратите внимание, что все нейроны во входном и скрытом слоях связаны со всеми нейронам в последующих слоях. Это пример полносвязной сети.
При создании подобной модели необходимо определить входной слой, поддерживающий ряд признаков, которые будет обрабатывать модель, и выходной слой, отражающий количество выходных данных, которые он должен создать. Можно выбрать, сколько скрытых слоев нужно включить, и сколько нейронов будет в каждом из них. Однако контролировать входные и выходные значения для этих слоев невозможно, так как они определяются процессом обучения модели.
Обучение глубокой нейронной сети
Процесс обучения для глубокой нейронной сети состоит из нескольких итераций, называемых эпохами. В первой эпохе случайные значений инициализации присваиваются значениям веса (w) и смещения b. Затем выполняются следующие действия.
- Признаки для наблюдений за данными с известными значениями меток передаются во входной слой. Как правило, эти наблюдения группируются в пакеты (часто называемые мини-пакетами).
- Затем нейроны применяют свою функцию и в случае активации передают результат в следующий слой до тех пор, пока выходной слой не выдаст прогноз.
- Прогноз сравнивается с фактическим известным значением, после чего вычисляется величина дисперсии между прогнозируемым и истинным значениями (которая называется потерей).
- В зависимости от результатов в целях сокращения потерь вычисляются измененные значения для веса и смещения, и эти корректировки распространяются обратно к нейронам в сетевых слоях.
- Следующая эпоха повторяет прямую передачу пакетного обучения с измененными значениями веса и смещения, повышая точность модели (уменьшая потери).
Примечание.
Обработка обучающих признаков в пакетном режиме повышает эффективность процесса обучения за счет одновременной обработки нескольких наблюдений в виде матрицы признаков с векторами весов и смещений. Линейные алгебраические функции, работающие с матрицами и векторами, также используются в обработке трехмерной графики, поэтому компьютеры с графическими процессорами (GPU) обеспечивают значительно более высокую производительность для обучения моделей глубокого обучения, чем компьютеры, имеющие только центральные процессоры (CPU).
Более подробные сведения о функциях потерь и обратном распространении
В предыдущем описании процесса глубокого обучения упоминалось, что потери из модели вычисляются и используются для корректировки значений веса и смещения. Как именно это работает?
Вычисление потерь
Предположим, что один из примеров, прошедший процесс обучения, содержит признаки вида Adelie (класс 0). Правильные выходные данные из сети должны иметь следующий вид: [1, 0, 0]. Теперь предположим, что выходные данные, созданные сетью, имеют следующий вид: [0,4, 0,3, 0,3]. Сравнивая их, для каждого элемента можно вычислить абсолютную дисперсию (иными словами, насколько отличается прогнозируемое значение от ожидаемого) как [0,6, 0,3, 0,3].
В действительности, так как мы имеем дело с несколькими наблюдениями, мы обычно агрегируем дисперсию (например, путем возведения в квадрат отдельных значений дисперсии и вычисления среднего значения) и в результате получаем одно среднее значение потерь, такое как 0,18.
Оптимизаторы
А теперь самое интересное. Потери вычисляются с помощью функции, которая работает с результатами последнего слоя сети, который также является функцией. Последний слой сети работает с выходными данными из предыдущих слоев, которые также являются функциями. Таким образом, вся модель, начиная от входного слоя и заканчивая вычислением потерь, является одной большой вложенной функцией. Функции имеют несколько действительно полезных характеристик, в число которых входят следующие:
- возможность концептуализации функции в виде графика для сравнения ее выходных данных с каждой из ее переменных;
- возможность использования дифференциального исчисления для вычисления производной от функции в любой точке относительно ее переменных.
Рассмотрим первую из этих возможностей. Построим линию функции, чтобы показать сравнение отдельного значения веса с потерями, и отметим на этой линии точку, где текущее значение веса совпадает с текущим значением потерь.
Теперь применим вторую характеристику функции. Производная от функции для заданной точки указывает, увеличивается или уменьшается наклон (или уклон) выходного значения функции (в данном случае это потери) по отношению к переменной функции (в данном случае это значение веса). Положительная производная означает, что функция растет, а отрицательная производная означает, что она снижается. В нашем случае в изображенной точке для текущего значения веса у функции есть уклон вниз. Другими словами, увеличение значения веса приведет к снижению показателя потерь.
Оптимизатор позволяет использовать такой же прием для всех переменных веса и смещения в модели и определить, в каком направлении их нужно скорректировать (вверх или вниз), чтобы уменьшить общий объем потерь в модели. Существует несколько часто используемых алгоритмов оптимизации, включая стохастический градиентный спуск (SGD), адаптивную скорость обучения (ADADELTA), адаптивную оценку моментов (ADAM) и т. д. Все они предназначены для того, чтобы понять, как откорректировать значения весов и смещений для уменьшения потерь.
Скорость обучения
Возникает следующий очевидный вопрос: насколько оптимизатор должен корректировать значения весов и смещений? Если взглянуть на график для значения веса, можно увидеть, что при незначительном увеличении веса строка функции идет вниз (потери уменьшаются), но при его значительном увеличении строка функции начнет снова подниматься, поэтому фактически идет увеличение потерь, и после следующей эпохи может потребоваться уменьшить значение веса.
Размер корректировки определяется задаваемым для обучения параметром, который называется скоростью обучения. Низкая скорость обучения влечет за собой незначительные корректировки (поэтому для снижения потерь данных может потребоваться больше эпох), в то время как высокая скорость обучения приводит к значительным корректировкам (поэтому минимальных значений может не быть вообще).