Часть II • Введение в TensorFlow.js
К сожалению, пока не существует однозначного алгоритма выбора наилучших ги
перпараметров для заданного набора данных и задачи машинного обучения. Слож
ность в том, что многие гиперпараметры дискретны, а значит, величина потерь на
проверочном наборе данных недифференцируема по ним. Например, количество
нейронов плотного слоя и количество плотных слоев модели — целые числа; тип
оптимизатора — дискретный параметр. Отслеживать во время обучения градиен
ты даже непрерывных гиперпараметров, относительно которых величина потерь
на проверочном наборе данных дифференцируема (например, коэффициентов
регуляризации), обычно слишком затратно с вычислительной точки зрения, по
этому производить градиентный спуск в пространстве подобных гиперпараметров
на практике обычно не имеет смысла. Оптимизация гиперпараметров остается
областью активных исследований, важной для всех практикующих глубокое
обучение.
Поскольку стандартной готовой методики/инструмента оптимизации гиперпа
раметров не существует, специалисты, занимающиеся практическим применением
глубокого обучения, используют три подхода. Вопервых, если решаемая задача
похожа на другую, хорошо изученную (например, на один из приведенных в данной
книге примеров), можно применить к своей задаче эту аналогичную модель, после
чего воспользоваться ее гиперпараметрами. А затем достаточно будет производить
поиск в относительно небольшом пространстве гиперпараметров возле этой стар
товой точки.
Вовторых, у специалистов с достаточным практическим опытом обычно уже
выработано чутье, они способны выдвигать для конкретной задачи обоснованные
варианты хороших гиперпараметров модели. И хотя подобный субъективный ва
риант редко оказывается оптимальным, он служит неплохой отправной точкой для
дальнейшего более точного подбора.
Втретьих, в случаях, когда число оптимизируемых гиперпараметров невелико
(например, меньше четырех), можно воспользоваться поиском по сетке, то есть
перебрать все возможные сочетания гиперпараметров, полностью обучить модель
для каждого из них, фиксируя потери на проверочном наборе данных, и выбрать со
четание с минимальными потерями. Например, пусть необходимо найти значения
только двух гиперпараметров: 1) количество нейронов в плотном слое и 2) скорость
обучения. Можно взять множество значений количества нейронов (
{10,
20,
50,
100,
200}
) и множество скоростей обучения (
{1e-5,
1e-4,
1e-3,
1e-2}
). Произведение
этих двух множеств дает
5
*
4
=
20
сочетаний гиперпараметров. Если вы захотите
реализовать поиск по сетке самостоятельно, то псевдокод вашей реализации будет
выглядеть примерно так, как показано в листинге 3.4.
Листинг 3.4.
Псевдокод для простого поиска гиперпараметров по сетке
function hyperparameterGridSearch():
for units of [10, 20, 50, 100, 200]:
for learningRate of [1e-5, 1e-4, 1e-3, 1e-2]:
Создать модель, плотный слой которой состоит из `units` нейронов
Обучить эту модель при оптимизаторе с `learningRate`
Do'stlaringiz bilan baham: |