77
правок
Изменения
Нет описания правки
Всегда можно выбрать случайно начальное приближение, но лучше выбирать определённым образом, ниже приведены самые распространённые из них:
* Метод инициализации Завьера (Xavier) (иногда — метод Glorot’а)<ref>[http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf Understanding the difficulty of training deep feedforward neural networks]</ref>. Основная идея этого метода — упростить прохождение сигнала через слой во время как прямого, так и обратного распространения ошибки для линейной функции активации (этот метод также хорошо работает для сигмоидной функции, так как участок, где она ненасыщена, также имеет линейный характер). При вычислении весов этот метод опирается на вероятностное распределение (равномерное или нормальное) с дисперсией, равной <tex>\mathrm{Var}(W) = {2 \over{n_{in} + n_{out}}}</tex>, где <tex>n_{in}</tex> и <tex>n_{out}</tex> — количества нейронов в предыдущем и последующем слоях соответственно.;
* Метод инициализации Ге (He) — это вариация метода Завьера, больше подходящая функции активации ReLU, компенсирующая тот факт, что эта функция возвращает нуль для половины области определения. А именно, в этом случае <tex>\mathrm{Var}(W) = {2 \over{n_{in}}}</tex><ref>[https://arxiv.org/pdf/1502.01852.pdf Delving Deep into Rectifiers]</ref>.
== Граф вычислений ==
Глубокие сети являются особенной формой графа вычиcлений.
[[Файл: tree-def.png|450px|thumb|Рис.1. Граф вычислений для функции <tex>f(a,b)=(a+b)*(b+1)</tex>]]
Граф вычислений — это ориентированный граф, узлы которого соответствуют операциям или переменным. Переменные могут передавать свое значение в операции, а операции могут передавать свои результаты в другие операции. Таким образом, каждый узел в графе определяет функцию переменных.
Значения, которые вводятся в узлы и выходят из узлов, называются тензорами (т.е. многомерными массивами). На рисунке 1 представлен граф вычислений для функции <tex>f(a,b)=(a+b)*(b+1)</tex>. В нейронах сетях функций имеют больше аргументов и сложнее, но смысл операций остаётся прежним.
Преимуществом такого представления функции является простота вычисления производных. Используя следующие правила вычисления частных производных:
*<tex>q=x+y:\frac{\partial q}{\partial x}=1, \frac{\partial q}{\partial y}=1;</tex>;*<tex>q=xy:\frac{\partial q}{\partial x}=y, \frac{\partial q}{\partial y}=x;</tex>;
*<tex>\frac{\partial f}{\partial x}=\frac{\partial f}{\partial q}\frac{\partial q}{\partial y}</tex>.
Рассмотрим граф вычислений на рисунке 2 с поданными на вход значениями <tex>(x_0=-2, y_0=5, z_0=-4)</tex>. Подсчёт производных по графу вычислений производим от значения функции к значениям независимых переменных-входов.
* <tex>\frac{\partial f}{\partial f} = 1</tex>;* <tex>\frac{\partial f}{\partial q} = z_0 = -4</tex>, <tex>\frac{\partial f}{\partial z} = q_0 = 3</tex>;* <tex>\frac{\partial f}{\partial x} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial x} = -4</tex>, <tex>\frac{\partial f}{\partial y} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial y} = -4</tex>.
Граф вычислений является частью нейронной сети, у которой <tex>x_{n_{in}}</tex> — {{---}} входные значения, <tex>y_{n_{out}}</tex> — {{---}} выходные с сети значения, <tex>w</tex> — {{---}} матрица весов, приводящая значения предыдущего слоя к выходным значениям.
Зная производные, можно искать матрицы весов <tex>w</tex> (числа, на которые умножаются входные для этого слоя значения) с помощью [[Настройка глубокой сети#Способы настройки параметров|градиентного спуска]] сдвигаемся
* Метод Нестерова (англ. Nesterov accelerated gradient, NAG)<ref>[https://jlmelville.github.io/mize/nesterov.html#nag Nesterov accelerated gradient]</ref> добавляет к методу Momentum идею "заглядывания вперёд", используя производную не в текущей точке, а в следующей (если бы мы продолжали двигаться в этом же направлении без измений): <tex> w^{(k+1)} = w^{(k)}-v^{(k)}; v^{(k+1)}=\gamma v^{(k)}+\mu\frac{\partial L(w^{(k)}-v^{(k)})}{\partial w}</tex>;