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

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

Anton
May 15, 2019

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

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

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

Anton

May 15, 2019
Tweet

More Decks by Anton

Other Decks in Education

Transcript

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

    View full-size slide

  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

    View full-size slide

  3. Двоичная (бинарная) классификация объектов:
    искусственный нейрон класса «Перцептрон»

    View full-size slide

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

    На входе: объект выборки — вектор 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}

    View full-size slide


  5. Классификация — потому, что нейрон
    назначает объекту класс,

    бинарная (двоичная) — потому, что возможных
    классов всего два.

    ŷ [игрек с крышкой] — будем обозначать
    предсказанное (вычисленное) значение класса
    для объекта x

    y [обычный игрек без крышки] — истинные
    (известные) значения класса для объекта x из
    обучающей выборки.

    View full-size slide


  6. Значения x (здесь и дальше x и w — это не единичные
    значения, а векторы) меняются от объекта к объекту, весовые
    коэффициенты w (будучи выбраны один раз) остаются
    неизменны.

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

    Предположение о полезности обученного таким образом
    нейрона базируется на надежде на то, что с подобранными
    коэффициентами он будет выдавать правильные значение ŷ
    для новых объектов x, истинное значение класса для которых
    заранее не известно.

    View full-size slide


  7. Интуитивный смысл взвешенной суммы входов
    нейрона заключается в том, что все признаки
    объекта (каждый из признаков — это один из входов
    нейрона) оказывают влияние на результат
    классификации объекта, но не все признаки — в
    одинаковой степени.

    В какой именно степени — определяют веса;

    обнуление какого-то весового коэффициента
    обнуляет вклад соответствующего признака в общую
    сумму, т.е. это равносильно удалению у объекта
    признака.

    View full-size slide

  8. Адаптивный линейный нейрон 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)

    View full-size slide

  9. Задача: подобрать параметры
    нейрона

    Весовые коэффициенты w
    j
    , j=1,..,m

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

    View full-size slide

  10. Немного преобразуем

    ŷ = 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

    View full-size slide

  11. Задача': подобрать параметры
    нейрона

    Весовые коэффициенты 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

    View full-size slide


  12. Начиная с этого места нумеруем признаки и весовые
    коэффициенты c 0, а не с 1.

    Про вектор w будем говорить, как про (m+1)-мерный,
    а не m-мерный.

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

    View full-size slide

  13. Геометрический смысл задачи

    Разделить множество m-мерных точек x на 2
    непересекающихся класса

    Метки классов: y={1, -1}

    Если мы внимательно посмотрим на формулу
    функции активации, то мы увидим, что она
    представляет собой параметрическую
    гиперплоскость в (m+1)-мерном пространстве, при
    этом в первых m измерениях она сосуществует
    вместе с точками элементов выборки, а (m+1)-е
    измерение — пространство значений функции,
    отдельное от элементов.

    View full-size slide

  14. Геометрический смысл задачи

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

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

    View full-size slide

  15. Одномерное пространство

    View full-size slide

  16. 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})

    View full-size slide

  17. 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])

    View full-size slide

  18. Точки на линии

    View full-size slide

  19. 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()

    View full-size slide


  20. Здесь у нас каждый i-й элемент массива X1 —
    это i-й элемент (i-я точка) обучающей выборки
    (еще точнее — его 1-й и единственный признак),

    Каждый i-й элемент массива y — правильный
    ответ, истинная метка, соответствующая i-му
    элементу обучающей выборки с единственным
    признаком X1[i].

    Возьмем всего 5 точек, первые две отнесем к
    классу "-1", остальные три — к классу "1".

    View full-size slide

  21. Одномерное пространство

    Построить линию, разделяющую группы точек

    Это обычная параметрическая прямая на плоскости (в 2-мерном,
    т.е. (m+1)-мерном пространстве):

    на горизонтальной оси у нас лежат точки элементов (они же —
    значения признака X1),

    на вертикальной — значения активации для каждого элемента

    Параметр w
    1
    — задает угол наклона,

    параметр w
    0
    — сдвиг по вертикальной оси (вот и разгадка к
    сдвиговому нейрону).
    Φ=w
    0
    +w
    1
    x
    1

    View full-size slide

  22. 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)')

    View full-size slide

  23. Замечание

    Вспомним еще, что после небольшого преобразования у нас
    порог активации обратился в ноль. Таким образом, если
    проекция i-го элемента на линию активации оказывается
    ниже нуля, мы назначаем элементу класс "-1" (ŷ=-1), если
    выше нуля, назначаем элементу класс "1" (ŷ=1).

    Фиолетовая точка — пересечение линии активации с осью
    Φ=0, разделяющая элементы из разных классов, — это и есть
    та самая разделяющая гиперплоскость (для 1-мерного
    пространства точка — это гиперплоскость), построенная в 1-
    мерном (т.е. m-мерном) пространстве признаков.

    View full-size slide


  24. Пространство признаков — одномерное

    Для того, чтобы разделить элементы на группы, её
    (точки) достаточно, но для того, чтобы назначить
    группам классы — уже не достаточно.

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

    View full-size slide


  25. Меняя параметры w
    0
    и w
    1
    мы будем получать
    разные активационные линии.

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

    View full-size slide


  26. В нашем конкретном случае нет ничего сложного в
    том, чтобы построить такую линию, более того,
    таких линий вообще можно построить бесконечное
    количество.

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

    плюс должна быть возможность распространить
    алгоритм на многомерный случай.

    View full-size slide


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

    View full-size slide


  28. Добавим на график еще две горизонтальные
    линии, соответствующие классам {1, -1},

    спроецируем на них элементы.

    View full-size slide

  29. 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)')

    View full-size slide


  30. Точки с классом "-1" проецируем на нижнюю линию Φ=-1, точки с
    классом "1" проецируем на верхнюю линию Φ=1.
    Обратим здесь внимание на еще один небольшой нюанс.

    По вертикальной оси мы строим значения активации, пространство
    значений активации непрерывно.

    Но результат работы классификатора (функция активации,
    пропущенная через порог) — дискретное множество из двух
    элементов {-1, 1}, а не непрерывная шкала.

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

    View full-size slide

  31. Введем метрику ошибки

    View full-size slide

  32. gradient-1d.py
    # ошибки - расстояния от точек
    # на линии активации до горизонтальных линий
    # меток классов
    plt.plot([X1, X1], [y_, y], color='orange')#, label='err')

    View full-size slide


  33. Естественно принять, что чем ближе окажется значение
    активации для выбранного элемента к значению класса
    для этого же элемента, тем лучше активация
    предсказывает для этого элемента его класс.

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

    На графике: ошибки — вертикальные оранжевые линии.

    View full-size slide

  34. Функция стоимости (потерь)

    Ошибка — расстояние от значения метки класса до линии
    (гиперплоскости) активации

    Сумма квадратичных ошибок всех элементов: 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

    View full-size slide

  35. Для 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

    View full-size slide


  36. Далее код см. в статье
    «Градиентный спуск по косточкам»
    habr.com/ru/post/467185/

    View full-size slide

  37. J(w) 3D (обычная шкала по вертикали)

    View full-size slide


  38. Видим, что есть минимум

    вроде как

    View full-size slide

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

    View full-size slide


  40. Наша задача — подобрать такие значения w
    0
    и w
    1
    , чтобы попасть на дно этой ямы.

    Получим значения весовых коэффициентов
    — получим обученный нейрон.

    View full-size slide

  41. Точка минимума ("вручную" на сетке)

    View full-size slide

  42. # найдем минимальное значение на сетке
    # 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))

    View full-size slide

  43. Подобрали коэффициенты

    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

    View full-size slide

  44. Сетка побольше

    View full-size slide

  45. Поиск минимума: перебор по сетке

    Вариант рабочий (как видим)

    Нужно заранее знать область, где искать минимум (можно взять
    достаточно большие границы, затем сужать область поиска — это
    только на глаз)

    Для повышения точности нужно уменьшать шаг → еще больше точек
    (решение: можно итеративно сужать область поиска)

    Слишком много точек (для 2д может и ок, но для многомерных случаев
    очень быстро упремся в ресурсы)

    Для MNIST (28x28=784 пикселей — столько же входов, весовых
    коэффициентов столько же плюс смещение, сетка 10 шагов на
    размерность): 10^785 (в видимой части Вселенной всего 10^80 атомов,
    Вселенная существует примерно 4*10^17 секунд = 4*10^26 наносекунд)

    View full-size slide

  46. График J(w) — 2-д
    (фиксируем w
    0
    , меняем w
    1
    )

    View full-size slide


  47. Это обычная парабола (точнее, семейство парабол —
    они будут немного отличаться в зависимости от того,
    какое именно значение зафиксировали на w
    0
    ).

    Чтобы найти минимум параболы, не обязательно
    перебирать все точки.

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

    View full-size slide

  48. Поиск минимума: спуск с постоянным шагом

    Если шаг слишком большой, можно промахнуться, так и не достигнув
    минимума (шаг можно уменьшить)

    Если слишком маленький, будет слишком много шагов (больше, чем
    могло бы быть)

    Точный минимум мы в любом случае не достигнем, но можем
    достигнуть с произвольной точностью, поменяв около найденного
    неточного минимума шаг (шаг перестает быть постоянным)

    Не знаем направление спуска (можно решить алгоритмически: не
    шагать в сторону увеличения ошибки)

    Проблема с поиском диапазона решена (можно спускаться из любой
    точки)

    В принципе, вариант рабочий, но может есть вариант получше?

    View full-size slide

  49. Поиск минимума: градиентный спуск

    Используем для подбора шага производную кривой стоимости
    J(w)

    У нас несколько измерений и в каждом из них своя кривая:
    фиксируем все w
    j
    , кроме w
    k

    J(w
    k
    ) будет кривая ошибки в k-ом измерении

    Все они — параболы

    Для регулировки шага по каждому измерению будем
    использовать частную производную функции ошибки по этому
    измерению (изменяющемуся коэффициенту w
    k
    )

    (вектор из таких частных производных — градиент)

    View full-size slide

  50. Геометрический смысл
    производной

    View full-size slide


  51. Производная функции y(x) в данной точке x
    0
    — это предел
    отношения приращения функции Δy к приращению аргумента
    при приращении аргумента Δx, стремящемся к нулю
    y'(x
    0
    )= lim
    Δ x→0
    Δ y
    Δ x
    ,Δ y= y(x
    0
    +Δ x)− y(x
    0
    )

    View full-size slide

  52. Устремляем приращение Δx к нулю

    View full-size slide

  53. /* Здесь анимация gif */

    View full-size slide

  54. Интересные свойства производной

    Производная функции в точке x
    0
    равна тангенсу угла между касательной
    к исходной кривой в этой точке и горизонтальной осью y=0

    По модулю — это отношение координаты точки y(x
    0
    ) по вертикальной
    оси к длине горизонтального отрезка — расстоянию между точкой x
    0
    на
    оси y=0 и точкой пересечения касательной и оси y=0

    Чем «круче» исходная кривая, тем вертикальное расстояние больше
    горизонтального, тем больше абсолютное значение тангенса и
    производной

    Знак производной — направление спуска: слева направо — минус,
    справа налево — плюс

    (чтобы понять, откуда он берется, посмотрите, как в том и другом случае
    получается Δy)

    View full-size slide

  55. Вот, например,
    наш случай с параболой

    View full-size slide


  56. Оранжевая линия — исходная функция, красная линия —
    касательная к исходной функции в точке x
    0
    , синяя линия — это
    производная исходной функции в каждой из точек.

    Две зеленые линии — катеты прямоугольного треугольника с
    гипотенузой — касательной.

    Отношение вертикальной зеленой линии к горизонтальной —
    тангенс острого угла между касательной и горизонтальной
    осью y=0, оно же — абсолютное значение производной в этой
    точке.

    View full-size slide


  57. Чем ближе минимум исходной функции, тем более
    пологий спуск, тем меньше вертикальная зеленая линия
    по сравнению с горизонтальной, тем меньше
    абсолютное значение производной.

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

    View full-size slide


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

    View full-size slide

  59. /* Здесь анимация gif */

    View full-size slide

  60. Подытожим

    У нас есть универсальный вычислимый индикатор
    (метрика), который показывает как
    «крутизну»/«пологость» спуска, так и его направление в
    каждой из точек.

    Этот индикатор — производная функции в каждой точке.

    И, раз у нас есть такой индикатор, почему бы нам не
    использовать его для вычисления динамического шага
    при спуске к минимуму данной функции?

    Ровно это мы сейчас и сделаем.

    View full-size slide

  61. Вернемся к нашей функции
    ошибки, она же — многомерное
    семейство парабол

    View full-size slide

  62. Частная производная по вектору

    Выбираем k-й элемент вектора

    Считаем, что он изменяется

    По нему берем производную

    Остальные элементы считаем константами

    Производная по выбранному элементу вектора
    называется частной производной
    J (w)=
    1
    2
    SSE=
    1
    2

    i=1
    n
    (∑
    j=0
    m
    w
    j
    x
    j
    (i)− y(i))
    2

    View full-size slide

  63. ∂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
    Производная суммы равна сумме производных

    View full-size slide

  64. ∂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,
    умножаем на производную вложенной функции

    View full-size slide

  65. ∂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
    равны нулю
    (и двойку слева тоже вынесем)

    View full-size slide

  66. ∂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)
    (½ слева сократили тоже здесь)

    View full-size slide

  67. Получили в общем виде
    ∂J (w)
    ∂w
    k
    =∑
    i=1
    n
    (∑
    j=0
    m
    w
    j
    x
    j
    (i)− y(i))x
    k
    (i)
    По w
    k
    — линейная функция (чего и следовало ожидать)

    View full-size slide

  68. Градиент — вектор частных производных

    ∇ [набла] (перевернутая дельта)

    Определим правило шага:

    Правило шага для 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

    View full-size slide

  69. Обратим внимание на

    Минус перед градиентом

    Коэффициент η [эта] — коэффициент обучения,
    некоторая константа

    View full-size slide

  70. Опять вернемся в наш
    1-мерный случай

    View full-size slide

  71. Φ(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)

    View full-size slide

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

    View full-size slide

  73. Кстати, у нас всё готово для спуска

    Спустимся по одному из измерений,

    пусть будет w
    1

    Фиксируем w
    0
    = 1

    спускаемся к минимуму J(w
    1
    )

    View full-size slide

  74. Построим график функции
    стоимости J(w
    1
    , w
    0
    =1)

    заодно отметим первую точку, из которой
    будем спускаться (вообще говоря, она
    может быть любая, в том числе случайная)
    w
    1

    View full-size slide

  75. Градиент

    точнее, частная производная ∂J(w)/∂w
    1
    — элемент градиента

    Обратим внимание на масштаб по вертикальной шкале
    w
    1

    View full-size slide

  76. Шаги спуска Δw
    1
    (w
    1
    )

    (да, здесь размер шага Δw
    1
    зависит от текущего значения w
    1
    ,
    т.е. шаг зависит от того, из какой точки мы шагаем)

    Здесь обратим внимание на направление наклона и опять на
    вертикальную шкалу
    w
    1

    View full-size slide

  77. Здесь видим

    Наверху: график выпуклой функции, имеется
    глобальный минимум

    Внизу: частная производная — показывает
    степень «крутизны» функции наверху (чем больше
    производная, тем «круче» функция), знак
    определяет направление

    Посередине: шаг для спуска — частная
    производная со знаком минус (чтобы спускаться в
    сторону минимума), помноженная на коэффициент
    η [эта], определяющий размер шага

    View full-size slide

  78. Спускаемся по J(w) по градиенту

    (точнее, пока по одному измерению)

    Исходные веса w — обычно это какие-то случайные
    не очень большие значения или какие-то константы.

    Мы договорились взять w
    0
    =1, а исходную точку
    спуска w
    1
    =0.9.

    Здесь же выберем коэффициент обучения η=0.001 и

    количество итераций (количество шагов, количество
    эпох обучения) пусть будет 12

    View full-size slide


  79. На всех графиках горизонтальная ось — параметр w
    1
    на одном и том же отрезке, вертикальные оси —
    разные

    Движемся справа налево, от самой большой точки w
    1
    к
    самой маленькой

    Размер шага и направление — оранжевые отрезки на
    графике: на верхнем графике горизонтальные, на
    среднем — вертикальные

    Длина вертикального отрезка на среднем графике
    равна длине соответствующего горизонтального
    отрезка на верхнем графике, но на экране они могут не
    совпадать — обратите внимание на масштабы по осям

    View full-size slide


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

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

    View full-size slide


  81. Знак перед шагом на среднем графике
    полностью соответствует направлению спуска на
    верхнем графике:

    в правой половине графика мы спускаемся
    справа налево — шаг отрицательный,

    в левой половине графика мы спускаемся слева
    направо — шаг положительный

    Откуда мы его берем? Из нижнего графика
    производной — она попадает на средний график
    со знаком минус. Вспоминаем про
    геометрический смысл производной.

    View full-size slide

  82. Посмотрим еще ближе на нижний график производной и
    средний график с шагом.

    По горизонтальной оси у них одни и те же значения w
    1
    , а
    по вертикали масштаб существенно отличается.

    Из геометрического смысла производной мы помним, что
    значение производной в данной точке можно
    использовать как метрику «крутости»/«пологости»
    исходной кривой.

    Чем круче кривая, тем мы дальше от минимума, тем
    дальше в этом месте можем шагать.

    Чем кривая более пологая, тем мы ближе к минимуму,
    тем короче нужно делать шаги, «сбавить обороты».

    View full-size slide


  83. Но посмотрите на диапазон значений на
    вертикальной оси нижнего графика с производной,
    а потом на диапазон на горизонтальной оси на
    верхнем графике с функцией:

    для исходной точки w
    1
    =0.9 значение производной
    получается примерно 200, при том, что расстояние
    до минимума, судя по графику, в районе 1.

    Это значит, что значение производной как есть мы
    в качестве шага брать не можем, но мы можем
    легко отмасштабировать его так, чтобы оно
    попадало в нужный нам диапазон.

    View full-size slide


  84. Для этого используем специальный
    коэффициент — тот самый коэффициент
    обучения η.

    В нашем случае нужно подобрать его
    значение так, чтобы значение производной
    200 стало меньше 1.

    Берем η=0.001, получаем для точки длину
    шага 200*0.001=0.2

    (с учетом домножения на -1, точный шаг
    получается -0.2) — в самый раз.

    View full-size slide


  85. Значение ошибки в первой точке J(w1=0.9) =
    92.43,

    в последней точке через 12 эпох (шагов,
    итераций) J(w1=0.03) = 8.54

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

    View full-size slide


  86. В общем, именно в этом и заключается метод
    градиентного спуска. С таким уточнением, что здесь мы
    спустились только по одной координате и попали в
    локальный минимум на одном срезе.

    Чтобы попасть в глобальный минимум многомерной
    функции, мы будем на каждой итерации делать по одному
    шагу по каждой из координат (или можно считать, что это
    один, но многомерный шаг).

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

    View full-size slide

  87. Подбираем темп обучения η

    View full-size slide

  88. Подбираем темп обучения η

    η [эта] — коэффициент (темп) обучения

    Влияет на длину шага на каждой эпохе

    Чем меньше шаг, тем выше точность

    Но тем больше эпох требуется для спуска в
    минимум

    View full-size slide

  89. Подбираем темп обучения η

    Можно подбирать наугад, пока не получится
    подходящее значение (начать с маленького так,
    чтобы алгоритм сходился, и начать увеличивать
    до тех пор, пока алгоритм не начнет расходиться)

    Но лучше посмотреть на диапазон w
    1
    и на
    значение градиента и подобрать η так, чтобы
    градиент попал в масштаб окрестности w
    1

    Или построить график сходимости J(w) по эпохам

    View full-size slide

  90. Возьмем значение η=0.01
    (было η=0.001)

    View full-size slide


  91. Здесь еще раз обратите внимание на диапазон значений по
    вертикальной оси на среднем графике и диапазон на
    горизонтальной оси наверху.

    Вертикальные отрезки на среднем графике по длине равны
    соответствующим горизонтальным отрезкам шагов на верхнем
    графике, хотя при экранном масштабе это не бросается в глаза.

    Здесь начинаем движение из точки 3-й справа, дальше
    перепрыгиваем через минимум в 3-ю слева, потом опять через
    минимум направо, налево и т. п.

    Каждый раз забираемся все выше по параболе, т.е. с каждым
    шагом ошибка возрастает.

    Это значит, что алгоритм расходится, нужно выбрать [эту]
    поменьше.

    View full-size slide

  92. И так по каждой координате w

    View full-size slide


  93. Значит коэффициент обучения η подбираем
    таким образом, чтобы он обеспечил спуск по
    каждому из элементов градиента.

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

    View full-size slide


  94. Вопрос от Александра Веденеева: почему
    нельзя сразу попасть в минимум для
    параболы, а не плестись по шагам?

    Самостоятельно: подумать и проверить,
    получится так сделать для линейного
    нейрона или нет

    View full-size slide

  95. График сходимости ошибки J(w)

    View full-size slide

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

    View full-size slide

  97. Побольше эпох

    View full-size slide

  98. Подбираем количество эпох

    Алгоритм должен успеть спуститься вниз при
    заданном темпе обучения η

    Идеальный минимум можем не получить, но
    можем приблизиться к нему настолько
    близко, насколько захотим

    Кстати, ответ еще будет зависеть от
    исходных значений весов w, точнее, от того, с
    какой стороны минимума начнется спуск

    View full-size slide


  99. Темп ок

    Эпох маловато
    Здесь

    View full-size slide

  100. Количество эпох

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

    На глаз: по графику сходимости

    View full-size slide

  101. Посмотрим на спуск по всем
    измерениям

    View full-size slide

  102. Немного странно...

    По пологому склону катится быстро, а в
    воронке — замедляется...

    Не забываем, что вертикальная шкала у нас
    логарифмическая

    На самом деле поверхность спуска J(w)
    выглядит так:

    View full-size slide


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

    View full-size slide

  104. Активация
    на резиночках

    View full-size slide

  105. Подытожим

    При η=0.001 видно, что алгоритм сходится к 10-12й
    эпохе (значение ошибки перестает уменьшаться
    сильно)

    Но чтобы получить такую же точность, как при ручном
    поиске минимума по сетке, с таким же коэффициентом
    нужно отработать 1767 эпох

    Еще дальше гонять обучение не имеет смысла —
    ошибка почти не уменьшилась спустя еще 60 тыс эпох

    Нужна ли такая точность — вопрос задачи

    View full-size slide

  106. Результат обучения

    Нашли коэффициенты (при условии, что
    остановились на эпохе 1767)

    w
    0
    = -1.184831

    w
    1
    = 0.258455

    Φ (x, w) = w
    0
    + w
    1
    x
    1
    = -1.184831 + 0.258455 * x
    1

    View full-size slide

  107. Проверим модель —
    протестируем обученный нейрон

    View full-size slide


  108. Между прочим, мы с вами только что научили
    искусственный нейрон (так же известный как
    мыслящая машина класса «Перцептрон»)
    отличать красные точки слева от синих точек
    справа

    и нам потребовалось на это всего 12 попыток.

    View full-size slide

  109. 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

    View full-size slide

  110. Двумерное пространство
    (m=2)

    View full-size slide

  111. Пространство 2д

    Элементы выборки — точки на плоскости (две
    координаты)

    x = (x
    1
    , x
    2
    )

    y = {-1, 1} (как и раньше)

    активация Φ(x, w) = w
    0
    + w
    1
    x
    1
    + w
    2
    x
    2

    Спускаемся одновременно по 3м параметрам
    (градиент из 3-х измерений)

    View full-size slide

  112. Активация
    Φ (x, w) = w
    0
    + w
    1
    x
    1
    + w
    2
    x
    2

    Активация — параметрическая плоскость в
    трёхмерном пространстве,

    значит мы не можем нарисовать ее на плоскости,
    как для 1-мерного случая,

    нужно переходить в 3-д:

    View full-size slide

  113. Плоскость активации с
    проекциями элементов

    View full-size slide

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

    View full-size slide


  115. Ошибка для каждого элемента — расстояние
    от проекции элемента на плоскость активации
    до проекции этого же элемента на плоскость
    истинного класса.

    Линия пересечения плоскости активации
    (сиреневая) и нулевой плоскости Φ(w)=0
    (матово-белая) делит точки на классы.

    View full-size slide


  116. В статьях, описывающих градиентный спуск или
    рассказывающих про нейросети, обычно рисуют такую линию и
    говорят, что вот ее нам нужно построить, конечно, если
    множество еще линейно разделимо (оно линейно разделимо,
    если группы элементов можно разделить вот такой линией).

    Это правда, но это не вся правда. На самом деле, как мы только
    что увидели, нам нужно построить не линию в пространстве
    m=2, а плоскость в пространстве (m+1)=3:

    пересечение плоскости активации с нулевой координатой
    активации и даст нам эту линию, хотя все равно одной линии не
    достаточно — она разделит элементы на две части,

    но значения классов назначает не линия, а плоскость — в
    зависимости от того, выше или ниже нуля оказывается проекция
    элемента на ней (см квантизатор).

    View full-size slide

  117. /* здесь анимация */

    View full-size slide

  118. График ошибки J(w)

    У нас 3 параметра (w
    0
    , w
    1
    , w
    2
    ) — 3 размерности

    Плюс значение J(w) — 4-я размерность

    Нарисовать целиком красивую воронку уже проблематично

    (если только вы не умеете рисовать графики в 4-д)

    Можно только отдельные срезы с парой изменяющихся и остальными
    фиксированными w

    Добавить динамику?

    Также можно попробовать изобразить несколько графиков на одном,
    применив, например, цветовое кодирование

    Или что-то вроде того (любой прием изображения 4-мерных поверхностей
    в 3-д, если вы такие знаете)

    View full-size slide


  119. И это только для простейшего случая с 2-
    мерными признаками

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

    Но в нее все равно получится спуститься по
    градиенту

    View full-size slide

  120. Спуск по градиенту

    View full-size slide

  121. /* здесь анимация */

    View full-size slide

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

    View full-size slide


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

    Почему стоит остановиться именно на 70-м шаге, а не на
    30-м, 40-м или 200-м, этот график, по крайней мере, в
    представленном виде, ответ не дает.

    View full-size slide

  124. Заключение

    View full-size slide

  125. 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

    View full-size slide

  126. Другие функции активации

    ADALINE — это только нейрон с линейной активацией, а
    не любые такие нейроны в целом

    Если заменить активацию на другую функцию, получим
    вполне современные архитектуры нейронов

    С ними точно так же будет применяться градиентный
    спуск (или его улучшенные модификации)

    Например, сигмоида (рассмотрим на следующем занятии)

    ru.wikipedia.org/wiki/Функция_активации

    Более 20 вариантов, можно придумывать свои

    View full-size slide