├── main.pdf ├── Neo Euler.otf ├── main_ans.pdf ├── images ├── steps.png ├── tree1.png ├── tree2.png ├── tensorflow_demo.png └── tensorflow_demo2.png ├── main_2020-12-21.pdf ├── main_ans_2020-12-21.pdf ├── .gitignore ├── README.md ├── main.tex ├── part_02_logloss_nn_out.tex ├── part_07_rnn.tex ├── preamble.tex ├── part_03_gradient.tex ├── part_05_lego.tex ├── part_06_cnn.tex ├── task_list_matrix_diff.tex └── part_04_backprop.tex /main.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/main.pdf -------------------------------------------------------------------------------- /Neo Euler.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/Neo Euler.otf -------------------------------------------------------------------------------- /main_ans.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/main_ans.pdf -------------------------------------------------------------------------------- /images/steps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/images/steps.png -------------------------------------------------------------------------------- /images/tree1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/images/tree1.png -------------------------------------------------------------------------------- /images/tree2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/images/tree2.png -------------------------------------------------------------------------------- /main_2020-12-21.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/main_2020-12-21.pdf -------------------------------------------------------------------------------- /main_ans_2020-12-21.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/main_ans_2020-12-21.pdf -------------------------------------------------------------------------------- /images/tensorflow_demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/images/tensorflow_demo.png -------------------------------------------------------------------------------- /images/tensorflow_demo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FUlyankin/neural_nets_prob/HEAD/images/tensorflow_demo2.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.aux 2 | *.fdb_latexmk 3 | *.fls 4 | *.log 5 | *.nav 6 | *.out 7 | *.snm 8 | *.synctex.gz 9 | *.toc 10 | *.vrb 11 | .Rhistory 12 | .DS_Store 13 | *.ipynb_checkpoints 14 | secret_token.txt -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Виньетка по нейросеткам 2 | 3 | В этом репозитории живёт красивая pdf-ка, которая на простых задачках рассказывает как обучаются и работают нейросетки. Всегда мечтали сделать backprop руками, но вот чёто как-то не получалось, тогда эта виньетка для вас! 4 | 5 | * [Текущая версия книги без ответов](https://github.com/FUlyankin/neural_nets_prob/blob/master/main_2020-12-21.pdf) 6 | * [Текущая версия книги с решениями](https://github.com/FUlyankin/neural_nets_prob/blob/master/main_ans_2020-12-21.pdf) 7 | -------------------------------------------------------------------------------- /main.tex: -------------------------------------------------------------------------------- 1 | %!TEX TS-program = xelatex 2 | \documentclass[12pt, a4paper, oneside]{article} 3 | 4 | \input{preamble.tex} 5 | 6 | 7 | % \title{Тятя! Тятя! Наши сети притащили мертвеца!} 8 | \title{Тятя! Тятя! Нейросети заменили продавца!} 9 | \date{ } 10 | \author{Ппилиф Ульянкин} 11 | 12 | \begin{document} 13 | 14 | % Если переключить в false, все sol исчезнут из pdf 15 | \toggletrue{lecture} 16 | %\togglefalse{lecture} 17 | 18 | \maketitle 19 | 20 | % % Beware of bugs in the above code; I have only proved it correct, not tried it (Donald Knuth) 21 | 22 | \begin{abstract} 23 | В этой виньетке собрана коллекция ручных задачек про нейросетки. Вместе с Машей можно попробовать по маленьким шажкам с ручкой и бумажкой раскрыть у себя в теле несколько чакр и немного глубже понять модели глубокого обучения\footnote{Ахахах глубже глубокого, ахахах}. 24 | \end{abstract} 25 | 26 | \section*{Вместо введения} 27 | 28 | \epigraph{Я попала в сети, которые ты метил, я самая счастливая на всей планете.}{\textit{Юлианна Караулова}} 29 | 30 | Однажды Маша услышала про какой-то Машин лёрнинг. Она сразу же смекнула, что именно она --- та самая Маша, кому этот лёрнинг должен принадлежать. Ещё она смекнула, что если хочет владеть лёрнингом по праву, ни одна живая душа не должна сомневаться в том, что она шарит. Поэтому она постоянно изучает что-то новое. 31 | 32 | Её друг Миша захотел стать адептом Машиного лёрнинга, и спросил её о том, как можно за вечер зашарить алгоритм обратного распространения ошибки. Тогда Маша открыла свою коллекцию учебников по глубокому обучению. В каких-то из них было написано, что ей никогда не придётся реализовывать алгоритм обратного распространения ошибки, а значит и смысла тратить время на его формулировку нет\footnote{Франсуа Шолле, Глубокое обучение на Python}. В каких-то она находила слишком сложную математику, с которой за один вечер точно не разберёшься.\footnote{Goodfellow I., Bengio Y., Courville A. Deep learning. – MIT press, 2016.} В каких-то алгоритм был описан понятно, но оставалось много недосказанностей\footnote{Николенко С., Кадурин А., Архангельская Е. Глубокое обучение. Погружение в мир нейронных сетей - Санкт-Петербург, 2018.}. 33 | 34 | Маша решила, что для вечерних разборок нужно что-то более инфантильное. Тогда она решила поскрести по лёрнингу и собрать коллекцию ручных задачек, прорешивая которую, новые адепты Машиного лёрнинга могли бы открывать у себя диплернинговые чакры. Так и появилась эта виньетка. 35 | 36 | \tableofcontents 37 | 38 | \newpage 39 | 40 | \input{part_01_just_function.tex} 41 | 42 | \newpage 43 | 44 | \input{part_02_logloss_nn_out.tex} 45 | 46 | \newpage 47 | 48 | \input{part_03_gradient.tex} 49 | 50 | \newpage 51 | 52 | \input{part_04_backprop.tex} 53 | 54 | \newpage 55 | 56 | \input{part_05_lego.tex} 57 | 58 | \newpage 59 | 60 | \input{part_06_cnn.tex} 61 | 62 | \newpage 63 | 64 | \input{part_07_rnn.tex} 65 | 66 | \newpage 67 | 68 | \todo[inline]{какие-нибудь упражнения про w2v} 69 | 70 | \todo[inline]{упражнение про разные модные виды ячеек типа резнетов и тп} 71 | 72 | 73 | % там смысл такой - был какой-то исходный вектор emb, он описывал текст как-то, но описывал его не оч хорошо для нашей задачи. Хочется прогнать его через какой-то слой, который этот вектор подправит в соотвествии с лоссом. 74 | % F(x) на картинке это результат работы слоя, внутри него есть нелинейность. И мы считаем что F(x) это коррекция исходного вектора и когда ищем 75 | % x + F(x) то надеемся что инфа в исходном векторе немного подокрректируется и станет более пригодной для решения нашей задачи 76 | 77 | % а потом можно и нелинейность применить, по идее если до нелинейность воткнуть то это надо делать не с релу 78 | 79 | % потому что он часть координат занулит и мы поправим в x только часть координат из-за него и только в положительную сторону 80 | 81 | % что ухудшит обучение по идее 82 | 83 | % кстати прикольный вопрос, надо его в контрольную воткнуть на порассуждать студентоте 84 | 85 | % elu отрицательные значения допускает поэтому по идее не особо результат интуитивно изменится 86 | 87 | 88 | 89 | \todo[inline]{задачи про атеншны и тп} 90 | 91 | 92 | % \newpage 93 | 94 | % \input{task_list_matrix_diff.tex} 95 | 96 | % \section{Итоговый тест в стиле Носко} 97 | 98 | \end{document} 99 | 100 | 101 | 102 | All models are wrong, but some 103 | are useful. 104 | George E. P. Box 105 | 106 | Все, что случилось с нами, лишь пролог. 107 | — Уильям Шекспир, «Буря» -------------------------------------------------------------------------------- /part_02_logloss_nn_out.tex: -------------------------------------------------------------------------------- 1 | % !TEX root = main.tex 2 | 3 | %%%------------------------------------------- 4 | \section*{Листочек 2: что выплёвывает нейросеть} 5 | \addcontentsline{toc}{section}{Листочек 2: что выплёвывает нейросеть} 6 | 7 | \epigraph{Плюют в душу обычно те, кому не удалось в неё влезть.}{\textit{Пацанский паблик категории Б}} 8 | 9 | %%%------------------------------------------- 10 | \begin{problem}{(про сигмоиду)} 11 | Любую $s$-образную функцию называют сигмоидой. Наиболее сильно прославилась под таким названием функция $f(t) = \frac{e^t}{1 + e^t}.$ Слава о ней добралась до Маши и теперь она хочет немного поисследовать её свойства\footnote{Часть задач украдена отсюда: \url{https://github.com/bdemeshev/mlearn_pro}}. 12 | 13 | \begin{enumerate} 14 | \item Что происходит при $t \to +\infty$? А при $t \to -\infty$? 15 | \item Как связаны между собой $f(t)$ и $f(-t)$? 16 | \item Как связаны между собой $f'(t)$ и $f'(-t)$? 17 | \item Как связаны между собой $f(t)$ и $f'(t)$? 18 | \item Найдите $f(0)$, $f'(0)$ и $\ln f(0)$. 19 | \item Найдите обратную функцию $f^{-1}(t)$ 20 | \item Как связаны между собой $\frac{d\ln f(t)}{dt}$ и $f(-t)$? 21 | \item Постройте графики функций $f(t)$ и $f'(t)$. 22 | \item Говорят, что сигмоида --- это гладкий аналог единичной ступеньки. Попробуйте построить на компьютере графики $f(t), f(10\cdot t), f(100\cdot t), f(1000\cdot t)$. Как они себя ведут? 23 | \end{enumerate} 24 | \end{problem} 25 | 26 | % \newpage 27 | 28 | %%%------------------------------------------- 29 | \begin{problem}{(про $\logloss$)} 30 | У Маши три наблюдения, первое наблюдение --- кит, остальные --- муравьи. Киты кодируются $y_i = 1$, муравьи --- $y_i = 0$. В качестве регрессоров Маша берёт номера наблюдений $x_i = i$. После этого Маша оценивает логистическую регрессию с константой. В качестве функции потерь используются логистические потери. 31 | 32 | \begin{enumerate} 33 | \item Выпишите для данной задачи функцию потерь, которую минимизирует Маша. 34 | \item При каких оценках коэффициентов логистической регрессии эта функция достигает своего минимума? 35 | \end{enumerate} 36 | \end{problem} 37 | 38 | %%%------------------------------------------- 39 | \begin{problem}{(про $\softmax$)} 40 | Маша чуть внимательнее присмотрелась к своему третьему наблюдению и поняла, что это не кит, а бобёр. Теперь ей нужно решать задачу классификации на три класса. Она решил использовать для этого нейросеть с softmax-слоем на выходе. 41 | 42 | Маша уже обучила нейронную сетку и хочет построить прогнозы для двух наблюдений. Слой, который находится перед $\softmax$ выдал для этих двух наблюдений следующий результат: $(1, -2, 0)$ и $(0.5, -1, 0)$. 43 | 44 | \begin{enumerate} 45 | \item Чему равны вероятности получить кита, муравья и бобра для этих двух наблюдений? 46 | 47 | \item Пусть первым был кит, а вторым бобёр. Чему будет равна $\logloss$-ошибка? 48 | 49 | \item Пусть у Маши есть два класса. Она хочет выучить нейросеть. Она может учить нейронку с одним выходом и сигмоидой в качестве функции активации либо нейронку с двумя выходами и $\softmax$ в качестве функции активации. Как выходы этих двух нейронок взаимосвязаны между собой? 50 | 51 | \item Объясните, почему $\softmax$ считают сглаженным вариантом максимума. 52 | \end{enumerate} 53 | \end{problem} 54 | 55 | % \begin{sol} 56 | % В решении нарисовать изокванты 57 | % http://www.johndcook.com/blog/2010/01/13/soft-maximum/ 58 | 59 | % Чтобы найти максимум мы обычно используем функцию $f(x,y) = \max(x,y)$. Давайте нарисуем линии уровня такой функции. Они будут острыми 60 | 61 | % \todo[inline]{Картинка} 62 | 63 | % Теперь рассмотрим мягкий максимум $f(x, y) = e^x$ 64 | 65 | 66 | % % [1,−2,0]→[e1,e−2,e0]=[2.71,0.14,1]→[0.7,0.04,0.26] 67 | % % [0.5,−1,0]→[e0.5,e−1,e0]=[1.65,0.37,1]→[0.55,0.12,0.33] 68 | 69 | 70 | %\begin{frame}{Важный нюанс} 71 | %\begin{wideitemize} 72 | %\item При поиске Softmax мы ищем экспоненты, в памяти компьютера может произойти переполнение из-за больших чисел 73 | % 74 | %\item Если добавить ко всем входам нейронки одинаковую константу, значение Sofrmax не изменится: 75 | % 76 | %\[ 77 | %\frac{e^{z_i + c}}{\sum_{k=1}^K e^{z_k + c}} = \frac{ e^c \cdot e^{z_i } }{e^c \cdot \sum_{k=1}^K e^{z_k} } = \frac{e^{z_i}}{\sum_{k=1}^K e^{z_k }} 78 | %\] 79 | % 80 | %\item Обычно считают устойчивый к переполнению Softmax: 81 | % 82 | %\[ 83 | %\Softmax(z_1, \ldots, z_{K}) = \Softmax(z_1 - \max_i (z_i), \ldots, z_{K} - \max_i (z_i)) 84 | %\] 85 | % 86 | %\end{wideitemize} 87 | %\end{frame} 88 | 89 | % \end{sol} 90 | 91 | %%%------------------------------------------- 92 | \begin{problem}{(про разные выходы)} 93 | Та, в чьих руках находится лёрнинг, решила немного поэкспериментировать с выходами из своей сетки. 94 | 95 | \begin{enumerate} 96 | \item Для начала Маша решила, что хочет решать задачу классификации на два класса и получать на выходе вероятность принадлежности к первому. Что ей надо сделать с последним слоем сетки? 97 | 98 | \item Теперь Маша хочет решать задачу классификации на $K$ классов. Что ей делать с последним слоем? 99 | 100 | \item Новые вводные! Маша хочет спрогнозировать рейтинг фильма на "Кинопоиске". Он измеряется по шкале от $0$ до $10$ и принимает любое непрерывное значение. Как Маша может приспособить для этого свою нейронку? 101 | 102 | \item У Маши есть куча новостей. Каждая новость может быть спортивной, политической или экономической. Иногда новость может относится сразу к нескольким категориям. Как Маше собрать нейросетку для решения этой задачи? Как будет выглядеть при этом функция ошибки? 103 | 104 | \item У Маши есть картинки с уточками и чайками. Маша хочет научить нейросеть искать на картинке птицу, обводить её в прямоугольник (bounding box), а затем классифицировать то, что попало в прямоугольник. Как должен выглядеть выход из такой нейросети? Как должна выглядеть функция потерь? 105 | 106 | \item Маша задумалась, как можно спрогнозировать число людей в кафе так, чтобы на выходе сетка всегда прогнозировала целое число. Надо ли как-то при этом менять функцию потерь? 107 | 108 | \textbf{Hint:} вспомните про пуассоновскую регрессию. 109 | \end{enumerate} 110 | \end{problem} 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /part_07_rnn.tex: -------------------------------------------------------------------------------- 1 | % !TEX root = main.tex 2 | 3 | %%%------------------------------------------- 4 | \section*{Листочек 7: рекуррентные сети} 5 | 6 | \addcontentsline{toc}{section}{Листочек 7: рекуррентные сети} 7 | 8 | \epigraph{А сегодня в завтрашний день, не все могут смотреть. Вернее смотреть могут не только лишь все, не каждый может это делать.}{\textit{Рекуррентная сеть глубины один}} 9 | 10 | 11 | \begin{problem}{(Туда и обратно)} 12 | Маша хочет сделать шаг обратного распространения ошибки через рекуррентную ячейку для последовательности $y_0 = 0, y_1=1, y_2 = -1, y_3 =2$. Скрытое состояние инициализировано как $h_0 = 0$. Все веса инициализированы как $0.5$. Во всех уравнениях, описывающих ячейку нет констант. В качестве функций активаций Маша использует $ReLU$. В качестве функции потерь Маша использует $MSE$. 13 | 14 | \begin{center} 15 | \definecolor{zzttqq}{rgb}{0.6,0.2,0.} 16 | \begin{tikzpicture}[scale=0.6] 17 | \fill[line width=2.pt,color=zzttqq,fill=zzttqq,fill opacity=0.10000000149011612] (2.,8.) -- (2.,6.) -- (4.,6.) -- (4.,8.) -- cycle; 18 | \draw (3.,3.) circle (1.cm); 19 | \draw [color=zzttqq] (2.,8.)-- (2.,6.); 20 | \draw [color=zzttqq] (2.,6.)-- (4.,6.); 21 | \draw [color=zzttqq] (4.,6.)-- (4.,8.); 22 | \draw [color=zzttqq] (4.,8.)-- (2.,8.); 23 | \draw (3,11) circle (1.cm); 24 | \draw [->] (3,4) -- (3,6); 25 | \draw [->] (3,8) -- (3,10); 26 | \draw [shift={(4.45,7.)}] plot[domain=-2.541806576912956:2.541806576912956,variable=\t]({1.*1.7715861960215864*cos(\t r)+0.*1.7715861960215864*sin(\t r)},{0.*1.7715861960215864*cos(\t r)+1.*1.7715861960215864*sin(\t r)}); 27 | \draw [->] (3.4,5.6) -- (3,6.); 28 | \draw (2.2,3.5) node[anchor=north west] {$y_{t-1}$}; 29 | \draw (2.4,11.5) node[anchor=north west] {$y_t$}; 30 | \draw (6.3,7.8) node[anchor=north east] {$0.5$}; 31 | \draw (2.4,7.6) node[anchor=north west] {$h_t$}; 32 | \draw (1.7,9.7) node[anchor=north west] {$0.5$}; 33 | \draw (1.7,5.6) node[anchor=north west] {$0.5$}; 34 | \end{tikzpicture} 35 | \end{center} 36 | 37 | \begin{enumerate} 38 | \item Сделайте прямой шаг через ячейку. Для каждого элемента последовательности постройте прогноз. Посчитайте значение ошибки. 39 | \item Сделайте обратный шаг распространения ошибки. Посчитайте для каждого из весов градиенты и обновите значения весов. 40 | \end{enumerate} 41 | \end{problem} 42 | 43 | 44 | \begin{problem}{(Число параметров)} 45 | У Маши есть очень длинный временной ряд. Она хочет обучить несколько нейросетей предсказывать его дальнейшее значение. В своих моделях Маша нигде не использует константы. 46 | 47 | \begin{enumerate} 48 | \item Маша выделяет окно длины $100$. Оно движется по последовательности. Для каждого окна Маша предсказывает следующее значение в ряду. В сетку подаются наблюдения с $1-$го по $100-$е. Прогнозируется $101-$ое наблюдение. Затем на вход подаются наблюдения со $2-$го по $100-$е. Прогнозируется $102-$ое наблюдение. И так далее до конца последовательности. 49 | 50 | На первом слое используется $20$ нейронов. На втором слое используется один нейрон. Сколько параметров нужно оценить? 51 | % 100*20 + 20*1 = 2020 52 | 53 | \item Маша использует одну простую RNN-ячейку. Сколько параметров ей необходимо оценить? 54 | % 3 55 | 56 | \item Маша хочет предсказывать значение $y_t$ по трём последовательностям $y_{t-1},$ $y_{t-2}$ и $y_{t-3}.$ На первом слое сети Маша использует два рекуррентных нейрона. На втором слое она использует один рекуррентный нейрон. Матрица какого размера идёт на вход в первый слой? Матрица какого размера передаётся во второй слой? Какое число параметров необходимо оценить Маше? 57 | 58 | \item Мы находимся в условиях прошлого пункта, но используетм LSTM-ячейки с забыванием. Сколько параметров надо оценить? 59 | 60 | \item Мы находимся в условиях прошлого пугкта, но используем GRU-ячейки. Сколько параметров надо оценить? 61 | \end{enumerate} 62 | \end{problem} 63 | 64 | 65 | \begin{problem}{(Из картинки в формулу)} 66 | У Маши есть два рекуррентных нейрона. Помогите ей изобразить их в виде вычислительных графов. 67 | 68 | \begin{minipage}{0.45\linewidth} 69 | \textbf{Однонаправленный:} 70 | \begin{equation*} 71 | \begin{aligned} 72 | h_t =& f_h(b_h + W \cdot h_{t-1} + V \cdot x_t)\\ 73 | y_t =& f_y(b_y + U \cdot h_t) 74 | \end{aligned} 75 | \end{equation*} 76 | \end{minipage} 77 | \hfill 78 | \begin{minipage}{0.45\linewidth} 79 | \textbf{Двунаправленный:} 80 | \begin{equation*} 81 | \begin{aligned} 82 | h_t =& f_h(b_h + W \cdot h_{t-1} + V \cdot x_t)\\ 83 | s_t =& f_s(b_s + W' \cdot s_{t+1} + V' \cdot x_t)\\ 84 | o_t =& b_y + U \cdot h_t + U' \cdot s_t \\ 85 | y_t =& f_y(o_t) 86 | \end{aligned} 87 | \end{equation*} 88 | \end{minipage} 89 | 90 | \end{problem} 91 | 92 | \begin{problem}{(Замочные скважины)} 93 | В 2000 году Шмидхубер и Герс предложили модификацию LSTM с замочными скважинами. Она описывается следующей системой из уравнений 94 | 95 | \begin{equation*} 96 | \begin{aligned} 97 | c'_t &= \phi_c(W_c x_t + V_c h_{t-1} + b_c) \\ 98 | i_t &= \phi_i(W_i x_t + V_i h_{t-1} + U_i c_{t-1} + b_i) \\ 99 | f_t &= \phi_f(W_f x_t + V_f h_{t-1} + U_f c_{t-1} + b_f) \\ 100 | o_t &= \phi_o(W_o x_t + V_o h_{t-1} + U_o c_{t-1} + b_o) \\ 101 | c_t &= f_t \odot c_{t-1} + i_t \odot c'_t \\ 102 | h_t &= o_t \odot \phi_h(c_t) \\ 103 | \end{aligned} 104 | \end{equation*} 105 | 106 | Изобразите эту ячейку в виде вычислительного графа. Объясните, чем именно она отличается от базовой модификации LSTM. Какой в этом смысл? 107 | \end{problem} 108 | 109 | 110 | \begin{problem}{(Лишние части)} 111 | Выпишите уравнения, описывающие LSTM-ячейку с забыванием и GRU-ячейку. Какие последовательности и веса нужно занулить, чтобы эти ячейки превратились в простую RNN-ячейку? 112 | \end{problem} 113 | 114 | 115 | \newpage 116 | 117 | 118 | 119 | \begin{center} 120 | \begin{tikzpicture} 121 | \tikzstyle{place}=[circle, draw=black, minimum size = 12mm] 122 | \tikzstyle{placeh}=[minimum height=32pt,minimum width=32pt, inner sep=2pt, draw=black] 123 | 124 | \node at (-1.2,0) (here) {}; 125 | 126 | \draw node at (0, 2) [place, fill=blue, opacity=0.1] (y) {$\hat y_{t-2}$}; 127 | \draw node at (0, 2) [place] {$\hat y_{t-2}$}; % мои костыли максимально всратые 128 | \draw node at (0, 0) [placeh, fill=red, opacity=0.1] (h) {$h_{t-2}$}; 129 | \draw node at (0, 0) [placeh] {$h_{t-2}$}; 130 | \draw node at (0, -2) [place, fill=green, opacity=0.1] (x) {$x_{t-2}$}; 131 | \draw node at (0, -2) [place] {$x_{t-2}$}; 132 | 133 | \draw [->] (here) to node[above]{$W$} (h); 134 | \draw [->] (x) to node[left]{$V$} (h); 135 | \draw [->] (h) to node[left]{$U$} (y); 136 | 137 | \draw node at (2, 2) [place, fill=blue, opacity=0.1] (y1) {$\hat y_{t-1}$}; 138 | \draw node at (2, 2) [place] {$\hat y_{t-1}$}; % мои костыли максимально всратые 139 | \draw node at (2, 0) [placeh, fill=red, opacity=0.1] (h1) {$h_{t-1}$}; 140 | \draw node at (2, 0) [placeh] {$h_{t-1}$}; 141 | \draw node at (2, -2) [place, fill=green, opacity=0.1] (x1) {$x_{t-1}$}; 142 | \draw node at (2, -2) [place] {$x_{t-1}$}; 143 | 144 | \draw [->] (h) to node[above]{$W$} (h1); 145 | \draw [->] (x1) to node[left]{$V$} (h1); 146 | \draw [->] (h1) to node[left]{$U$} (y1); 147 | 148 | \draw node at (4, 2) [place, fill=blue, opacity=0.1] (y2) {$\hat y_{t}$}; 149 | \draw node at (4, 2) [place] {$\hat y_{t}$}; % мои костыли максимально всратые 150 | \draw node at (4, 0) [placeh, fill=red, opacity=0.1] (h2) {$h_{t}$}; 151 | \draw node at (4, 0) [placeh] {$h_{t}$}; 152 | \draw node at (4, -2) [place, fill=green, opacity=0.1] (x2) {$x_{t}$}; 153 | \draw node at (4, -2) [place] {$x_{t}$}; 154 | 155 | \draw [->] (h1) to node[above]{$W$} (h2); 156 | \draw [->] (x2) to node[left]{$V$} (h2); 157 | \draw [->] (h2) to node[left]{$U$} (y2); 158 | 159 | 160 | \draw node at (6, 2) [place, fill=blue, opacity=0.1] (y3) {$\hat y_{t+1}$}; 161 | \draw node at (6, 2) [place] {$\hat y_{t+1}$}; % мои костыли максимально всратые 162 | \draw node at (6, 0) [placeh, fill=red, opacity=0.1] (h3) {$h_{t+1}$}; 163 | \draw node at (6, 0) [placeh] {$h_{t+1}$}; 164 | \draw node at (6, -2) [place, fill=green, opacity=0.1] (x3) {$x_{t+1}$}; 165 | \draw node at (6, -2) [place] {$x_{t+1}$}; 166 | 167 | \draw [->] (h2) to node[above]{$W$} (h3); 168 | \draw [->] (x3) to node[left]{$V$} (h3); 169 | \draw [->] (h3) to node[left]{$U$} (y3); 170 | 171 | \node at (7.2,0) (end) {}; 172 | \draw [->] (h3) to node[above]{$W$} (end); 173 | \end{tikzpicture} 174 | \end{center} 175 | 176 | 177 | % https://tex.stackexchange.com/questions/432312/how-do-i-draw-an-lstm-cell-in-tikz/432344 178 | 179 | 180 | -------------------------------------------------------------------------------- /preamble.tex: -------------------------------------------------------------------------------- 1 | % !TEX root = main.tex 2 | 3 | % пакеты для математики 4 | \usepackage{amsmath,amsfonts,amssymb,amsthm,mathtools} 5 | \mathtoolsset{showonlyrefs=true} % Показывать номера только у тех формул, на которые есть \eqref{} в тексте. 6 | 7 | \usepackage[british,russian]{babel} % выбор языка для документа 8 | \usepackage[utf8]{inputenc} % utf8 кодировка 9 | 10 | % Основные шрифты 11 | \usepackage{fontspec} 12 | \setmainfont{Linux Libertine O} % задаёт основной шрифт документа 13 | 14 | % Математические шрифты 15 | \usepackage{unicode-math} 16 | \setmathfont[math-style=upright]{[Neo Euler.otf]} 17 | 18 | %%%%%%%%%% Работа с картинками и таблицами %%%%%%%%%% 19 | \usepackage{graphicx} % Для вставки рисунков 20 | \usepackage{graphics} 21 | \graphicspath{{images/}{pictures/}} % папки с картинками 22 | 23 | \usepackage[figurename=Картинка]{caption} 24 | 25 | \usepackage{wrapfig} % обтекание рисунков и таблиц текстом 26 | 27 | \usepackage{booktabs} % таблицы как в годных книгах 28 | \usepackage{tabularx} % новые типы колонок 29 | \usepackage{tabulary} % и ещё новые типы колонок 30 | \usepackage{float} % возможность позиционировать объекты в нужном месте 31 | \renewcommand{\arraystretch}{1.2} % больше расстояние между строками 32 | 33 | 34 | %%%%%%%%%% Графики и рисование %%%%%%%%%% 35 | \usepackage{tikz, pgfplots} % языки для графики 36 | %\pgfplotsset{compat=1.16} 37 | 38 | \usepackage{todonotes} % для вставки в документ заметок о том, что осталось сделать 39 | % \todo{Здесь надо коэффициенты исправить} 40 | % \missingfigure{Здесь будет Последний день Помпеи} 41 | % \listoftodos --- печатает все поставленные \todo'шки 42 | 43 | 44 | %%%%%%%%%% Внешний вид страницы %%%%%%%%%% 45 | 46 | \usepackage[paper=a4paper, top=20mm, bottom=15mm,left=20mm,right=15mm]{geometry} 47 | \usepackage{indentfirst} % установка отступа в первом абзаце главы 48 | 49 | \usepackage{setspace} 50 | \setstretch{1.15} % межстрочный интервал 51 | \setlength{\parskip}{4mm} % Расстояние между абзацами 52 | % Разные длины в LaTeX: https://en.wikibooks.org/wiki/LaTeX/Lengths 53 | 54 | % свешиваем пунктуацию 55 | % теперь знаки пунктуации могут вылезать за правую границу текста, при этом текст выглядит ровнее 56 | \usepackage{microtype} 57 | 58 | % \flushbottom % Эта команда заставляет LaTeX чуть растягивать строки, чтобы получить идеально прямоугольную страницу 59 | \righthyphenmin=2 % Разрешение переноса двух и более символов 60 | \widowpenalty=300 % Небольшое наказание за вдовствующую строку (одна строка абзаца на этой странице, остальное --- на следующей) 61 | \clubpenalty=3000 % Приличное наказание за сиротствующую строку (омерзительно висящая одинокая строка в начале страницы) 62 | \tolerance=10000 % Ещё какое-то наказание. 63 | 64 | % мои цвета https://www.artlebedev.ru/colors/ 65 | \definecolor{titleblue}{rgb}{0.2,0.4,0.6} 66 | % \definecolor{blue}{rgb}{0.2,0.4,0.6} 67 | % \definecolor{red}{rgb}{1,0,0.2} 68 | % \definecolor{green}{rgb}{0,0.6,0} 69 | \definecolor{purp}{rgb}{0.4,0,0.8} 70 | 71 | \definecolor{blue}{RGB}{0,114,178} 72 | \definecolor{red}{RGB}{213,94,0} 73 | \definecolor{yellow}{RGB}{240,228,66} 74 | \definecolor{green}{RGB}{0,128, 0} 75 | 76 | \definecolor{amethyst}{rgb}{0.6, 0.4, 0.8} 77 | \definecolor{junglegreen}{rgb}{0.16, 0.67, 0.53} 78 | 79 | 80 | % цвета из geogebra 81 | \definecolor{litebrown}{rgb}{0.6,0.2,0} 82 | \definecolor{darkbrown}{rgb}{0.75,0.75,0.75} 83 | 84 | % Гиперссылки 85 | \usepackage{xcolor} % разные цвета 86 | 87 | \usepackage{hyperref} 88 | \hypersetup{ 89 | unicode=true, % позволяет использовать юникодные символы 90 | colorlinks=true, % true - цветные ссылки 91 | urlcolor=blue, % цвет ссылки на url 92 | linkcolor=black, % внутренние ссылки 93 | citecolor=green, % на библиографию 94 | breaklinks % если ссылка не умещается в одну строку, разбивать её на две части? 95 | } 96 | 97 | % меняю оформление секций 98 | \usepackage{titlesec} 99 | \usepackage{sectsty} 100 | 101 | % меняю цвет на синий 102 | \sectionfont{\color{titleblue}} 103 | \subsectionfont{\color{titleblue}} 104 | 105 | % выбрасываю нумерацию страниц и колонтитулы 106 | % \pagestyle{empty} 107 | 108 | % синие круглые бульпоинты в списках itemize 109 | \usepackage{enumitem} 110 | 111 | \definecolor{itemizeblue}{rgb}{0, 0.45, 0.70} 112 | 113 | \newcommand*{\MyPoint}{\tikz \draw [baseline, fill=itemizeblue, draw=blue] circle (2.5pt);} 114 | \renewcommand{\labelitemi}{\MyPoint} 115 | 116 | \AddEnumerateCounter{\asbuk}{\@asbuk}{\cyrm} 117 | \renewcommand{\theenumi}{\asbuk{enumi}} 118 | 119 | % расстояние в списках 120 | \setlist[itemize]{parsep=0.4em,itemsep=0em,topsep=0ex} 121 | \setlist[enumerate]{parsep=0.4em,itemsep=0em,topsep=0ex} 122 | 123 | % эпиграфы 124 | \usepackage{epigraph} 125 | \setlength\epigraphwidth{.6\textwidth} 126 | \setlength\epigraphrule{0pt} 127 | 128 | 129 | %%%%%%%%%% Свои команды %%%%%%%%%% 130 | 131 | % Математические операторы первой необходимости: 132 | \DeclareMathOperator{\sgn}{sign} 133 | \DeclareMathOperator*{\argmin}{arg\,min} 134 | \DeclareMathOperator*{\argmax}{arg\,max} 135 | \DeclareMathOperator{\Cov}{Cov} 136 | \DeclareMathOperator{\Var}{Var} 137 | \DeclareMathOperator{\Corr}{Corr} 138 | \DeclareMathOperator{\E}{\mathop{E}} 139 | \DeclareMathOperator{\Med}{Med} 140 | \DeclareMathOperator{\Mod}{Mod} 141 | \DeclareMathOperator*{\plim}{plim} 142 | \DeclareMathOperator{\tr}{tr} 143 | 144 | \DeclareMathOperator{\logloss}{logloss} 145 | \DeclareMathOperator{\softmax}{softmax} 146 | 147 | 148 | % команды пореже 149 | \newcommand{\const}{\mathrm{const}} % const прямым начертанием 150 | \newcommand{\iid}{\sim i.\,i.\,d.} % ну вы поняли... 151 | \newcommand{\fr}[2]{\ensuremath{^{#1}/_{#2}}} % особая дробь 152 | \newcommand{\ind}[1]{\mathbbm{1}_{\{#1\}}} % Индикатор события 153 | \newcommand{\dx}[1]{\,\mathrm{d}#1} % для интеграла: маленький отступ и прямая d 154 | 155 | % одеваем шапки на частые штуки 156 | \def \hb{\hat{\beta}} 157 | \def \hs{\hat{s}} 158 | \def \hy{\hat{y}} 159 | \def \hY{\hat{Y}} 160 | \def \he{\hat{\varepsilon}} 161 | \def \hVar{\widehat{\Var}} 162 | \def \hCorr{\widehat{\Corr}} 163 | \def \hCov{\widehat{\Cov}} 164 | 165 | % Греческие буквы 166 | \def \a{\alpha} 167 | \def \b{\beta} 168 | \def \t{\tau} 169 | \def \dt{\delta} 170 | \def \e{\varepsilon} 171 | \def \ga{\gamma} 172 | \def \kp{\varkappa} 173 | \def \la{\lambda} 174 | \def \sg{\sigma} 175 | \def \tt{\theta} 176 | \def \Dt{\Delta} 177 | \def \La{\Lambda} 178 | \def \Sg{\Sigma} 179 | \def \Tt{\Theta} 180 | \def \Om{\Omega} 181 | \def \om{\omega} 182 | 183 | % Готика 184 | \def \mA{\mathcal{A}} 185 | \def \mB{\mathcal{B}} 186 | \def \mC{\mathcal{C}} 187 | \def \mE{\mathcal{E}} 188 | \def \mF{\mathcal{F}} 189 | \def \mH{\mathcal{H}} 190 | \def \mL{\mathcal{L}} 191 | \def \mN{\mathcal{N}} 192 | \def \mU{\mathcal{U}} 193 | \def \mV{\mathcal{V}} 194 | \def \mW{\mathcal{W}} 195 | 196 | % Жирные буквы 197 | \def \mbb{\mathbb} 198 | \def \RR{\mbb R} 199 | \def \NN{\mbb N} 200 | \def \ZZ{\mbb Z} 201 | \def \PP{\mbb{P}} 202 | \def \QQ{\mbb Q} 203 | 204 | %%%%%%%%%% Теоремы %%%%%%%%%% 205 | \theoremstyle{plain} % Это стиль по умолчанию. Есть другие стили. 206 | \newtheorem{theorem}{Теорема}[section] 207 | \newtheorem{result}{Следствие}[theorem] 208 | % счётчик подчиняется теоремному, нумерация идёт по главам согласованно между собой 209 | 210 | % убирает курсив и что-то еще наверное делает ;) 211 | \theoremstyle{definition} 212 | \newtheorem*{definition}{Определение} % нумерация не идёт вообще 213 | 214 | 215 | %%%%%%%%%% Задачки и решения %%%%%%%%%% 216 | \usepackage{etoolbox} % логические операторы для своих макросов 217 | \usepackage{environ} 218 | \newtoggle{lecture} 219 | 220 | \newcounter{probNum}[section] % счётчик для упражнений 221 | \NewEnviron{problem}[1]{% 222 | \refstepcounter{probNum}% увеличели номер на 1 223 | {\noindent \textbf{\large \color{titleblue} Упражнение~\theprobNum~#1} \\ \\ \BODY} 224 | {}% 225 | } 226 | 227 | % Окружение, чтобы можно было убирать решения из pdf 228 | \NewEnviron{sol}{% 229 | \iftoggle{lecture} 230 | {\noindent \textbf{\large Решение:} \\ \\ \BODY} 231 | {}% 232 | } 233 | 234 | % выделение по тексту важных вещей 235 | \newcommand{\indef}[1]{\textbf{ \color{green} #1}} 236 | 237 | % разные дополнения для картинок 238 | \usetikzlibrary{arrows.meta} 239 | \usepackage{varwidth} 240 | 241 | % рисование крестов 242 | % https://tex.stackexchange.com/questions/123760/draw-crosses-in-tikz 243 | \tikzset{ 244 | cross/.pic = { 245 | \draw[line width=2.pt, rotate = 45] (-#1,0) -- (#1,0); 246 | \draw[line width=2.pt, rotate = 45] (0,-#1) -- (0, #1); 247 | } 248 | } 249 | 250 | \usepackage[normalem]{ulem} % для зачекивания текста 251 | 252 | \usepackage{pgfplots} %http://www.ctan.org/pkg/pgfplots 253 | \pgfplotsset{compat=newest, set layers=standard} 254 | 255 | \usetikzlibrary{shapes,snakes,backgrounds,arrows} 256 | %\usepackage{verbatim} 257 | \usepackage{minted} 258 | \usepackage{alltt} 259 | -------------------------------------------------------------------------------- /part_03_gradient.tex: -------------------------------------------------------------------------------- 1 | % !TEX root = main.tex 2 | 3 | %%%------------------------------------------- 4 | \section*{Листочек 3: пятьдесят оттенков градиентного спуска} 5 | \addcontentsline{toc}{section}{Листочек 3: пятьдесят оттенков градиентного спуска} 6 | 7 | \epigraph{Повторять до сходимости --- это как жарить до готовности}{\textit{Неизвестный студент Вышки}} 8 | 9 | \begin{problem}{(50 оттенков спуска)} 10 | Маша Нестерова, хозяйка машин лёрнинга\footnote{Лёрнинг ей папа подарил}, собрала два наблюдения: $x_1 = 1, x_2 = 2$, $y_1 = 2, y_2 = 3$ и собирается обучить линейную регрессию $y = w \cdot x$. Маша очень хрупкая девушка, и ей не помешает помощь. 11 | 12 | \begin{enumerate} 13 | \item Получите теоретическую оценку методом наименьших квадратов. 14 | 15 | \item Сделайте три шага градиентного спуска. В качестве стартовой точки используйте $w_0 = 0$. В качестве скорости обучения возьмите $\eta = 0.1$. 16 | 17 | \item Сделайте четыре шага стохастического градиентного спуска. Пусть в SGD сначала попадает первое наблюдение, затем второе. 18 | 19 | \item Если вы добрались до этого пункта, вы поняли градиентный спуск. Маша довольна. Начинаем заниматься тупой технической бессмыслицей. Сделайте два шага Momentum SGD. Возьмите $\alpha = 0.9, \eta = 0.1$ 20 | 21 | \item Сделайте два шага Momentum SGD с коррекцией Нестерова. 22 | 23 | \item Сделайте два шага RMSprop. Возьмите $\alpha = 0.9, \eta = 0.1$ 24 | 25 | \item Сделайте два шага Adam. Возьмём $\beta_1 = \beta_2 = 0.9, \eta = 0.1$ 26 | \end{enumerate} 27 | \end{problem} 28 | 29 | \begin{sol} 30 | \begin{enumerate} 31 | \item Найдём теоретическую оценку стандартным МНК. Минимизируем MSE: 32 | 33 | \[ 34 | MSE = \frac{1}{2} \cdot ((2 - w)^2 + (3 - 2 w)^2) \to \min_{w} 35 | \] 36 | 37 | Берём производную, решаем уравнение и получаем ответ: 38 | \[ 39 | - (2 - w) - 2 (3 - 2 w) = 0 \Rightarrow \hat w = \frac{8}{5} = 1.6 40 | \] 41 | 42 | \item Чтобы сделать три шага градиентного спуска, нужно найти градиент. Наша функция потерь выглядит как 43 | 44 | \[ 45 | L(w) = (y - w x)^2. 46 | \] 47 | 48 | Мы подбираем один параметр, значит градиентом в данном случае будет просто одно число --- производная по этому параметру. 49 | 50 | \[ 51 | \nabla L(w_0, x, y) = \frac{\partial L}{\partial w} = -2 x (y - w x). 52 | \] 53 | 54 | Стартовая точка $w_0 = 0$. Мы хотим сделать шаг 55 | 56 | \[ 57 | w_1 = w_0 - \eta \cdot \nabla L(w_0) 58 | \] 59 | 60 | Посчитаем градиент в точке $w_0$ по всей выборке: 61 | 62 | \[ 63 | \nabla L(w_0) = \frac{1}{n} \cdot \sum_{i = 1}^n \nabla L(w_0, x_i, y_i) = \frac{1}{2} \cdot (-2(2- w_0) - 2\cdot 2(3 - 2 w_0)) = -8 64 | \] 65 | 66 | Делаем \textbf{первый шаг:} 67 | 68 | \[ 69 | w_1 = 0 + 0.1 \cdot 8 = 0.8 70 | \] 71 | 72 | По аналогии, \textbf{второй шаг:} 73 | \begin{equation*} 74 | \begin{aligned} 75 | & \nabla L(w_1) = \frac{1}{2} \cdot (-2(2 - w_1) - 2\cdot 2(3 - 2 w_1)) = -4 \\ 76 | & w_2 = w_1 - \eta \cdot \nabla L(w_1) = 0.8 + 0.1 \cdot 4 = 1.2 77 | \end{aligned} 78 | \end{equation*} 79 | 80 | По аналогии, \textbf{третий шаг:} 81 | \begin{equation*} 82 | \begin{aligned} 83 | & \nabla L(w_2) = \frac{1}{2} \cdot (-2(2 - w_2) - 2\cdot 2(3 - 2 w_2)) = -2 \\ 84 | & w_3 = w_2 - \eta \cdot \nabla L(w_2) = 1.2 + 0.1 \cdot 2 = 1.4 85 | \end{aligned} 86 | \end{equation*} 87 | 88 | \item Теперь то же самое, на градиентный спуск стохастический. Мы будем считать $\nabla(w_t)$ не как среднее по всей выборке, а как значение градиента в одной случайно выбранной точке. 89 | 90 | \textbf{Первый шаг:} 91 | \begin{equation*} 92 | \begin{aligned} 93 | & \nabla L(w_0) = -2(2 - w_0 \cdot 1) = -4 \\ 94 | & \beta_1 = w_0 - \eta \cdot \nabla L(w_0) = 0 + 0.1 \cdot 4 = 0.4 95 | \end{aligned} 96 | \end{equation*} 97 | 98 | \textbf{Второй шаг:} 99 | \begin{equation*} 100 | \begin{aligned} 101 | & \nabla L(w_1) = -2 \cdot 2 \cdot (3 - w_1 \cdot 2) = - 8.8 \\ 102 | & w_2 = w_1 - \eta \cdot \nabla L(w_1) = 0.4 + 0.1 \cdot 8.8 = 1.28 103 | \end{aligned} 104 | \end{equation*} 105 | 106 | \textbf{Третий шаг:} 107 | \begin{equation*} 108 | \begin{aligned} 109 | & \nabla L(w_2) = -2(2 - w_1 \cdot 1) = -1.44 \\ 110 | & w_3 = w_2 - \eta \cdot \nabla L(w_2) = 1.28 + 0.144 = 1.424 111 | \end{aligned} 112 | \end{equation*} 113 | 114 | \textbf{Четвёртый шаг:} 115 | \begin{equation*} 116 | \begin{aligned} 117 | & \nabla L(w_3) = -2 \cdot 2(3 - w_3 \cdot 2) \\ 118 | & w_4 = w_3 - \eta \cdot \nabla L(w_4) = 1.424 + 0.1 \cdot 0.608 = 1.4848 119 | \end{aligned} 120 | \end{equation*} 121 | 122 | \item Автор не очень хочет расписывать решение дальнейших четырёх пунктов. Но вы обязательно это сделайте. 123 | \end{enumerate} 124 | \end{sol} 125 | 126 | 127 | %%%%------------------------------------------- 128 | \begin{problem}{(логистическая регрессия)} 129 | Маша решила, что нет смысла останавливаться на обычной регрессии, когда она знает, что есть ещё и логистическая: 130 | 131 | \begin{equation*} 132 | \begin{aligned} 133 | & z = w \cdot x \qquad p = P(y = 1) = \frac{1}{1 + e^{-z}} \\ 134 | & \logloss = -[ y \cdot \ln p + (1 - y) \cdot \ln (1 - p) ] 135 | \end{aligned} 136 | \end{equation*} 137 | 138 | Запишите формулу, по которой можно пересчитывать веса в ходе градиентного спуска для логистической регрессии. 139 | 140 | Оказалось, что $x = -5$, а $y = 1$. Сделайте один шаг градиентного спуска, если $w_0 = 1$, а скорость обучения $\gamma = 0.01$. 141 | \end{problem} 142 | 143 | \begin{sol} 144 | Сначала нам надо найти $\logloss'_{\beta}$. В принципе в этом и заключается вся сложность задачки. Давайте подставим вместо $\hat p $ в $\logloss$ сигмоиду. 145 | 146 | $$ 147 | \logloss = -1 \left (y \cdot \ln \left( \frac{1}{1 + e^{-z}} \right) + (1 - y) \cdot \ln \left ( 1 - \frac{1}{1 + e^{-z}} \right ) \right) 148 | $$ 149 | 150 | Теперь подставим вместо $z$ уравнение регрессии: 151 | 152 | 153 | $$ 154 | \logloss = -1 \left (y \cdot \ln \left( \frac{1}{1 + e^{-w \cdot x}} \right) + (1 - y) \cdot \ln \left ( 1 - \frac{1}{1 + e^{- w \cdot x}} \right ) \right) 155 | $$ 156 | 157 | Это и есть наша функция потерь. От неё нам нужно найти производную. Давайте подготовимся. 158 | 159 | \indef{Делай раз,} найдём производную $\logloss$ по $\hat p$: 160 | $$ 161 | \logloss'_{\hat p} = -1 \left(y \cdot \frac{1}{\hat p} - (1 - y) \cdot \frac{1}{(1 - p)} \right) 162 | $$ 163 | 164 | \indef{Делай два,} найдём производную $\frac{1}{1 + e^{-w x}} $ по $w$: 165 | \begin{multline*} 166 | \left( \frac{1}{1 + e^{-w x}} \right)'_{w} = - \frac{1}{(1 + e^{-w x})^2} \cdot e^{-w x} \cdot (-x) =\frac{1}{1 + e^{-w x}} \cdot \frac{e^{-w x}}{1 + e^{-w x}} \cdot x = \\ = \frac{1}{1 + e^{-w x}} \cdot \left(1 - \frac{1}{1 + e^{-w x}} \right) \cdot x 167 | \end{multline*} 168 | 169 | По-другому это можно записать как $\hat p \cdot (1 - \hat p) \cdot x$. 170 | 171 | \indef{Делай три,} находим полную производную: 172 | \begin{multline*} 173 | \logloss'_{\beta} = -1 \left(y \cdot \frac{1}{\hat p} \cdot \hat p \cdot \left(1 - \hat p) \right) \cdot x - (1 - y) \cdot \frac{1}{(1 - \hat p)} \cdot \hat p \cdot \left(1 - \hat p) \right) \cdot x \right) = \\ = -y \cdot \left( 1 - \hat p \right) \cdot x + (1 - y) \cdot \hat p \cdot x = (-y + y \hat p + \hat p - y \hat p ) \cdot x = (\hat p - y) \cdot x 174 | \end{multline*} 175 | 176 | Найдём значение производной в точке $w_0 = 1$ для нашего наблюдения $x = -5, y=1$: 177 | $$ 178 | \left(\frac{1}{1 + e^{-1 \cdot (-5)}} - 1 \right) \cdot (-5) \approx 4.96 179 | $$ 180 | 181 | Делаем шаг градиентного спуска: 182 | $$ 183 | w_1 = 1 - 0.01 \cdot 4.96 \approx 0.95 184 | $$ 185 | \end{sol} 186 | 187 | \begin{problem}{(вопросики)} 188 | Убедитесь, что вы можете дать ответы на следующие вопросы: 189 | 190 | \begin{itemize} 191 | \item Как вы думаете, почему считается, что SGD лучше работает для оптимизации функций, имеющих больше одного экстремума? 192 | 193 | \item Предположим, что у функции потерь есть несколько локальных минимумов. Как можно адаптировать градиентный спуск так, чтобы он находил глобальный минимум чаще? 194 | 195 | \item Что будет происходить со стохастическим градиентным спуском, если длина его шага не будет уменьшаться от итерации к итерации? 196 | \end{itemize} 197 | \end{problem} 198 | 199 | 200 | \begin{problem}{(скорости обучения)} 201 | В стохастическом градиентном спуске веса изменяются по формуле 202 | 203 | \[ 204 | w_t = w_{t-1} - \eta_t \cdot \nabla L(w_{t-1}, x_i, y_i), 205 | \] где наблюдение $i$ выбрано случайно, скорость обучения зависит от номера итерации. 206 | 207 | Условия Роббинса-Монро гарантируют сходимость алгоритма к оптимуму для выпуклых дифференцируемых функций. Они говорят, что ряд из скоростей $\sum_{t=0}^{\infty} \eta_t$ должен расходиться, а ряд $\sum_{t=0}^{\infty} \eta_t^2$ сходиться. То есть скорость спуска должна падать не слишком медленно, но и не слишком быстро. Какие из последовательностей, перечисленных ниже, можно использовать для описания изменения скорости алгоритма? 208 | 209 | \begin{enumerate} 210 | \item $\eta_t = \frac{1}{t}$ % да 211 | \item $\eta_t = \frac{0.1}{t^{0.3}}$ 212 | \item $\eta_t = \frac{1}{\sqrt{t}}$ 213 | \item $\eta_t = \frac{1}{t^2}$ 214 | \item $\eta_t = e^{-t}$ 215 | \item $\eta_t = \lambda \cdot \left(\frac{s_0}{s_0 + t} \right)^p,$ где $\lambda, p$ и $s_0$ --- параметры 216 | \end{enumerate} 217 | \end{problem} 218 | 219 | 220 | 221 | -------------------------------------------------------------------------------- /part_05_lego.tex: -------------------------------------------------------------------------------- 1 | % !TEX root = main.tex 2 | 3 | %%%------------------------------------------- 4 | \section*{Листочек 5: всего лишь кубики LEGO} 5 | 6 | \addcontentsline{toc}{section}{Листочек 5: всего лишь кубики LEGO} 7 | 8 | \epigraph{Цитата про лего}{\textit{автор цитаты}} 9 | 10 | \subsection*{Функции активации} 11 | 12 | \epigraph{Желание - Ржавый - Семнадцать - Рассвет - Печь - Девять - Добросердечный - Возвращение на Родину - Один - Грузовой вагон.}{\textit{Код активации Зимнего Солдата}} 13 | 14 | 15 | %%%------------------------------------------- 16 | \begin{problem}{(про сигмоиду)} 17 | Любую "s"-образную функцию называют сигмоидой. Наиболее сильно прославилась под таким названием функция $f(t) = \frac{e^t}{1 + e^t}.$ Слава о ней добралась до Маши и теперь она хочет немного поисследовать её свойства. 18 | 19 | \begin{enumerate} 20 | \item Выпишите формулы для forward pass и backward pass через слой с сигмоидой. 21 | \item Какое максимальное значение принимает производная сигмоиды? Объясните как это способствует затуханию градиента и параличу нейронной сети? 22 | \end{enumerate} 23 | \end{problem} 24 | 25 | 26 | %%%------------------------------------------- 27 | \begin{problem}{(про тангенс)} 28 | Функция $f(t) = \tanh(t) = \frac{2}{1 + e^{-2t}} - 1$ называется гиперболическим тангенсом. 29 | \begin{enumerate} 30 | \item Что происходит при $t \to +\infty$? А при $t \to -\infty$? 31 | \item Как связаны между собой $f(t)$ и $f'(t)$? 32 | \item Выпишите формулы для forward pass и backward pass через слой с тангенсом. 33 | \item Правда ли, что тангенс способствует затуханию градиента и параличу нейронной сети? Какое максимальное значение принимает производная тангенса? 34 | \item \todo[inline]{пункт про то, почему часто функцию юзают в RNN} 35 | \end{enumerate} 36 | \end{problem} 37 | 38 | 39 | %%%------------------------------------------- 40 | \begin{problem}{(про ReLU)} 41 | Функция $f(t) = ReLU(t) = \max(t, 0)$ называется ReLU. 42 | \begin{enumerate} 43 | \item 44 | \end{enumerate} 45 | \end{problem} 46 | 47 | 48 | \todo[inline]{Задача про ReLU и сигмоиду (Николенко)} 49 | \todo[inline]{Задача про паралич сигмоиды и ReLU} 50 | 51 | \todo[inline]{Parametric Rectifier (PReLU) Выписать уравнения для бэкпропа по параметру $\alpha$} 52 | 53 | 54 | %%%------------------------------------------- 55 | \begin{problem}{(softplus)} 56 | \todo[inline]{Про то почему её не используют} 57 | \end{problem} 58 | 59 | %%%------------------------------------------- 60 | \todo[inline]{Что-то про Mish и Swish} 61 | 62 | 63 | 64 | %%%------------------------------------------- 65 | \begin{problem}{(температура генерации)} 66 | Иногда в функцию $\softmax$ добавляют дополнительный параметр $T$, который называют температурой. Тогда она приобретает вид 67 | 68 | $$ 69 | f(z) = \frac{e^{\tfrac{z_i}{T}}}{ \sum_{k=1}^K e^{\tfrac{z_k}{T}}} 70 | $$ 71 | 72 | Обычно это делается, когда с помощью нейросетки нужно сгенерировать какой-нибудь новый объект. Пусть у нас есть три класса. Наша нейросеть выдала на последнем слое числа $1,2,5$. 73 | 74 | \begin{enumerate} 75 | \item Какое итоговое распределение вероятностей мы получим, если $T = 10$? 76 | \item А если $T = 1$? 77 | \item А если $T = 0.1$? 78 | \item Какое распределение получится при $T \to 0$? 79 | \item А при $T \to \infty$? 80 | \item Предположим, что объектов на порядок больше. Например, это реплики, которые Алиса может сказать вам в ответ на какую-то фразу. Понятное дело, что вашей фразе будет релевантно какое-то подмножество ответов. Какое значение температуры сэмплирования $T$ смогут сделать реплики Алисы непредсказуемыми? А какие сделают их однотипными? 81 | \end{enumerate} 82 | \end{problem} 83 | 84 | 85 | 86 | %%%------------------------------------------- 87 | \subsection*{Регуляризация} 88 | 89 | \epigraph{Цитата про регуляризацию}{Автор цитаты} 90 | 91 | 92 | \begin{problem}{(Маша и покемоны)} 93 | Маша измерила вес трёх покемонов, $y_1=6$, $y_2=6$, $y_3=10$. Она хочет спрогнозировать вес следующего покемона. Модель для веса покемонов у Маши очень простая, $y_i = \beta + \varepsilon_i$, поэтому прогнозирует Маша по формуле $\hat y_i = \hat \beta$. 94 | 95 | Для оценки параметра $\beta$ Маша использует следующую целевую функцию: 96 | 97 | $$ 98 | \sum (y_i - \hat \beta)^2 + \lambda \cdot \hat \beta^2 99 | $$ 100 | 101 | \begin{enumerate} 102 | \item[a)] Найдите оптимальное $\hat \beta$ при $\lambda =0$. 103 | \item[б)] Найдите оптимальное $\hat \beta$ при произвольном $\lambda$. Правда ли, что чем больше $\lambda$, тем меньше $\beta$? 104 | \item[в)] Подберите оптимальное $\lambda$ с помощью кросс-валидации leave one out («выкинь одного»). При такой валидации на первом шаге мы оцениваем модель на всей выборке без первого наблюдения, а на первом тестируем её. На втором шаге мы оцениваем модель на всей выборке без второго наблюдения, а на втором тестируем её. И так далее $n$ раз. Каждое наблюдение является отдельным фолдом. 105 | \item[г)] Найдите оптимальное $\hat \beta$ при $\lambda_{CV}$. 106 | \end{enumerate} 107 | \end{problem} 108 | 109 | 110 | \begin{problem}{(а вот и моя остановочка)} 111 | \todo[inline]{Сделать задачу по связи ранней остановки и регуляризатора. Как в книжке про диплернинг} 112 | \end{problem} 113 | 114 | 115 | \begin{problem}{(дропаут)} 116 | Маша собирается обучить нейронную сеть для решения задачи регрессии, На вход в неё идёт $12$ переменных, в сетке есть $3$ скрытых слоя. В пером слое $300$ нейронов, во втором $200$, в третьем $100$. 117 | 118 | \begin{enumerate} 119 | \item[a)] Сколько параметров предстоит оценить Маше? Сколько наблюдений вы бы на её месте использовали? 120 | \item[b)] Пусть в каждом слое была отключена половина нейронов. Сколько коэффициентов необходимо оценить? 121 | \item[c)] Предположим, что Маша решила после первого слоя добавить в свою сетку Dropout c вероятностью $p$. Какова вероятность того, что отключится весь слой? 122 | \item[d)] Маша добавила Dropout c вероятностью $p$. после каждого слоя. Какова вероятность того, что один из слоёв отключится и сетка не сможет учиться? 123 | \item[e)] Пусть случайная величина $N$ --- это число включённых нейронов. Найдите её математическое ожидание и дисперсию. Если Маша хочет проредить сетку на четверть, какое значение $p$ она должна поставить? 124 | \item[f)] Пусть случайная величина $P$ --- это число параметров в нейросети, которое необходимо оценить. Найдите её математическое ожидание и дисперсию. Почему найденное вами математическое ожидание выглядит очень логично? Что оно вам напоминает? Обратите внимание на то, что смерть одного из параметров легко может привести к смерти другого. 125 | \end{enumerate} 126 | \end{problem} 127 | 128 | \todo[inline]{Добавить вопросиков про дропконнект} 129 | 130 | \todo[inline]{Бэкпроп через дропаут} 131 | 132 | 133 | %%%------------------------------------------- 134 | \subsection*{Нормализация по батчам} 135 | 136 | \epigraph{Чашка хорошего чая восстановит мою нормальность.}{\textit{Артур из «Автостопом по галактике»}} 137 | 138 | \todo[inline]{Бэкпроп через батчнорм, смысл батчнорма, нарисовать граф через него, про то что это уродливая процедура} 139 | 140 | \todo[inline]{родить задачу из статьи dropout vs batchnorm} 141 | 142 | 143 | %%%------------------------------------------- 144 | \subsection*{Инициализация} 145 | 146 | \epigraph{цитата об этом}{\textit{автор}} 147 | 148 | \begin{problem}{(инициализация весов)} 149 | \begin{enumerate} 150 | \item Маша использует для активации симметричную функцию. Для инициализации весов она хочет использовать распределение 151 | 152 | $$ 153 | w_i \sim U \left[ - \frac{1}{\sqrt{n_{in}}}; \frac{1}{\sqrt{n_{in}}} \right]. 154 | $$ 155 | 156 | Покажите, что это будет приводить к затуханию дисперсии при переходе от одного слоя к другому. 157 | 158 | \item Какими нужно взять параметры равномерного распределения, чтобы дисперсия не затухала? 159 | 160 | \item Маша хочет инициализировать веса из нормального распределения. Какими нужно взять параметры, чтобы дисперсия не затухала? 161 | 162 | \item Несимметричный случай 163 | \end{enumerate} 164 | \end{problem} 165 | 166 | \begin{problem}{(ReLU и инициализация весов)} 167 | Внутри нейрона в качестве функции активации используется ReLU. На вход идёт $10$ признаков. В качестве инициализации для весов используется нормальное распределение, $N(0,1)$. С какой вероятностью нейрон будет выдавать на выход нулевое наблюдение, если 168 | 169 | Предположения на входы? Какое распределение и с какими параметрами надо использовать, чтобы этого не произошло? Сюда же про инициализацию Хе. 170 | \end{problem} 171 | 172 | 173 | \begin{problem}{(сложная задача про инициализацию)} 174 | Так чтобы плотность частного надо было искать и все офигели (Воронцов) 175 | \end{problem} 176 | 177 | 178 | \subsection*{Стрельба по ногам} 179 | 180 | \epigraph{цитата об этом}{\textit{автор}} 181 | 182 | 183 | \begin{problem}{(Проблемы с архитектурой)} 184 | Миша принёс Маше несколько разных архитектур. Они выглядят довольно странно. Помогите Маше разобраться, что именно Миша сделал неправильно. 185 | 186 | % \begin{enumerate} 187 | 188 | % \item Решается задача регрессии, предсказываются цены на недвижимость. На вход в сеть подаётся $39$ регрессоров. 189 | 190 | % \begin{alltt} 191 | % model = Sequential() \\ 192 | % model.add(InputLayer([39]) \\ 193 | % model.add(BatchNormalization()) \\ 194 | % model.add(Dense(128, kernel\_initializer=keras.initializers.zeros())) \\ 195 | % model.add(Dense(1)) \\ 196 | % model.compile(optimizer='sgd', loss='mean\_squared\_error') 197 | % \end{alltt} 198 | 199 | % \item Решается задача классификация картинок размера $28 \times 28$ на $10$ классов. 200 | 201 | % \begin{alltt} 202 | % model = Sequential() \\ 203 | % model.add(InputLayer([28, 28, 1])) \\ 204 | % model.add(Conv2D(filters=512, kernel\_size=(3, 3))) \\ 205 | % model.add(Activation('relu')) \\ 206 | % model.add(MaxPool2D(pool_size=(2, 2))) \\ 207 | % model.add(Flatten()) \\ 208 | % model.add(Dense(100)) \\ 209 | % model.add(Activation('softmax')) \\ 210 | % model.add(Dropout(0.1)) \\ 211 | % model.add(Dense(10)) \\ 212 | % model.add(Activation('softmax')) \\ 213 | % model.add(Dropout(0.1)) \\ 214 | % model.compile(optimizer='rmsprop', loss='mean\_squared\_error') 215 | % \end{alltt} 216 | 217 | 218 | % \item Решается задача классификация картинок размера $100 \times 100$ на $10$ классов. 219 | % \begin{alltt} 220 | % model = Sequential() \\ 221 | % model.add(InputLayer([100, 100, 3])) \\ 222 | 223 | % for filters in [32, 64, 128, 256]: 224 | % model.add(Conv2D(filters, kernel\_size=(5, 5))) 225 | % model.add(Conv2D(filters, kernel\_size=(1, 1))) 226 | % model.add(MaxPooling2D(pool\_size=(3, 3))) 227 | % model.add(Activation('relu')) 228 | % model.add(BatchNormalization()) 229 | 230 | % model.add(Flatten()) 231 | % model.add(Dense(100, activation='relu')) 232 | % model.add(Dropout(0.5)) 233 | % model.add(Dense(10, activation='softmax')) 234 | 235 | % model.compile(optimizer='adam', loss='sparse\_categorical\_accuracy') 236 | % \end{alltt} 237 | 238 | % \end{enumerate} 239 | \end{problem} 240 | 241 | 242 | % %%%------------------------------------------- 243 | \begin{problem}{(Ещё один backpropagation)} 244 | У Маши есть трёхслойная нейросеть: 245 | 246 | $$ 247 | y = f(f(X \cdot W_3 ) \cdot W_2) \cdot W_1 248 | $$ 249 | 250 | \begin{enumerate} 251 | \item Маща использует в качестве функции активации $f(t) = ReLU(t) = \max(0; t)$, а в качестве функции потерь $L(W_1, W_2) = \frac{1}{2} \cdot (y - \hat y)^2$. 252 | 253 | \item 254 | 255 | \item 256 | 257 | \item 258 | 259 | \end{enumerate} 260 | 261 | Для всех пунктов запишите уравнения для прямого и обратного проходов по сетке. Выпишите для всех весов уравнения, по которым будет делаться шаг градиентного спуска. 262 | \end{problem} 263 | 264 | 265 | -------------------------------------------------------------------------------- /part_06_cnn.tex: -------------------------------------------------------------------------------- 1 | % !TEX root = main.tex 2 | 3 | %%%------------------------------------------- 4 | \section*{Листочек 6: свёрточные сети} 5 | 6 | \addcontentsline{toc}{section}{Листочек 6: свёрточные сети} 7 | 8 | \epigraph{Урра! Отлично сработано, ребятки. Давайте завтра не придем? Возьмем отгул на денек? Вы пробовали шаурму? В двух кварталах отсюда делают какую-то шаурму. Не знаю, что это, но мне хочется.}{\textit{Тони Старк (Мстители, 2012)}} 9 | 10 | % Нарезать на задачи: 11 | % https://arxiv.org/pdf/1603.07285.pdf 12 | 13 | \begin{problem}{(Свёртка своими руками)} 14 | У Маши есть картинка и свёртка, которую она хочет применить к этой картинке. 15 | \begin{figure}[H] 16 | \begin{minipage}{0.49\linewidth} 17 | \centering 18 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 19 | \draw[fill=green,opacity=0.4] (0,-2) rectangle (5,3); 20 | \draw[draw=green,thick] (0,-2) grid (5,3); 21 | \node (00) at (0.5,2.5) {3}; 22 | \node (01) at (1.5,2.5) {3}; 23 | \node (02) at (2.5,2.5) {2}; 24 | \node (03) at (3.5,2.5) {1}; 25 | \node (04) at (4.5,2.5) {0}; 26 | 27 | \node (10) at (0.5,1.5) {0}; 28 | \node (11) at (1.5,1.5) {0}; 29 | \node (12) at (2.5,1.5) {1}; 30 | \node (13) at (3.5,1.5) {3}; 31 | \node (14) at (4.5,1.5) {1}; 32 | 33 | \node (20) at (0.5,0.5) {3}; 34 | \node (21) at (1.5,0.5) {1}; 35 | \node (22) at (2.5,0.5) {2}; 36 | \node (23) at (3.5,0.5) {2}; 37 | \node (24) at (4.5,0.5) {3}; 38 | 39 | \node (30) at (0.5,-0.5) {3}; 40 | \node (31) at (1.5,-0.5) {1}; 41 | \node (32) at (2.5,-0.5) {2}; 42 | \node (33) at (3.5,-0.5) {2}; 43 | \node (34) at (4.5,-0.5) {3}; 44 | 45 | \node (40) at (0.5,-1.5) {3}; 46 | \node (41) at (1.5,-1.5) {1}; 47 | \node (42) at (2.5,-1.5) {2}; 48 | \node (43) at (3.5,-1.5) {2}; 49 | \node (44) at (4.5,-1.5) {3}; 50 | \end{tikzpicture} 51 | \\ Картинка Маши 52 | \end{minipage} 53 | \hfill 54 | \begin{minipage}{0.49\linewidth} 55 | \centering 56 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 57 | \draw[fill=blue,opacity=0.4] (0,0) rectangle (3,3); 58 | \draw[draw=blue,thick] (0,0) grid (3,3); 59 | \node (00) at (0.5,2.5) {0}; 60 | \node (01) at (1.5,2.5) {1}; 61 | \node (02) at (2.5,2.5) {2}; 62 | \node (10) at (0.5,1.5) {2}; 63 | \node (11) at (1.5,1.5) {2}; 64 | \node (12) at (2.5,1.5) {0}; 65 | \node (20) at (0.5,0.5) {0}; 66 | \node (21) at (1.5,0.5) {1}; 67 | \node (22) at (2.5,0.5) {2}; 68 | \end{tikzpicture} 69 | \\ Свёртка Маши 70 | \end{minipage} 71 | \end{figure} 72 | \begin{enumerate} 73 | \item Сделайте свёртку картинки без сдвигов и дополнений. К тому, что получилось применить max pooling и average pooling размера $2 \times 2$. 74 | \item Примените к исходной картинке свёртку с параметром сдвига (stride) равным $2$. 75 | \item Примените к исходной картинке свёртку с параметром сдвига (stride) равным $3$. 76 | \item Примените к исходной картинке свёртку с дополнением нулями (zero padding) и параметром сдвига (stride) равным $0$. 77 | \end{enumerate} 78 | \end{problem} 79 | 80 | 81 | \begin{problem}{(Ядра)} 82 | У Маши есть куча ядер для свёрток. Догадайтесь какое из них что делает: 83 | 84 | \begin{minipage}{0.18\linewidth} 85 | \centering 86 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 87 | \draw[fill=blue,opacity=0.4] (0,0) rectangle (3,3); 88 | \draw[draw=blue,thick] (0,0) grid (3,3); 89 | \node (00) at (0.5,2.5) {0}; 90 | \node (01) at (1.5,2.5) {0}; 91 | \node (02) at (2.5,2.5) {0}; 92 | \node (10) at (0.5,1.5) {0}; 93 | \node (11) at (1.5,1.5) {1}; 94 | \node (12) at (2.5,1.5) {0}; 95 | \node (20) at (0.5,0.5) {0}; 96 | \node (21) at (1.5,0.5) {0}; 97 | \node (22) at (2.5,0.5) {0}; 98 | \end{tikzpicture} 99 | \end{minipage} 100 | \hfill 101 | \begin{minipage}{0.18\linewidth} 102 | \centering 103 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 104 | \draw[fill=blue,opacity=0.4] (0,0) rectangle (3,3); 105 | \draw[draw=blue,thick] (0,0) grid (3,3); 106 | \node (00) at (0.5,2.5) {-1}; 107 | \node (01) at (1.5,2.5) {-1}; 108 | \node (02) at (2.5,2.5) {-1}; 109 | \node (10) at (0.5,1.5) {-1}; 110 | \node (11) at (1.5,1.5) {8}; 111 | \node (12) at (2.5,1.5) {-1}; 112 | \node (20) at (0.5,0.5) {-1}; 113 | \node (21) at (1.5,0.5) {-1}; 114 | \node (22) at (2.5,0.5) {-1}; 115 | \end{tikzpicture} 116 | \end{minipage} 117 | \hfill 118 | \begin{minipage}{0.18\linewidth} 119 | \centering 120 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 121 | \draw[fill=blue,opacity=0.4] (0,0) rectangle (3,3); 122 | \draw[draw=blue,thick] (0,0) grid (3,3); 123 | \node (00) at (0.5,2.5) {-1}; 124 | \node (01) at (1.5,2.5) {-1}; 125 | \node (02) at (2.5,2.5) {-1}; 126 | \node (10) at (0.5,1.5) {-1}; 127 | \node (11) at (1.5,1.5) {8}; 128 | \node (12) at (2.5,1.5) {-1}; 129 | \node (20) at (0.5,0.5) {-1}; 130 | \node (21) at (1.5,0.5) {-1}; 131 | \node (22) at (2.5,0.5) {-1}; 132 | \end{tikzpicture} 133 | \end{minipage} 134 | \hfill 135 | \begin{minipage}{0.18\linewidth} 136 | \centering 137 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 138 | \draw[fill=blue,opacity=0.4] (0,0) rectangle (3,3); 139 | \draw[draw=blue,thick] (0,0) grid (3,3); 140 | \node (00) at (0.5,2.5) {-1}; 141 | \node (01) at (1.5,2.5) {-1}; 142 | \node (02) at (2.5,2.5) {-1}; 143 | \node (10) at (0.5,1.5) {-1}; 144 | \node (11) at (1.5,1.5) {8}; 145 | \node (12) at (2.5,1.5) {-1}; 146 | \node (20) at (0.5,0.5) {-1}; 147 | \node (21) at (1.5,0.5) {-1}; 148 | \node (22) at (2.5,0.5) {-1}; 149 | \end{tikzpicture} 150 | \end{minipage} 151 | \hfill 152 | \begin{minipage}{0.18\linewidth} 153 | \centering 154 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 155 | \draw[fill=blue,opacity=0.4] (0,0) rectangle (3,3); 156 | \draw[draw=blue,thick] (0,0) grid (3,3); 157 | \node (00) at (0.5,2.5) {-1}; 158 | \node (01) at (1.5,2.5) {-1}; 159 | \node (02) at (2.5,2.5) {-1}; 160 | \node (10) at (0.5,1.5) {-1}; 161 | \node (11) at (1.5,1.5) {8}; 162 | \node (12) at (2.5,1.5) {-1}; 163 | \node (20) at (0.5,0.5) {-1}; 164 | \node (21) at (1.5,0.5) {-1}; 165 | \node (22) at (2.5,0.5) {-1}; 166 | \end{tikzpicture} 167 | \end{minipage} 168 | % - границы 169 | % - повороты 170 | % - сдвиги 171 | \end{problem} 172 | 173 | \newpage 174 | 175 | \begin{problem}{(Крестики и нолики)} 176 | Маша хочет научить компьютер играть в крестики и нолики. На первом шаге ей надо научить алгоритм распознавать есть ли крестик на картинке. Под ноликом понимается любая фигура с дырой в середине. Под крестиком понимается любая фигура из двух пересекающихся линий. 177 | 178 | Алгоритм должен быть устроен следующим образом. На первом шаге одна или несколько свёрток проходят по картинке. На втором шаге по результатам свёрток принимается решение. Например, берётся максимальное получившееся число и сравнивается с каким-то порогом. Классификатор крестиков и ноликов должен работать безупречно. Помогите Маше придумать такой классификатор. 179 | 180 | \begin{enumerate} 181 | \item В мире Маши на картинках могут быть нарисованы либо крестики либо нолики. Все картинки, подающиеся на вход алгоритма могут быть только размера $4 \times 4$. Примеры крестиков и ноликов нарисованы ниже. 182 | 183 | \begin{minipage}{0.22\linewidth} 184 | \centering 185 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 186 | \draw[fill=green,opacity=0.4] (0,-1) rectangle (4,3); 187 | \draw[draw=green,thick] (0,-1) grid (4,3); 188 | \node (00) at (0.5,2.5) {1}; 189 | \node (01) at (1.5,2.5) {1}; 190 | \node (02) at (2.5,2.5) {1}; 191 | \node (03) at (3.5,2.5) {0}; 192 | 193 | \node (10) at (0.5,1.5) {1}; 194 | \node (11) at (1.5,1.5) {0}; 195 | \node (12) at (2.5,1.5) {1}; 196 | \node (13) at (3.5,1.5) {0}; 197 | 198 | \node (20) at (0.5,0.5) {1}; 199 | \node (21) at (1.5,0.5) {0}; 200 | \node (22) at (2.5,0.5) {1}; 201 | \node (23) at (3.5,0.5) {0}; 202 | 203 | \node (30) at (0.5,-0.5) {1}; 204 | \node (31) at (1.5,-0.5) {1}; 205 | \node (32) at (2.5,-0.5) {1}; 206 | \node (33) at (3.5,-0.5) {0}; 207 | \end{tikzpicture} 208 | \\ нолик 209 | \end{minipage} 210 | \hfill 211 | \begin{minipage}{0.22\linewidth} 212 | \centering 213 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 214 | \draw[fill=green,opacity=0.4] (0,-1) rectangle (4,3); 215 | \draw[draw=green,thick] (0,-1) grid (4,3); 216 | \node (00) at (0.5,2.5) {0}; 217 | \node (01) at (1.5,2.5) {0}; 218 | \node (02) at (2.5,2.5) {1}; 219 | \node (03) at (3.5,2.5) {0}; 220 | 221 | \node (10) at (0.5,1.5) {0}; 222 | \node (11) at (1.5,1.5) {1}; 223 | \node (12) at (2.5,1.5) {0}; 224 | \node (13) at (3.5,1.5) {1}; 225 | 226 | \node (20) at (0.5,0.5) {0}; 227 | \node (21) at (1.5,0.5) {0}; 228 | \node (22) at (2.5,0.5) {1}; 229 | \node (23) at (3.5,0.5) {0}; 230 | 231 | \node (30) at (0.5,-0.5) {0}; 232 | \node (31) at (1.5,-0.5) {0}; 233 | \node (32) at (2.5,-0.5) {0}; 234 | \node (33) at (3.5,-0.5) {0}; 235 | \end{tikzpicture} 236 | \\ нолик 237 | \end{minipage} 238 | \hfill 239 | \begin{minipage}{0.22\linewidth} 240 | \centering 241 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 242 | \draw[fill=green,opacity=0.4] (0,-1) rectangle (4,3); 243 | \draw[draw=green,thick] (0,-1) grid (4,3); 244 | \node (00) at (0.5,2.5) {0}; 245 | \node (01) at (1.5,2.5) {1}; 246 | \node (02) at (2.5,2.5) {0}; 247 | \node (03) at (3.5,2.5) {1}; 248 | 249 | \node (10) at (0.5,1.5) {0}; 250 | \node (11) at (1.5,1.5) {0}; 251 | \node (12) at (2.5,1.5) {1}; 252 | \node (13) at (3.5,1.5) {0}; 253 | 254 | \node (20) at (0.5,0.5) {0}; 255 | \node (21) at (1.5,0.5) {1}; 256 | \node (22) at (2.5,0.5) {0}; 257 | \node (23) at (3.5,0.5) {1}; 258 | 259 | \node (30) at (0.5,-0.5) {0}; 260 | \node (31) at (1.5,-0.5) {0}; 261 | \node (32) at (2.5,-0.5) {0}; 262 | \node (33) at (3.5,-0.5) {0}; 263 | \end{tikzpicture} 264 | \\ крестик 265 | \end{minipage} 266 | \hfill 267 | \begin{minipage}{0.22\linewidth} 268 | \centering 269 | \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}, on grid] 270 | \draw[fill=green,opacity=0.4] (0,-1) rectangle (4,3); 271 | \draw[draw=green,thick] (0,-1) grid (4,3); 272 | \node (00) at (0.5,2.5) {0}; 273 | \node (01) at (1.5,2.5) {1}; 274 | \node (02) at (2.5,2.5) {0}; 275 | \node (03) at (3.5,2.5) {0}; 276 | 277 | \node (10) at (0.5,1.5) {1}; 278 | \node (11) at (1.5,1.5) {1}; 279 | \node (12) at (2.5,1.5) {1}; 280 | \node (13) at (3.5,1.5) {1}; 281 | 282 | \node (20) at (0.5,0.5) {0}; 283 | \node (21) at (1.5,0.5) {1}; 284 | \node (22) at (2.5,0.5) {0}; 285 | \node (23) at (3.5,0.5) {0}; 286 | 287 | \node (30) at (0.5,-0.5) {0}; 288 | \node (31) at (1.5,-0.5) {1}; 289 | \node (32) at (2.5,-0.5) {0}; 290 | \node (33) at (3.5,-0.5) {0}; 291 | \end{tikzpicture} 292 | \\ крестик 293 | \end{minipage} 294 | 295 | \item Предположим, что теперь кроме крестиков и ноликов в нашем мире существуют ещё и другие любые картинки. Как можно модернизировать ваш алгоритм, чтобы он по-прежнему стабильно работал с безупречным качеством? 296 | \end{enumerate} 297 | \end{problem} 298 | 299 | \begin{problem}{(Свёрточный и полносвязный)} 300 | Маше рассказали, что свёрточный слой --- это полносвязный слой с некоторыми ограничениями. Она хочет разобраться, что это за ограничения. На вход в слой идёт чёрно-белое изображение размера $4 \times 4.$ Каждый пиксель изображения --- отдельная переменная. 301 | \begin{enumerate} 302 | \item Нарисуйте с помощью кругляшей и стрелочек полносвязным слой, который обрабатывает картинку. Подпишите все веса. Нарисуйте свёрточный слой в таком же формате. На картинке часть связей исчезнет, а часть весов станет одинаковой. 303 | 304 | \item Запишите свёрточный слой с помощью перемножения матриц в виде $H = X \cdot W.$ Как выглядит матрица $W$? Как через свёрточный слой можно сделать шаг обратного распространения ошибки? 305 | \end{enumerate} 306 | \end{problem} 307 | 308 | 309 | \begin{problem}{(Число параметров)} 310 | На вход в нейронную сетку идёт изображение рукописной цифры размера $28 \times 28$. 311 | \begin{enumerate} 312 | \item Маша вытягивает изображение в длинный вектор и использует полносвязную сетку для классификации изображений. В сетке идёт один полносвязный слой из $1000$ нейронов. После идёт слой, который осуществляет классификацию изображения на $10$ классов. Сколько параметров нужно оценить? 313 | 314 | \item \label{lanet} Маша вместо полносвязной сетки использует свёрточную. На первом шаге делается $6$ свёрток размера $5 \times 5$. На втором шаге делается max-pooling размера $2 \times 2$. На третьем $16$ свёрток размера $5\times 5$. На четвёртом max-pooling размера $2 \times 2$. На пятом картинка вытягивается в длинный вектор. Далее идут три полносвязных слоя размеров $120, 84, 10$. В конце делается softmax. После каждой свёртки и полносвязного слоя, кроме последнего, в качестве функции активации используется $ReLU.$ 315 | 316 | \begin{center} 317 | \begin{tikzpicture}[scale=.8] 318 | \tikzstyle{st}=[draw=black, opacity=0.7, minimum height=25pt,minimum width=130pt,inner sep=2pt,rotate=90]; 319 | 320 | \node at (0, 0) [st, fill=blue] { \large $Input \quad 28 \times 28$}; 321 | \node at (1.5, 0) [st, fill=green] { \large $Conv2D(6, 5 \times 5)$}; 322 | \node at (3, 0) [st, fill=red] { \large $MaxPool(2\times2)$}; 323 | \node at (4.5, 0) [st, fill=green] { \large $Conv2D(16, 5 \times 5)$}; 324 | \node at (6, 0) [st, fill=red] { \large $MaxPool(2\times2)$}; 325 | \node at (7.5, 0) [st, fill=red] { \large $Flatten$}; 326 | \node at (9, 0) [st, fill=green] { \large $FC(120)$}; 327 | \node at (10.5, 0) [st, fill=green] { \large $FC(84)$}; 328 | \node at (12, 0) [st, fill=green] { \large $FC(10)$}; 329 | \node at (13.5, 0) [st, fill=red] { \large $Softmax$}; 330 | \node at (15, 0) [st, fill=blue] { \large $Output \quad 10$}; 331 | \end{tikzpicture} 332 | \end{center} 333 | 334 | Сколько параметров необходимо будет оценить в такой модели? Какого размера будут выходы из каждого слоя? 335 | 336 | \item Маша использует архитектуру из пункта \ref{lanet}, но все свёртки делает с дополнением нулями (zero padding). Как изменится число оцениваемых параметров? Какого размера будут выходы из каждого слоя? 337 | 338 | \item Маша использует архитектуру из пункта \ref{lanet}, но все свёртки делает с дополнением нулями (zero padding) и параметром сдвига (stride) равным $2$. ак изменится число оцениваемых параметров? Какого размера будут выходы из каждого слоя? 339 | \end{enumerate} 340 | \end{problem} 341 | 342 | % \begin{sol} 343 | % У нас $28^2 = 784$ входа. Весов между входным и полносвязным слоями будет 344 | % \[ (784 + 1)\cdot 1000 = 785000.\] 345 | % Единица отвечает за константу для каждого из $1000$ нейронов. Между полносвязным и итоговым слоем 346 | % \[(1000 + 1) \cdot 10 = 10010. \] 347 | % \end{sol} 348 | 349 | 350 | \begin{problem}{(Поле обзора)} 351 | Маша хочет найти котика размера $512 \times 512$ пикселей. Для этого она использует свёртки размера $5 \times 5$ без дополнения нулями (zero padding) После каждого свёрточного слоя Маша делает max-pooling. 352 | \begin{enumerate} 353 | \item Через сколько слоёв поле восприятия Машиной нейросетки впервые охватит котейку? 354 | 355 | \item Маша хочет поменять max-pooling на свёртки со сдвигом (stride) так, чтобы котейка находился за такое же число слоёв. Какой размер сдвига ей надо выбрать? 356 | 357 | \item Пусть $s$ --- величина сдвига, $k$ --- размер свёртки, $m$ --- размер пулинга, $n$ --- номер слоя. Выпишите формулу, по которой можно найти размер поля видимости (receptive field). % (2n + 1) \times (2n + 1) 358 | \end{enumerate} 359 | % Нарезать на задачи: https://distill.pub/2019/computing-receptive-fields/ 360 | \end{problem} 361 | 362 | 363 | \begin{problem}{(Снова число параметров)} 364 | 365 | Маша собирает разные архитектуры. Помогите ей оценить число параметров для каждой из них. 366 | 367 | \begin{enumerate} 368 | \item У Маши есть свёрточный слой. На вход в свёрточный слой идёт изображение с $C_{in}$ каналами размера $W \times H$. Маша использует $C_{out}$ фильтров размера $W_k \cdot H_k$. Сколько параметров ей предстоит оценить? 369 | 370 | \item 371 | 372 | \item \todo[inline]{Сюда вариант с подсчётом числа параметров в сепарабельной свёртке} 373 | 374 | \end{enumerate} 375 | \end{problem} 376 | % \begin{sol} 377 | % $(W_k \cdot H_k \cdot C_{in} + 1) \cdot C_{out}$ 378 | % \end{sol} 379 | 380 | 381 | \begin{problem}{(Скользящее среднее)} 382 | Скользящее среднее --- это свёртка, которая работает для вектора. Опишите как именно она работает. Какой физический смысл стоит за размером такой свёртки и дополнением нулями? 383 | % def moving_average(x, w): 384 | % return np.convolve(x, np.ones(w), 'valid') / w 385 | \end{problem} 386 | 387 | 388 | 389 | 390 | % \begin{problem}{(Рекур для поля обзора\footnote{По мотивам: \url{https://distill.pub/2019/computing-receptive-fields/})} 391 | % Пусть у нас есть вектор размера $n$. На нём отрабатывают одномерные свёртки размера $k$ с шагом $s$. Как поле обзора для $i$-го слоя зависит от поля обзора для $i-1$ слоя? Выпишите формулу в явном виде. 392 | 393 | 394 | % Пусть у нас есть два свёрточных слоя размера $k \times k$. 395 | 396 | % На подумать: как скип-конкешн и батч-нормализация влияют на поле обзора? 397 | 398 | % Insight: Skip-connections may provide more paths, however, based on [7], they tend to make the effective receptive field smaller. 399 | 400 | % During training, batch normalization parameters are computed based on all the channel elements of the feature map. Thus, one can state that its receptive field is the whole input image. 401 | 402 | 403 | % \end{problem} 404 | % \begin{sol} 405 | % $r_{i - 1} = s_i \cdot r_i + (k_i - s_i)$ 406 | 407 | 408 | % \end{sol} 409 | 410 | -------------------------------------------------------------------------------- /task_list_matrix_diff.tex: -------------------------------------------------------------------------------- 1 | % !TEX root = main.tex 2 | 3 | %%%------------------------------------------- 4 | \section*{Листочек 4: матричное дифФфФфФференцирование} 5 | 6 | \epigraph{ $\bigg(\text{ \includegraphics[scale=0.08]{tree1.png}} \bigg)^T = $ \includegraphics[scale=0.08]{tree2.png} }{<<Джек и бобовый стебель>> (1890)} 7 | 8 | % Эта часть виньетки необязательна для изучения. В ней мы подробно поговорим про матричные производные. С их помощью удобно заниматься оптимизацией, в том числе бэкпропом\footnote{Часть задач взята из \href{https://github.com/bdemeshev/mlearn\_pro/blob/master/mlearn\_pro.pdf}{прототипа задачника по ML Бориса Демешева}, часть из \href{https://github.com/esokolov/ml-course-hse}{конспектов по ML Жени Соколова}}. 9 | 10 | 11 | %%%------------------------------------------- 12 | \begin{problem}{} 13 | Найдите следующие производные: 14 | \begin{enumerate} 15 | 16 | \item $f(x) = x^2$, где $x$ скаляр 17 | 18 | \item $f(x) = a^T x$, где $a$ и $x$ векторы размера $1 \times n$ 19 | 20 | \item $f(x) = x^T A x$, где $x$ вектор размера $1 \times n$, $A$ матрица размера $n \times n$ 21 | 22 | \item $f(x) = \ln(x^T A x)$, где $x$ вектор размера $1 \times n$, $A$ матрица размера $n \times n$ 23 | 24 | \item $f(x) = a^TXAXa$, где $x$ вектор размера $1 \times n$, $A$ матрица размера $n \times n$ 25 | 26 | \item $f(x) = x x^T x$, где $x$ вектор размера $1 \times n$ 27 | \end{enumerate} 28 | \end{problem} 29 | \begin{sol} 30 | 31 | 32 | Зачем нам нужно научиться искать матричные производные? \indef{Машинное обучение --- это сплошная оптимизация.} В нём мы постоянно вынуждены искать минимум какой-нибудь штрафной функции. Матричные производные довольно сильно в этом помогают\footnote{В тексте про матричные производные я опирался на \href{http://www.machinelearning.ru/wiki/images/5/50/MOMO17_Seminar2.pdf}{этот конспект.} Для того, чтобы познакомиться с темой более широко, имеет смысл прочитать его.}. 33 | 34 | Когда мы работаем с одномерными функциями, для поиска любых производных нам хватает небольшой таблицы со стандартными случаями и пары правил. Для случая матриц все эти правила можно обобщить, а таблицы дополнить специфическими функциями вроде определителя. \indef{Удобнее всего оказывается работать в терминах «дифференциала» --- с ним можно не задумываться о промежуточных размерностях, а просто применять стандартные правила.} 35 | 36 | Мы будем работать в этом конспекте со скалярами, векторами и матрицами. Нас будет интересовать, что именно мы дифференцируем, по чему мы дифференцируем и что получается в итоге. 37 | 38 | Строчными буквами мы будем обозначать векторы-столбцы и константы. Заглавными буквами мы будем обозначать матрицы. Производная столбца --- это столбец. Производная по столбцу --- это столбец. 39 | 40 | \[ 41 | x = \begin{pmatrix}x_1 \\ \ldots \\ x_n \end{pmatrix} \qquad X = \begin{pmatrix}x_{11} & \ldots & x_{1n} \\ \vdots & \ddots & \vdots \\ x_{n1} & \ldots & x_{nn} \end{pmatrix}. 42 | \] 43 | 44 | Мы рассмотрим постепенно много разных входов и выходов, и получим таблицу из канонических случаев. По строчкам будем откладывать то, откуда бьёт функция, то есть входы. По столбцам будем откладывать то, куда бьёт функция, то есть выходы. Для ситуаций обозначенных прочерками обобщения получить не выйдет. 45 | 46 | \begin{center} 47 | \begin{tabular}{|c|c|c|c|} 48 | \hline 49 | & скаляр & вектор & матрица \\ 50 | \hline 51 | скаляр & $f'(x) \dx{x}$ & $\mathfrak{J} * \dx{x}$ & --- \\ 52 | \hline 53 | вектор & $\nabla f^T \dx{x}$ & $\mathfrak{J} \dx{x}$ & --- \\ 54 | \hline 55 | матрица & $\tr(\nabla f^T \dx{X})$ & --- & --- \\ 56 | \hline 57 | \end{tabular} 58 | \end{center} 59 | 60 | Символом $\nabla^T f$ обозначается градиент (вектор из производных). Символом $\mathfrak{J}$ обозначена матрица Якоби. Символом $H$ мы будем обозначать матрицу Гессе из вторых производных. 61 | 62 | \begin{enumerate} 63 | \item Начнём с уже известного нам случая: функция бьёт из скаляров в скаляры 64 | 65 | \[ 66 | f(x) : \RR \to \RR. 67 | \] 68 | 69 | Примером такой функции может быть $f(x) = x^2$. Мы знаем, что по таблице производных $f'(x) = 2x$. Также мы знаем, что \indef{дифференциал} --- это линейная часть приращения функции, а \indef{производная} --- это предел отношения приращения функции к приращению аргумента при приращении аргумента стремящемся к нулю. 70 | 71 | Грубо говоря, дифференциал помогает представить приращение функции в линейном виде 72 | 73 | \[ 74 | \dx{f(x)} = f'(x) \dx{x}. 75 | \] 76 | 77 | Если мы находимся в какой-то точке $x_0$ и делаем из неё небольшое приращение $\dx{x},$ то наша функция изменится примерно на $\dx{f(x)}$. \indef{Оказывается, что именно в терминах дифференциалов удобно работать с матричными производными.} 78 | 79 | Свойства матричных дифференциалов очень похожи на свойства обычных. Надо только не забыть, что мы работаем с матрицами. 80 | 81 | \begin{equation*} 82 | \begin{aligned} 83 | & \dx{(XY)} = \dx{X}Y + X\dx{Y}, \quad \dx{X}Y \ne Y\dx{X} \\ 84 | & \dx{(\alpha X + \beta Y)} = \alpha \dx{X} + \beta \dx{Y} \\ 85 | & \dx{(X^T)} = (\dx{X})^T \\ 86 | & \dx{A} = 0, \quad A - \text{матрица из констант} 87 | \end{aligned} 88 | \end{equation*} 89 | 90 | Чтобы доказать все эти свойства достаточно просто аккуратно расписать их. Кроме этих правил нам понадобится пара трюков по работе со скалярами. Если $s$ --- скаляр размера $1 \times 1$, тогда $s^T = s$ и $\tr(s) = s$, где $\tr$ --- операция взятия следа матрицы. 91 | 92 | С помощью этих преобразований мы будем приводить дифференциалы к каноническому виду и вытаскивать из них производные. 93 | 94 | \item Рассмотрим вторую ситуацию из таблицы, функция бьёт из векторов в скаляры. Это обычная функция от нескольких аргументов 95 | 96 | \[ 97 | f(x) : \RR^n \to \RR. 98 | \] 99 | 100 | Такие производные мы брать также умеем. Если мы хотим найти производную функции $f(x_1, x_2, \ldots, x_n)$, нам надо взять производную по каждому аргументу и записать их все в виде вектора. Такой вектор \indef{называют градиентом} 101 | 102 | \[ 103 | \nabla f = \begin{pmatrix} \frac{\partial f}{\partial x_1} \\ \frac{\partial f}{\partial x_2} \\ \ldots \\ \frac{\partial f}{\partial x_n} \end{pmatrix} 104 | \] 105 | 106 | Если умножить градиент на вектор приращений, у нас получится дифференциал 107 | 108 | \[ 109 | \dx{f(x)} = \nabla f^T \dx{x} = \begin{pmatrix} \frac{\partial f}{\partial x_1} & \frac{\partial f}{\partial x_2} & \ldots & \frac{\partial f}{\partial x_n} \end{pmatrix} \begin{pmatrix} \dx{x_1} \\ \dx{x_2} \\ \ldots \\ \dx{x_n} \end{pmatrix} = \frac{\partial f}{\partial x_1} \cdot \dx{x_1} + \frac{\partial f}{\partial x_2} \cdot \dx{x_2} + \ldots +\frac{\partial f}{\partial x_n} \cdot \dx{x_n}. 110 | \] 111 | 112 | При маленьком изменении $x_i$ на $\dx{x_i}$ функция будет при прочих равных меняться пропорционально соответствующей частной производной. Посмотрим на конкретный пример, \indef{скалярное произведение}. Можно расписать умножение одного вектора на другой в виде привычной нам формулы 113 | 114 | \begin{equation*} 115 | \underset{[1 \times 1]}{f(x)} = \underset{[1 \times n]}{a^T} \cdot \underset{[n \times 1]}{x} = \begin{pmatrix} a_1 & a_2 & \ldots &a_n \end{pmatrix} \cdot \begin{pmatrix} x_1 \\ x_2 \\ \ldots \\ x_n \end{pmatrix} = a_1 \cdot x_1 + a_2 \cdot x_2 + \ldots + a_n \cdot x_n. 116 | \end{equation*} 117 | 118 | Из неё чётко видно, что $\frac{\partial f}{\partial x_i} = a_i$. Увидев это мы можем выписать градиент функции 119 | 120 | \[ 121 | \nabla f = \begin{pmatrix} \frac{\partial f}{\partial x_1} \\ \frac{\partial f}{\partial x_2} \\ \ldots \\ \frac{\partial f}{\partial x_n} \end{pmatrix} = \begin{pmatrix} a_1 \\ a_2 \\ \ldots \\ a_n \end{pmatrix} = a, 122 | \] 123 | 124 | теперь можно записать дифференциал 125 | 126 | \[ 127 | \dx{f} = a^T \dx{x} = \frac{\partial f}{\partial x_1} \cdot \dx{x_1} + \frac{\partial f}{\partial x_2} \cdot \dx{x_2} + \ldots +\frac{\partial f}{\partial x_n} \cdot \dx{x_n} = a_1 \cdot \dx{x_1} + a_2 \cdot \dx{x_2} + \ldots + a_n \cdot \dx{x_n}. 128 | \] 129 | 130 | В то же самое время можно было бы просто воспользоваться правилами нахождения матричных дифференциалов 131 | 132 | \[ 133 | \dx{f} = \dx{a^T x} = a^T \dx{x} = \nabla f^T \dx{x}, 134 | \] 135 | 136 | откуда $ \nabla f = a$. Производная найдена. При таком подходе нам не надо анализировать каждую частную производную по отдельности. Мы находим одним умелым движением руки сразу же все производные. Давайте немного усложним задачу и увидим его мощь во всей красе. 137 | 138 | \item Функция по-прежнему бьёт из векторов в скаляры. Попробуем перемножить все матрицы и расписать её в явном виде по аналогии со скалярным произведением 139 | 140 | 141 | \begin{equation*} 142 | \underset{[1 \times 1]}{f(x)} = \underset{[1 \times n]}{x^T} \cdot \underset{[n \times n]}{A} \cdot \underset{[n \times 1]}{x} = \sum_{i = 1}^n \sum_{j=1}^n a_{ij} \cdot x_i \cdot x_j. 143 | \end{equation*} 144 | 145 | Если продолжить в том же духе, мы сможем найти все частные производные, а потом назад вернём их в матрицу. Единственное, что смущает --- \indef{мы делаем что-то неестественное.} Всё было записано в красивом компактном матричном виде, а мы это испортили. А что, если множителей будет больше? Тогда суммы станут совсем громоздкими, и мы легко запутаемся. 146 | 147 | При этом, если воспользоваться тут правилами работы с матричными дифференциалами, мы легко получим красивый результат 148 | 149 | \[ 150 | \dx{f} = \dx{x^T A x} = \dx{(x^T)} A x + x^T \dx{(Ax)} = \dx{(x^T)} A x + x^T \underset{\dx{A} = 0}{\dx{(A)}} x + x^T A \dx{(x)}. 151 | \] 152 | 153 | Заметим, что $\dx{(x^T)} A x$ это скаляр. Мы перемножаем матрицы с размерностями $1 \times n$, $n \times n$ и $n \times 1$. В результате получается размерность $1 \times 1$. Мы можем смело транспонировать скаляр, когда нам это надо. Эта операция никак не повлияет на результат 154 | 155 | \[ 156 | \dx{f} = \dx{(x^T)} A x + x^T A \dx{(x)} = x^T A^T \dx{x} + x^T A \dx{x} = x^T(A^T + A) \dx{x}. 157 | \] 158 | 159 | Мы нашли матричный дифференциал и свели его к каноничной форме 160 | 161 | \[ 162 | \dx{f} = \nabla^T f \dx{x} = x^T(A^T + A) \dx{x} 163 | \] 164 | 165 | Получается, что искомая производная $\nabla f = (A + A^T) x$. Обратите внимание, что размерности не нарушены и мы получили столбец из производных, то есть искомый градиент нашей функции $f$. 166 | 167 | По аналогии мы легко можем найти вторую производную. Для этого надо взять производную производной. Функция $g(x) = (A + A^T) x$ бьёт из векторов в вектора 168 | 169 | \[ 170 | f(X) : \RR^n \to \RR^m. 171 | \] 172 | 173 | На самом деле с такой ситуацией мы также знакомились на математическом анализе. Если $n=1$ то у нас есть $m$ функций, каждая из которых применяется к $x$. На выходе получается вектор 174 | 175 | \[ 176 | \begin{pmatrix} f_1(x) \\ f_2(x) \\ \ldots \\ f_m(x). \end{pmatrix} 177 | \] 178 | 179 | Если мы хотим найти производную, нужно взять частную производную каждой функции по $x$ и записать в виде вектора. Дифференциал также будет представлять из себя вектор, так как при приращении аргумента на какую-то величину изменяется каждая из функций 180 | 181 | \[ 182 | \dx{f(x)} = \begin{pmatrix} \frac{\partial f_1}{\partial x} \\ \frac{\partial f_2}{\partial x} \\ \ldots \\ \frac{\partial f_m}{\partial x} \end{pmatrix} * \begin{pmatrix} \dx{x} \\ \dx{x} \\ \ldots \\ \dx{x} \end{pmatrix} = \begin{pmatrix} \frac{\partial f_1}{\partial x} \dx{x} \\ \frac{\partial f_2}{\partial x} \dx{x} \\ \ldots \\ \frac{\partial f_m}{\partial x} \dx{x} \end{pmatrix}. 183 | \] 184 | 185 | Под символом $*$ имеется в виду поэлементное умножение. Если $n > 1$, то аргументов на вход в такой вектор из функций идёт несколько, на выходе получается матрица 186 | 187 | \[ 188 | \begin{pmatrix} f_1(x_1) & f_1(x_2) & \ldots & f_1(x_n) \\ f_2(x_1) & f_2(x_2) & \ldots & f_2(x_n) \\ \ldots & \ldots & \ddots & \ldots \\ f_m(x_1) & f_m(x_2) & \ldots & f_m(x_n) \end{pmatrix} 189 | \] 190 | 191 | Производной такой многомерной функции будет матрица из частных производных каждой функции по каждому аргументу 192 | 193 | \[ 194 | \begin{pmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \ldots & \frac{\partial f_1}{\partial x_n} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \ldots & \frac{\partial f_2}{\partial x_n} \\ \ldots & \ldots & \ddots & \ldots \\ \frac{\partial f_m}{\partial x_1} & \frac{\partial f_m}{\partial x_2} & \ldots & \frac{\partial f_m}{\partial x_n} \end{pmatrix}. 195 | \] 196 | 197 | Дифференциал снова будет представлять из себя вектор 198 | 199 | \[ 200 | \dx{f(x)} = \begin{pmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \ldots & \frac{\partial f_1}{\partial x_n} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \ldots & \frac{\partial f_2}{\partial x_n} \\ \ldots & \ldots & \ddots & \ldots \\ \frac{\partial f_m}{\partial x_1} & \frac{\partial f_m}{\partial x_2} & \ldots & \frac{\partial f_m}{\partial x_n} \end{pmatrix} \cdot \begin{pmatrix} \dx{x_1} \\ \dx{x_2} \\ \ldots \\ \dx{x_n} \end{pmatrix} = \begin{pmatrix} \frac{\partial f_1}{\partial x_1} \dx{x_1} + \frac{\partial f_1}{\partial x_2} \dx{x_2} + \ldots + \frac{\partial f_1}{\partial x_n} \dx{x_n} \\ \frac{\partial f_2}{\partial x_1} \dx{x_1} + \frac{\partial f_2}{\partial x_2} \dx{x_2} + \ldots + \frac{\partial f_2}{\partial x_n} \dx{x_n} \\ \ldots \\ \frac{\partial f_m}{\partial x_1} \dx{x_1} + \frac{\partial f_m}{\partial x_2} \dx{x_2} + \ldots + \frac{\partial f_m}{\partial x_n} \dx{x_n} \end{pmatrix}. 201 | \] 202 | 203 | В обоих ситуациях мы можем записать дифференциал через матричное произведение. Вернёмся к поиску второй производной 204 | 205 | \[ 206 | \dx{g(x)} = (A + A^T) \dx{x}. 207 | \] 208 | 209 | Выходит, что матрица из вторых производных для функции $f(x)$ выглядит как $A + A^T.$ Обратите внимание, что для этой ситуации в каноническом виде нет транспонирования. Когда мы вытаскиваем из записи дифференциала производную, нам не надо его применять. 210 | 211 | 212 | \item Когда мы хотим найти производную $f(x) = \ln(x^T A x)$, мы просто можем применить правила взятия производной от сложной функции $f(y) = \ln(y).$ К логарифму на вход идет скаляр, а значит его производная равна $\frac{1}{y}$. Выходит, что 213 | 214 | \[ 215 | \dx{f(x)} = \dx{\ln(y)} = \frac{1}{y} \dx{y} = \frac{1}{y} \dx{(x^T A x)} = \frac{1}{x^T A x} \cdot x^T(A^T + A) \dx{x}. 216 | \] 217 | 218 | В таких ситуация нужно быть осторожным и следить за тем, что на вход функции идёт скаляр. Если это не так, то ситуация усложняется и мы оказываемся в ситуации, где надо поднапрячься. Чуть ниже мы рассмотрим в качестве примера матричную экспоненту $\exp(X),$ где $X$ --- квадратная матрица. 219 | 220 | 221 | \item \label{tr_tr} Движемся к следующей ситуации. Функция бьёт из матриц в скаляры 222 | 223 | \[ 224 | f(X) : \RR^{n \times k} \to \RR. 225 | \] 226 | 227 | В таком случае нам надо найти производную функции по каждому элементу матрицы, то есть дифференциал будет выглядеть как 228 | 229 | \[ 230 | \dx{f(X)} = f'_{x_{11}} \dx{x_{11}} + f'_{x_{12}} \dx{x_{12}} + \ldots + f'_{x_{nk}} \dx{x_{nk}}. 231 | \] 232 | 233 | Его можно записать в компактном виде через след матрицы как 234 | \[ 235 | \dx{f(X)} = \tr(\nabla f^T \dx{X}), 236 | \] где 237 | 238 | \[ 239 | \nabla f = \begin{pmatrix} f'_{x_{11}} & \ldots & f'_{x_{1k}} \\ 240 | \hdots & \ddots & \hdots \\ 241 | f'_{x_{n1}} & \ldots & f'_{x_{nk}} 242 | \end{pmatrix} 243 | \] 244 | 245 | Вполне естественен вопрос \indef{а почему это можно записать именно так?} Давайте попробуем увидеть этот факт на каком-нибудь простом примере. Пусть у нас есть две матрицы 246 | 247 | \[ 248 | A_{[2 \times 3]} = \begin{pmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \end{pmatrix} \qquad X_{[2 \times 3]} = \begin{pmatrix} x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23} \end{pmatrix}. 249 | \] 250 | 251 | Посмотрим на то, как выглядит $\tr(A^T \dx{X})$. Как это не странно, он совпадает с дифференциалом 252 | 253 | \[\tr(A^T \dx{X}) = \tr \left( \begin{pmatrix} a_{11} & a_{21} \\ a_{12} & a_{22} \\ a_{13} & a_{23} \end{pmatrix} \begin{pmatrix} \dx x_{11} & \dx x_{12} & \dx x_{13} \\ \dx x_{21} & \dx x_{22} & \dx x_{23} \end{pmatrix} \right), 254 | \] 255 | 256 | при произведении на выходе получаем матрицу размера $3 \times 3$ 257 | 258 | \[ 259 | \begin{pmatrix} a_{11} \dx x_{11} + a_{21} \dx x_{21} & a_{11} \dx x_{12} + a_{21} \dx x_{22} & a_{11} \dx x_{13} + a_{21} \dx x_{23} \\ a_{12} \dx x_{11} + a_{22} \dx x_{21} & a_{12} \dx x_{12} + a_{22} \dx x_{22} & a_{12} \dx x_{13} + a_{22} \dx x_{23} \\ a_{13} \dx x_{11} + a_{23} \dx x_{21} & a_{13} \dx x_{12} + a_{23} \dx x_{22} & a_{13} \dx x_{13} + a_{23} \dx x_{23} \end{pmatrix}. 260 | \] 261 | 262 | \index{Когда мы берём её след, остаётся сумма элементов по диагонали. Это и есть требуемый дифференциал.} Дальше мы периодически будем пользоваться таким приёмом. Например, величину 263 | 264 | \[ 265 | ||X-A||^2 = \sum_{i,j} (x_{ij} - a_{ij})^2 266 | \] 267 | 268 | можно записать в матричном виде как 269 | 270 | \[ 271 | \tr((X-A)^T (X-A)). 272 | \] 273 | 274 | 275 | 276 | Итак, найдём производную от $f(X) = a^TXAXa$. Нам нужно выписать дифференциал и привести его к каноническому виду 277 | 278 | Обратим внимание на то, что мы бьём из матриц в скаляры. Дифференциал будет по своей размерности совпадать со скаляром. Производная будет размера матрицы 279 | 280 | \[ 281 | \dx{f(X)} = \dx{(a^TXAXa)} = \underset{[1 \times 1]}{a^T\dx{(X)}AXa} + \underset{[1 \times 1]}{a^TXA\dx{(X)}a}. 282 | \] 283 | 284 | Оба слагаемых, которые мы получаем после перехода к дифференциалу --- скаляры. Мы хотим представить дифференциал в виде $\tr(\text{нечто} \dx{X})$. След от скаляра это снова скаляр. Получается, что мы бесплатно можем навесить над правой частью наешго равенство знак следа и воспользоваться его свойствами 285 | 286 | \begin{multline*} 287 | \dx{f(X)} = \dx{(a^TXAXa)} = \tr(a^T\dx{(X)}AXa) + \tr(a^TXA\dx{(X)}a) = \\ = \tr(AXaa^T\dx{(X)}) + \tr(aa^TXA\dx{(X)}) = \\ = \tr(AXaa^T\dx{(X)} + aa^TXA\dx{(X)}) = \tr((AXaa^T + aa^TXA)\dx{(X)}). 288 | \end{multline*} 289 | 290 | Производная найдена, оказалось что это 291 | 292 | \[ 293 | \nabla f = (AXaa^T + aa^TXA)^T = aa^TX^TA^T + A^TXaa^T. 294 | \] 295 | 296 | Как бы мы нашли это, всё по-честному перемножив, даже боюсь себе представлять. 297 | 298 | \item Ещё один пример на ситуацию, когда функция бьёт из векторов в вектора 299 | 300 | \[ 301 | \underset{[n \times 1]}{f(x)} = \underset{[n \times 1]}{x} \underset{[1 \times n]}{x^T} \underset{[n \times 1]}{x}. 302 | \] 303 | В нём надо аккуратно вести себя со сложением матриц со скалярами. Берём дифференциал 304 | 305 | \[ 306 | \dx{f(x)} = \dx{xx^Tx} = \dx{x}x^Tx + x \dx{x^T} x + xx^T\dx{x}. 307 | \] 308 | 309 | В первом слагаемом пользуемся тем, что $x^Tx$ скаляр и его можно вынести перед дифференциалом. Этот скаляр умножается на каждый элемент вектора. Дальше мы захотим вынести дифференциал за скобку, чтобы не испортить матричное сложение, подчеркнём факт этого перемножения на каждый элемент единичной матрицей. Во втором слагаемом пользуемся тем, что $\dx{x^T} x$ скаляр и транспонируем его 310 | \[ 311 | \dx{f(x)} = \underset{[1 \times 1]}{x^Tx} \underset{[n \times n]}{I_n} \underset{[n \times 1]}{\dx{x}} + x x^T \dx{x} + xx^T\dx{x} = (x^Tx I_n + 2 x x^T)\dx{x}. 312 | \] 313 | 314 | Обратите внимание, что без единичной матрицы размерности у сложения поломаются. Получается, что наша производная выглядит как 315 | 316 | \[ 317 | \mathfrak{J} = x^Tx I_n + 2 x x^T = \begin{pmatrix} \sum x_i^2 + 2 x_1^2 & 2 x_1 x_2 & \ldots & 2 x_1 x_n \\ 318 | 2 x_1 x_2 & \sum x_i^2 + 2 x_2^2 & \ldots & 2 x_2 x_n \\ 319 | \ldots & \ldots & \ddots &\ldots \\ 320 | 2 x_1 x_n & 2 x_n x_2 & \ldots & \sum x_i^2 + 2 x_n^2 \\ 321 | \end{pmatrix}. 322 | \] 323 | 324 | Как и ожидалось, на выходе получилась матрица. 325 | 326 | 327 | \item \indef{В нашей таблице. осталось ещё несколько ситуаций, которые остались вне поля нашего зрения.} Давайте их обсудим более подробно. Например, давайте посмотрим на ситуацию когда отображение бьёт из матриц в вектора 328 | 329 | \[ 330 | f(X) : \RR^{n \times k} \to \RR^m. 331 | \] 332 | 333 | Тогда $X$ матрица, а $f(X)$ вектор. Нам надо найти производную каждого элемента из вектора $f(X)$ по каждому элементу из матрицы $X$. Получается, что $\frac{\partial f}{\partial X}$ --- это трёхмерная структура. Обычно в таких ситуациях ограничиваются записью частных производных либо прибегают к более сложным, многомерным методикам. Мы такие ситуации опустим. 334 | \end{enumerate} 335 | \end{sol} 336 | 337 | \begin{problem}{} 338 | Давайте пополним таблицу дифференциалов несколькими новыми функциями, специфичными для матриц. Найдём матричные дифференциалы функций: 339 | \begin{enumerate} 340 | \item $f(X) = X^{-1}$, где матрица $X$ размера $n \times n$ 341 | 342 | \item $f(X) = \det X$, где матрица $X$ размера $n \times n$ 343 | 344 | \item $f(X) = \tr(X)$, где матрица $X$ размера $n \times n$ 345 | 346 | \item Ещё больше матричных производных можно найти в книге The Matrix Cookbook\footnote{\url{https://www.math.uwaterloo.ca/~hwolkowi/matrixcookbook.pdf}} 347 | \end{enumerate} 348 | \end{problem} 349 | 350 | \begin{sol} 351 | \begin{enumerate} 352 | \item Найдём производную обратной матрицы. Тут логично вспомнить, что производная константы это ноль, обратная матрица определяется как $X^{-1} \cdot X = I_n$, а единичная матрица $I_n$ это как раз константа. Берём дифференциал с обеих сторон нашего равенства 353 | 354 | \[ 355 | \dx{X^{-1}} X + X^{-1} \dx{X} = \dx{I_n} = 0, 356 | \] 357 | 358 | отсюда получаем что 359 | 360 | \[ 361 | \dx{X^{-1}} = - X^{-1} \dx{X} X^{-1}. 362 | \] 363 | 364 | \item Определитель --- это функция, которая бьёт из матриц в скаляры. Его можно искать по-разному, один из способов --- разложение по строке 365 | 366 | \[ 367 | \det X = \sum_{j = 1}^n x_{ij} (-1)^{i + j} M_{ij}, 368 | \] 369 | 370 | где $M_{ij}$ --- дополнительный минор матрицы $X$. Берём дифференциал 371 | 372 | \[ 373 | \dx{(\det X)} = (-1)^{1 + 1} M_{11} \dx{x_{11}} + (-1)^{1 + 2} M_{12} \dx{x_{12}} + \ldots = \sum_{ij} A_{ji} \dx{x_{ij}} = \tr(A \dx{X}), 374 | \] 375 | 376 | где $A_{ij} = (-1)^{i +j} M_{ij},$ то есть $A$ --- матрица алгебраических дополнений. Трюк со следом аналогичен пункту \ref{tr_tr} из предыдущей задачи. Вспомним, что обратную матрицу можно получить отталкиваясь от алгебраических дополнений по формуле 377 | 378 | \[ 379 | X^{-1} = \frac{A}{\det X}. 380 | \] 381 | 382 | Выразим матрицу $A$ и подставим её а получившееся выше уравнение 383 | 384 | \[ 385 | \dx{(\det X)} = \tr(\det (X) X^{-1} \dx{X}), 386 | \] 387 | 388 | выходит что искомая производная равна 389 | 390 | \[ 391 | \nabla f = (\det X \cdot X^{-1})^T = \det X \cdot X^{-T}. 392 | \] 393 | 394 | \item По аналогии с определителем след бьёт из пространства матриц в пространство скаляров, получается 395 | 396 | \[ 397 | \dx{(\tr X)} = \tr(I_n \dx X). 398 | \] 399 | 400 | Это логично, так как след представляет из себя сумму диагональных элементов. 401 | \end{enumerate} 402 | \end{sol} 403 | 404 | 405 | %%%------------------------------------------- 406 | \begin{problem}{} 407 | Рассмотрим задачу линейной регресии 408 | \[ 409 | L(w) = (y - Xw)^T(y - Xw) \to \min_{w}. 410 | \] 411 | 412 | \begin{enumerate} 413 | \item Найдите $L(w)$, выведите формулу для оптимального $w$. 414 | \item Как выглядит шаг градиентного спуска в матричном виде? 415 | \item Найдите $\dx^2L(w)$. Убедитесь, что мы действительно в точке минимума. 416 | \end{enumerate} 417 | \end{problem} 418 | \begin{sol} 419 | Ради интереса убедимся, что перед нами в качестве функции потерь используется именно MSE, в качестве $x_i$ будем обозначать $i-$ую строчку матрицы $X$ 420 | 421 | \[ 422 | (y - Xw)^T(y - Xw) = \begin{pmatrix} y_1 - x_1^Tw & \ldots & y_n - x_n^Tw \end{pmatrix} \begin{pmatrix} y_1 - x_1^Tw \\ \ldots \\ y_n - x_n^Tw \end{pmatrix} = \sum_{i=1}^n (y_i - x_i^Tw)^2. 423 | \] 424 | 425 | Найдём дифференциал для нашей функции потерь, держим в голове что производная берётся по вектору $w$ 426 | 427 | \begin{multline*} 428 | \dx L = \dx[(y - Xw)^T(y - Xw)] = \dx[(y - Xw)^T] (y - Xw) + (y - Xw)^T\dx[(y - Xw)] = \\ = \dx[(-Xw)^T] (y - Xw) - (y - Xw)^TX\dx w = \\ = - \dx w^T X^T (y - Xw) - (y - Xw)^TX\dx w = -2 (y - Xw)^TX \dx w. 429 | \end{multline*} 430 | 431 | Тут мы воспользовались тем, что $ \dx w^T X^T (y - Xw)$ это скаляр и его можно транспонировать. Производная найдена. Шаг градиентного спуска будет выглядеть как 432 | 433 | \[ 434 | w_t = w_{t-1} + \gamma \cdot 2X^T(y-Xw). 435 | \] 436 | 437 | Здесь $\gamma$ --- это скорость обучения. Приравняем производную к нулю, чтобы найти минимум для $w$. Получается система уравнений 438 | 439 | \[ 440 | 2X^T(y-Xw) = 0 \qquad X^Ty = X^TX w \qquad w = (X^TX)^{-1} X^Ty. 441 | \] 442 | 443 | При решении системы мы сделали предположение, что матрица $X^TX$ обратима. Это так, если в матрице $X$ нет линейно зависимых столбцов, а также наблюдений больше чем переменных. Найдём вторую производную 444 | 445 | \[ 446 | \dx[-2X^T(y-Xw)] = 2X^TX \dx w. 447 | \] 448 | 449 | Выходит, что $H = 2X^TX$. Так как матрица $X^TX$ положительно определена, по критерию Сильвестра, мы находимся в точке минимума. 450 | 451 | Матрица $X^TX$ положительно определена по определению. Если для любого вектора $v \ne 0$ квадратичная форма $v^T X^TX v > 0$, матрица $X^TX$ положительно определена. При перемножении $Xv$ у нас получается вектор. Обозначим его как $z$, значит $v^T X^TX v = z^T z = \sum_{i=1}^n z_i^2 > 0$. 452 | 453 | Выпишем в явном виде второй дифференциал 454 | 455 | \[ 456 | \dx^2 L = \dx w^T 2X^TX \dx w. 457 | \] 458 | \end{sol} 459 | 460 | 461 | %%%------------------------------------------- 462 | \begin{problem}{} 463 | Найдите следующие производные: 464 | \begin{enumerate} 465 | \item $f(X) = \tr(AXB)$, где матрица $A$ размера $p \times m$, матрица $B$ размера $n \times p$, матрица $X$ размера $m \times n$. % A^TB^T 466 | 467 | \item $f(X) = \tr(AX^TX)$, где матрица $A$ размера $n \times n$, матрица $X$ размера $m \times n$. % XA + XA^T 468 | 469 | \item $f(X) = \ln \det X$ % X^{-1} 470 | 471 | \item $f(X) = \tr(AX^TXBX^{-T})$ 472 | 473 | \item $f(X) = \det(X^TAX)$ 474 | 475 | \item $f(x) = x^TAb$, где матрица $A$ размера $n \times n$, вектора $x$ и $b$ размера $n \times 1$. 476 | 477 | \item $f(A) = x^TAb$. 478 | \end{enumerate} 479 | \end{problem} 480 | \begin{sol} 481 | Проверить правильность своего решения можно в матричном калькуляторе\footnote{ \url{http://www.matrixcalculus.org/}}. Не забывайте, что $\tr(A) = \tr(A^T)$ и что под знаком следа можно циклически переставлять матрицы, если размерность не ломается. 482 | \end{sol} 483 | 484 | 485 | %%%------------------------------------------- 486 | \begin{problem}{} 487 | В случае Ridge-регрессии минимизируется функция со штрафом: 488 | \[ 489 | L(w) = (y - Xw)^T(y - Xw) + \lambda w^Tw, 490 | \] 491 | где $\lambda$ — положительный параметр, штрафующий функцию за слишком большие значения $w$. 492 | 493 | \begin{enumerate} 494 | \item Найдите $dL(w)$, выведите формулу для оптимального $w$. 495 | \item Как выглядит шаг градиентного спуска в матричном виде? 496 | \item Найдите $d^2L(w)$. Убедитесь, что мы действительно в точке минимума. 497 | \end{enumerate} 498 | \end{problem} 499 | \begin{sol} 500 | \begin{equation*} 501 | \begin{aligned} 502 | & \dx L = 2 (y - Xw)^TX \dx w + 2\lambda w^T \dx{w} \\ 503 | & \nabla L(w) = 2 X^T (Xw - y) + 2\lambda w \\ 504 | & w = (X^TX + \lambda I)^{-1} X^Ty \\ 505 | & w_t = w_{t-1} - \gamma \cdot (2 X^T (Xw_{t-1} - y) + 2\lambda w_{t-1}) \\ 506 | & \dx^2 L = \dx{w^T}(2X^TX + 2\lambda)\dx{w} \\ 507 | & H = 2X^TX + 2\lambda \text{ положительно определена} 508 | \end{aligned} 509 | \end{equation*} 510 | 511 | % Для Lasso-модели нужно рассмотреть два случая: 512 | 513 | % \begin{itemize} 514 | % \item $w \ge 0: \quad L(w) - (y - xw)^T(y-xw) + \lambda w$. Решив, получаем оптимальное значение 515 | 516 | % \[ w^{+} = \frac{x^Ty}{x^Tx} - \frac{\lambda}{2x^Tx}.\] 517 | 518 | % \item $w < 0: \quad L(w) - (y - xw)^T(y-xw) - \lambda w$. Решив, получаем оптимальное значение 519 | 520 | % \[ w^{-} = \frac{x^Ty}{x^Tx} + \frac{\lambda}{2x^Tx}.\] 521 | % \end{itemize} 522 | 523 | % Заметим, что $L(w)$ --- это парабола. Рассмотрим четыре ситуации положения $w^{+}$ и $w^{-}$ и получим ответ: 524 | 525 | % \begin{equation*} 526 | % \begin{aligned} 527 | % & w^{+} < 0, w^{-1} < 0 \Rightarrow \hat{w} = w^{-} \\ 528 | % & w^{+} > 0, w^{-1} > 0 \Rightarrow \hat{w} = w^{+} \\ 529 | % & w^{+} < 0, w^{-1} > 0 \Rightarrow \hat{w} = 0 \\ 530 | % & w^{+} > 0, w^{-1} < 0 \text{ этот случай невозможен.} 531 | % \end{alligned} 532 | % \end{equation*} 533 | \end{sol} 534 | 535 | 536 | %%%------------------------------------------- 537 | \begin{problem}{} 538 | Пусть $x_i$ — вектор-столбец $k\times 1$, $y_i$ — скаляр, равный $+1$ или $-1$, $w$ — вектор-столбец размера $k\times 1$. Рассмотрим логистическую функцию потерь с $l_2$ регуляризацией 539 | \[ 540 | L(w) = \sum_{i=1}^n \ln (1 + \exp(-y_ix_i^Tw)) + \lambda w^T w 541 | \] 542 | 543 | \begin{enumerate} 544 | \item Найдите $\dx L$; 545 | \item Найдите вектор-столбец $\nabla L$. 546 | \item Как для этой функции потерь выглядит шаг градиентного спуска в матричном виде? 547 | \end{enumerate} 548 | \end{problem} 549 | \begin{sol} 550 | Используем весь арсенал, который обсудили выше. Начнём с одного слагаемого. Обозначим его как $y$. Это скаляр, значит 551 | 552 | \[ 553 | \dx \ln y = \frac{1}{y} \dx y = \frac{1}{\ln (1 + \exp(-y_ix_i^Tw))} \cdot -y_i \exp(-y_i x_i^T w) \cdot x_i^T \dx w. 554 | \] 555 | 556 | Выписываем дифференциал 557 | 558 | \[ 559 | \dx L = \left( - \sum_{i=1}^n \frac{y_i \exp(-y_i x_i^T w)}{1 + \exp(-y_ix_i^Tw)} \cdot x_i^T + 2 \lambda w^T \right) \dx{w}. 560 | \] 561 | 562 | Можно записать градиент с помощью сигмоиды $\sigma(z) = \frac{1}{1 + \exp(-z)}.$ Получится, что 563 | 564 | \[ 565 | \nabla L = \sum_{i=1}^n -y_i \sigma(-y_i x_i^T w) x_i + 2 \lambda w. 566 | \] 567 | 568 | Выходит, что шаг градиентного спуска можно записать как 569 | 570 | \[ 571 | w_t = w_{t-1} + \gamma \cdot \nabla L. 572 | \] 573 | \end{sol} 574 | 575 | 576 | %%%------------------------------------------- 577 | \begin{problem}{} 578 | Упражняемся в матричном методе максимального правдоподобия. Допустим, что выборка размера $n$ пришла к нам из многомерного нормального распределения с неизвестными вектором средних $\mu$ и ковариационной матрицей $\Sigma$. В этом задании нужно найти оценки максимального правдоподобия для $\hat \mu$ и $\hat \Sigma$. Обратите внимание, что выборкой здесь будет не $x_1, \ldots, x_n$, а 579 | \begin{equation*} 580 | \begin{pmatrix} 581 | x_{11}, \ldots, x_{n1} \\ 582 | \ldots \\ 583 | x_{n1}, \ldots, x_{nm} 584 | \end{pmatrix} 585 | \end{equation*} 586 | \end{problem} 587 | \begin{sol} 588 | 589 | Плотность распределения для $m-$мерного вектора $y$ будет выглядеть как 590 | 591 | \[ 592 | f(x \mid \mu, \Sigma) = \frac{1}{(\sqrt{2 \pi})^m \cdot \sqrt{\det \Sigma}} \cdot \exp \left( - \frac{1}{2} \cdot (x - \mu)^T \Sigma^{-1} (x - \mu) \right). 593 | \] 594 | 595 | В силу того, что все наблюдения независимы, функция правдоподобия для выборки объёма $n$ примет вид: 596 | 597 | \[ 598 | L(x \mid \mu, \Sigma) = \frac{1}{(\sqrt{2 \pi})^{m \cdot n} \cdot \sqrt{\det \Sigma}^n} \cdot \exp \left( - \frac{1}{2} \cdot \sum_{i = 1}^n (x_i - \mu)^T \Sigma^{-1} (x_i - \mu) \right). 599 | \] 600 | 601 | Прологарифмировав правдоподобие, получим 602 | 603 | \[ 604 | \ln L(x \mid \mu, \Sigma) = - \frac{m \cdot n}{2} \ln 2 \pi - \frac{n}{2} \ln \det \Sigma - \frac{1}{2} \sum_{i=1}^n (x_i - \mu)^T \Sigma^{-1} (x_i - \mu) 605 | \] 606 | 607 | Нам нужно найти максимум этой функции по $\mu$ и $\Sigma$. Начнём с $\mu$. Аргумент $\Sigma$ будем считать константой. Обозначим такую функцию за $f(\mu)$. Эта функция бьёт с множества векторов в множество скаляров. Значит дифференциал этой функции можно записать в виде: 608 | 609 | \[ df(\mu) = \nabla f^T d \mu. \] 610 | 611 | Найдём этот дифференциал. Не будем забывать, что дифференциал от константы нулевой, а также что дифференциал суммы равен сумме дифференциалов 612 | 613 | \begin{multline*} 614 | d f(\mu) = -\frac{1}{2} \cdot d \sum_{i=1}^n (x_i - \mu)^T \Sigma^{-1} (x_i - \mu) = -\frac{1}{2} \cdot \sum_{i=1}^n d[(x_i - \mu)^T \Sigma^{-1} (x_i - \mu)] = \\ = -\frac{1}{2} \cdot \sum_{i=1}^n d[(x_i - \mu)^T] \Sigma^{-1} (x_i - \mu) + (x_i - \mu)^T \Sigma^{-1} d[(x_i - \mu)] = \\ = \frac{1}{2} \cdot \sum_{i=1}^n d\mu^T \Sigma^{-1} (x_i - \mu) + (x_i - \mu)^T \Sigma^{-1} d\mu. 615 | \end{multline*} 616 | 617 | Первое слагаемое под суммой имеет размерность $1 \times m \cdot m \times m \cdot m \times 1$. Это константа. Если мы протранспонируем константу, ничего не изменится. Обратим внимание, что матрица $\Sigma$ симметричная и при транспонировании не меняется. Сделаем этот трюк 618 | 619 | \begin{multline*} 620 | \frac{1}{2} \cdot \sum_{i=1}^n d\mu^T \Sigma^{-1} (x_i - \mu) + (x_i - \mu)^T \Sigma^{-1} d\mu = \frac{1}{2} \cdot \sum_{i=1}^n (x_i - \mu)^T \Sigma^{-1} d\mu + (x_i - \mu)^T \Sigma^{-1} d\mu = \\ = \frac{1}{2} \cdot \sum_{i=1}^n [(x_i - \mu)^T \Sigma^{-1} + (x_i - \mu)^T \Sigma^{-1} ] d\mu = \left[ \cdot \sum_{i=1}^n (x_i - \mu)^T \Sigma^{-1} \right] d\mu 621 | \end{multline*} 622 | 623 | Получается, что $f'(\mu) = \sum_{i=1}^n \Sigma^{-1} (x_i - \mu)$. Приравняв производную к нулю и домножив обе части уравнения слева на $\Sigma$, получим оптимальное значению $\mu$: 624 | 625 | \begin{equation*} 626 | \begin{aligned} 627 | &\sum_{i=1}^n \Sigma^{-1} (x_i - \hat \mu) = 0 \\ 628 | &\sum_{i=1}^n (x_i - \hat \mu) = 0 \\ 629 | &\sum_{i=1}^n x_i = n \cdot \hat \mu \Rightarrow \hat \mu = \bar x. 630 | \end{aligned} 631 | \end{equation*} 632 | 633 | Не будем забывать, что в записях выше $x$ и $\mu$ были векторами-столбцами размерности $m \times 1$. В итоговом ответе они также являются векторами-столбцами такой размерности. 634 | 635 | Займёмся оценкой для $\Sigma.$ Аргумент $\mu$ будем считать константой. Обозначим такую функцию за $f(\Sigma)$ 636 | 637 | \[ 638 | f(\Sigma) = - \frac{n}{2} \ln \det \Sigma - \frac{1}{2} \sum_{i=1}^n (x_i - \mu)^T \Sigma^{-1} (x_i - \mu). 639 | \] 640 | 641 | Эта функция бьёт с множества матриц в множество скаляров. Значит дифференциал этой функции можно записать в виде: 642 | 643 | \[ 644 | d f(\Sigma) = \tr (\nabla f^T dx). 645 | \] 646 | 647 | Начнём с первого слагаемого. Для него нам понадобится вспомнить как выглядит дифференциал для определителя 648 | 649 | \[ 650 | - \frac{n}{2} \frac{1}{\det \Sigma} d[\det \Sigma] = - \frac{n}{2} \frac{1}{\det \Sigma} \tr( \det \Sigma \cdot \Sigma^{-T} d \Sigma) = - \tr( \frac{n}{2} \cdot \Sigma^{-1} d \Sigma). 651 | \] 652 | 653 | Теперь поработаем со вторым слагаемым. В нём нас интересует дифференциал обратной матрицы 654 | 655 | \[ 656 | - \frac{1}{2} \sum_{i=1}^n (x_i - \mu)^T d[\Sigma^{-1}] (x_i - \mu) = \frac{1}{2} \sum_{i=1}^n (x_i - \mu)^T \Sigma^{-1} \cdot d \Sigma \cdot \Sigma^{-1} (x_i - \mu). 657 | \] 658 | 659 | Под знаком суммы размерность каждого слагаемого $1 \times m \cdot m \times m \cdot m \times m \cdot m \times m \cdot m \times 1$. Это константа. Если мы возьмём от неё след, ничего не изменится. Взяв след, переставим внутри множители 660 | 661 | \[ 662 | \frac{1}{2} \sum_{i=1}^n (x_i - \mu)^T \Sigma^{-1} \cdot d \Sigma \cdot \Sigma^{-1} (x_i - \mu) = \frac{1}{2} \sum_{i=1}^n \tr( \Sigma^{-1} (x_i - \mu) \cdot (x_i - \mu)^T \Sigma^{-1} \cdot d \Sigma). 663 | \] 664 | 665 | Сумма следов --- след суммы. Объединяем наши слагаемые в месте. В первом множитель $n$ подменяем на сумму 666 | 667 | \[ 668 | d f(\Sigma) = \tr \left( \left [ - \frac{1}{2} \sum_{i = 1}^n \Sigma^{-1} + \Sigma^{-1} (x_i - \mu) \cdot (x_i - \mu)^T \Sigma^{-1} \right] d \Sigma \right) 669 | \] 670 | 671 | Забираем себе из-под знака дифференциала производную. Под знаком суммы после транспонирования ничего не поменяется. Приравниваем производную к нулю, домножим справа каждое слагаемое на $\Sigma$. На четвёртой строчке домножим слева на $\Sigma$: 672 | 673 | \begin{equation*} 674 | \begin{aligned} 675 | & \frac{1}{2} \sum_{i = 1}^n - \Sigma^{-1} + \Sigma^{-1} (x_i - \mu) \cdot (x_i - \mu)^T \Sigma^{-1} = 0 \\ 676 | & - n \cdot \Sigma^{-1} + \sum_{i = 1}^n \Sigma^{-1} (x_i - \mu) \cdot (x_i - \mu)^T \Sigma^{-1} = 0 \\ 677 | & - n + \Sigma^{-1} \sum_{i = 1}^n (x_i - \mu) \cdot (x_i - \mu)^T = 0 \\ 678 | & - n \Sigma+ \sum_{i = 1}^n (x_i - \mu) \cdot (x_i - \mu)^T = 0 \\ 679 | & \Sigma = \frac{1}{n} \sum_{i = 1}^n (x_i - \mu) \cdot (x_i - \mu)^T 680 | \end{aligned} 681 | \end{equation*} 682 | 683 | До оценок остался один шаг. Вспоминаем оценку для $\mu$, подставляем её в уравнение и получаем, что 684 | 685 | \[ 686 | \hat \Sigma = \frac{1}{n} \sum_{i = 1}^n (x_i - \bar x) \cdot (x_i - \bar x)^T. 687 | \] 688 | 689 | Не забываем, что $x_i$ и $\bar x$ --- вектора размерности $m \times 1$. 690 | \end{sol} 691 | 692 | 693 | %%%------------------------------------------- 694 | \begin{problem}{} 695 | Найдите симметричную матрицу $X$ наиболее близкую к матрице $A$ по норме Фробениуса, $\sum_{i,j} (x_{ij} - a_{ij})^2$. Тут мы просто из каждого элемента вычитаем каждый и смотрим на сумму квадратов таких разностей. То есть решите задачку условной матричной минимизации 696 | 697 | \begin{equation*} 698 | \begin{cases} 699 | & ||X - A||^2 \to \min_{A} \\ 700 | & X^T = X 701 | \end{cases} 702 | \end{equation*} 703 | 704 | \textbf{Hint:} Надо будет выписать Лагранджиан. А ещё пригодится тот факт, что $\sum_{i,j} (x_{ij} - a_{ij})^2 = ||X-A||^2 = \tr((X-A)^T (X-A))$. 705 | \end{problem} 706 | 707 | \begin{sol} 708 | Выписываем лагранджиан 709 | 710 | \begin{multline*} 711 | \mathscr{L} = \sum_{i,j} (x_{ij} - a_{ij})^2 + \sum_{ij} \lambda_{ij} (x_{ij} - x_{ji}) = \tr((X-A)^T (X-A)) + \tr(\Lambda^T (X - X^T)) = \\ = \tr(X^TX) - 2 \tr(X^TA) + \tr(A^TA) + \tr(\Lambda^T (X - X^T)) 712 | \end{multline*} 713 | 714 | Найдём все необходимые нам дифференциалы 715 | 716 | \begin{equation*} 717 | \begin{aligned} 718 | & \dx \tr(X^TX) = \tr(\dx(X^TX)) = \tr(X^T\dx X) + \tr(\dx X^T X) = \tr(2 X^T\dx X) \\ 719 | & \dx \tr(X^TA) = \tr(A^T \dx{X}) \\ 720 | & \dx \tr(\Lambda^TX) = \tr(\Lambda^T \dx{X}) \\ 721 | & \dx \tr(\Lambda^TX^T) = \tr(\Lambda \dx{X}) \\ 722 | \end{aligned} 723 | \end{equation*} 724 | 725 | Выписываем в яном виде производную по $X$ 726 | 727 | \[ 728 | \frac{\partial \mathscr{L}}{\partial X} = 2X^T - 2A^T + \Lambda^T - \Lambda = 0 729 | \] 730 | 731 | Нужно избавиться от $\Lambda$, давайте транспонируем уравнение 732 | 733 | \[ 734 | \frac{\partial \mathscr{L}}{\partial X} = 2X - 2A + \Lambda - \Lambda^T = 0, 735 | \] 736 | 737 | а после прибавим его к исходному, тогда лишние части исчезнут 738 | 739 | \[ 740 | 4X - 2A^T - 2A = 0 \qquad X = \frac{1}{2}(A + A^T). 741 | \] 742 | \end{sol} 743 | 744 | % \todo[inline]{Придумать ещё какую-нибудь задачу оптимизации} 745 | % в мидтерме есть с матрицей обратной 746 | -------------------------------------------------------------------------------- /part_04_backprop.tex: -------------------------------------------------------------------------------- 1 | % !TEX root = main.tex 2 | 3 | %%%------------------------------------------- 4 | \section*{Листочек 4: алгоритм обратного распространения ошибки} 5 | 6 | \addcontentsline{toc}{section}{Листочек 4: алгоритм обратного распространения ошибки} 7 | 8 | \epigraph{К толковому выбору приводит опыт,а к нему приводит выбор бестолковый.}{\textit{JSON Стэтхэм}} 9 | 10 | 11 | %%%------------------------------------------- 12 | \begin{problem}{(граф вычислений)} 13 | Как найти производную $a$ по $b$ в графе вычислений? Находим не посещённый путь из $a$ в $b$, перемножаем все производные на рёбрах получившегося пути. Добавляем это произведение в сумму. Так делаем для всех путей. Маша хочет попробовать этот алгоритм на функции 14 | 15 | $$ 16 | f(x,y) = x^2 + xy + (x + y)^2. 17 | $$ 18 | 19 | Помогите ей нарисовать граф вычислений и найти $\frac{\partial f}{\partial x}$ и $\frac{\partial f}{\partial y}.$ В каждой вершине графа записывайте результат вычисления одной элементарной операции: сложений или умножения\footnote{По мотивам книги Николенко "Глубокое обучение" (стр. 79)}. 20 | \end{problem} 21 | 22 | \begin{sol} Нарисуем граф вычислений. 23 | \begin{center} 24 | \begin{tikzpicture} 25 | \tikzstyle{place}=[draw=black,ellipse,minimum height=20pt,minimum width=50pt,inner sep=2pt] 26 | 27 | \draw node at (0, 0) [place] (x) {$x$}; 28 | \draw node at (4, 0) [place] (y) {$y$}; 29 | \draw node at (-2, 2) [place] (a) {$a = x^2$}; 30 | \draw node at (1, 2) [place] (b) {$b = x \cdot y$}; 31 | \draw node at (5, 2) [place] (c) {$c = x + y$}; 32 | \draw node at (-1, 4) [place] (d) {$d = a + b$}; 33 | \draw node at (3, 4) [place] (e) {$e = c^2$}; 34 | \draw node at (1, 6) [place] (f) {$f = d + e$}; 35 | 36 | \draw [->] (x) to (a); 37 | \draw [->] (x) to (b); 38 | \draw [->] (x) to (c); 39 | \draw [->] (y) to (b); 40 | \draw [->] (y) to (c); 41 | \draw [->] (a) to (d); 42 | \draw [->] (b) to (d); 43 | \draw [->] (c) to (e); 44 | \draw [->] (e) to (f); 45 | \draw [->] (d) to (f); 46 | \end{tikzpicture} 47 | \end{center} 48 | 49 | Каждому ребру припишем производную выхода по входу. Например, ребру между $x$ и $a$ будет соответствовать $\frac{\partial a}{\partial x} = 2x.$ 50 | 51 | \begin{center} 52 | \begin{tikzpicture} 53 | \tikzstyle{place}=[draw=black,ellipse,minimum height=20pt,minimum width=50pt,inner sep=2pt] 54 | 55 | \draw node at (0, 0) [place] (x) {$x$}; 56 | \draw node at (4, 0) [place] (y) {$y$}; 57 | \draw node at (-2, 2) [place] (a) {$a = x^2$}; 58 | \draw node at (1, 2) [place] (b) {$b = x \cdot y$}; 59 | \draw node at (5, 2) [place] (c) {$c = x + y$}; 60 | \draw node at (-1, 4) [place] (d) {$d = a + b$}; 61 | \draw node at (3, 4) [place] (e) {$e = c^2$}; 62 | \draw node at (1, 6) [place] (f) {$f = d + e$}; 63 | 64 | \draw [->, red] (x) to (a) node[below=1.cm] {$\frac{\partial a}{\partial x} = 2x$}; 65 | \draw [->, red, dashed] (x) to (b) node[below=10.mm, left] {$\frac{\partial b}{\partial x} = y$}; 66 | \draw [->, amethyst, thick] (x) to (c) node[below=9mm, left] {$\frac{\partial c}{\partial x} = 1$}; 67 | \draw [->] (y) to (b) node[below=9.mm, right] {$\frac{\partial b}{\partial y} = x$}; 68 | \draw [->] (y) to (c) node[below=8.mm, right] {$\frac{\partial c}{\partial y} = 1$}; 69 | \draw [->, red] (a) to (d) node[below=10.mm, left] {$\frac{\partial d}{\partial a} = 1$}; 70 | \draw [->, red, dashed] (b) to (d) node[below=10.mm, right] {$\frac{\partial d}{\partial b} = 1$}; 71 | \draw [->, amethyst, thick] (c) to (e) node[below=10.mm, right] {$\frac{\partial e}{\partial c} = 2c$}; 72 | \draw [->, amethyst, thick] (e) to (f) node[below=10.mm, right] {$\frac{\partial f}{\partial e} = 1$}; 73 | \draw [->, red] (d) to (f) node[below=10.mm, left] {$\frac{\partial f}{\partial d} = 1$}; 74 | \end{tikzpicture} 75 | \end{center} 76 | 77 | Теперь пройдём по всем траекториям из $x$ в $f$ и перемножим производные на рёбрах. После просуммируем получившиеся множители 78 | 79 | \begin{multline*} 80 | \frac{\partial f}{\partial x} = \frac{\partial f}{\partial d} \cdot \frac{\partial d}{\partial a} \cdot \frac{\partial a}{\partial x} + \frac{\partial f}{\partial d} \cdot \frac{\partial d}{\partial b} \cdot \frac{\partial b}{\partial x} + \frac{\partial f}{\partial e} \cdot \frac{\partial e}{\partial c} \cdot \frac{\partial c}{\partial x} = \\ = 1 \cdot 1 \cdot 2x + 1 \cdot 1 \cdot y + 1 \cdot 2c \cdot 1 = 2x + y + 2(x + y). 81 | \end{multline*} 82 | 83 | По аналогии найдём производную по траекториям из $y$ в $f$: 84 | 85 | \[ 86 | \frac{\partial f}{\partial y} = 1 \cdot 1 \cdot x + 1 \cdot 2c \cdot 1 = x + 2(x + y). 87 | \] 88 | \end{sol} 89 | 90 | 91 | 92 | %%%------------------------------------------- 93 | \begin{problem}{(придумываем backpropagation)} 94 | У Маши есть нейросеть с картинки ниже, где $w_k$ --- веса для $k$ слоя, $f(t)$ --- какая-то функция активации. Маша хочет научиться делать для такой нейронной сетки градиентный спуск. 95 | 96 | \begin{center} 97 | \begin{tikzpicture}[scale=1.4] 98 | \tikzstyle{place}=[circle, draw=black, minimum size = 12mm] 99 | \tikzstyle{placeh}=[draw=black, minimum height=25pt,minimum width=60pt,inner sep=2pt] 100 | 101 | % Input 102 | \draw node at (0, -2.25) [place] (first) {$x$}; 103 | \node at (2.5, -2.25) [placeh] (second){$f(t)$}; 104 | \node at (5, -2.25) [placeh] (third){$f(t)$}; 105 | \node at (7.5, -2.25) [placeh] (fourth){$\hat y$}; 106 | 107 | \draw [->] (first) to node[above]{$w_1$} (second); 108 | \draw [->] (second) to node[above]{$w_2$} (third); 109 | \draw [->] (third) to node[above]{$w_3$} (fourth); 110 | \end{tikzpicture} 111 | \end{center} 112 | 113 | \begin{enumerate} 114 | \item Запишите Машину нейросеть, как сложную функцию. 115 | 116 | \item Предположим, что Маша решает задачу регрессии. Она прогоняет через нейросетку одно наблюдение. Она вычисляет знчение функции потерь $L(w_1, w_2, w_3) = \frac{1}{2} \cdot (y - \hat y)^2$. Найдите производные функции $L$ по всем весам $w_k$. 117 | 118 | \item В производных постоянно повторяются одни и те же части. Постоянно искать их не очень оптимально. Выделите эти части в прямоугольнички цветными ручками. 119 | 120 | \item Выпишите все производные в том виде, в котором их было бы удобно использовать для алгоритма обратного распространения ошибки, а затем, сформулируйте сам алгоритм. Нарисуйте под него удобную схемку. 121 | \end{enumerate} 122 | \end{problem} 123 | 124 | \begin{sol} Чтобы записать нейросеть как сложную функцию, нужно просто последовательно применить все слои 125 | 126 | \[ 127 | \hat y_i = f(f(f(x_i \cdot w_1) \cdot w_2) \cdot w_3. 128 | \] 129 | 130 | Запишем функцию потерь и аккуратно найдём все производные 131 | 132 | \[ 133 | L(w_1, w_2, w_3) = \frac{1}{2} \cdot (y - \hat y)^2 = \frac{1}{2} \cdot (y - f(f(x \cdot w_1) \cdot w_2) \cdot w_3)^2. 134 | \] 135 | 136 | Делаем это по правилу взятия производной сложной функции. Как в школе. 137 | 138 | \begin{equation*} 139 | \begin{aligned} 140 | & \frac{\partial L}{\partial w_3} = \frac{\partial L}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial w_3} = (y - \hat{y}) \cdot f(f(x\cdot w_1) \cdot w_2) \\ 141 | & \frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial w_2} = (y - \hat{y}) \cdot w_3 \cdot f'(f(x\cdot w_1) \cdot w_2) \cdot f(x\cdot w_1) \\ 142 | & \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial w_1} = (y - \hat{y}) \cdot w_3 \cdot f'(f(x\cdot w_1) \cdot w_2) \cdot w_2 \cdot f'(x\cdot w_1) \cdot x \\ 143 | \end{aligned} 144 | \end{equation*} 145 | 146 | Выделим в прямоугольники части, которые каждый раз считаются заново, хотя могли бы переиспользоваться. 147 | 148 | \begin{equation*} 149 | \begin{aligned} 150 | & \frac{\partial L}{\partial w_3} = \frac{\partial L}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial w_3} = \boxed{ (y - \hat{y}) } \cdot f(f(x\cdot w_1) \cdot w_2) \\ 151 | & \frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial w_2} = \boxed{ (y - \hat{y})} \cdot \boxed{ w_3 \cdot f'(f(x\cdot w_1) \cdot w_2)} \cdot f(x\cdot w_1) \\ 152 | & \frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial w_1} = \boxed{ (y - \hat{y}) } \cdot \boxed{ w_3 \cdot f'(f(x\cdot w_1) \cdot w_2)} \cdot w_2 \cdot f'(x\cdot w_1) \cdot x \\ 153 | \end{aligned} 154 | \end{equation*} 155 | 156 | Если бы слоёв было бы больше, переиспользования возникали бы намного чаще. Градиентный спуск при таком подходе мы могли бы сделать точно также, как и в любых других моделях \begin{equation*} 157 | \begin{aligned} 158 | & w_3^t = w_3^{t-1} - \eta \cdot \frac{\partial L}{\partial w_3}(w_3^{t-1}) \\ 159 | & w_2^t = w_2^{t-1} - \eta \cdot\frac{\partial L}{\partial w_2}(w_2^{t-1}) \\ 160 | & w_1^t = w_1^{t-1} - \eta \cdot\frac{\partial L}{\partial W_1}(w_1^{t-1}). 161 | \end{aligned} 162 | \end{equation*} 163 | 164 | Проблема в том, что такой подход из-за постоянных перевычислений будет работать долго. Алгоритм обратного распространения ошибки помогает более аккуратно считать производную и ускорить обучение нейросетей. 165 | 166 | Выпишем алгоритм обратного распространения ошибки. Договоримся до следующих обозначений. Буквами $h^k$ будем обозначать выход $k-$го слоя до применения функции активации. Буквами $o^k$ будем обозначать всё то же самое после применения функции активации. Например, для первого слоя: 167 | 168 | \begin{equation*} 169 | \begin{aligned} 170 | & h^1_i = w_1 \cdot x_i \\ 171 | & o^1_i = f(h_i^1). \\ 172 | \end{aligned} 173 | \end{equation*} 174 | 175 | Сначала мы делаем прямой проход по нейросети (forward pass): 176 | 177 | \begin{center} 178 | \begin{tikzpicture} 179 | \tikzstyle{place}=[rectangle, draw=black, minimum size = 8mm] 180 | \draw node at (0, 0) (input) {$x$}; 181 | \draw node at (1.5, 0) (h1) {$h_1$}; 182 | \draw node at (3, 0) (o1) {$o_1$}; 183 | \draw node at (4.5, 0) (h2) {$h_2$}; 184 | \draw node at (6, 0) (o2) {$o_2$}; 185 | \draw node at (7.5, 0) (output) {$\hat{y}$}; 186 | \draw node at (9, 0) (mse) {$L(y, \hat y)$}; 187 | 188 | \draw [->] (input) -- (h1) node[pos=.49, above] {$w_1$} ; 189 | \draw [->] (h1) -- (o1) node[pos=.49, above] {$f$} ; 190 | \draw [->] (o1) -- (h2) node[pos=.49, above] {$w_2$} ; 191 | \draw [->] (h2) -- (o2) node[pos=.49, above] {$f$} ; 192 | \draw [->] (o2) -- (output) node[pos=.49, above] {$w_3$} ; 193 | \draw [->] (output) to (mse); 194 | \end{tikzpicture} 195 | \end{center} 196 | 197 | Наша нейросеть --- граф вычислений. Давайте запишем для каждого ребра в рамках этого графа производную. 198 | 199 | \begin{center} 200 | \begin{tikzpicture} 201 | \draw node at (0, 0) (input) {$x$}; 202 | \draw node at (2, 0) (h1) {$h_1$}; 203 | \draw node at (4, 0) (o1) {$o_1$}; 204 | \draw node at (6, 0) (h2) {$h_2$}; 205 | \draw node at (8, 0) (o2) {$o_2$}; 206 | \draw node at (10, 0) (output) {$\hat{y} $}; 207 | \draw node at (12, 0) (mse) {$MSE$}; 208 | 209 | \draw [->, dashed] (h1) -- (input) node[pos=.49, above] {$\frac{\partial h_1}{\partial x}$} ; 210 | \draw [->, dashed] (o1) -- (h1) node[pos=.49, above] {$\frac{\partial o_1}{\partial h_1}$} ; 211 | \draw [->, dashed] (h2) -- (o1) node[pos=.49, above] {$\frac{\partial h_2}{\partial o_1}$} ; 212 | \draw [->, dashed] (o2) -- (h2) node[pos=.49, above] {$\frac{\partial o_2}{\partial h_2}$} ; 213 | \draw [->, dashed] (output) -- (o2)node[pos=.49, above] {$\frac{\partial \hat{y}}{\partial o_2}$} ; 214 | \draw [->, dashed] (mse) -- (output) node[pos=.49, above] {$\frac{\partial L}{\partial \hat{y}} $} ; 215 | 216 | \draw [->, dashed] (9, -0.05) -- (9, -1.2) node[pos=.49, right] {$\frac{\partial \hat{y}}{\partial w_3} = o_2$} ; 217 | \draw [->, dashed] (5, -0.05) -- (5, -1.2) node[pos=.49, right] {$\frac{\partial h_2}{\partial w_2} = o_1$} ; 218 | \draw [->, dashed] (1, -0.05) -- (1, -1.2) node[pos=.49, right] {$\frac{\partial h_1}{\partial w_1} = x$} ; 219 | \end{tikzpicture} 220 | \end{center} 221 | 222 | Мы везде работаем со скалярами. Все производные довольно просто найти по графу, на котором мы делаем прямой проход. Например, 223 | 224 | \[ 225 | \frac{\partial h_2}{\partial w_2} = \frac{\partial (o_2 \cdot w_2)}{\partial w_2} = o_2. 226 | \] 227 | 228 | Если в качестве функции активации мы используем сигмоиду 229 | 230 | \[ 231 | f(z) = \sigma(z) = \frac{1}{1 + e^{-z}} = \frac{e^z}{1 + e^{z}}, 232 | \] 233 | 234 | тогда 235 | 236 | \begin{multline*} 237 | \frac{\partial \sigma }{\partial z} = \left(\frac{e^z}{1 + e^{z}} \right)' = \frac{e^z}{1 + e^{z}} - \frac{e^z}{(1 + e^{z})^2} \cdot e^z = \frac{e^z}{1 + e^{z}} \left(1 - \frac{e^z}{1 + e^{z}} \right) = \sigma(z)(1 - \sigma(z)). 238 | \end{multline*} 239 | 240 | Получается, что 241 | \[ 242 | \frac{\partial o_2}{\partial h_2} = \sigma'(h_2) = \sigma(h_2) \cdot (1 - \sigma(h_2)) = o_2 \cdot (1 - o_2). 243 | \] 244 | 245 | Осталось только аккуратно записать алгоритм. В ходе прямого прохода мы запоминаем все промежуточные результаты. Они нам пригодятся для поиска производных при обратном проходе. Например, выше, в сигмоиде, при поиске производной, используется результат прямого прохода $o_2.$ 246 | 247 | Заведём для накопленного значения производной переменную $d$. На первом шаге нам надо найти $\frac{\partial L}{\partial w_3}$. Сделаем это в два хода 248 | 249 | \begin{equation*} 250 | \begin{aligned} 251 | & d = \frac{\partial L}{\partial \hat y} \\ 252 | & \frac{\partial L}{\partial w_3} = d \cdot o_2. 253 | \end{aligned} 254 | \end{equation*} 255 | 256 | Для поиска производной $\frac{\partial L}{\partial w_2}$ переиспользуем значение, которое накопилось в $d$. Нам надо найти 257 | 258 | \[ 259 | \frac{\partial L}{\partial w_2} = \frac{\partial L}{\hat y} \cdot \frac{\partial \hat y}{\partial o_2} \cdot \frac{\partial o_2}{\partial h_2} \cdot \frac{\partial h_2}{\partial w_2} = d \cdot \boxed{ \frac{\partial \hat y}{\partial o_2} \cdot \frac{\partial o_2}{\partial h_2} } \cdot \frac{\partial h_2}{\partial w_2}. 260 | \] 261 | 262 | Часть, выделенную в прямоугольник мы будем переиспользовать для поиска $\frac{\partial L}{\partial w_1}$. Хорошо бы дописать её в $d$ для этого. Получается, вторую производную тоже надо найти в два хода 263 | 264 | \begin{equation*} 265 | \begin{aligned} 266 | & d = d \cdot \frac{\partial \hat y}{\partial o_2} \cdot \frac{\partial o_2}{\partial h_2} \\ 267 | & \frac{\partial L}{\partial w_2} = d \cdot o_1. 268 | \end{aligned} 269 | \end{equation*} 270 | 271 | Осталась заключительная производная $\frac{\partial L}{\partial w_1}$. Нам надо найти 272 | 273 | \[ 274 | \frac{\partial L}{\partial w_2} = \frac{\partial L}{\hat y} \cdot \frac{\partial \hat y}{\partial o_2} \cdot \frac{\partial o_2}{\partial h_2} \cdot \frac{\partial h_2}{\partial o_1} \cdot \frac{\partial o_1}{\partial h_1} \cdot \frac{\partial h_1}{\partial w_1} = d \cdot \frac{\partial h_2}{\partial o_1} \cdot \frac{\partial o_1}{\partial h_1} \cdot \frac{\partial h_1}{\partial w_1}. 275 | \] 276 | 277 | Снова делаем это в два шага 278 | 279 | \begin{equation*} 280 | \begin{aligned} 281 | & d = d \cdot \frac{\partial h_2}{\partial o_1} \cdot \frac{\partial o_1}{\partial h_1} \\ 282 | & \frac{\partial L}{\partial w_1} = d \cdot x. 283 | \end{aligned} 284 | \end{equation*} 285 | 286 | Если бы нейросетка была бы глубже, мы смогли бы переиспользовать $d$ на следующих слоях. Каждую производную мы нашли ровно один раз. \indef{Это и есть алгоритм обратного распространения ошибки.} В случае матриц происходит всё ровно то же самое, но дополнительно надо проследить за всеми размерностями и более аккуратно перемножить матрицы. 287 | \end{sol} 288 | 289 | 290 | 291 | %%%------------------------------------------- 292 | \begin{problem}{(сигмоида)} 293 | В \indef{не}глубоких сетях в качестве функции активации можно использовать сигмоиду 294 | 295 | \[ 296 | \sigma(z) = \frac{1}{1 + e^{-z}} = \frac{e^z}{1 + e^{z}}, 297 | \] 298 | 299 | Маша хочет использовать сигмоиду внутри нейросети. Предполагается, что после прямого шага, наши вычисления будут использованы в другой части нейросети. В конечном итоге, по выходу из нейросети мы вычислим какую-то функцию потерь $L$. 300 | 301 | У сигмоиды нет параметров. Чтобы обучить нейросеть, Маше понадобится производная $\frac{\partial L}{\partial z}$. Выпишите её в матричном виде через производные $\frac{\partial L}{\partial \sigma}$ и $\frac{\partial \sigma}{\partial z}$. 302 | \end{problem} 303 | 304 | \begin{sol} При решении предыдущей задачи мы выяснили, что $\sigma'(z) = \sigma(z) \cdot (1 - \sigma(z)).$ Тогда по цепному правилу 305 | \[ 306 | \frac{\partial L}{\partial z} = \frac{\partial L}{\partial \sigma} \cdot \frac{\partial \sigma }{\partial z} = \frac{\partial L}{\partial \sigma} \cdot \sigma(z) \cdot (1 - \sigma(z)). 307 | \] 308 | 309 | Получается, при прямом проходе мы вычисляем сигмоиду по формуле из условия. При обратном проходе мы умножаем пришедшую к нам производную на производную сигмоиды. Если на вход приходит матрица, мы берём сигмоиду от каждого её элемента. Если на вход приходит матрица $Z_{[n \times k]},$ на выходе мы получаем матрицу $\Sigma_{[n \times k]}.$ 310 | 311 | Когда мы берём сигмоиду от матрицы, мы применяем функцию к каждому её элементу. из-за этого, в производной все умножения мы делаем поэлементно, то есть матрица $\Sigma * (1 - \Sigma)$ останется размера $[n \times k].$ Когда мы применяем цепное правило, под $\frac{\partial L}{\partial \Sigma}$ мы подразумеваем производную функции потерь $L$ по каждому элементу матрицы $\Sigma$. Получается, что это матрица размера $[n \times k].$ Её мы поэлементно умножаем на $\Sigma * (1 - \Sigma)$ и снова получаем матрицу размера $[n \times k].$ Все размерности оказываются соблюдены. 312 | \end{sol} 313 | 314 | 315 | %%%------------------------------------------- 316 | \begin{problem}{(линейный слой)} 317 | Маша знает, что главный слой в нейронных сетях --- линейный. В матричном виде его можно записать как $Z = XW.$ 318 | 319 | Маша хочет использовать этот слой внутри нейросети. Предполагается, что после прямого шага наши вычисления будут использованы в другой части нейросети. В конечном итоге, по выходу из нейросети мы вычислим какую-то функцию потерь $L$. 320 | 321 | Чтобы обучить нейросеть, Маше понадобятся производные $\frac{\partial L}{\partial X}$ и $\frac{\partial L}{\partial W}.$ Аккуратно найдите их и запишите в матричном виде\footnote{\url{https://web.eecs.umich.edu/~justincj/teaching/eecs442/notes/linear-backprop.html}}. Предполагается, что 322 | 323 | \[ 324 | X = \begin{pmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{pmatrix} \qquad W = \begin{pmatrix} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \end{pmatrix} 325 | \]\[ 326 | Z = XW = \begin{pmatrix} z_{11} & z_{12} & z_{13}\\ z_{21} & z_{22} & z_{23} \end{pmatrix} = \begin{pmatrix} x_{11}w_{11} + x_{12}w_{21} & x_{11}w_{12} + x_{12}w_{22} & x_{11}w_{13} + x_{12}w_{23} \\ x_{21}w_{11} + x_{22}w_{21} & x_{21}w_{12} + x_{22}w_{22} & x_{21}w_{13} + x_{22}w_{23} \end{pmatrix} 327 | \] 328 | 329 | \end{problem} 330 | 331 | \begin{sol} 332 | При обратном распространении ошибки мы предполагаем, что производная $\frac{\partial L}{\partial Z}$ у нас уже есть. Так как $Z$ --- это матрица размера $2 \times 3,$ эта производная будет выглядеть как 333 | 334 | \[ 335 | \frac{\partial L}{\partial Z} = \begin{pmatrix} \frac{\partial L}{\partial z_{11}} & \frac{\partial L}{\partial z_{12}} & \frac{\partial L}{\partial z_{13}} \\ \frac{\partial L}{\partial z_{21}} & \frac{\partial L}{\partial z_{22}} & \frac{\partial L}{\partial z_{23}} \end{pmatrix}. 336 | \] 337 | 338 | По цепному правилу мы можем использовать $\frac{\partial L}{\partial Z}$ для поиска интересующих нас градиентов 339 | 340 | \[ 341 | \frac{\partial L}{\partial X} = \frac{\partial L}{\partial Z} \cdot \frac{\partial Z}{\partial X} \qquad \frac{\partial L}{\partial W} = \frac{\partial L}{\partial Z} \cdot \frac{\partial Z}{\partial W}. 342 | \] 343 | 344 | Нужно, чтобы у матриц совпали размерности. Производные $\frac{\partial Z}{\partial X}$ и $\frac{\partial Z}{\partial W}$ --- это матрицы Якоби нашего линейного слоя. Пусть $W$ это параметры, а $X$ аргумент функции. Функция $f(X) = XW$ бьёт из пространства матриц $X_{[2 \times 2]}$ в пространство матриц $Z_{[2 \times 3]}$. Нам надо взять производную от каждого элемента матрицы $Z$ по каждому элементу из матрицы $X$. Всего получится $24$ производных. По правилам из матана мы должны будем записать их в виде четырёхмерной матрицы\footnote{Про это можно более подробно почитать в разделе про матричные производные.}. Это жутко неудобно. 345 | 346 | К счастью, многие производные будут нулевыми. Поэтому мы можем схитрить, сначала найти $\frac{\partial L}{\partial X},$ 347 | 348 | \[ 349 | X = \begin{pmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{pmatrix} \quad \Rightarrow \quad \frac{\partial L}{\partial X} = \begin{pmatrix} \frac{\partial L}{\partial x_{11}} & \frac{\partial L}{\partial x{12}} \\ \frac{\partial L}{\partial x_{21}} & \frac{\partial L}{\partial x_{22}} \end{pmatrix}, 350 | \] 351 | 352 | а затем написать удобные формулы в общем виде. Найдём $\frac{\partial L}{\partial x_{11}}$ с помощью цепного правила 353 | \[ 354 | \frac{\partial L}{\partial x_{11}} = \sum_{i=1}^n \sum_{j=1}^d \frac{\partial L}{\partial z_{ij}} \cdot \frac{\partial z_{ij}}{\partial x_{11}} = \langle \frac{\partial L}{\partial Z} , \frac{\partial Z}{\partial x_{11}} \rangle. 355 | \] 356 | 357 | Работать с суммами неудобно. Мы помним, что $\frac{\partial L}{\partial Z}$ и $\frac{\partial Z}{\partial x_{11}}$ --- матрицы из производных. Поэтому сумму можно записать в виде скалярного произведения матриц. Мы должны в нём умножить элементы матриц друг на друга, а затем сложить. Давайте найдём производную матрицы $Z$ по $x_{11}$ 358 | 359 | \[ 360 | Z = XW = \begin{pmatrix} x_{11}w_{11} + x_{12}w_{21} & x_{11}w_{12} + x_{12}w_{22} & x_{11}w_{13} + x_{12}w_{23} \\ x_{21}w_{11} + x_{22}w_{21} & x_{21}w_{12} + x_{22}w_{22} & x_{21}w_{13} + x_{22}w_{23} \end{pmatrix}. 361 | \] 362 | 363 | Переменная $x_{11}$ фигурирует только в первой строке 364 | 365 | \[ 366 | \frac{\partial Z}{\partial x_{11}} = \begin{pmatrix} w_{11} & w_{12} & w_{13} \\ 0 & 0 & 0 \end{pmatrix}. 367 | \] 368 | 369 | Выходит, что 370 | 371 | \[ 372 | \frac{\partial L}{\partial x_{11}} = \left\langle \begin{pmatrix} \frac{\partial L}{\partial z_{11}} & \frac{\partial L}{\partial z_{12}} & \frac{\partial L}{\partial z_{13}} \\ \frac{\partial L}{\partial z_{21}} & \frac{\partial L}{\partial z_{22}} & \frac{\partial L}{\partial z_{23}} \end{pmatrix} , \begin{pmatrix} w_{11} & w_{12} & w_{13} \\ 0 & 0 & 0 \end{pmatrix} \right\rangle = \frac{\partial L}{\partial z_{11}} \cdot w_{11} + \frac{\partial L}{\partial z_{12}} \cdot w_{12} + \frac{\partial L}{\partial z_{13}} \cdot w_{13}. 373 | \] 374 | 375 | По аналогии мы можем найти оставшиеся три производные. Например, 376 | 377 | \[ 378 | \frac{\partial L}{\partial x_{21}} = \left\langle \begin{pmatrix} \frac{\partial L}{\partial z_{11}} & \frac{\partial L}{\partial z_{12}} & \frac{\partial L}{\partial z_{13}} \\ \frac{\partial L}{\partial z_{21}} & \frac{\partial L}{\partial z_{22}} & \frac{\partial L}{\partial z_{23}} \end{pmatrix} , \begin{pmatrix} 0 & 0 & 0 \\ w_{11} & w_{12} & w_{13} \end{pmatrix} \right\rangle = \frac{\partial L}{\partial z_{21}} \cdot w_{11} + \frac{\partial L}{\partial z_{22}} \cdot w_{12} + \frac{\partial L}{\partial z_{23}} \cdot w_{13}. 379 | \] 380 | 381 | Попробуем выписать $\frac{\partial L}{\partial X}$ через $\frac{\partial L}{\partial Z}$ и $W$ 382 | 383 | \begin{multline*} 384 | \frac{\partial L}{\partial X} = \begin{pmatrix} \frac{\partial L}{\partial x_{11}} & \frac{\partial L}{\partial x{12}} \\ \frac{\partial L}{\partial x_{21}} & \frac{\partial L}{\partial x_{22}} \end{pmatrix} = \\ = \begin{pmatrix} \frac{\partial L}{\partial z_{11}} \cdot w_{11} + \frac{\partial L}{\partial z_{12}} \cdot w_{12} + \frac{\partial L}{\partial z_{13}} \cdot w_{13} & \frac{\partial L}{\partial z_{11}} \cdot w_{21} + \frac{\partial L}{\partial z_{12}} \cdot w_{22} + \frac{\partial L}{\partial z_{13}} \cdot w_{23} \\ \frac{\partial L}{\partial z_{21}} \cdot w_{11} + \frac{\partial L}{\partial z_{22}} \cdot w_{12} + \frac{\partial L}{\partial z_{23}} \cdot w_{13} & \frac{\partial L}{\partial z_{21}} \cdot w_{21} + \frac{\partial L}{\partial z_{22}} \cdot w_{22} + \frac{\partial L}{\partial z_{23}} \cdot w_{23}\end{pmatrix} = \\ = \begin{pmatrix} \frac{\partial L}{\partial z_{11}} & \frac{\partial L}{\partial z_{12}} & \frac{\partial L}{\partial z_{13}} \\ \frac{\partial L}{\partial z_{21}} & \frac{\partial L}{\partial z_{22}} & \frac{\partial L}{\partial z_{23}} \end{pmatrix} \cdot \begin{pmatrix} w_{11} & w_{21} \\ w_{12} & w_{22} \\ w_{13} & w_{23} \end{pmatrix} = \frac{\partial L}{\partial Z} W^T 385 | \end{multline*} 386 | 387 | Нам повезло! Наша хитрость увенчалась успехом, и нам удалось записать нашу формулу в виде произведения двух матриц без вычисления четырёхмерных якобианов. 388 | 389 | \textbf{Провернём ровно такой же фокус с поиском производной $\frac{\partial L}{\partial W}.$} 390 | \[ 391 | W = \begin{pmatrix} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{23} \end{pmatrix} \quad \Rightarrow \quad \frac{\partial L}{\partial W} = \begin{pmatrix} \frac{\partial L}{\partial w_{11}} & \frac{\partial L}{\partial w_{12}} & \frac{\partial L}{\partial w_{13}} \\ \frac{\partial L}{\partial w_{21}} & \frac{\partial L}{\partial w_{22}} & \frac{\partial L}{\partial w_{23}} \end{pmatrix}. 392 | \] 393 | 394 | По аналогии с предыдущей производной 395 | \[ 396 | \frac{\partial L}{\partial w_{kl}} = \sum_{i=1}^n \sum_{j=1}^d \frac{\partial L}{\partial z_{ij}} \cdot \frac{\partial z_{ij}}{\partial w_{kl}} = \langle \frac{\partial L}{\partial Z} , \frac{\partial Z}{\partial w_{kl}} \rangle. 397 | \] 398 | 399 | По матрице 400 | \[ 401 | Z = XW = \begin{pmatrix} x_{11}w_{11} + x_{12}w_{21} & x_{11}w_{12} + x_{12}w_{22} & x_{11}w_{13} + x_{12}w_{23} \\ x_{21}w_{11} + x_{22}w_{21} & x_{21}w_{12} + x_{22}w_{22} & x_{21}w_{13} + x_{22}w_{23} \end{pmatrix} 402 | \] 403 | 404 | мы можем найти все требуемые производные 405 | \begin{equation*} 406 | \begin{aligned} 407 | \frac{\partial Z}{\partial w_{11}} = \begin{pmatrix} x_{11} & 0 & 0 \\ x_{21} & 0 & 0 \end{pmatrix} & \quad \frac{\partial Z}{\partial w_{12}} = \begin{pmatrix} 0 & x_{11} & 0 \\ 0 & x_{21} & 0 \end{pmatrix} & \quad \frac{\partial Z}{\partial w_{13}} = \begin{pmatrix} 0 & 0 & x_{11}\\ 0 & 0 & x_{21}\end{pmatrix} \\ 408 | \frac{\partial Z}{\partial w_{21}} = \begin{pmatrix} x_{12} & 0 & 0 \\ x_{22} & 0 & 0 \end{pmatrix} & \quad \frac{\partial Z}{\partial w_{22}} = \begin{pmatrix} 0 & x_{12} & 0 \\ 0 & x_{22} & 0 \end{pmatrix} & \quad \frac{\partial Z}{\partial w_{23}} = \begin{pmatrix} 0 & 0 & x_{12}\\ 0 & 0 & x_{22}\end{pmatrix}. 409 | \end{aligned} 410 | \end{equation*} 411 | 412 | Чтобы найти $\frac{\partial L}{\partial w_{kl}} $ нам надо посчитать между матрицами $\frac{\partial L}{\partial Z}$ и $\frac{\partial Z}{\partial w_{kl}}$ скалярное произведение. Например, 413 | \[ 414 | \frac{\partial L}{\partial w_{21}} = \left\langle \begin{pmatrix} \frac{\partial L}{\partial z_{11}} & \frac{\partial L}{\partial z_{12}} & \frac{\partial L}{\partial z_{13}} \\ \frac{\partial L}{\partial z_{21}} & \frac{\partial L}{\partial z_{22}} & \frac{\partial L}{\partial z_{23}} \end{pmatrix} , \begin{pmatrix} x_{12} & 0 & 0 \\ x_{22} & 0 & 0 \end{pmatrix} \right \rangle = \frac{\partial L}{\partial z_{11}} \cdot x_{12} + \frac{\partial L}{\partial z_{11}} \cdot x_{22}. 415 | \] 416 | 417 | Получается, что всю матрицу $\frac{\partial L}{\partial W}$ целиком можно найти как 418 | \begin{multline*} 419 | \frac{\partial L}{\partial W} = \frac{\partial L}{\partial W} = \begin{pmatrix} \frac{\partial L}{\partial w_{11}} & \frac{\partial L}{\partial w_{12}} & \frac{\partial L}{\partial w_{13}} \\ \frac{\partial L}{\partial w_{21}} & \frac{\partial L}{\partial w_{22}} & \frac{\partial L}{\partial w_{23}} \end{pmatrix} = \\ = \begin{pmatrix} \frac{\partial L}{\partial z_{11}} \cdot x_{11} + \frac{\partial L}{\partial z_{21}} \cdot x_{21} & \frac{\partial L}{\partial z_{12}} \cdot x_{11} + \frac{\partial L}{\partial z_{22}} \cdot x_{21} & \frac{\partial L}{\partial z_{13}} \cdot x_{11} + \frac{\partial L}{\partial z_{23}} \cdot x_{21} \\ \frac{\partial L}{\partial z_{11}} \cdot x_{12} + \frac{\partial L}{\partial z_{21}} \cdot x_{22} & \frac{\partial L}{\partial z_{12}} \cdot x_{12} + \frac{\partial L}{\partial z_{22}} \cdot x_{22} & \frac{\partial L}{\partial z_{13}} \cdot x_{12} + \frac{\partial L}{\partial z_{23}} \cdot x_{22} \end{pmatrix} = \\ = \begin{pmatrix} x_{11} & x_{21} \\ x_{12} & x_{22} \end{pmatrix} \cdot \begin{pmatrix} \frac{\partial L}{\partial z_{11}} & \frac{\partial L}{\partial z_{12}} & \frac{\partial L}{\partial z_{13}} \\ \frac{\partial L}{\partial z_{21}} & \frac{\partial L}{\partial z_{22}} & \frac{\partial L}{\partial z_{23}} \end{pmatrix} = X^T \frac{\partial L}{\partial Z}. 420 | \end{multline*} 421 | 422 | Таким образом, для линейного слоя, мы всегда можем посчитать производные как 423 | \[ 424 | \frac{\partial L}{\partial W} = X^T \frac{\partial L}{\partial Z} \qquad \frac{\partial L}{\partial X} = \frac{\partial L}{\partial Z} W^T. 425 | \] 426 | 427 | Дальше под $\frac{\partial Z}{\partial W}$ будем всегда подразумевать $X^T,$ а под $\frac{\partial Z}{\partial X}$ будем иметь в виду $W^T$. 428 | \end{sol} 429 | 430 | 431 | 432 | %%%------------------------------------------------------------------------- 433 | \begin{problem}{(Backpropagation в матричном виде)} 434 | У Маши есть нейросеть с картинки ниже, где $w_{ij}^k$ --- веса для $k$ слоя, $f(t)$ --- какая-то функция активации. Маша хочет научиться делать для такой нейронной сетки градиентный спуск. 435 | 436 | \begin{center} 437 | \begin{tikzpicture}[scale=1.4] 438 | \tikzstyle{place}=[circle, draw=black, minimum size = 12mm] 439 | \tikzstyle{placeh}=[draw=black, minimum height=25pt,minimum width=60pt,inner sep=2pt] 440 | 441 | % Input 442 | \foreach \x in {1,...,2} 443 | \draw node at (0, -\x*1.5) [place] (first_\x) {$x_\x$}; 444 | 445 | % Hidden 1 446 | \foreach \x in {1,...,2} 447 | \node at (3, -\x*1.5) [placeh] (second_\x){$f(t)$}; 448 | 449 | % Hidden 2 450 | \foreach \x in {1,...,2} 451 | \node at (6, -\x*1.5) [placeh] (third_\x){$f(t)$}; 452 | 453 | % Output 454 | \node at (9, -2.25) [placeh] (fourth){$y$}; 455 | 456 | \draw [->] (first_1) to node[above]{$w_{11}^1$} (second_1); 457 | \draw [->] (first_1) to node[above]{$w_{12}^1$} (second_2); 458 | \draw [->] (first_2) to node[below]{$w_{21}^1$} (second_1); 459 | \draw [->] (first_2) to node[below]{$w_{22}^1$} (second_2); 460 | 461 | \draw [->] (second_1) to node[above]{$w_{11}^2$} (third_1); 462 | \draw [->] (second_1) to node[above]{$w_{12}^2$} (third_2); 463 | \draw [->] (second_2) to node[below]{$w_{21}^2$} (third_1); 464 | \draw [->,] (second_2) to node[below]{$w_{22}^2$} (third_2); 465 | 466 | \draw [->] (third_1) to node[above]{$w_1^3$} (fourth); 467 | \draw [->] (third_2) to node[below]{$w_2^3$} (fourth); 468 | \end{tikzpicture} 469 | \end{center} 470 | 471 | \begin{enumerate} 472 | \item Запишите Машину нейросеть, как сложную функцию. Сначала в виде нескольких уравнений, а затем в матричном виде. 473 | 474 | \item Выпишите все производные в том виде, в котором их было бы удобно использовать для алгоритма обратного распространения ошибки, а затем, сформулируйте сам алгоритм. Нарисуйте под него удобную схемку. 475 | \end{enumerate} 476 | \end{problem} 477 | 478 | \begin{sol} Договоримся до следующих обозначений. Буквами $h^k_{ij}$ будем обозначать выход $k-$го слоя для $j-$го нейрона для $i-$го наблюдения до применения функции активации. Буквами $o^k_{ij}$ будем обозначать всё то же самое после применения функции активации. Например, для первого слоя: 479 | 480 | \begin{equation*} 481 | \begin{aligned} 482 | & h^1_{i1} = w^1_{11} \cdot x_{i1} + w^1_{21} \cdot x_{i2} \\ 483 | & o^1_{i1} = f(h_{i1}^1). \\ 484 | \end{aligned} 485 | \end{equation*} 486 | 487 | \indef{Делай раз.} Для начала перепишем сетку в виде нескольких уравнений. Для первого слоя мы находим 488 | \begin{equation*} 489 | \begin{aligned} 490 | & o^1_{i1} = f( w^1_{11} \cdot x_{i1} + w^1_{21} \cdot x_{i2}) \\ 491 | & o^1_{i2} = f( w^1_{12} \cdot x_{i1} + w^1_{22} \cdot x_{i2}). \\ 492 | \end{aligned} 493 | \end{equation*} 494 | 495 | Для второго работают аналогичные уравнения, но значения $x$ заменяются на соответствующие $o$. На выходе мы предсказываем $y$, как взвешенную суммы выходов со второго слоя 496 | \[ 497 | \hat{y}_i = w_1^3 \cdot o^2_{i1} + w_2^3 \cdot o^2_{i2}. 498 | \] 499 | 500 | Подставим вместо $o^2_{1i}$ и $o^2_{2i}$ результат вычисления предыдущих слоёв 501 | \[ 502 | \hat{y}_i = w_1^3 \cdot f( w^1_{12} \cdot o^1_{i1} + w^1_{22} \cdot o^1_{i2}) + w_2^3 \cdot f( w^1_{12} \cdot o^1_{i1} + w^1_{22} \cdot o^1_{i2}). 503 | \] 504 | 505 | Подставим результат вычисления первого слоя 506 | \begin{multline*} 507 | \hat{y}_i = w_1^3 \cdot f( w^1_{12} \cdot f( w^1_{11} \cdot x_{i1} + w^1_{21} \cdot x_{i2}) + w^1_{22} \cdot f( w^1_{12} \cdot x_{i1} + w^1_{22} \cdot x_{i2})) + \\ + w_2^3 \cdot f( w^1_{12} \cdot f( w^1_{11} \cdot x_{i1} + w^1_{21} \cdot x_{i2}) + w^1_{22} \cdot f( w^1_{12} \cdot x_{i1} + w^1_{22} \cdot x_{i2})). 508 | \end{multline*} 509 | 510 | Мы записали нашу нейросеть в виде сложной функции. Выглядит ужасно. 511 | 512 | Давайте перепишем всё то же самое более компактно, в матричном виде. Начнём с первого слоя. На самом деле, чтобы найти строчку $(h^1_{i1}, h^1_{i2})$ мы делаем матричное умножение. Строчку $(x_{i1}, x_{i2})$ мы умножаем на матрицу весов $W_1$ 513 | \begin{equation*} 514 | \begin{pmatrix} h^1_{i1} & h^1_{i2} \end{pmatrix} = \begin{pmatrix} x_{i1} & x_{i2}\end{pmatrix} \cdot \begin{pmatrix} w^1_{11} & w^1_{12} \\ w^1_{21} & w^1_{22}\end{pmatrix}. 515 | \end{equation*} 516 | 517 | Чтобы получить $h_1$ мы умножаем строчку из переменных на первый столбец, чтобы получить $h_2$, на второй столбец. Получается, что в терминах матриц каждый нейрон нашей сети --- это столбец. Если мы добавим ещё один столбец из весов в матрицу, это будет эквивалентно добавлению в сетку третьего нейрона, так как на выходе мы будем получать ещё и $h_3$. Если у нас появится дополнительный вход $x_3$, в матрицу нам нужно будет добавить ещё одну строчку из весов. 518 | 519 | Запишем первый слой в матричном виде. На вход идёт матрица из наблюдений $X_{[n \times 2]}$, она умножается на матрицу весов $W_{[2 \times 2]}$, получается матрица $H_{[n \times 2]}$. Ко всем элементам этой матрицы мы применяем функцию активации $f$. Делаем это поэлементно 520 | \[ 521 | O_1 = f(H_1) = f(X\cdot W_1). 522 | \] 523 | 524 | Остальные слои записываются по аналогии. Получается, что наша нейросеть в матричном виде выглядит как 525 | \[ 526 | \hat{y} = f(f(X\cdot W_1) \cdot W_2) \cdot W_3. 527 | \] 528 | 529 | Здесь $\hat{y}$ --- вектор столбец размера $[n \times 1]$, а матрицы весов обладают размерностями $[2 \times 2]$, $[2 \times 2]$ и $[2 \times 1]$ соответственно. 530 | 531 | \indef{Делай два.} Выпишем алгоритм обратного распространения ошибки в виде красивой схемки. Сначала мы делаем прямой проход по нейросети (forward pass): 532 | 533 | \begin{center} 534 | \begin{tikzpicture} 535 | \tikzstyle{place}=[rectangle, draw=black, minimum size = 8mm] 536 | \draw node at (0, 0) (input) {$\underset{[n \times 2]}{X}$}; 537 | \draw node at (2, 0) (h1) {$\underset{[n \times 2]}{H_1}$}; 538 | \draw node at (4, 0) (o1) {$\underset{[n \times 2]}{O_1}$}; 539 | \draw node at (6, 0) (h2) {$\underset{[n \times 2]}{H_2}$}; 540 | \draw node at (8, 0) (o2) {$\underset{[n \times 2]}{O_2}$}; 541 | \draw node at (10, 0) (output) {$\underset{[n \times 1]}{\hat{y}} $}; 542 | \draw node at (12, 0) (mse) {$L(y, \hat y)$}; 543 | 544 | \draw [->] (input) -- (h1) node[pos=.49, above] {$\underset{[2 \times 2]}{W_1}$} ; 545 | \draw [->] (h1) -- (o1) node[pos=.49, above] {$f$} ; 546 | \draw [->] (o1) -- (h2) node[pos=.49, above] {$\underset{[2 \times 2]}{W_2}$} ; 547 | \draw [->] (h2) -- (o2) node[pos=.49, above] {$f$} ; 548 | \draw [->] (o2) -- (output) node[pos=.49, above] {$\underset{[2 \times 1]}{W_3}$} ; 549 | \draw [->] (output) to (mse); 550 | \end{tikzpicture} 551 | \end{center} 552 | 553 | Под всеми матрицами подписаны размерности. Взятие функции активации --- поэлементная операция, она никак не меняет размер матрицы. Это будет важно при взятии производных. В ходе прямого прохода мы запоминаем все промежуточные результаты. Они нам пригодятся для поиска производных при обратном проходе. Например, $\frac{\partial H_2}{\partial W_2} = O_1^T.$ Получается, в какой-то момент нам надо будет переиспользовать результаты вычислений, полученных при прямом проходе. 554 | 555 | Наша нейросеть --- граф вычислений. Давайте запишем для каждого ребра в рамках этого графа производную. 556 | 557 | \begin{center} 558 | \begin{tikzpicture} 559 | \draw node at (0, 0) (input) {$X$}; 560 | \draw node at (2, 0) (h1) {$H_1$}; 561 | \draw node at (4, 0) (o1) {$O_1$}; 562 | \draw node at (6, 0) (h2) {$H_2$}; 563 | \draw node at (8, 0) (o2) {$O_2$}; 564 | \draw node at (10, 0) (output) {$\hat{y} $}; 565 | \draw node at (12, 0) (mse) {$MSE$}; 566 | 567 | \draw [->, dashed] (h1) -- (input) node[pos=.49, above] {$\frac{\partial H_1}{\partial X}$} ; 568 | \draw [->, dashed] (o1) -- (h1) node[pos=.49, above] {$\frac{\partial O_1}{\partial H_1}$} ; 569 | \draw [->, dashed] (h2) -- (o1) node[pos=.49, above] {$\frac{\partial H_2}{\partial O_1}$} ; 570 | \draw [->, dashed] (o2) -- (h2) node[pos=.49, above] {$\frac{\partial O_2}{\partial H_2}$} ; 571 | \draw [->, dashed] (output) -- (o2)node[pos=.49, above] {$\frac{\partial \hat{y}}{\partial O_2}$} ; 572 | \draw [->, dashed] (mse) -- (output) node[pos=.49, above] {$\frac{\partial L}{\partial \hat{y}} $} ; 573 | 574 | \draw [->, dashed] (9, -0.05) -- (9, -1.2) node[pos=.49, right] {$\frac{\partial \hat{y}}{\partial W_3}$} ; 575 | \draw [->, dashed] (5, -0.05) -- (5, -1.2) node[pos=.49, right] {$\frac{\partial H_2}{\partial W_2}$} ; 576 | \draw [->, dashed] (1, -0.05) -- (1, -1.2) node[pos=.49, right] {$\frac{\partial H_1}{\partial W_1}$} ; 577 | \end{tikzpicture} 578 | \end{center} 579 | 580 | Осталось только аккуратно записать обратный ход алгоритма. Заведём для накопленного значения производной переменную $d$. На первом шаге нам надо найти $\frac{\partial L}{\partial W_3}$. Не будем забывать, как выглядят производные для линейного слоя, полученные в предыдущей задаче. Сделаем это в два хода 581 | 582 | \begin{equation*} 583 | \begin{aligned} 584 | & d = \frac{\partial L}{\partial \hat y} \\ 585 | & \frac{\partial L}{\partial W_3} = \frac{\partial L}{\partial \hat y} \cdot \frac{\partial \hat y}{\partial W_3} = O_2^T \cdot d. 586 | \end{aligned} 587 | \end{equation*} 588 | 589 | Матрица $O_2^T$ будет размера $[2 \times n],$ вектор $d$ будет размера $[n \times 1]$, размер производной будет~$[2 \times 1],$ что совпадает с размером матрицы $W_3.$ 590 | 591 | Для поиска производной $\frac{\partial L}{\partial W_2}$ переиспользуем значение, которое накопилось в $d$ 592 | 593 | \begin{equation*} 594 | \begin{aligned} 595 | & d = \frac{\partial L}{\partial H_2} = d \cdot \frac{\partial \hat y}{\partial O_2} \cdot \frac{\partial O_2}{\partial H_2} = d \cdot W_3^T * f'(H_2) \\ 596 | & \frac{\partial L}{\partial W_2} = O_1^T \cdot d. 597 | \end{aligned} 598 | \end{equation*} 599 | 600 | Размер $d$ был $[n \times 1],$ после персчёта стал $[n \times 1] \cdot [1 \times 2] * [n \times 2] = [n \times 2].$ Поэлементное умножение на производную функции активации не повлияло на размер матрицы. Размер производной $\frac{\partial L}{\partial W_2}$ оказывается $[2 \times 2],$ что совпадает с размером матрицы $W_2.$ 601 | 602 | Осталась заключительная производная $\frac{\partial L}{\partial W_1}$. Нам надо найти 603 | 604 | \begin{equation*} 605 | \begin{aligned} 606 | & d = \frac{\partial L}{\partial H_1} = \frac{\partial L}{\partial H_2} \cdot \frac{\partial H_2}{\partial O_1} \cdot \frac{\partial O_1}{\partial H_1} = d \cdot W_2^T * f'(H_1)\\ 607 | & \frac{\partial L}{\partial W_1} = X^T \cdot d. 608 | \end{aligned} 609 | \end{equation*} 610 | 611 | Если бы сетка была глубже, мы продолжили бы переиспользовать $d$. Каждую производную мы посчитали один раз. Такой алгоритм обучения линеен по числу параметров. 612 | \end{sol} 613 | 614 | 615 | %%%------------------------------------------- 616 | \begin{problem}{(Backpropagation своими руками)} 617 | У Маши есть нейросеть с картинки ниже. Она использует функцию потерь 618 | 619 | \[ 620 | L(W_1, W_2, W_3) = \frac{1}{2} \cdot (\hat y - y)^2. 621 | \] 622 | 623 | В качестве функции активации Маша выбрала сигмоиду $\sigma(t) = \frac{e^t}{1 + e^t}$. 624 | 625 | \begin{center} 626 | \begin{tikzpicture}[scale=1.4] 627 | \tikzstyle{place}=[circle, draw=black, minimum size = 12mm] 628 | \tikzstyle{placeh}=[draw=black, minimum height=25pt,minimum width=60pt,inner sep=2pt] 629 | 630 | % Input 631 | \foreach \x in {1,...,2} 632 | \draw node at (0, -\x*1.5) [place] (first_\x) {$x_\x$}; 633 | 634 | % Hidden 1 635 | \foreach \x in {1,...,2} 636 | \node at (3, -\x*1.5) [placeh] (second_\x){$f(t)$}; 637 | 638 | % Hidden 2 639 | \foreach \x in {1,...,2} 640 | \node at (6, -\x*1.5) [placeh] (third_\x){$f(t)$}; 641 | 642 | % Output 643 | \node at (9, -2.25) [placeh] (fourth){$y$}; 644 | 645 | \draw [->] (first_1) to node[above]{$w_{11}^1$} (second_1); 646 | \draw [->] (first_1) to node[above]{$w_{12}^1$} (second_2); 647 | \draw [->] (first_2) to node[below]{$w_{21}^1$} (second_1); 648 | \draw [->] (first_2) to node[below]{$w_{22}^1$} (second_2); 649 | 650 | \draw [->] (second_1) to node[above]{$w_{11}^2$} (third_1); 651 | \draw [->] (second_1) to node[above]{$w_{12}^2$} (third_2); 652 | \draw [->] (second_2) to node[below]{$w_{21}^2$} (third_1); 653 | \draw [->,] (second_2) to node[below]{$w_{22}^2$} (third_2); 654 | 655 | \draw [->] (third_1) to node[above]{$w_1^3$} (fourth); 656 | \draw [->] (third_2) to node[below]{$w_2^3$} (fourth); 657 | \end{tikzpicture} 658 | \end{center} 659 | 660 | Выпишите для Машиной нейросетки алгоритм обратного распространения ошибки в общем виде. Пусть Маша инициализировала веса нейронной сети нулями. У неё есть два наблюдения 661 | 662 | \begin{center} 663 | \begin{tabular}{c|c|c|c} 664 | № & $x_1$ & $x_2$ & $y$ \\ \hline 665 | $1$ & $1$ & $1$ & $1$ \\ 666 | $2$ & $5$ & $2$ & $0$ \\ 667 | \end{tabular} 668 | \end{center} 669 | 670 | Сделайте руками два шага алгоритма обратного распространения ошибки. Пусть скорость обучения $\eta = 1$. Стохастический градиентный спуск решил, что сначала для шага будет использоваться второе наблюдение, а затем первое. Объясните, почему инициализировать веса нулями --- плохая идея. Почему делать инициализацию весов любой другой константой --- плохая идея? 671 | \end{problem} 672 | 673 | \begin{sol} Для начала запишем алгоритм в общем виде. Для этого нам надо взять схему из предыдущей задачи и записать там все производные. Для сигмоиды $\sigma'(t) = \sigma(t) \cdot (1 - \sigma(t)).$ Прямой проход по нейронной сети (forward pass): 674 | 675 | \begin{center} 676 | \begin{tikzpicture} 677 | \tikzstyle{place}=[rectangle, draw=black, minimum size = 8mm] 678 | \draw node at (0, 0) (input) {$X$}; 679 | \draw node at (2, 0) (h1) {$H_1$}; 680 | \draw node at (4, 0) (o1) {$O_1$}; 681 | \draw node at (6, 0) (h2) {$H_2$}; 682 | \draw node at (8, 0) (o2) {$O_2$}; 683 | \draw node at (10, 0) (output) {$\hat{y} $}; 684 | \draw node at (12, 0) (mse) {$MSE$}; 685 | 686 | \draw [->] (input) -- (h1) node[pos=.49, above] {$W_1$} ; 687 | \draw [->] (h1) -- (o1) node[pos=.49, above] {$\sigma$} ; 688 | \draw [->] (o1) -- (h2) node[pos=.49, above] {$W_2$} ; 689 | \draw [->] (h2) -- (o2) node[pos=.49, above] {$\sigma$} ; 690 | \draw [->] (o2) -- (output) node[pos=.49, above] {$W_3$} ; 691 | \draw [->] (output) to (mse); 692 | \end{tikzpicture} 693 | \end{center} 694 | 695 | Обратный проход по нейронной сети (backward pass): 696 | 697 | \begin{center} 698 | \begin{tikzpicture} 699 | \draw node at (0, 0) (input) {$X$}; 700 | \draw node at (2, 0) (h1) {$H_1$}; 701 | \draw node at (4, 0) (o1) {$O_1$}; 702 | \draw node at (6, 0) (h2) {$H_2$}; 703 | \draw node at (8, 0) (o2) {$O_2$}; 704 | \draw node at (10, 0) (output) {$\hat{y}$}; 705 | \draw node at (12, 0) (mse) {$MSE$}; 706 | 707 | \draw [->, dashed] (h1) -- (input) node[pos=.49, above] {\scriptsize $W_1^T$} ; 708 | \draw [->, dashed] (o1) -- (h1) node[pos=.49, above] {\scriptsize $O_1 (1-O_1)$} ; 709 | \draw [->, dashed] (h2) -- (o1) node[pos=.49, above] {\scriptsize $W_2^T$} ; 710 | \draw [->, dashed] (o2) -- (h2) node[pos=.49, above] {\scriptsize $O_2 (1 - O_2)$} ; 711 | \draw [->, dashed] (output) -- (o2)node[pos=.49, above] {\scriptsize $W_3^T$} ; 712 | \draw [->, dashed] (mse) -- (output) node[pos=.49, above] {\scriptsize $(\hat{y} - y)$} ; 713 | 714 | \draw [->, dashed] (9, -0.05) -- (9, -1.2) node[pos=.49, right] {$O_2^T$} ; 715 | \draw [->, dashed] (5, -0.05) -- (5, -1.2) node[pos=.49, right] {$O_1^T$} ; 716 | \draw [->, dashed] (1, -0.05) -- (1, -1.2) node[pos=.49, right] {$X^T$} ; 717 | \end{tikzpicture} 718 | \end{center} 719 | 720 | По аналогии с предыдущей задачей выпишем формулы для обратного распространения ошибки: 721 | 722 | \begin{minipage}{.2\linewidth} 723 | \begin{equation*} 724 | \begin{aligned} 725 | & d = (\hat{y} - y) \\ 726 | & \frac{\partial MSE}{\partial W_3} = O_2^T \cdot d \\ 727 | \end{aligned} 728 | \end{equation*} 729 | \end{minipage} \hfill 730 | \begin{minipage}{.35\linewidth} 731 | \begin{equation*} 732 | \begin{aligned} 733 | & d = d \cdot W_3^T * O_2 * (1 - O_2) \\ 734 | & \frac{\partial MSE}{\partial W_2} = O_1^T \cdot d \\ 735 | \end{aligned} 736 | \end{equation*} 737 | \end{minipage} \hfill 738 | \begin{minipage}{.35\linewidth} 739 | \begin{equation*} 740 | \begin{aligned} 741 | & d = d \cdot W_2^T * O_1 * (1 - O_1) \\ 742 | & \frac{\partial MSE}{\partial W_1} = X^T \cdot d \\ 743 | \end{aligned} 744 | \end{equation*} 745 | \end{minipage} 746 | 747 | Когда мы аккуратно подставим все числа, можно будет сделать шаг SGD 748 | 749 | \begin{minipage}{.28\textwidth} 750 | \[ W_3^t = W_3^{t-1} - \eta \cdot \frac{\partial MSE}{\partial W_3} \] 751 | \end{minipage} 752 | \begin{minipage}{.3\textwidth} 753 | \[ W_2^t = W_2^{t-1} - \eta \cdot \frac{\partial MSE}{\partial W_2} \] 754 | \end{minipage} 755 | \begin{minipage}{.35\textwidth} 756 | \[ W_1^t = W_1^{t-1} - \eta \cdot \frac{\partial MSE}{\partial W_1} \] 757 | \end{minipage} 758 | 759 | \indef{Сделаем шаг SGD для второго наблюдения.} Делаем прямое распространение для второго наблюдения, напомним, что матрицы весов инициализированы нулями: 760 | 761 | \begin{center} 762 | \begin{tikzpicture} 763 | \tikzstyle{place}=[rectangle, draw=black, minimum size = 8mm] 764 | \draw node at (0, 0) (input) {$(5, 2)$}; 765 | \draw node at (2.5, 0) (h1) {$(0, 0)$}; 766 | \draw node at (5, 0) (o1) {$(0.5, 0.5)$}; 767 | \draw node at (7.5, 0) (h2) {$(0, 0)$}; 768 | \draw node at (10, 0) (o2) {$(0.5, 0.5)$}; 769 | \draw node at (12.5, 0) (output) {$0$}; 770 | \draw node at (15, 0) (mse) {$0.5 \cdot (0 - 1)^2$}; 771 | 772 | \draw [->] (input) -- (h1) node[pos=.49, above] {$W_1$} ; 773 | \draw [->] (h1) -- (o1) node[pos=.49, above] {$\sigma$} ; 774 | \draw [->] (o1) -- (h2) node[pos=.49, above] {$W_2$} ; 775 | \draw [->] (h2) -- (o2) node[pos=.49, above] {$\sigma$} ; 776 | \draw [->] (o2) -- (output) node[pos=.49, above] {$W_3$} ; 777 | \draw [->] (output) to (mse); 778 | \end{tikzpicture} 779 | \end{center} 780 | 781 | Делаем обратный проход. 782 | 783 | \textbf{Шаг 1:} 784 | \begin{equation*} 785 | \begin{aligned} 786 | & d = (\hat{y} - y) = -1 \\ 787 | & \frac{\partial MSE}{\partial W_3} = O_2^T \cdot d = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix} \cdot (-1) = \begin{pmatrix} -0.5 \\ -0.5 \end{pmatrix} \\ 788 | \end{aligned} 789 | \end{equation*} 790 | 791 | \textbf{Шаг 2:} 792 | \begin{equation*} 793 | \begin{aligned} 794 | & d = d \cdot W_3^T * O_2 * (1 - O_2) = -1 \cdot (0, 0) * (0.5, 0.5) * (0.5, 0.5) = (0, 0) \\ 795 | & \frac{\partial MSE}{\partial W_2} = O_1^T \cdot d = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix} \cdot (0, 0) = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} \\ 796 | \end{aligned} 797 | \end{equation*} 798 | 799 | 800 | \textbf{Шаг 3:} 801 | \begin{equation*} 802 | \begin{aligned} 803 | & d = d \cdot W_2^T * O_1 * (1 - O_1) = (0, 0) \cdot \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} * (0.5, 0.5) * (0.5, 0.5) = (0, 0) \\ 804 | & \frac{\partial MSE}{\partial W_1} = X^T \cdot d = \begin{pmatrix} 5 \\ 2 \end{pmatrix} \cdot (0, 0) = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} \\ 805 | % & W_1^1 = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} - 1 \cdot \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} 806 | \end{aligned} 807 | \end{equation*} 808 | 809 | Делаем шаг градиентного спуска 810 | \begin{equation*} 811 | \begin{aligned} 812 | & W_1^1 = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} - 1 \cdot \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix}\\ 813 | & W_2^1 = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} - 1 \cdot \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} \\ 814 | & W_3^1 = \begin{pmatrix} 0 \\ 0 \end{pmatrix} - 1 \cdot \begin{pmatrix} -0.5 \\ -0.5 \end{pmatrix} = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix} 815 | \end{aligned} 816 | \end{equation*} 817 | 818 | \indef{Сделаем шаг SGD для первого наблюдения.} Делаем прямое распространение для второго наблюдения, напомним, что матрицы весов инициализированы нулями: 819 | 820 | \begin{center} 821 | \begin{tikzpicture} 822 | \tikzstyle{place}=[rectangle, draw=black, minimum size = 8mm] 823 | \draw node at (0, 0) (input) {$(1, 1)$}; 824 | \draw node at (2.5, 0) (h1) {$(0, 0)$}; 825 | \draw node at (5, 0) (o1) {$(0.5, 0.5)$}; 826 | \draw node at (7.5, 0) (h2) {$(0, 0)$}; 827 | \draw node at (10, 0) (o2) {$(0.5, 0.5)$}; 828 | \draw node at (12.5, 0) (output) {$0.5$}; 829 | \draw node at (15, 0) (mse) {$0.5 \cdot (0.5 - 0)^2$}; 830 | 831 | \draw [->] (input) -- (h1) node[pos=.49, above] {$W_1$} ; 832 | \draw [->] (h1) -- (o1) node[pos=.49, above] {$\sigma$} ; 833 | \draw [->] (o1) -- (h2) node[pos=.49, above] {$W_2$} ; 834 | \draw [->] (h2) -- (o2) node[pos=.49, above] {$\sigma$} ; 835 | \draw [->] (o2) -- (output) node[pos=.49, above] {$W_3$} ; 836 | \draw [->] (output) to (mse); 837 | \end{tikzpicture} 838 | \end{center} 839 | 840 | Делаем обратный проход. 841 | 842 | \textbf{Шаг 1:} 843 | \begin{equation*} 844 | \begin{aligned} 845 | & d = (\hat{y} - y) = 0.5 \\ 846 | & \frac{\partial MSE}{\partial W_3} = O_2^T \cdot d = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix} \cdot (0.5) = \begin{pmatrix} 0.25 \\ 0.25 \end{pmatrix} \\ 847 | \end{aligned} 848 | \end{equation*} 849 | 850 | \textbf{Шаг 2:} 851 | \begin{equation*} 852 | \begin{aligned} 853 | & d = d \cdot W_3^T * O_2 * (1 - O_2) = 0.5 \cdot (0.5, 0.5) * (0.5, 0.5) * (0.5, 0.5) = (1/16, 1/16) \\ 854 | & \frac{\partial MSE}{\partial W_2} = O_1^T \cdot d = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix} \cdot (1/16, 1/16) = \begin{pmatrix} 1/32 & 1/32 \\ 1/32 & 1/32 \end{pmatrix} \\ 855 | \end{aligned} 856 | \end{equation*} 857 | 858 | \textbf{Шаг 3:} 859 | \begin{equation*} 860 | \begin{aligned} 861 | & d = d \cdot W_2^T * O_1 * (1 - O_1) = (1/16, 1/16) \cdot \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} * (0.5, 0.5) * (0.5, 0.5) = (0, 0) \\ 862 | & \frac{\partial MSE}{\partial W_1} = X^T \cdot d = \begin{pmatrix} 1 \\ 1 \end{pmatrix} \cdot (0, 0) = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} \\ 863 | \end{aligned} 864 | \end{equation*} 865 | 866 | На этой задаче видно, как сигмоида способствует затуханию градиента. Её производная по абсолютной величине всегда принимает значения меньше $1$. Из-з этого значение $d$ от слоя к слою становится всё меньше и меньше. Чем ближе к началу нашей сети мы находимся, тем на меньшую величину шагают веса. Если сетка оказывается очень глубокой, такой эффект ломает её обучение. Его обычно называют \indef{параличом нейронной сети.} Именно из-за этого сигмоиду обычно не используют в глубоких архитектурах. 867 | 868 | Делаем шаг градиентного спуска 869 | \begin{equation*} 870 | \begin{aligned} 871 | & W_3^2 = \begin{pmatrix} 0.5 \\ 0.5 \end{pmatrix} - 1 \cdot \begin{pmatrix} 0.25 \\ 0.25 \end{pmatrix} = \begin{pmatrix} 0.25 \\ 0.25 \end{pmatrix} \\ 872 | & W_2^2 = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} - 1 \cdot \begin{pmatrix}1/32 & 1/32 \\ 1/32 & 1/32 \end{pmatrix} = \begin{pmatrix} -1/32 & -1/32 \\ -1/32 & -1/32 \end{pmatrix} \\ 873 | & W_1^1 = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} - 1 \cdot \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} = \begin{pmatrix} 0 & 0 \\ 0 & 0 \end{pmatrix} 874 | \end{aligned} 875 | \end{equation*} 876 | 877 | Из-за того, что мы инициализировали веса нулями, слои поначалу учатся по-очереди. Пока мы не сдвинем веса более поздних слоёв, веса более ранних слоёв не сдвинутся. Это замедляет обучение. Обратите внимание, что все веса меняются на одну и ту же величину в одном и том же направлении. При инициализации любой другой константой этот эффект сохраниться. Нам хочется, чтобы после обучения нейроны внутри сетки были максимально разнообразными. Для этого веса лучше инициализировать случайно. В будущем мы обсудим грамотные способы инициализации, которые не портят обучение. 878 | \end{sol} 879 | 880 | 881 | %%%------------------------------------------- 882 | \begin{problem}{(Незаметный backpropagation)} 883 | Маша собрала нейросеть: 884 | 885 | \begin{equation*} 886 | y = \max \left( 0; X \cdot \begin{pmatrix} 1 & -1 \\ 0.5 & 0 \end{pmatrix} \right) \cdot \begin{pmatrix} 0.5 \\ 1 \end{pmatrix} 887 | \end{equation*} 888 | 889 | Теперь Маша внимательно смотрит на неё. 890 | 891 | \begin{enumerate} 892 | \item[а)] Первый слой нашей нейросетки --- линейный. По какой формуле делается forward pass? Сделайте его для матрицы \[X =\begin{pmatrix} 1 & 2 \\ -1 & 2 \end{pmatrix}.\] 893 | 894 | \item[б)] Найдите для первого слоя производную выхода по входу. При обратном движении по нейросетке, в первый слой пришёл накопленный градиент \[d = \begin{pmatrix} -0.5 & 0 \\ 0 & 0 \end{pmatrix}.\] Каким будет новое накопленное значение градиента, которое выплюнет из себя линейный слой? По какой формуле делается backward pass? 895 | 896 | \item[в)] Второй слой нейросетки --- функция активации, $ReLU.$ По какой формуле делается forward pass? Сделайте его для матрицы \[H_1 = \begin{pmatrix} 2 & -0.5 \\ 0 & 1 \end{pmatrix}.\] 897 | 898 | \item[г)] Найдите для второго слоя производную выхода по входу. При обратном движении по нейросетке во второй слой пришёл накопленный градиент \[d = \begin{pmatrix} -0.5 & -1 \\ 0 & 0 \end{pmatrix}.\] Каким будет новое накопленное значение градиента, которое выплюнет из себя $ReLU$? По какой формуле делается backward pass? 899 | 900 | \item[д)] Третий слой нейросетки --- линейный. По какой формуле делается forward pass? Сделайте его для матрицы \[O_1 =\begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix}.\] 901 | 902 | \item[е)] Найдите для третьего слоя производную выхода по входу. При обратном движении по нейросетке, в третий слой пришёл накопленный градиент $d = (-1, 0)^T$. Каким будет новое накопленное значение градиента, которое выплюнет из себя линейный слой? 903 | 904 | \item[ж)] Мы решаем задачу Регрессии. В качестве функции ошибки мы используем \[MSE = \frac{1}{2n} \sum (\hat y_i - y_i)^2.\] Пусть для рассматриваемых наблюдений реальные значения $y_1 = 2, y_2 = 1$. Найдите значение $MSE$. 905 | 906 | \item[з)] Чему равна производная $MSE$ по прогнозу? Каким будет накопленное значение градиента, которое $MSE$ выплюнет из себя в предыдущий слой нейросетки? 907 | 908 | \item[и)] Пусть скорость обучения $\gamma = 1$. Сделайте для весов нейросети шаг градиентного спуска. 909 | 910 | \item[к)] Посидела Маша, посидела, и поняла, что неправильно она всё делает. В реальности перед ней не задача регрессии, а задача классификации. Маша применила к выходу из нейросетки сигмоиду. Как будет для неё выглядеть forward pass? 911 | 912 | \item[л)] В качестве функции потерь Маша использует $\logloss.$ Как для этой функции потерь выглядит forward pass? Сделайте его. 913 | 914 | \item[м)] Найдите для $\logloss$ производную прогнозов по входу в сигмоиду. Как будет выглядеть backward pass, если $y_1 = 0, y_2 = 1?$ Как поменяется оставшаяся часть алгоритма обратного распространения ошибки? 915 | \end{enumerate} 916 | \end{problem} 917 | 918 | \begin{sol} 919 | Весь путь по нейросети от начала к концу, то есть forward pass будет выглядеть следующим образом: 920 | \begin{equation*} 921 | \begin{aligned} 922 | & H_1 = X \cdot W_1 = \begin{pmatrix} 1 & 2 \\ -1 & 2 \end{pmatrix} \cdot \begin{pmatrix} 1 & -1 \\ 0.5 & 0 \end{pmatrix} = \begin{pmatrix} 2 & -0.5 \\ 0 & 1 \end{pmatrix} \\ 923 | & O_1 = ReLU(H_1) = \begin{pmatrix} \max(0,2) & \max(0,-0.5) \\ \max(0,0) & \max(0,1) \end{pmatrix} = \begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix} \\ 924 | & \hat{y} = O_1 \cdot W_2 = \begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} 0.5 \\ 1 \end{pmatrix} = \begin{pmatrix} 1 \\ 1 \end{pmatrix} \\ 925 | & MSE = \frac{1}{4} \cdot ((1 - 2)^2 + (1 - 1)^2) = 0.25 926 | \end{aligned} 927 | \end{equation*} 928 | 929 | Все необходимые для обратного прохода производные выглядят как 930 | \begin{equation*} 931 | \begin{aligned} 932 | & \frac{\partial MSE}{\partial \hat y} = \begin{pmatrix} \hat y_1 - y_1 \\ \hat y_2 - y_2 \end{pmatrix} = \begin{pmatrix} -1 \\ 0 \end{pmatrix} \\ 933 | & \frac{\partial\hat y}{\partial O_1} = W_2^T = (0.5, 1) \qquad \frac{\partial\hat y}{\partial W_2} = O_1^T = \begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix} \\ 934 | & \frac{\partial O_1}{\partial H_1} = [H_{ij} > 0] = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} \\ 935 | & \frac{\partial H_1}{\partial X} = W_1^T = \begin{pmatrix} 1 & 0.5 \\ -1 & 0 \end{pmatrix} \qquad \frac{\partial H_1}{\partial W_1} = X^T = \begin{pmatrix} 1 & -1 \\ 2 & 2 \end{pmatrix} 936 | \end{aligned} 937 | \end{equation*} 938 | 939 | Когда мы считаем производную $MSE,$ мы ищем её по каждому прогнозу. В случае производной для $ReLU$ запись $[H_{ij} > 0]$ означает, что на месте $ij$ стоит $1$, если элемент больше нуля и ноль иначе. Делаем шаг обратного распространения ощибки 940 | \begin{equation*} 941 | \begin{aligned} 942 | & d = \begin{pmatrix} -1 \\ 0 \end{pmatrix} \\ 943 | & \frac{\partial MSE}{\partial W_2} = O_1^T \cdot d = \begin{pmatrix} 2 & 0 \\ 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} -1 \\ 0 \end{pmatrix} = \begin{pmatrix} -2 \\ 0 \end{pmatrix}\\ 944 | & d = d \cdot W_2^T * [H_{ij} > 0] = \begin{pmatrix} -1 \\ 0 \end{pmatrix} \cdot (0.5, 1) * \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} = \begin{pmatrix} -0.5 & -1 \\ 0 & 0 \end{pmatrix} * \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} = \begin{pmatrix} -0.5 & 0 \\ 0 & 0 \end{pmatrix} \\ 945 | & \frac{\partial MSE}{\partial W_1} = X^T \cdot d = \begin{pmatrix} 1 & -1 \\ 2 & 2 \end{pmatrix} \cdot \begin{pmatrix} -0.5 & 0 \\ 0 & 0 \end{pmatrix} = \begin{pmatrix} -0.5 & 0 \\ -1 & 0 \end{pmatrix} \\ 946 | \end{aligned} 947 | \end{equation*} 948 | 949 | Делаем шаг градиентного спуска 950 | \begin{equation*} 951 | \begin{aligned} 952 | & W_1 = \begin{pmatrix} 1 & -1 \\ 0.5 & 0 \end{pmatrix} - \gamma \cdot \begin{pmatrix} -0.5 & -1 \\ 0 & 0 \end{pmatrix}\\ 953 | & W_2 = \begin{pmatrix} 0.5 \\ 1 \end{pmatrix} - \gamma \cdot \begin{pmatrix} - 2 \\ 0 \end{pmatrix}. 954 | \end{aligned} 955 | \end{equation*} 956 | 957 | Меняем MSE на logloss и добавляем сигмоиду. Производная для сигмоиды выглядит как 958 | 959 | \begin{equation*} 960 | \begin{aligned} 961 | & \logloss = y_i \cdot \ln \hat p_i + (1 - y_i) \cdot (1 - \hat p_i) \\ 962 | & \frac{\partial \logloss}{\partial \hat p_i} = \frac{y_i}{\hat p_i} - \frac{1 - y_i}{1 - \hat p_i}. 963 | \end{aligned} 964 | \end{equation*} 965 | 966 | Так как в бинарной классификации $y_i$ принимает значения $\{0,1\},$ производная равна либо первому либо второму слагаемому. Получаем вычисления 967 | 968 | \begin{equation*} 969 | \begin{aligned} 970 | & O_2 = \sigma(\hat y) = \begin{pmatrix} 0.73 \\ 0.73 \end{pmatrix} \qquad \frac{\partial O_2}{\partial \hat y} = O_2 \cdot (1 - O_2) \approx \begin{pmatrix} 0.2 \\ 0.2 \end{pmatrix} \\ 971 | & \frac{\partial \logloss}{\partial \hat p} \approx \begin{pmatrix} 3.7 \\ 1.4 \end{pmatrix} \qquad \frac{\partial \logloss}{\partial \hat y} \approx \begin{pmatrix} 3.7 \\ 1.4 \end{pmatrix} * \begin{pmatrix} 0.2 \\ 0.2 \end{pmatrix} = \begin{pmatrix} 0.74 \\ 0.28 \end{pmatrix} 972 | \end{aligned} 973 | \end{equation*} 974 | 975 | Дальше алгоритм делается ровно также, только в качестве стартового $d$ используется $\logloss'_{\hat y},$ а не $MSE'_{\hat y}.$ 976 | \end{sol} 977 | 978 | 979 | %%%-------------------------------------------- 980 | \begin{problem}{(Нестеров и backprop)} 981 | К Маше приехал её папа и загрузил её интересным вопросом. В алгоритме обратного распространения ошибки мы можем делать шаг как минимум двумя способами: 982 | 983 | \begin{enumerate} 984 | \item Зафиксировали все $w_{t-1},$ нашли все градиенты, сделали сразу по всем весам шаг градиентного спуска. 985 | 986 | \item Нашли градиенты для последнего слоя и сделали шаг для его весов, получили $w_t^k.$ Для поиска градиентов предпоследнего слоя используем веса $w_t^k,$ а не $w_{t-1}^k.$ Все остальные слои обновляем по аналогии. 987 | \end{enumerate} 988 | 989 | Как думаете, какой из способов будет приводить к более быстрой сходимости и почему\footnote{Я придумал эту задачу и не смог найти статью, где делали бы что-то похожее. Если вы видели такую, пришлите мне её плиз.}? 990 | \end{problem} 991 | 992 | \begin{sol} 993 | С одной стороны идея чем-то похожа на градиентный спуск с поправкой Нестерова. Возможно, сходимость ускорится. С другой стороны, градиенты оказываются смещёнными. Если сеть глубокая, в её начале смещение может быть очень большим. Из-за этого сходимость может сломаться. 994 | \end{sol} 995 | 996 | --------------------------------------------------------------------------------