Обсуждение участника:Mishenkoil — различия между версиями
(фикс He) |
(фикс He 2) |
||
Строка 37: | Строка 37: | ||
*<tex>(\mathrm{E}[x_i] \neq 0, \mathrm{E}[w_i]=0)</tex><br><tex>\Rightarrow \mathrm{Var}[y_i]=\mathrm{E}[x_i]^2\mathrm{Var}[w_i] + \mathrm{Var}[w_i]\mathrm{Var}[x_i]=\mathrm{Var}[w_i](\mathrm{E}[x_i]^2 + \mathrm{Var}[x_i])=\mathrm{Var}[w_i]\mathrm{E}[x_i^2]</tex><br><tex>\Rightarrow \mathrm{Var}[y]=n_{in}\mathrm{Var}[w_i]\mathrm{E}[x_i^2]</tex> | *<tex>(\mathrm{E}[x_i] \neq 0, \mathrm{E}[w_i]=0)</tex><br><tex>\Rightarrow \mathrm{Var}[y_i]=\mathrm{E}[x_i]^2\mathrm{Var}[w_i] + \mathrm{Var}[w_i]\mathrm{Var}[x_i]=\mathrm{Var}[w_i](\mathrm{E}[x_i]^2 + \mathrm{Var}[x_i])=\mathrm{Var}[w_i]\mathrm{E}[x_i^2]</tex><br><tex>\Rightarrow \mathrm{Var}[y]=n_{in}\mathrm{Var}[w_i]\mathrm{E}[x_i^2]</tex> | ||
− | Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между функциями активации ReLU. Пусть представление на входе было получено после применения данной функции активации к предыдущему представлению $ | + | Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между функциями активации ReLU. Пусть представление на входе было получено после применения данной функции активации к предыдущему представлению $y_{prev}$: |
*<tex>x=\mathrm{ReLU}(y_{prev})</tex> | *<tex>x=\mathrm{ReLU}(y_{prev})</tex> | ||
Тогда с учётом поведения ReLU и того, что $\mathrm{E}(y_{prev})=0$, можно сказать, что: | Тогда с учётом поведения ReLU и того, что $\mathrm{E}(y_{prev})=0$, можно сказать, что: | ||
− | *<tex>\mathrm{E}[x_i^2]=\frac{1}{2}\mathrm{Var}[ | + | *<tex>\mathrm{E}[x_i^2]=\frac{1}{2}\mathrm{Var}[ |
y_{prev}]</tex><br><tex>\Rightarrow \mathrm{Var}[y]=\frac{1}{2}n_{in}\mathrm{Var}[w_i]\mathrm{Var}[y_{prev}]</tex> | y_{prev}]</tex><br><tex>\Rightarrow \mathrm{Var}[y]=\frac{1}{2}n_{in}\mathrm{Var}[w_i]\mathrm{Var}[y_{prev}]</tex> | ||
Версия 16:50, 9 мая 2022
Глубокая сеть состоит из нескольких преобразований, где каждое преобразование организовано таким образом, что в начале преобразования каждый нейрон получает свою копию всех выходных данных предыдущего преобразования. Эта модель идеально подходит для определенных типов задач, например, обучение на ограниченном количестве более или менее неструктурированных параметров. Существует множество способов изменения настраиваемых параметров (весов) в такой модели, когда ей на вход поступают необработанные данные.
Содержание
Инициализация сети
Инициализация случайными числами
Рассмотрим линейный нейрон:
Его дисперсия (считаем настраиваемые параметры и входные данные независимыми):
Если отнормировать входные данные и подобрать настраиваемые параметры, чтобы среднее было нулевым, получится:
Поскольку $x_i$ мы отнормировали, а $w_i$ из одного распределения, то все дисперсии одинаковые:
Отсюда видно, что дисперсия результата линейно зависит от дисперсии входных данных с коэффициентом $n_{in} \mathrm{Var}[w_i]$.
Если коэффициент будет $>1$ это приведет к увеличению дисперсии с каждым новым преобразованием, что может привести к ошибкам или насыщению функции активации, что негативно скажется на обучении сети.
Если коэффициент будет $<1$ это приведет к снижению дисперсии с каждым новым преобразованием с около нулевым промежуточным представлением, что тоже негативно скажется на обучении сети.
Поэтому для начальной инициализации настраиваемых параметров стоит использовать такое распределение, что $\mathrm{Var}[w_i]=\frac{1}{n_{in}}$, которое позволит сохранить дисперсию входных данных.
Метод инициализации Xavier[1].
Предыдущий подход хорошо работает, когда размерность наших данных не изменяется после преобразований $(n_{in} == n_{out})$, но так бывает не всегда. В качестве компромисса Xavier Glorot и Yoshua Bengio предлагают инициализировать параметры из распределения с дисперсией $\mathrm{Var}[w_i]=\frac{2}{n_{in}+n_{out}}$.
Для равномерного распределения $U$ это будет:
Для нормального распределения $N$ это будет:
Этот способ инициализации хорошо подойдет для симметричных относительно нуля функций активации (гиперболический тангенс, сигмоид), для ReLU[2] данный способ не подходит.
Метод инициализации He
Поскольку ReLU несимметричная функция $f(x) = max(0, x)$, мы уже не можем утверждать, что среднее значение входных данных в каждом преобразовании будет нулевым:
Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между функциями активации ReLU. Пусть представление на входе было получено после применения данной функции активации к предыдущему представлению $y_{prev}$:
Тогда с учётом поведения ReLU и того, что $\mathrm{E}(y_{prev})=0$, можно сказать, что:
Получается, что при использовании ReLU, нужно инициализировать параметры из распределения с дисперсией $\mathrm{Var}[w_i]=\frac{2}{n_{in}}$. Для нормального распределения $N$ это будет:
Граф вычислений
Глубокие сети являются особенной формой графа вычиcлений.
Граф вычислений — ориентированный граф, узлы которого соответствуют операциям или переменным. Переменные могут передавать свое значение в операции, а операции могут передавать свои результаты в другие операции. Таким образом, каждый узел в графе определяет функцию переменных.
Значения, которые вводятся в узлы и выходят из узлов, называются тензорами (т.е. многомерными массивами). На рисунке 1 представлен граф вычислений для функции
. В нейронах сетях функций имеют больше аргументов и сложнее, но смысл операций остаётся прежним.Процесс передачи значений от входных нейронов к выходным называется прямым распространением (от англ. Forward pass). После чего мы вычисляем ошибку обработанных сетью данных на выходном нейроне и, основываясь на её значении, делаем обратную передачу ошибки (Back propagation). Обратное распространение ошибки заключается в том, чтобы последовательно менять настраиваемые параметры нейронной сети, начиная с параметров выходного нейрона. Значения параметров будут меняться в сторону уменьшения ошибки.
Преимуществом такого представления функции является простота вычисления производных. Используя следующие правила вычисления частных производных:
- ;
- ;
- .
Рассмотрим граф вычислений на рисунке 2 с поданными на вход значениями
. Подсчёт производных по графу вычислений производим от значения функции к значениям независимых переменных-входов.- ;
- , ;
- , .
Граф вычислений является частью нейронной сети, у которой — входные значения, — выходные с сети значения, — матрица параметров, приводящая значения предыдущего преобразования к выходным значениям.
Зная производные, можно искать матрицы параметров градиентного спуска сдвигаемся в сторону градиента (при максимизации) или обратную ему (при минимизации) , где — функция потерь, а — параметры после -ой итерации, или его модификаций[3].
(числа, на которые умножаются входные для этого преобразования значения) с помощьюСпособы настройки параметров
Ниже представлены различные вариации градиентного спуска (более подробное сравнение, применительно к данной задаче [6]). Градиентный спуск — итеративный алгоритм поиска минимума или максимума функции, метриками качества алгоритма этого семейства методов являются скорость сходимости и сходимость в глобальный оптимум. Методы имеют различные преимущества на различных функциях. Так например на рисунке 3 из локального минимума метод adam и метод Нестерова не могут достигнуть глобального, а в случае "шаткого" ландшафта (рисунок 4) эти методы сходятся быстрее.
- Метод стохастического градиентного спуска заключается в том, что алгоритм делает шаг постоянной величины в направлении, указанном градиентом в текущей точке: ;
- Модификация Momentum [7] запоминает скорость на предыдущем шаге и добавляет в раз меньшую величину на следующем шаге: , ;
- Метод Нестерова (англ. Nesterov accelerated gradient, NAG)[8] добавляет к методу Momentum идею "заглядывания вперёд", используя производную не в текущей точке, а в следующей (если бы мы продолжали двигаться в этом же направлении без измений): ;
- Adagrad имеет преимущество в плане обучения нейронных сетей в предположении, что процесс обучения должен сходится (т.е. не нужно сильно менять настраиваемые параметры сети, когда мы уже немного научились). В процессе обучения после каждого прецендента алгоритм будет уменьшать шаг за счёт суммы квадратов координат градиента предыдущих итераций[9]: , где — диагональная матрица, элементы которой, суммы квадратов координат градиента к -ой итерации алгоритма: ;
- RMSProp[10] основан на идее Adagrad'a, но с учётом того элементы матрицы могут быть большими величинами и начать препятствовать обучению. Для этого RMSProp делит шаг не на полную сумму градиентов, а на скользящую, т.е. , обновление параметров осталось таким же как в Adagrad : ;
- Adadelta[11] устраняет "нефизичность" методов Adagrad и RMSProp, добавка с градиентом в которых не имеет размерности параметров(точнее вообще безразмерна). Умножение этого слагаемого на любую величину правильной размерности — не самая хорошая идея. Используем разложение ряда Тейлора в точке с большим числом членов, тогда появится матрица вторых производных функции потерь: , расчёт которой повлечёт за собой дополнительные затраты на её расчёт (сами градиенты мы получаем сразу при обратном распространении ошибки), поэтому вместо неё можно брать приближение (из сложных выводов получаем необходимый множитель ), однако в данном случае знание предыдущей скорости не добавляет алгоритму "инерции" методов Momentum и NAG): , где ;
- Adam[12] сочетает в себе преимущества NAG и Adadelta над обычным градиентным спуском: , где и .
Сравнение способов настройки параметров
Рассмотрим график седловой функции с "седлом" в точке
. Предположим, что в качестве начальной точки выбрана точка , где . На рисунке координата варьируется в пределах от до , координата , а координата . Рассмотрим работу описанных выше методов, примененных к данной оптимизируемой функции с данной начальной точкой:- SGD (Стандартный градиентный спуск без оптимизаций) никак не учитывает тот факт, что по координате производная в данной точке пренебрежимо мала по сравнению с производной по . Поэтому через малое число итераций алгоритм сойдется в окрестности седловой точки и остановится, потому что производная в данной точке нулевая.
- Momentum. Так как добавится инерция, то спуск в сторону седловой точки будет значительно быстрее, чем в случае со стандартным градиентным спуском. Однако, оптимизируемая переменная будет еще долго колебаться в плоскости , накапливая градиенты. При этом колебания будут затухать из-за того, что параметр , но т.к. оптимизируемая переменная несколько раз отдалится от точки на достаточное расстояние, успеет накопиться значение производной по координате , достаточное для того чтобы выйти из локального минимума. Однако для этого потребуется большое число итераций, необходимое для того, чтобы производная по перестала преобладать над производной по .
- NAG. Эффект будет схожим с алгоритмом Momentum, однако спуск в плоскости будет происходить быстрее благодаря заглядыванию вперед.
- Adagrad. Изначально спуск будет происходить медленнее, чем при использовании SGD из-за нормирования градиента по всем координатам, однако метод сойдется в глобальном минимуме выбранной области графика.
- RMSProp. Изначально процесс оптимизации почти совпадает с Adagrad, но в области, где функция начинает сильно убывать, благодаря использованию скользящей суммы градиентов (то есть благодаря тому, что мы забываем старые изменения и больше учитываем новые) алгоритм RMSProp оптимизирует переменную быстрее, чем Adagrad.
- Adadelta. Использует все преимущества RMSProp, но при этом в данном случае сходится быстрее в раз.
См.также
Примечания
- ↑ Understanding the difficulty of training deep feedforward neural networks
- ↑ ReLU, Wikipedia
- ↑ Метод градиентного спуска
- ↑ Методы оптимизации нейронных сетей, Habr
- ↑ Методы оптимизации нейронных сетей, Habr
- ↑ Методы оптимизации нейронных сетей, Habr
- ↑ Momentum, Wikipedia
- ↑ Nesterov accelerated gradient
- ↑ AdaGrad
- ↑ RMSProp
- ↑ Adadelta
- ↑ Adam
Источники информации
- Курс лекций по машинному обучению — Воронцов К.В.
- Онлайн-учебник по машинному обучению от ШАД
- Riedmiller, M., & Braun, H. (1993). A direct adaptive method for faster backpropagation learning: The RPROP algorithm. In Neural Networks, 1993., IEEE International Conference on (pp. 586-591). IEEE.