Редактирование: Обсуждение участника:Mishenkoil

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
 +
Инициализация {{---}} это процесс установки настраиваемых параметров для нашей глубокой сети. Выбор правильного метода инициализации важен для качества обучения нашей модели. Также это позволяет сократить время сходимости и минимизировать функцию потерь. Поэтому важно уметь выбрать правильный метод инициализации.
  
 +
===Наивная инициализация===
 +
 +
Если задать все параметры нулевыми или константными значениями, это приведёт к тому, что наша сеть либо совсем не обучится, либо абсолютно все нейроны будут вести себя одинаково {{---}} совсем не то, что мы хотим получить. Глубокая сеть должна обучаться разным признакам.
 +
 +
===Инициализация случайными числами===
 +
 +
Рассмотрим линейное преобразование:
 +
*<tex>y=w^Tx+b=\sum(w_i x_i)+b=\sum(y_i)+b</tex>
 +
Его дисперсия (считаем настраиваемые параметры и входные данные независимыми):
 +
*<tex>\mathrm{Var}[y_i]=\mathrm{Var}[w_i x_i]=\mathbb{E}[x_i]^2\mathrm{Var}[w_i]+\mathbb{E}[w_i]^2\mathrm{Var}[x_i]+\mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex> ([https://en.wikipedia.org/wiki/Variance#Product_of_independent_variables см. дисперсия произведения])
 +
Если отнормировать входные данные и подобрать параметры, чтобы среднее было нулевым, получится:
 +
*<tex>(\mathbb{E}[x_i]=0, \mathbb{E}[w_i]=0) \Rightarrow \mathrm{Var}[y_i]=\mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex>
 +
Поскольку $x_i$ мы отнормировали, а $w_i$ из одного распределения, то все дисперсии одинаковые:
 +
*<tex>\mathrm{Var}[y]=\mathrm{Var}[\sum\limits_{i=1}^{n_{in}}[y_i]]=\sum\limits_{i=1}^{n_{in}}[w_i x_i]=n_{in} \mathrm{Var}[w_i]\mathrm{Var}[x_i]</tex>
 +
Отсюда видно, что дисперсия результата линейно зависит от дисперсии входных данных с коэффициентом $n_{in} \mathrm{Var}[w_i]$.
 +
 +
Если коэффициент будет $>1$ это приведет к увеличению дисперсии с каждым новым преобразованием, что может привести к ошибкам или насыщению функции активации, что негативно скажется на обучении сети.
 +
 +
Если коэффициент будет $<1$ это приведет к снижению дисперсии с каждым новым преобразованием с около нулевым промежуточным представлением, что тоже негативно скажется на обучении сети.
 +
 +
Поэтому для начальной инициализации параметров стоит использовать такое распределение, что $\mathrm{Var}[w_i]=\frac{1}{n_{in}}$, которое позволит сохранить дисперсию входных данных.
 +
 +
===Метод инициализации Xavier<ref>[http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf Understanding the difficulty of training deep feedforward neural networks]</ref>.===
 +
 +
Предыдущий подход хорошо работает, когда размерность наших данных не изменяется после преобразований $(n_{in} = n_{out})$, но так бывает не всегда. В качестве компромисса Xavier Glorot и Yoshua Bengio предлагают инициализировать параметры из распределения с дисперсией $\mathrm{Var}[w_i]=\frac{2}{n_{in}+n_{out}}$.
 +
 +
Для равномерного распределения $\mathcal U$ это будет:
 +
*<tex>w_i \sim \mathcal U[-\frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}},\frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}]</tex>
 +
Для нормального распределения $\mathcal N$ это будет:
 +
*<tex>w_i \sim \mathcal N(0,\frac{2}{n_{in}+n_{out}})</tex>
 +
 +
Этот способ инициализации хорошо подойдет для симметричных относительно нуля функций активации (гиперболический тангенс, сигмоид), для ReLU<ref>[https://en.wikipedia.org/wiki/Rectifier_(neural_networks) ReLU, Wikipedia]</ref> данный способ не подходит.
 +
 +
====Пример инициализации Xavier на языке Python====
 +
 +
    <font color=darkgreen># example of the normalized xavier weight initialization</font>
 +
    from math import sqrt
 +
    from numpy import mean
 +
    from numpy.random import rand
 +
    <font color=darkgreen># number of nodes in the previous layer</font>
 +
    n = 10
 +
    <font color=darkgreen># number of nodes in the next layer</font>
 +
    m = 20
 +
    <font color=darkgreen># calculate the range for the weights</font>
 +
    lower, upper = -(sqrt(6.0) / sqrt(n + m)), (sqrt(6.0) / sqrt(n + m))
 +
    <font color=darkgreen># generate random numbers</font>
 +
    numbers = rand(1000)
 +
    <font color=darkgreen># scale to the desired range</font>
 +
    scaled = lower + numbers * (upper - lower)
 +
 +
===Метод инициализации He<ref>[https://arxiv.org/pdf/1502.01852.pdf Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification ]</ref>===
 +
 +
Поскольку ReLU несимметричная функция $f(x) = max(0, x)$, мы уже не можем утверждать, что среднее значение входных данных в каждом преобразовании будет нулевым:
 +
*<tex>(\mathbb{E}[x_i] \neq 0, \mathbb{E}[w_i]=0)</tex><br><tex>\Rightarrow \mathrm{Var}[y_i]=\mathbb{E}[x_i]^2\mathrm{Var}[w_i] + \mathrm{Var}[w_i]\mathrm{Var}[x_i]=\mathrm{Var}[w_i](\mathbb{E}[x_i]^2 + \mathrm{Var}[x_i])=\mathrm{Var}[w_i]\mathbb{E}[x_i^2]</tex><br><tex>\Rightarrow \mathrm{Var}[y]=n_{in}\mathrm{Var}[w_i]\mathbb{E}[x_i^2]</tex>
 +
 +
Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между входами ReLU. Пусть представление на входе было получено после применения данной функции активации к предыдущему представлению $y_{prev}$:
 +
*<tex>x=\mathrm{ReLU}(y_{prev})</tex>
 +
Тогда с учётом поведения ReLU и того, что $\mathrm{E}(y_{prev})=0$, можно сказать, что:
 +
*<tex>\mathbb{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>
 +
 +
Получается, что при использовании ReLU, нужно инициализировать параметры из распределения с дисперсией $\mathrm{Var}[w_i]=\frac{2}{n_{in}}$.
 +
 +
Для нормального распределения $\mathcal N$ это будет:
 +
*<tex>w_i \sim \mathcal N(0,\frac{2}{n_{in}})</tex>
 +
 +
====Пример инициализации He на языке Python====
 +
 +
    <font color=darkgreen># example of the he weight initialization</font>
 +
    from math import sqrt
 +
    from numpy.random import randn
 +
    <font color=darkgreen># number of nodes in the previous layer</font>
 +
    n = 10
 +
    <font color=darkgreen># calculate the range for the weights</font>
 +
    std = sqrt(2.0 / n)
 +
    <font color=darkgreen># generate random numbers</font>
 +
    numbers = randn(1000)
 +
    <font color=darkgreen># scale to the desired range</font>
 +
    scaled = numbers * std
 +
 +
 +
==См.также==
 +
* [[Настройка глубокой сети]]
 +
* [[Глубокое обучение]]
 +
 +
==Примечания==
 +
<references/>
 +
 +
==Источники информации==
 +
#[https://ml-handbook.ru/chapters/neural_nets/training Онлайн-учебник по машинному обучению от ШАД]
 +
 +
 +
[[Категория: Машинное обучение]]
 +
[[Категория: Глубокое обучение]]

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)