Обсуждение участника:Mishenkoil — различия между версиями
(правки x2) |
(правки x3) |
||
Строка 1: | Строка 1: | ||
− | Инициализация {{---}} это процесс установки настраиваемых параметров для нашей глубокой сети. Выбор правильного метода инициализации важен для качества обучения нашей модели. Также это позволяет сократить время сходимости и минимизировать функцию потерь. | + | Инициализация {{---}} это процесс установки настраиваемых параметров для нашей глубокой сети. Выбор правильного метода инициализации важен для качества обучения нашей модели. Также это позволяет сократить время сходимости и минимизировать функцию потерь. Поэтому важно уметь выбрать правильный метод инициализации. |
+ | |||
+ | ===Наивная инициализация=== | ||
+ | |||
+ | Если задать все параметры нулевыми или константными значениями, это приведёт к тому, что наша сеть либо совсем не обучится, либо абсолютно все нейроны будут вести себя одинаково {{---}} совсем не то, что мы хотим получить. Глубокая сеть должна обучаться разным признакам. | ||
===Инициализация случайными числами=== | ===Инициализация случайными числами=== | ||
Строка 6: | Строка 10: | ||
*<tex>y=w^Tx+b=\sum(w_i x_i)+b=\sum(y_i)+b</tex> | *<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]=\ | + | *<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>(\ | + | *<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$ из одного распределения, то все дисперсии одинаковые: | Поскольку $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> | *<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> | ||
Строка 33: | Строка 37: | ||
Поскольку ReLU несимметричная функция $f(x) = max(0, x)$, мы уже не можем утверждать, что среднее значение входных данных в каждом преобразовании будет нулевым: | Поскольку ReLU несимметричная функция $f(x) = max(0, x)$, мы уже не можем утверждать, что среднее значение входных данных в каждом преобразовании будет нулевым: | ||
− | *<tex>(\ | + | *<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}$: | Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между входами 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>\ | + | *<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> | 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$ это будет: | + | Получается, что при использовании ReLU, нужно инициализировать параметры из распределения с дисперсией $\mathrm{Var}[w_i]=\frac{2}{n_{in}}$. |
+ | |||
+ | Для нормального распределения $\mathcal N$ это будет: | ||
*<tex>w_i \sim \mathcal N(0,\frac{2}{n_{in}})</tex> | *<tex>w_i \sim \mathcal N(0,\frac{2}{n_{in}})</tex> | ||
Версия 18:55, 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}}$.
Для равномерного распределения $\mathcal U$ это будет:
Для нормального распределения $\mathcal N$ это будет:
Этот способ инициализации хорошо подойдет для симметричных относительно нуля функций активации (гиперболический тангенс, сигмоид), для ReLU[2] данный способ не подходит.
Метод инициализации He[3]
Поскольку ReLU несимметричная функция $f(x) = max(0, x)$, мы уже не можем утверждать, что среднее значение входных данных в каждом преобразовании будет нулевым:
Поэтому мы будем пытаться контролировать дисперсию не между слоями, а между входами ReLU. Пусть представление на входе было получено после применения данной функции активации к предыдущему представлению $y_{prev}$:
Тогда с учётом поведения ReLU и того, что $\mathrm{E}(y_{prev})=0$, можно сказать, что:
Получается, что при использовании ReLU, нужно инициализировать параметры из распределения с дисперсией $\mathrm{Var}[w_i]=\frac{2}{n_{in}}$.
Для нормального распределения $\mathcal N$ это будет: