Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Большие данные - лекция-10 - градиентный спуск, адаптивный линейный нейрон

3a855e4e8dd144b8942da2463831a067?s=47 Anton
May 15, 2019

Большие данные - лекция-10 - градиентный спуск, адаптивный линейный нейрон

Градиентный спуск, двоичная классификация, адаптивный линейный нейрон ADALINE

Обновлено: 28.04.2020
https://vk.com/video53223390_456239456

3a855e4e8dd144b8942da2463831a067?s=128

Anton

May 15, 2019
Tweet

Transcript

  1. Градиентный спуск, двоичная классификация, адаптивный линейный нейрон ADALINE

  2. 8 июля 1958 года The New York Times писала: «Психолог

    показывает эмбрион компьютера, разработанного, чтобы читать и становиться мудрее. Разработанный ВМФ… стоивший 2 миллиона долларов компьютер "704", обучился различать левое и правое после пятидесяти попыток… По утверждению ВМФ, они используют этот принцип, чтобы построить первую мыслящую машину класса "Перцептрон", которая сможет читать и писать; разработку планируется завершить через год, с общей стоимостью $100 000… Ученые предсказывают, что позже Перцептроны смогут распознавать людей и называть их по имени, мгновенно переводить устную и письменную речь с одного языка на другой. Мистер Розенблатт сказал, что в принципе возможно построить "мозги", которые смогут воспроизводить самих себя на конвейере и которые будут осознавать свое собственное существование» (цитата и перевод из книги С. Николенко, «Глубокое обучение, погружение в мир нейронный сетей»). www.nytimes.com/1958/07/08/archives/new-navy-device-learns-by-doing- psychologist-shows-embryo-of.html
  3. None
  4. Двоичная (бинарная) классификация объектов: искусственный нейрон класса «Перцептрон»

  5. Искусственный нейрон — двоичная классификация объектов • На входе: объект

    выборки — вектор m-мерного пространства x=(x 1 , …, x m ) • Весовые коэффициенты w=(w 1 , …, w m ) по одному на каждый признак объекта выборки (тоже m-мерный вектор) • Внутри: сумматор SUM=w 1 x 1 +...+w m x m — взвешенная сумма входов нейрона • Дальше: активация Φ(x,w)=Φ(SUM) • Еще дальше: квантизатор (порог) — θ [тета] • Активация+порог — предсказание метки класса объекта по взвешенной сумме входов нейрона (признаков объекта). Эта часть определяет архитектуру нейрона. • На выходе: метка класса объекта (одна из 2х) ŷ={1, -1}
  6. • Классификация — потому, что нейрон назначает объекту класс, •

    бинарная (двоичная) — потому, что возможных классов всего два. • ŷ [игрек с крышкой] — будем обозначать предсказанное (вычисленное) значение класса для объекта x • y [обычный игрек без крышки] — истинные (известные) значения класса для объекта x из обучающей выборки.
  7. • Значения x (здесь и дальше x и w —

    это не единичные значения, а векторы) меняются от объекта к объекту, весовые коэффициенты w (будучи выбраны один раз) остаются неизменны. • Для обучающей выборки для каждого объекта x известна метка класса y. На этапе обучения нужно подобрать весовые коэффициенты так, чтобы модель выдавала правильное значение ŷ (совпадающие с y) для максимального количества объектов обучающей выборки. • Предположение о полезности обученного таким образом нейрона базируется на надежде на то, что с подобранными коэффициентами он будет выдавать правильные значение ŷ для новых объектов x, истинное значение класса для которых заранее не известно.
  8. • Интуитивный смысл взвешенной суммы входов нейрона заключается в том,

    что все признаки объекта (каждый из признаков — это один из входов нейрона) оказывают влияние на результат классификации объекта, но не все признаки — в одинаковой степени. • В какой именно степени — определяют веса; • обнуление какого-то весового коэффициента обнуляет вклад соответствующего признака в общую сумму, т.е. это равносильно удалению у объекта признака.
  9. Адаптивный линейный нейрон ADALINE • ADALINE (adaptive linear neuron) •

    Активация Φ(x, w)=Φ(SUM)=SUM (для ADALINE) • Порог (квантизатор) — предсказывает метку класса: ŷ(i)= {1,Φ(x(i) ,w)≥θ −1,Φ(x(i) ,w)<θ Φ(x(i) ,w)=Φ( ∑ j=1 m w j x j (i))= ∑ j=1 m w j x j (i)
  10. Задача: подобрать параметры нейрона • Весовые коэффициенты w j ,

    j=1,..,m • и порог θ так, чтобы значения классов ŷ, которые нейрон назначает объектам обучающей выборки, совпадали с истинными значениями классов y для этих же элементов (или, по крайней мере, давали правильное значение для большинства).
  11. Немного преобразуем • ŷ = 1: перенесем порог в левую

    часть неравенства Φ(x(i) ,w)≥θ ∑ j=1 m w j x j (i)≥θ −θ+∑ j=1 m w j x j (i)≥0 w 0 x 0 (i)+∑ j=1 m w j x j (i)≥0,w 0 =−θ, x 0 =1 ∑ j=0 m w j x j (i)≥0, x 0 =1
  12. Задача': подобрать параметры нейрона • Весовые коэффициенты w j ,

    j=0,..,m • x 0 = 1 (признак-константа) — фиктивный нейрон (нейрон смещения) • Порог теперь всегда 0 (переехал в параметр w 0 ) ŷ(i)= {1,Φ(x(i),w)≥0 −1,Φ(x(i) ,w)<0 Φ(x(i) ,w)=Φ(∑ j=0 m w j x j (i))=∑ j=0 m w j x j (i) ,x 0 (i)=1∀ i
  13. • Начиная с этого места нумеруем признаки и весовые коэффициенты

    c 0, а не с 1. • Про вектор w будем говорить, как про (m+1)-мерный, а не m-мерный. • Вектор x в зависимости от контекста можем считать (m+1)-мерным (по большей части в формулах), но при этом помнить, что на самом деле он m-мерный.
  14. Геометрический смысл задачи • Разделить множество m-мерных точек x на

    2 непересекающихся класса • Метки классов: y={1, -1} • Если мы внимательно посмотрим на формулу функции активации, то мы увидим, что она представляет собой параметрическую гиперплоскость в (m+1)-мерном пространстве, при этом в первых m измерениях она сосуществует вместе с точками элементов выборки, а (m+1)-е измерение — пространство значений функции, отдельное от элементов.
  15. Геометрический смысл задачи • Теперь, если мы приравняем значение активации

    к нулю (значение порога), то это тоже будет гиперплоскость, только уже в m-мерном пространстве, т.е. полностью в пространстве значений элементов x. Эта гиперплоскость будет разделять элементы на две непересекающиеся группы. • подобрать значения параметров , т.е. построить m- мерную гиперплоскость в пространстве элементов так, чтобы элементы обучающей выборки с истинным значением класса "1" оказались по одну сторону плоскости, а элементы с истинным классом "-1" — по другую.
  16. Одномерное пространство

  17. gradient-1d.py # coding=utf-8 import matplotlib.pyplot as plt import seaborn as

    sns # симпатичная сетка на белом фоне # (без нее русские подписи -> кракозябры) sns.set(style='whitegrid', font_scale=1.8) #sns.set(style='whitegrid') # не будет работать, если включен seaborn #plt.rcParams.update({'font.size': 16})
  18. gradient-1d.py import numpy as np import math # точки -

    признаки (одно измерение) X1 = np.array([1, 2, 6, 8, 10]) # метки классов (правильные ответы) y = np.array([-1, -1, 1, 1, 1])
  19. Точки на линии

  20. gradient-1d.py # ось y=0 plt.plot(X1, np.zeros(len(X1)), color='black') # обучающие точки

    на оси y=0 plt.scatter(X1[y==1], np.full(len(X1[y==1]), 0), color='blue', marker='o', s=300, label=u'объект (1 признак): класс-1') plt.scatter(X1[y==-1], np.full(len(X1[y==-1]), 0), color='red', marker='s', s=300, label=u'объект (1 признак): класс-1') plt.xlabel(u'X (признак)') plt.ylabel(u'y (активация)') plt.legend(loc='upper left') plt.show()
  21. • Здесь у нас каждый i-й элемент массива X1 —

    это i-й элемент (i-я точка) обучающей выборки (еще точнее — его 1-й и единственный признак), • Каждый i-й элемент массива y — правильный ответ, истинная метка, соответствующая i-му элементу обучающей выборки с единственным признаком X1[i]. • Возьмем всего 5 точек, первые две отнесем к классу "-1", остальные три — к классу "1".
  22. None
  23. Одномерное пространство • Построить линию, разделяющую группы точек • Это

    обычная параметрическая прямая на плоскости (в 2-мерном, т.е. (m+1)-мерном пространстве): • на горизонтальной оси у нас лежат точки элементов (они же — значения признака X1), • на вертикальной — значения активации для каждого элемента • Параметр w 1 — задает угол наклона, • параметр w 0 — сдвиг по вертикальной оси (вот и разгадка к сдвиговому нейрону). Φ=w 0 +w 1 x 1
  24. gradient-1d.py w0 = -1.1 w1 = 0.4 # активация y_

    = w0 + w1*X1 # функция активации (вход для кванзистора - пороговой функции предсказания класса) plt.plot(X1, y_, color='violet', lw=3, label=u'активация: w0=%0.2f, w1=%0.2f, sse/2=%0.2f'% (w0, w1, sse/2)) # порог: пересечение активации с Ф=0 plt.scatter([-w0/w1], [0], color='violet', marker='o', s=300, label=u'порог активации') # проекция обучающих точек на линию активации plt.scatter(X1[y==1], y_[y==1], color='lightblue', marker='o', s=200, label=u'активация: класс-1 (y=1)') plt.scatter(X1[y==-1], y_[y==-1], color='pink', marker='s', s=200, label=u'активация: класс-2 (y=-1)')
  25. None
  26. Замечание • Вспомним еще, что после небольшого преобразования у нас

    порог активации обратился в ноль. Таким образом, если проекция i-го элемента на линию активации оказывается ниже нуля, мы назначаем элементу класс "-1" (ŷ=-1), если выше нуля, назначаем элементу класс "1" (ŷ=1). • Фиолетовая точка — пересечение линии активации с осью Φ=0, разделяющая элементы из разных классов, — это и есть та самая разделяющая гиперплоскость (для 1-мерного пространства точка — это гиперплоскость), построенная в 1- мерном (т.е. m-мерном) пространстве признаков.
  27. • Пространство признаков — одномерное • Для того, чтобы разделить

    элементы на группы, её (точки) достаточно, но для того, чтобы назначить группам классы — уже не достаточно. • Для того, чтобы назначить элементам классы, нам нужна прямая (2-мерная гиперплоскость) активации, построенная в 2-д (т.е. в (m+1)-д) пространстве «признаки+активация»: направление отклонения активации от вертикальной оси будет определять класс для групп элементов, т.к. от этого зависит, окажутся ли проекции элементов на активацию выше или ниже нуля.
  28. • Меняя параметры w 0 и w 1 мы будем

    получать разные активационные линии. • Нам нужно построить такую линию активации, т.е. найти такую комбинацию параметров w, при которой проекция первых двух точек обучающей выборки на линию активации окажется ниже нуля, а проекция оставшихся 3-х точек окажется выше нуля.
  29. • В нашем конкретном случае нет ничего сложного в том,

    чтобы построить такую линию, более того, таких линий вообще можно построить бесконечное количество. • Но мы постараемся ее построить так, чтобы удовлетворялся некий критерий оптимальности (может влиять на качество будущих предсказаний), • плюс должна быть возможность распространить алгоритм на многомерный случай.
  30. • Так же отметим, что мы специально выбрали исходное множество

    точек так, чтобы его можно было такой линией разделить (для 1-д: все элементы первой группы меньше, все элементы второй группы больше некоторого фиксированного значения), т.е. множество обучающих точек линейно разделимо.
  31. • Добавим на график еще две горизонтальные линии, соответствующие классам

    {1, -1}, • спроецируем на них элементы.
  32. gradient-1d.py # горизонтальные линии для меток классов (y=1, y=-1) plt.plot(X1,

    np.full(len(X1), 1), color='blue', label=u'метка: класс-1 (y=1)') plt.plot(X1, np.full(len(X1), -1), color='red', label=u'метка: класс-2 (y=-1)') # обучающие точки на линиях меток классов (y=1, y=-1) plt.scatter(X1[y==1], np.full(len(X1[y==1]), 1), color='lightblue', marker='o', s=200, label=u'ответ y: класс-1 (y=1)') plt.scatter(X1[y==-1], np.full(len(X1[y==-1]), -1), color='pink', marker='s', s=200, label=u'ответ y: класс-2 (y=-1)')
  33. None
  34. • Точки с классом "-1" проецируем на нижнюю линию Φ=-1,

    точки с классом "1" проецируем на верхнюю линию Φ=1. Обратим здесь внимание на еще один небольшой нюанс. • По вертикальной оси мы строим значения активации, пространство значений активации непрерывно. • Но результат работы классификатора (функция активации, пропущенная через порог) — дискретное множество из двух элементов {-1, 1}, а не непрерывная шкала. • Здесь мы берем дискретное множество классов и накладываем его на непрерывную шкалу активации так, что дискретные значения классов становятся обычными точками на шкале активации — частными случаями значений активации, которые она может непосредственно принимать или приближаться к ним достаточно близко.
  35. Введем метрику ошибки

  36. gradient-1d.py # ошибки - расстояния от точек # на линии

    активации до горизонтальных линий # меток классов plt.plot([X1, X1], [y_, y], color='orange')#, label='err')
  37. None
  38. • Естественно принять, что чем ближе окажется значение активации для

    выбранного элемента к значению класса для этого же элемента, тем лучше активация предсказывает для этого элемента его класс. • Таким образом, за ошибку для выбранного элемента можно принять расстояние между точками — вертикальной проекцией элемента на линию активации и проекцией элемента на горизонтальную линию его известного (истинного) класса. • На графике: ошибки — вертикальные оранжевые линии.
  39. Функция стоимости (потерь) • Ошибка — расстояние от значения метки

    класса до линии (гиперплоскости) активации • Сумма квадратичных ошибок всех элементов: SSE • Функция стоимости — метрика качества для выбранной линии активации: • (½ перед SSE для удобства — она дальше сократится) • y(i) — истинный класс, т. е. заранее известный правильный ответ J (w)= 1 2 SSE = 1 2 ∑ i=1 n (Φ(∑ j=0 m w j x j (i))− y(i)) 2 = 1 2 ∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) 2
  40. Для 1-мерного случая J (w)= 1 2 SSE= 1 2

    ∑ i=1 n (w 0 +w 1 x 1 (i)−y(i))2 • Значения x и y заранее известны (это обучающая выборка), поэтому фиксированы. • Мы подбираем параметры w, т.е. w 0 и w 1 так, чтобы значение J(w) получилось минимальным. • Попробуем построить график, который покажет, как значение J(w) зависит от параметров w 0 и w 1
  41. • Далее код см. в статье «Градиентный спуск по косточкам»

    habr.com/ru/post/467185/
  42. J(w) 3D (обычная шкала по вертикали)

  43. • Видим, что есть минимум • вроде как

  44. J(w) 3D (логарифмическая шкала по вертикали)

  45. None
  46. None
  47. • Наша задача — подобрать такие значения w 0 и

    w 1 , чтобы попасть на дно этой ямы. • Получим значения весовых коэффициентов — получим обученный нейрон.
  48. Точка минимума ("вручную" на сетке)

  49. # найдем минимальное значение на сетке # https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.min.html # https://docs.scipy.org/doc/numpy/reference/generated/numpy.amin.html#numpy.amin

    # https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmin.html min_ind = np.unravel_index(np.argmin(sse), sse.shape) # точка - минимум #ax.scatter(ww0[min_ind], ww1[min_ind], sse[min_ind]/2, color='red', marker='o', s=100, ax.scatter(ww0[min_ind], ww1[min_ind], math.log(sse[min_ind]/2), color='red', marker='o', s=100, label='min: w0=%0.2f, w1=%0.2f, SSE/2=%0.2f' % (ww0[min_ind], ww1[min_ind], sse[min_ind]/2))
  50. None
  51. None
  52. Подобрали коэффициенты • w 0 = -1.26 • w 1

    = 0.27 • Φ (x, w) = w 0 + w 1 x 1 = -1.26 + 0.27 * x 1 • J(w) = SSE/2 = 0.3456478371758288 ≈ 0.35
  53. None
  54. Сетка побольше

  55. None
  56. None
  57. Поиск минимума: перебор по сетке • Вариант рабочий (как видим)

    • Нужно заранее знать область, где искать минимум (можно взять достаточно большие границы, затем сужать область поиска — это только на глаз) • Для повышения точности нужно уменьшать шаг → еще больше точек (решение: можно итеративно сужать область поиска) • Слишком много точек (для 2д может и ок, но для многомерных случаев очень быстро упремся в ресурсы) • Для MNIST (28x28=784 пикселей — столько же входов, весовых коэффициентов столько же плюс смещение, сетка 10 шагов на размерность): 10^785 (в видимой части Вселенной всего 10^80 атомов, Вселенная существует примерно 4*10^17 секунд = 4*10^26 наносекунд)
  58. График J(w) — 2-д (фиксируем w 0 , меняем w

    1 )
  59. None
  60. • Это обычная парабола (точнее, семейство парабол — они будут

    немного отличаться в зависимости от того, какое именно значение зафиксировали на w 0 ). • Чтобы найти минимум параболы, не обязательно перебирать все точки. • Мы можем выбрать произвольную точку на горизонтальной оси и двигаться в сторону минимума с некоторым шагом.
  61. Поиск минимума: спуск с постоянным шагом • Если шаг слишком

    большой, можно промахнуться, так и не достигнув минимума (шаг можно уменьшить) • Если слишком маленький, будет слишком много шагов (больше, чем могло бы быть) • Точный минимум мы в любом случае не достигнем, но можем достигнуть с произвольной точностью, поменяв около найденного неточного минимума шаг (шаг перестает быть постоянным) • Не знаем направление спуска (можно решить алгоритмически: не шагать в сторону увеличения ошибки) • Проблема с поиском диапазона решена (можно спускаться из любой точки) • В принципе, вариант рабочий, но может есть вариант получше?
  62. Поиск минимума: градиентный спуск • Используем для подбора шага производную

    кривой стоимости J(w) • У нас несколько измерений и в каждом из них своя кривая: фиксируем все w j , кроме w k • J(w k ) будет кривая ошибки в k-ом измерении • Все они — параболы • Для регулировки шага по каждому измерению будем использовать частную производную функции ошибки по этому измерению (изменяющемуся коэффициенту w k ) • (вектор из таких частных производных — градиент)
  63. Геометрический смысл производной

  64. • Производная функции y(x) в данной точке x 0 —

    это предел отношения приращения функции Δy к приращению аргумента при приращении аргумента Δx, стремящемся к нулю y'(x 0 )= lim Δ x→0 Δ y Δ x ,Δ y= y(x 0 +Δ x)− y(x 0 )
  65. None
  66. None
  67. None
  68. None
  69. Устремляем приращение Δx к нулю

  70. None
  71. None
  72. None
  73. None
  74. /* Здесь анимация gif */

  75. None
  76. Интересные свойства производной • Производная функции в точке x 0

    равна тангенсу угла между касательной к исходной кривой в этой точке и горизонтальной осью y=0 • По модулю — это отношение координаты точки y(x 0 ) по вертикальной оси к длине горизонтального отрезка — расстоянию между точкой x 0 на оси y=0 и точкой пересечения касательной и оси y=0 • Чем «круче» исходная кривая, тем вертикальное расстояние больше горизонтального, тем больше абсолютное значение тангенса и производной • Знак производной — направление спуска: слева направо — минус, справа налево — плюс • (чтобы понять, откуда он берется, посмотрите, как в том и другом случае получается Δy)
  77. Вот, например, наш случай с параболой

  78. None
  79. • Оранжевая линия — исходная функция, красная линия — касательная

    к исходной функции в точке x 0 , синяя линия — это производная исходной функции в каждой из точек. • Две зеленые линии — катеты прямоугольного треугольника с гипотенузой — касательной. • Отношение вертикальной зеленой линии к горизонтальной — тангенс острого угла между касательной и горизонтальной осью y=0, оно же — абсолютное значение производной в этой точке.
  80. None
  81. • Чем ближе минимум исходной функции, тем более пологий спуск,

    тем меньше вертикальная зеленая линия по сравнению с горизонтальной, тем меньше абсолютное значение производной. • В правой части графика (спуск справа налево, функция возрастает) производная везде больше нуля (геометрически: угол между касательной и осью y=0 острый, тангенс острого угла больше нуля).
  82. None
  83. • Спуск слева направо (исходная функция убывает): все то же

    самое, только со знаком минус (геометрически: угол между касательной и осью y=0 тупой, тангенс тупого угла меньше нуля).
  84. /* Здесь анимация gif */

  85. Подытожим • У нас есть универсальный вычислимый индикатор (метрика), который

    показывает как «крутизну»/«пологость» спуска, так и его направление в каждой из точек. • Этот индикатор — производная функции в каждой точке. • И, раз у нас есть такой индикатор, почему бы нам не использовать его для вычисления динамического шага при спуске к минимуму данной функции? • Ровно это мы сейчас и сделаем.
  86. Вернемся к нашей функции ошибки, она же — многомерное семейство

    парабол
  87. Частная производная по вектору • Выбираем k-й элемент вектора •

    Считаем, что он изменяется • По нему берем производную • Остальные элементы считаем константами • Производная по выбранному элементу вектора называется частной производной J (w)= 1 2 SSE= 1 2 ∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) 2
  88. ∂J (w) ∂w k = ∂ ∂ w k 1

    2 ∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) 2 = 1 2 ∑ i=1 n ∂ ∂w k (∑ j=0 m w j x j (i)− y(i)) 2 Производная суммы равна сумме производных
  89. ∂J (w) ∂w k = ∂ ∂ w k 1

    2 ∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) 2 = 1 2 ∑ i=1 n ∂ ∂w k (∑ j=0 m w j x j (i)− y(i)) 2 = 1 2 ∑ i=1 n 2(∑ j=0 m w j x j (i)− y(i)) ∂ ∂w k (∑ j=0 m w j x j (i)− y(i)) Производная степенной функции + производная сложной функции: показатель степени спускаем вниз, понижаем степень на 1, умножаем на производную вложенной функции
  90. ∂J (w) ∂w k = ∂ ∂ w k 1

    2 ∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) 2 = 1 2 ∑ i=1 n ∂ ∂w k (∑ j=0 m w j x j (i)− y(i)) 2 = 1 2 ∑ i=1 n 2(∑ j=0 m w j x j (i)− y(i)) ∂ ∂w k (∑ j=0 m w j x j (i)− y(i)) = 1 2 2∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) ∂ ∂w k ((w 0 x 0 (i)+...+w k x k (i)+...+w m x m (i))− y(i)) Развернем сумму внутри производной, отметим слагаемое с w k : здесь все слагаемые без w k — константы, их производные по w k равны нулю (и двойку слева тоже вынесем)
  91. ∂J (w) ∂w k = ∂ ∂ w k 1

    2 ∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) 2 = 1 2 ∑ i=1 n ∂ ∂w k (∑ j=0 m w j x j (i)− y(i)) 2 = 1 2 ∑ i=1 n 2(∑ j=0 m w j x j (i)− y(i)) ∂ ∂w k (∑ j=0 m w j x j (i)− y(i)) = 1 2 2∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) ∂ ∂w k ((w 0 x 0 (i)+...+w k x k (i)+...+w m x m (i))− y(i)) =∑ i=1 n (∑ j=0 m w j x j (i)− y(i)) x k (i) От всей производной от слагаемого с w k остался только x k (i) (½ слева сократили тоже здесь)
  92. Получили в общем виде ∂J (w) ∂w k =∑ i=1

    n (∑ j=0 m w j x j (i)− y(i))x k (i) По w k — линейная функция (чего и следовало ожидать)
  93. Градиент — вектор частных производных • ∇ [набла] (перевернутая дельта)

    • Определим правило шага: • Правило шага для k-го измерения: ∇ J (w)=( ∂ J (w) ∂w 0 ,..., ∂J (w) ∂w m ),w=(w 0 ,...,w m ) w:=w+Δ w ,Δ w=−η∇ J(w) w k :=w k +Δ w k ,Δ w k =−η ∂J (w) ∂w k
  94. Обратим внимание на • Минус перед градиентом • Коэффициент η

    [эта] — коэффициент обучения, некоторая константа
  95. Опять вернемся в наш 1-мерный случай

  96. Φ(x, w)=w 0 +w 1 x 1 ∂ J (w)

    ∂w 0 =∑ i=1 n (w 0 +w 1 x 1 (i)− y(i)) ∂ J (w) ∂w 1 =∑ i=1 n (w 0 +w 1 x 1 (i)− y(i))x 1 (i) Δ w 1 =−η ∂ J (w) ∂w 1 =−η∑ i=1 n (w 0 +w 1 x 1 (i)− y(i))x 1 (i) Δ w 0 =−η ∂ J (w) ∂w 0 =−η∑ i=1 n (w 0 +w 1 x 1 (i)− y(i)) (x 0 = 1)
  97. Кстати, у нас всё готово для спуска Спустимся по одному

    из измерений (w 1 )
  98. Кстати, у нас всё готово для спуска • Спустимся по

    одному из измерений, • пусть будет w 1 • Фиксируем w 0 = 1 • спускаемся к минимуму J(w 1 )
  99. Построим график функции стоимости J(w 1 , w 0 =1)

    • заодно отметим первую точку, из которой будем спускаться (вообще говоря, она может быть любая, в том числе случайная) w 1
  100. Градиент • точнее, частная производная ∂J(w)/∂w 1 — элемент градиента

    • Обратим внимание на масштаб по вертикальной шкале w 1
  101. Шаги спуска Δw 1 (w 1 ) • (да, здесь

    размер шага Δw 1 зависит от текущего значения w 1 , т.е. шаг зависит от того, из какой точки мы шагаем) • Здесь обратим внимание на направление наклона и опять на вертикальную шкалу w 1
  102. None
  103. Здесь видим • Наверху: график выпуклой функции, имеется глобальный минимум

    • Внизу: частная производная — показывает степень «крутизны» функции наверху (чем больше производная, тем «круче» функция), знак определяет направление • Посередине: шаг для спуска — частная производная со знаком минус (чтобы спускаться в сторону минимума), помноженная на коэффициент η [эта], определяющий размер шага
  104. Спускаемся по J(w) по градиенту • (точнее, пока по одному

    измерению) • Исходные веса w — обычно это какие-то случайные не очень большие значения или какие-то константы. • Мы договорились взять w 0 =1, а исходную точку спуска w 1 =0.9. • Здесь же выберем коэффициент обучения η=0.001 и • количество итераций (количество шагов, количество эпох обучения) пусть будет 12
  105. None
  106. • На всех графиках горизонтальная ось — параметр w 1

    на одном и том же отрезке, вертикальные оси — разные • Движемся справа налево, от самой большой точки w 1 к самой маленькой • Размер шага и направление — оранжевые отрезки на графике: на верхнем графике горизонтальные, на среднем — вертикальные • Длина вертикального отрезка на среднем графике равна длине соответствующего горизонтального отрезка на верхнем графике, но на экране они могут не совпадать — обратите внимание на масштабы по осям
  107. • На среднем графике отрезки с шагами, расположенные ниже нуля

    (правая половина), дают отрицательный шаг справа налево, выше нуля (левая половина) — положительный шаг слева направо, пересечение с нулем — строгий минимум функции ошибки • (говоря проще и строже, здесь шаг — это просто значение вертикальной координаты на среднем графике).
  108. • Знак перед шагом на среднем графике полностью соответствует направлению

    спуска на верхнем графике: • в правой половине графика мы спускаемся справа налево — шаг отрицательный, • в левой половине графика мы спускаемся слева направо — шаг положительный • Откуда мы его берем? Из нижнего графика производной — она попадает на средний график со знаком минус. Вспоминаем про геометрический смысл производной.
  109. Посмотрим еще ближе на нижний график производной и средний график

    с шагом. • По горизонтальной оси у них одни и те же значения w 1 , а по вертикали масштаб существенно отличается. • Из геометрического смысла производной мы помним, что значение производной в данной точке можно использовать как метрику «крутости»/«пологости» исходной кривой. • Чем круче кривая, тем мы дальше от минимума, тем дальше в этом месте можем шагать. • Чем кривая более пологая, тем мы ближе к минимуму, тем короче нужно делать шаги, «сбавить обороты».
  110. • Но посмотрите на диапазон значений на вертикальной оси нижнего

    графика с производной, а потом на диапазон на горизонтальной оси на верхнем графике с функцией: • для исходной точки w 1 =0.9 значение производной получается примерно 200, при том, что расстояние до минимума, судя по графику, в районе 1. • Это значит, что значение производной как есть мы в качестве шага брать не можем, но мы можем легко отмасштабировать его так, чтобы оно попадало в нужный нам диапазон.
  111. • Для этого используем специальный коэффициент — тот самый коэффициент

    обучения η. • В нашем случае нужно подобрать его значение так, чтобы значение производной 200 стало меньше 1. • Берем η=0.001, получаем для точки длину шага 200*0.001=0.2 • (с учетом домножения на -1, точный шаг получается -0.2) — в самый раз.
  112. • Значение ошибки в первой точке J(w1=0.9) = 92.43, •

    в последней точке через 12 эпох (шагов, итераций) J(w1=0.03) = 8.54 • Это не реальный минимум, но мы можем приблизиться к реальному минимуму сколь угодно близко, увеличивая количество эпох
  113. • В общем, именно в этом и заключается метод градиентного

    спуска. С таким уточнением, что здесь мы спустились только по одной координате и попали в локальный минимум на одном срезе. • Чтобы попасть в глобальный минимум многомерной функции, мы будем на каждой итерации делать по одному шагу по каждой из координат (или можно считать, что это один, но многомерный шаг). • Коэффициент обучения η [эта] нужно подобрать таким образом, чтобы он обеспечил подходящий масштаб сразу для всех срезов.
  114. Подбираем темп обучения η

  115. Подбираем темп обучения η • η [эта] — коэффициент (темп)

    обучения • Влияет на длину шага на каждой эпохе • Чем меньше шаг, тем выше точность • Но тем больше эпох требуется для спуска в минимум
  116. Подбираем темп обучения η • Можно подбирать наугад, пока не

    получится подходящее значение (начать с маленького так, чтобы алгоритм сходился, и начать увеличивать до тех пор, пока алгоритм не начнет расходиться) • Но лучше посмотреть на диапазон w 1 и на значение градиента и подобрать η так, чтобы градиент попал в масштаб окрестности w 1 • Или построить график сходимости J(w) по эпохам
  117. Возьмем значение η=0.01 (было η=0.001)

  118. None
  119. • Здесь еще раз обратите внимание на диапазон значений по

    вертикальной оси на среднем графике и диапазон на горизонтальной оси наверху. • Вертикальные отрезки на среднем графике по длине равны соответствующим горизонтальным отрезкам шагов на верхнем графике, хотя при экранном масштабе это не бросается в глаза. • Здесь начинаем движение из точки 3-й справа, дальше перепрыгиваем через минимум в 3-ю слева, потом опять через минимум направо, налево и т. п. • Каждый раз забираемся все выше по параболе, т.е. с каждым шагом ошибка возрастает. • Это значит, что алгоритм расходится, нужно выбрать [эту] поменьше.
  120. И так по каждой координате w

  121. • Значит коэффициент обучения η подбираем таким образом, чтобы он

    обеспечил спуск по каждому из элементов градиента. • (Самостоятельно: модификация алгоритма с разными коэффициентами обучения для каждого из параметров?)
  122. • Вопрос от Александра Веденеева: почему нельзя сразу попасть в

    минимум для параболы, а не плестись по шагам? • Самостоятельно: подумать и проверить, получится так сделать для линейного нейрона или нет
  123. График сходимости ошибки J(w)

  124. Сходимость J(w) при разных η Сходимся (ошибка уменьшается) Расходимся (ошибка

    растет)
  125. Побольше эпох

  126. Подбираем количество эпох • Алгоритм должен успеть спуститься вниз при

    заданном темпе обучения η • Идеальный минимум можем не получить, но можем приблизиться к нему настолько близко, насколько захотим • Кстати, ответ еще будет зависеть от исходных значений весов w, точнее, от того, с какой стороны минимума начнется спуск
  127. None
  128. • Темп ок • Эпох маловато Здесь

  129. Количество эпох • Строго: сравнить ошибку на текущем шаге с

    ошибкой на предыдущем шаге, остановиться тогда, когда разница будет меньше некоторого заранее заданного значения (уровень точности). Чтобы избежать бесконечного цикла, останавливаться также, если нужная точность не достигнута после максимального количества итераций, или в том случае, если ошибка растет. • На глаз: по графику сходимости
  130. Посмотрим на спуск по всем измерениям

  131. None
  132. None
  133. None
  134. None
  135. None
  136. None
  137. None
  138. None
  139. None
  140. None
  141. None
  142. None
  143. None
  144. None
  145. None
  146. None
  147. Немного странно... • По пологому склону катится быстро, а в

    воронке — замедляется... • Не забываем, что вертикальная шкала у нас логарифмическая • На самом деле поверхность спуска J(w) выглядит так:
  148. None
  149. None
  150. None
  151. None
  152. None
  153. None
  154. None
  155. None
  156. None
  157. None
  158. None
  159. None
  160. None
  161. None
  162. None
  163. None
  164. None
  165. • Короче, поверхность спуска у нас не воронка, а гамак

    (или подвешенное за концы провисшее одеяло). Для интуитивного понимания геометрического смысла спуска по производной лучше смотреть на этот график: чем круче наклон функции, тем быстрее спуск. Хотя воронка, конечно, живописнее.
  166. Активация на резиночках

  167. None
  168. None
  169. None
  170. None
  171. None
  172. None
  173. None
  174. None
  175. Подытожим • При η=0.001 видно, что алгоритм сходится к 10-12й

    эпохе (значение ошибки перестает уменьшаться сильно) • Но чтобы получить такую же точность, как при ручном поиске минимума по сетке, с таким же коэффициентом нужно отработать 1767 эпох • Еще дальше гонять обучение не имеет смысла — ошибка почти не уменьшилась спустя еще 60 тыс эпох • Нужна ли такая точность — вопрос задачи
  176. Результат обучения • Нашли коэффициенты (при условии, что остановились на

    эпохе 1767) • w 0 = -1.184831 • w 1 = 0.258455 • Φ (x, w) = w 0 + w 1 x 1 = -1.184831 + 0.258455 * x 1
  177. Проверим модель — протестируем обученный нейрон

  178. None
  179. None
  180. None
  181. • Между прочим, мы с вами только что научили искусственный

    нейрон (так же известный как мыслящая машина класса «Перцептрон») отличать красные точки слева от синих точек справа • и нам потребовалось на это всего 12 попыток.
  182. 8 июля 1958 года The New York Times писала: «Психолог

    показывает эмбрион компьютера, разработанного, чтобы читать и становиться мудрее. Разработанный ВМФ… стоивший 2 миллиона долларов компьютер "704", обучился различать левое и правое после пятидесяти попыток… По утверждению ВМФ, они используют этот принцип, чтобы построить первую мыслящую машину класса "Перцептрон", которая сможет читать и писать; разработку планируется завершить через год, с общей стоимостью $100 000… Ученые предсказывают, что позже Перцептроны смогут распознавать людей и называть их по имени, мгновенно переводить устную и письменную речь с одного языка на другой. Мистер Розенблатт сказал, что в принципе возможно построить "мозги", которые смогут воспроизводить самих себя на конвейере и которые будут осознавать свое собственное существование» (цитата и перевод из книги С. Николенко, «Глубокое обучение, погружение в мир нейронный сетей»). www.nytimes.com/1958/07/08/archives/new-navy-device-learns-by-doing- psychologist-shows-embryo-of.html
  183. Двумерное пространство (m=2)

  184. Пространство 2д • Элементы выборки — точки на плоскости (две

    координаты) • x = (x 1 , x 2 ) • y = {-1, 1} (как и раньше) • активация Φ(x, w) = w 0 + w 1 x 1 + w 2 x 2 • Спускаемся одновременно по 3м параметрам (градиент из 3-х измерений)
  185. None
  186. Активация Φ (x, w) = w 0 + w 1

    x 1 + w 2 x 2 • Активация — параметрическая плоскость в трёхмерном пространстве, • значит мы не можем нарисовать ее на плоскости, как для 1-мерного случая, • нужно переходить в 3-д:
  187. None
  188. Плоскость активации с проекциями элементов

  189. None
  190. Плоскости классов с проекциями элементов

  191. None
  192. • Ошибка для каждого элемента — расстояние от проекции элемента

    на плоскость активации до проекции этого же элемента на плоскость истинного класса. • Линия пересечения плоскости активации (сиреневая) и нулевой плоскости Φ(w)=0 (матово-белая) делит точки на классы.
  193. None
  194. None
  195. • В статьях, описывающих градиентный спуск или рассказывающих про нейросети,

    обычно рисуют такую линию и говорят, что вот ее нам нужно построить, конечно, если множество еще линейно разделимо (оно линейно разделимо, если группы элементов можно разделить вот такой линией). • Это правда, но это не вся правда. На самом деле, как мы только что увидели, нам нужно построить не линию в пространстве m=2, а плоскость в пространстве (m+1)=3: • пересечение плоскости активации с нулевой координатой активации и даст нам эту линию, хотя все равно одной линии не достаточно — она разделит элементы на две части, • но значения классов назначает не линия, а плоскость — в зависимости от того, выше или ниже нуля оказывается проекция элемента на ней (см квантизатор).
  196. /* здесь анимация */

  197. График ошибки J(w) • У нас 3 параметра (w 0

    , w 1 , w 2 ) — 3 размерности • Плюс значение J(w) — 4-я размерность • Нарисовать целиком красивую воронку уже проблематично • (если только вы не умеете рисовать графики в 4-д) • Можно только отдельные срезы с парой изменяющихся и остальными фиксированными w • Добавить динамику? • Также можно попробовать изобразить несколько графиков на одном, применив, например, цветовое кодирование • Или что-то вроде того (любой прием изображения 4-мерных поверхностей в 3-д, если вы такие знаете)
  198. • И это только для простейшего случая с 2- мерными

    признаками • Для признаков с большим количеством элементов впадина будет многомерной • Но в нее все равно получится спуститься по градиенту
  199. Спуск по градиенту

  200. None
  201. None
  202. None
  203. None
  204. None
  205. None
  206. None
  207. None
  208. None
  209. None
  210. None
  211. None
  212. /* здесь анимация */

  213. Сходимость

  214. None
  215. None
  216. • Здесь отметим, что из этих графиков уже не очень

    понятно, в какой момент нужно останавливаться: ошибка радикально падает уже к 6-12-й эпохе, а полностью корректная классификация всех точек обучающей выборки наступает только в районе 70-го шага. • Почему стоит остановиться именно на 70-м шаге, а не на 30-м, 40-м или 200-м, этот график, по крайней мере, в представленном виде, ответ не дает.
  217. Заключение

  218. None
  219. ADALINE (adaptive linear neuron) • В Scikit-learn не реализован, т.

    к. для бинарной классификации с единичным нейроном устарел • См обсуждение (сайт зароскомнадзорен) scikit-learn-general.narkive.com/jGuqc0R9/adaline-adaptive-linear- neuron-classifier web.archive.org/web/20170808110903/https://scikit-learn- general.narkive.com/jGuqc0R9/adaline-adaptive-linear-neuron- classifier • Есть реализация в Себастьяна Рашки (в книге и на сайте) rasbt.github.io/mlxtend/user_guide/classifier/Adaline/ github.com/rasbt/mlxtend/blob/master/mlxtend/classifier/adaline.py
  220. Другие функции активации • ADALINE — это только нейрон с

    линейной активацией, а не любые такие нейроны в целом • Если заменить активацию на другую функцию, получим вполне современные архитектуры нейронов • С ними точно так же будет применяться градиентный спуск (или его улучшенные модификации) • Например, сигмоида (рассмотрим на следующем занятии) • ru.wikipedia.org/wiki/Функция_активации • Более 20 вариантов, можно придумывать свои