Skip to content

Commit

Permalink
Update documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
Filipp Ulyankin committed Feb 14, 2024
1 parent b8502b9 commit 1b84f89
Show file tree
Hide file tree
Showing 260 changed files with 42,205 additions and 81,386 deletions.
2 changes: 1 addition & 1 deletion .buildinfo
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 24379f9220df2eb774d736c85bd7bc7c
config: d42514d68f2d2ab9db0079b89aa0f05d
tags: 645f666f9bcd5a90fca523b33c5a78b7
1,099 changes: 438 additions & 661 deletions README.html

Large diffs are not rendered by default.

File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
2 changes: 1 addition & 1 deletion _sources/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

Поэтому вторая часть этой книги состоит из ещё $N$ листочков, в которых информация подаётся чуть хаотичнее, чем в первых трёх. А также там могу быть пробелы в решениях.

Четвёртый листочек расскажет про функции активации, функции потерь и то, как можно умелым движением рук адаптировать нейронки под разные задачи. Пятый листочек погрузит нас в свёрточные сети. Шестой листочек расскажет про специфические слои и красивые инженерные решения. Седьмой листочек погрузит в рекуррентные сети. В восьмом листочке речь пойдёт про векторные представления и втокодировщики. Девятый листочек расскажет про трансформеры. Десятый листочек будет немного в стороне от нейронок и научит нас брать матричные производные.
Четвёртый листочек расскажет про функции активации, функции потерь и то, как можно умелым движением рук адаптировать нейронки под разные задачи. Пятый листочек погрузит нас в свёрточные сети. Шестой листочек расскажет про специфические слои и красивые инженерные решения. Седьмой листочек погрузит в рекуррентные сети. В восьмом листочке речь пойдёт про векторные представления и автокодировщики. Девятый листочек расскажет про трансформеры. Десятый листочек будет немного в стороне от нейронок и научит нас брать матричные производные.

