Настройка глубокой сети

Материал из Викиконспекты
Версия от 09:12, 11 января 2019; Ventosa (обсуждение | вклад) (Способы настройки параметров)
Перейти к: навигация, поиск

Как и многие алгоритмы машинного обучения, глубокие сети имеют множество гиперпараметров, которые должны быть заданы до начала обучения.

Инициализация сети

Принцип выбора начальных значений весов для слоев, составляющих модель очень важен: установка всех весов в 0 будет серьезным препятствием для обучения, так как ни один из весов изначально не будет активен. Присваивать весам значения из интервала ±1 — тоже обычно не лучший вариант — на самом деле, иногда (в зависимости от задачи и сложности модели) от правильной инициализации модели может зависеть, достигнет она высочайшей производительности или вообще не будет сходиться. Даже если задача не предполагает такой крайности, удачно выбранный способ инициализации весов может значительно влиять на способность модели к обучению, так как он предустанавливает параметры модели с учетом функции потерь.[1]

Метод инициализации Завьера (Xavier) (иногда — метод Glorot’а)[2]. Основная идея этого метода — упростить прохождение сигнала через слой во время как прямого, так и обратного распространения ошибки для линейной функции активации (этот метод также хорошо работает для сигмоидной функции, так как участок, где она ненасыщена, также имеет линейный характер). При вычислении весов этот метод опирается на вероятностное распределение (равномерное или нормальное) с дисперсией, равной [math]\mathrm{Var}(W) = {2 \over{n_{in} + n_{out}}}[/math], где [math]n_{in}[/math] и [math]n_{out}[/math] — количества нейронов в предыдущем и последующем слоях соответственно.

Метод инициализации Ге (He) — это вариация метода Завьера, больше подходящая функции активации ReLU, компенсирующая тот факт, что эта функция возвращает нуль для половины области определения. А именно, в этом случае [math]\mathrm{Var}(W) = {2 \over{n_{in}}}[/math][3].


Граф вычислений

Глубокие сети являются особенной формой графа вычиcлений.

Рис.1. Граф вычислений для функции [math]f(a,b)=(a+b)*(b+1)[/math]

Граф вычислений - это ориентированный граф, узлы которого соответствуют операциям или переменным. Переменные могут передавать свое значение в операции, а операции могут передавать свои результаты в другие операции. Таким образом, каждый узел в графе определяет функцию переменных.

Значения, которые вводятся в узлы и выходят из узлов, называются тензорами (т.е. многомерными массивами). Forward pass - то есть мы последовательно передаем информацию от входных нейронов к выходным. После чего мы вычисляем ошибку и основываясь на ней делаем обратную передачу, которая заключается в том, чтобы последовательно менять веса нейронной сети, начиная с весов выходного нейрона. Значение весов будут меняться в ту сторону, которая даст нам наилучший результат.

Рис.2. Граф вычислений для функции [math]f(x,y,z)=(x+y)*z[/math]. Зелёные цифры - значения вычислений по ходу выполнения операций графа, красные - значения производной выходной функции по текущей переменной в точке [math](x_0=-2, y_0=5, z_0=-4)[/math]

Преимуществом такого представления функции является простота вычисления производных. Используя следующие правила вычисления частных производных: [math]q=x+y:\frac{\partial q}{\partial x}=1, \frac{\partial q}{\partial y}=1;[/math] [math]q=xy:\frac{\partial q}{\partial x}=y, \frac{\partial q}{\partial y}=x;[/math] [math]\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y}[/math]. Подсчёт производных по графу вычислений производим от значения функции к значениям независимых переменных-входов

  1. [math]\frac{\partial f}{\partial f} = 1[/math]
  2. [math]\frac{\partial f}{\partial q} = z_0 = -4[/math], [math]\frac{\partial f}{\partial z} = q_0 = 3[/math]
  3. [math]\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial x} = -4[/math], [math]\frac{\partial f}{\partial y} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial y} = -4[/math]

Зная производные, можно искать параметры [math]w[/math] с помощью градиентного спуска сдвигаемся в сторону градиента (при максимизации) или обратную ему (при минимизации) [math]w:=w-\eta\nabla_w f[/math], или его модификаций [4].

Способы настройки параметров

Ниже представлены различные вариации градиентного спуска, более подробное сравнение, применительно к данной задаче [5].

  • Стохастический градиентный спуск [6]: [math]w^{(0)}[/math] - начальные весы сети, [math]w^{(k+1)}=w^{(k)}-\mu\frac{\partial L(w^{(k)})}{\partial w}[/math];
  • Momentum [7]: [math] \Delta w:=\alpha \Delta w-\eta \nabla Q_{i}(w)[/math], [math] w:=w+\Delta w[/math] или [math] w:=w-\eta \nabla Q_{i}(w)+\alpha \Delta w[/math];
  • NAG (Nesterov accelerated gradient)[8]: [math] w^{(k+1)} = w^{(k)}-v^{(k)}; v^{(k+1)}=\gamma v^{(k)}+\mu\frac{\partial L(w^{(k)}-v^{(k)})}{\partial w}[/math]
  • Adagrad [9]: [math]g_{i,(k)}=\frac{\partial L(w_i^{(k)})}{\partial w_i}, w_i^{(k+1)}=w_i^{(k)}-\frac{\mu}{\sqrt{G^{(k)}_i,i+\epsilon}}g_{i,(k)}[/math], где G - диагональная матрица, элементы которой, суммы квадратов координат градиента к k-ой итерации алгоритма;
  • RMSProp[10]: [math]E^{(k)}[g_i^2] = \gamma E^{(k-1)}[g_i^2]+(1-\gamma)g^2_{i, (k)}, w^{(k+1)}_i = w_i^{(k)}-\frac{\mu}{\sqrt{E^{(k)}[g_i^2]+\epsilon}}g_{i, (k)}[/math];


  • Adadelta[11]:[math]w^{(k+1)}=w^{(k)}-\mu(Q''(w^{(k)})^{-1}Q'(w^{(k)}[/math], вычисление матрицы Q вторых производных довольно сложная задача, поэтому вместо неё можно брать приближение: [math]w^{(k+1)}=w^{(k)}-\frac{RMS^{(k-1)}[\delta w_i}{RMS^{(k)}[g_i]}g_i^{(k)}[/math], где [math]RMS^{(k)}[x_i]=\sqrt{E^{(k)}[x^2_i]+\epsilon}[/math];
  • Adam[12]: [math] w^{(k+1)}_i = w_i^{(k)}-\frac{\mu}{\sqrt{\hat{b}^2_{(k)}+\epsilon}}\hat{m}_{(k)}[/math], где [math]\hat{m}_{(k)}=\frac{\gamma_1 E^{(k-1)}[g_i]+(1-\gamma_1)g_{i,(k)}}{1-\gamma_1^k}[/math] и [math]\hat{b}^2_{(k)}= \frac{\gamma_2 E^{(k-1)}[g^2_i]+(1-\gamma_2)g:2_{i,(k)}}{1-\gamma_2^k}[/math].