**P.S.** По ссылке лежит курс по нейросетям на tensorflow, но он переедет на pytorch. Я поставил [не на ту лошадь и проиграл.](https://t.me/gonzo_ML/1026)

Expand Down
2 changes: 1 addition & 1 deletion _sources/problem_set_01_just_function/intro_01.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@

Этот листочек состоит из десяти задачек. В нём мы поймём, что нейросеть --- всего лишь нелинейная функция. Мы поймём, как именно нейросеть решает задачу классификации и регрессии, попытаемся разобраться, что именно делают нейроны с пространством признаков, а также поймём, сколько параметров нужно оценить, при обучении полносвязной сетки.

Чтобы понять материал этого листочка, вам достаточно разбираться в школьной математике. Мы не возьмём ни одной производной и не найдём ни одного интеграла. Один раз мы воспользуемся тем, что любую неприрывную функцию можно апроксимировать с помощью кучи ступенек.
Чтобы понять материал этого листочка, вам достаточно разбираться в школьной математике. Мы не возьмём ни одной производной и не найдём ни одного интеграла. Один раз мы воспользуемся тем, что любую непрерывную функцию можно аппроксимировать с помощью кучи ступенек.
2 changes: 1 addition & 1 deletion _sources/problem_set_01_just_function/problem_02.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 2. От картинки к формуле

Добродум хочет понять, насколько сильно будет заполнена кофейня в следующие выходные. Для этого он обучил нейросетку. На вход она принимает три фактора: температуру за окном, $x_1$, факт наличия на Тверской митинга, $x_2$ и пол баристы на смене, $x_3$. В качестве функции активации Добродум использует ReLU.
Добродум хочет понять, насколько сильно будет заполнена кофейня в следующие выходные. Для этого он обучил нейросетку. На вход она принимает три фактора: температуру за окном, $x_1$, факт наличия на Тверской митинга, $x_2$ и пол баристы на смене, $x_3$ (где мужчина - 0, а женщина - 1). В качестве функции активации Добродум использует ReLU.

```{figure} ../images/problem_set_01/img02_dobronet.png
---
Expand Down
4 changes: 2 additions & 2 deletions _sources/problem_set_01_just_function/problem_08.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ __2)__ Первый слой должен построить нам три ли
\begin{equation*}
\begin{cases}
& f(1 \cdot w_1 + 1 \cdot w_2 + 1 \cdot w_3) = 1 \\
& f(1 \cdot w_1 + 0 \cdot w_2 + 0 \cdot w_3) = 0 \\
& f(1 \cdot w_1 + 1 \cdot w_2 + 01 \cdot w_3) = 0 \\
& f(1 \cdot w_1 + 0 \cdot w_2 + 0 \cdot w_3) = 1 \\
& f(1 \cdot w_1 + 1 \cdot w_2 + 0 \cdot w_3) = 0 \\
& f(0 \cdot w_1 + 0 \cdot w_2 + 0 \cdot w_3) = 0 \\
\end{cases}.
\end{equation*}
Expand Down
2 changes: 1 addition & 1 deletion _sources/problem_set_03_backprop/problem_02.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ __г)__ Выпишите все производные в том виде, в к
Мы везде работаем со скалярами. Все производные довольно просто найти по графу, на котором мы делаем прямой проход. Например,
$$
\frac{\partial h_2}{\partial w_2} = \frac{\partial (o_2 \cdot w_2)}{\partial w_2} = o_2.
\frac{\partial h_2}{\partial w_2} = \frac{\partial (o_1 \cdot w_2)}{\partial w_2} = o_1.
$$
Если в качестве функции активации мы используем сигмоиду
Expand Down
2 changes: 1 addition & 1 deletion _sources/problem_set_03_backprop/problem_06.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ name: one_dim_nn

Выпишите для Машиной нейросетки алгоритм обратного распространения ошибки в общем виде. Пусть Маша инициализировала веса нейронной сети нулями. У неё есть два наблюдения.

Первое: $x_1 = 1, x_2 = 1, y = 1$. И второе: $x_1 = 5, x_2 = 2, y = 0$.
Первое: $x_1 = 1, x_2 = 1, y = 0$. И второе: $x_1 = 5, x_2 = 2, y = 1$.

Сделайте руками два шага алгоритма обратного распространения ошибки. Пусть скорость обучения $\eta = 1$. Стохастический градиентный спуск решил, что сначала для шага будет использоваться второе наблюдение, а затем первое.

Expand Down
4 changes: 1 addition & 3 deletions _sources/problem_set_04_logloss/problem_05.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,7 @@ Swish -- гладкий вариант ReLU с гейтом. **Гейтами**

Также почитайте небольшой обзор функций активации.[^statia3]

[^statia]: [FAST AND ACCURATE DEEP NETWORK LEARNING BY
EXPONENTIAL LINEAR UNITS (ELUS)](
https://arxiv.org/pdf/1511.07289.pdf)
[^statia]: [FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)](https://arxiv.org/pdf/1511.07289.pdf)
[^statia2]: [Self-Normalizing Neural Networks](https://arxiv.org/pdf/1706.02515.pdf)
[^statia4]: [SEARCHING FOR ACTIVATION FUNCTIONS](https://arxiv.org/pdf/1710.05941.pdf)
[^statia5]: [Mish: A Self Regularized Non-Monotonic Activation Function](https://arxiv.org/pdf/1908.08681.pdf)
Expand Down
103 changes: 96 additions & 7 deletions _sources/problem_set_06_lego/problem_03.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,108 @@
# 3. А вот и моя остановочка
# 3. Weight Decay

<!-- При обучении нейросетей ошибку измеряют на тренировочной и валидационной выборках. Как только ошибка на валидационной выборке начинает расти, обучение нейросетки останавливают, так как она начинает переобучаться. Такую стратегию называют **ранней остановкой.** Это одна из самых распространённых форм регуляризации в машинном обучении.
В случае $l_2$-регуляризации, к базовой функции потерь добавляют дополнительное слагаемое и вместо функционала

Пусть Маша обучает линейную модель с одним признаком без константы $y_i = w \cdot x_i.$ Для оценки параметра $w$ Маша использует MSE с $l_2$ регуляризацией.
-->
\[
L(w) = \frac{1}{n} \cdot \sum\limits_{i=1}^{n} \nabla_w L(y_i, x_i, w)
\]

::::{important}
Хочется сделать простую задачку на связь ранней остановки с l2 регуляризатором по мотивам страницы 205 из Гудфеллоу, но без дичи с SVD
::::
оптимизируют функционал

\[
Q_\lambda(w) = L(w) + \frac{1}{2}\lambda \cdot ||w||^2_2.
\]

Будем считать, что регуляризатор наложен на все веса нейронной сети. Обычно регуляризатор добавляют к функции потерь, чтобы избежать переобучения. Градиентный спуск можно переписать с учётом регуляризатора немного в другом виде. Такой вид называется **weight decay.**

В пакетах для обучения нейронных сеток у оптимизаторов обычно есть такой параметр. Давайте проделаем это переписывание для нескольких разных градиентных спусков.

__а)__ Выпишите шаг momentum-SGD для такой модели. Выразите получившийся шаг в виде

\[
w_t = g(\lambda) \cdot w_{t-1} - \eta_t \cdot h(\nabla_w L(w_{t-1}))
\]


```{dropdown} Решение
Один шаг momentum-SGD выглядит как
\[
\begin{cases}
g_t = \nabla_w Q(w_{t-1}) + \lambda \cdot w_{t-1} \\
m_t = \mu \cdot m_{t-1} + g_t\\
w_t = w_{t-1} - \eta_t \cdot m_t \\
\end{cases}
\]
Подставим первую строку во вторую, а вторую в третью
\begin{multline*}
w_t = w_{t-1} - \eta_t \cdot (\mu \cdot m_{t-1} + \nabla_w L(w_{t-1}) + \lambda \cdot w_{t-1}) = \\ =\alert{\underbrace{(1-\eta_t\cdot \lambda)}_{<1}}\cdot w_{t-1} - \eta_t\cdot(\mu\cdot m_{t-1} + \nabla_w L(w_{t-1}))
\end{multline*}
Получается, что когда мы добавляем к модели $l_2$ регуляризацию, мы делаем каждый шаг градиентного спуска по старому градиенту без регуляризатора, но из новых весов. Мы сдвигаем старые веса на какую-то константу и движемся из неё. Этот параметр в оптимизиторах называется weight decay. Обычно при обучении нейронных сетей вместо регуляризации используют его.
```

__б)__ Выпишите шаг Adam для такой модели. Выразите получившийся шаг в виде

\[
w_t = g(\lambda) \cdot w_{t-1} - \eta_t \cdot h(\nabla_w L(w_{t-1}))
\]

```{dropdown} Решение
Один шаг Adam выглядит как
\[
\begin{cases}
g_t = \nabla_w Q(w_{t-1}) + \lambda \cdot w_{t-1} \\
m_t = \beta_1 \cdot m_{t-1} + (1-\beta_1) \cdot g_t \\
v_t = \beta_2 \cdot v_{t-1} + (1-\beta_2) \cdot g_t^2\\
\hat{m}_t = \frac{1}{1-\beta_1^t} \cdot m_t \\
\hat{v}_t = \frac{1}{1-\beta_2^t}v_t \\
w_t = w_{t-1} -\eta_t \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \varepsilon}
\end{cases}
\]
Сделаем все подстановки и получим
\[
\Rightarrow w_t = w_{t-1} - \eta_t \cdot \frac{m_t}{1-\beta_1^t} \cdot \frac{1}{\sqrt{\hat{v}_t} + \varepsilon} = \\ = w_t = w_{t-1} - \eta_t \cdot \frac{\beta_1 \cdot m_{t-1} + (1-\beta_1) \cdot g_t}{1-\beta_1^t} \cdot \frac{1}{\sqrt{\hat{v}_t} + \varepsilon} = \\ =w_t = w_{t-1} - \eta_t \cdot \frac{\beta_1 \cdot m_{t-1} + (1-\beta_1) \cdot (\nabla_w Q(w_{t-1}) + \lambda \cdot w_{t-1})}{1-\beta_1^t} \cdot \frac{1}{\sqrt{\hat{v}_t} + \varepsilon} =\\=w_{t-1}\cdot \left(\underbrace{1}_{\text{вектор единиц}} - \frac{\eta_t \cdot \lambda\cdot (1-\beta_1)}{1-\beta_1^t} \cdot \underbrace{\frac{1}{\sqrt{\hat{v}_t}+\varepsilon}}_{(*)}\right) -\dots
\]
$(*) \Rightarrow$ регуляризация работает по-разному — разные веса будут по-разному затухать
В случае с Adam мы слишком хорошо оптимизируемся $\Rightarrow$ обязательно переобучаемся
Выпишем уравнения для AdamW
\begin{cases}
g_t = \nabla_w Q(w_{t-1}) \\
m_t = \beta_1 \cdot m_{t-1} + (1-\beta_1) \cdot g_t \\
v_t = \beta_2 \cdot v_{t-1} + (1-\beta_2) \cdot g_t^2\\
\hat{m}_t = \frac{1}{1-\beta_1^t} \cdot m_t \\
\hat{v}_t = \frac{1}{1-\beta_2^t}v_t \\
w_t = (1-\eta_t\cdot\lambda)\cdot w_{t-1} -\eta_t \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \varepsilon}
\end{cases}
В дефолтном Adam мы учитываем weight decay в $g_t$, а в модификации AdamW — в
```


[^statia]: [DECOUPLED WEIGHT DECAY REGULARIZATION](https://arxiv.org/pdf/1711.05101.pdf)














13 changes: 11 additions & 2 deletions _sources/problem_set_06_lego/problem_04.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
# 4. Нормализация по батчам
# 4. А вот и моя остановочка

<!-- При обучении нейросетей ошибку измеряют на тренировочной и валидационной выборках. Как только ошибка на валидационной выборке начинает расти, обучение нейросетки останавливают, так как она начинает переобучаться. Такую стратегию называют **ранней остановкой.** Это одна из самых распространённых форм регуляризации в машинном обучении.
Пусть Маша обучает линейную модель с одним признаком без константы $y_i = w \cdot x_i.$ Для оценки параметра $w$ Маша использует MSE с $l_2$ регуляризацией.
-->

::::{important}
Тут будет красивая задача про нормализацию по батчам. Мы нарисуем для неё граф, возьмём все производные, обсудим уродливость этой процедуры и смысл.
Хочется сделать простую задачку на связь ранней остановки с l2 регуляризатором по мотивам страницы 205 из Гудфеллоу, но без дичи с SVD
::::


```{dropdown} Решение
```



5 changes: 3 additions & 2 deletions _sources/problem_set_06_lego/problem_05.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# 5. Нормализация VS дропаут
# 4. Нормализация по батчам


::::{important}
А вы знали, что бачнорм и дропаут конфликтуют? Хочется превратить вот эту статью в задачку: https://arxiv.org/pdf/1801.05134.pdf
Тут будет красивая задача про нормализацию по батчам. Мы нарисуем для неё граф, возьмём все производные, обсудим уродливость этой процедуры и смысл.
::::

```{dropdown} Решение
Expand Down
Loading

0 comments on commit 1b84f89

Please sign in to comment.