Учиться только на ошибках

После этого урока ты руками проведёшь Hebbian learning для четырёх точек со слайда 12 лекции 2 и объяснишь, когда процедура остановится и почему итоговые веса у двух студентов могут не совпасть.

В машине Mark I — перцептроне Розенблатта, собранном в железе, — веса были не числами в памяти, а ручками потенциометров. Обучение выполняли электромоторы: они подкручивали ручки на небольшой угол. Каким должно быть итоговое положение каждой ручки, машине никто не сообщал.

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

Запиши свои два «да» или «нет» сейчас. К концу урока проверишь их руками: в одной задаче ручки замрут после трёх поворотов, в другой будут ходить по кругу без конца.

Правило в одну строчку

В прошлом уроке веса для OR и AND подбирались руками: четыре точки, одна прямая, три числа. Для ста входов прямую глазами не проведёшь. Нужна процедура, которая находит веса сама.

Идея пришла из психологии. В 1949 году Дональд Хебб в книге The Organization of Behavior предположил, что связь от нейрона A к нейрону B усиливается, когда A раз за разом участвует в возбуждении B. На слайде 11 лекции 2 эта мысль пересказана уже для перцептрона: синапс усиливается при одновременной активности входа и желаемого выхода, desired target. Запомни слово «желаемого»: вход сопоставляют не с тем, что нейрон ответил, а с тем, что он должен был ответить.

Сначала на людях

Представь совет из трёх человек с разным весом голоса: \(w_0\), \(w_1\), \(w_2\). Первый всегда голосует «за» (\(x_0 = 1\)). Двое других голосуют «за» (\(+1\)) или «против» (\(-1\)). Решение совета — знак взвешенной суммы голосов.

Совет ошибся: решил «за», а правильно было «против». Как поправить веса? Разумно так: кто голосовал так же, как правильный ответ, получает прибавку к весу, а кто голосовал наоборот, теряет столько же. Размер прибавки для всех один, назовём его \(\eta\).

«Голосовал так же, как правильный ответ» значит, что голос \(x_i\) и правильный ответ \(t\) одного знака: \(x_i \cdot t = +1\). «Наоборот» — это \(x_i \cdot t = -1\). Выходит, поправка к весу равна \(\eta \cdot x_i \cdot t\). Это и есть всё правило.

\[ w_i^{k+1} = w_i^{k} + \Delta w_i^{k} \] \[ \Delta w_i^{k} = \eta \cdot x_i^{k} \cdot t^{k} \]
\(w_i^{k}\)
вес \(i\)-го входа перед шагом \(k\); индекс \(i\) идёт от 0 до \(I\)
\(x_i^{k}\)
\(i\)-й вход перцептрона на шаге \(k\); \(x_0 = 1\) всегда
\(t^{k}\)
target: желаемый выход для этого примера, \(+1\) или \(-1\)
\(\eta\)
learning rate: размер одной поправки, положительное число

Все веса сразу удобно записать одним вектором: \(\vb{w} \leftarrow \vb{w} + \eta\, t\, \vb{x}\). Стрелка читается «заменить на».

В самой формуле не видно двух условий, без которых она не работает. На слайде 11 они вынесены в облачка, а слайд 12 добавляет, когда пора закончить.

Hebbian learning в этом курсе — процедура обучения одного перцептрона из четырёх пунктов. Начать со случайных весов. Показывать примеры по одному — online. Менять веса по правилу \(\Delta w_i = \eta\, x_i\, t\) только если пример предсказан неверно. Ходить по примерам по кругу и закончить, когда все предсказаны верно.

Один полный проход по всем примерам называют эпохой (epoch). Значит, условие остановки звучит так: эпоха без единого исправления.

Отдельного правила для bias не нужно. Bias — это вес \(w_0\) при постоянном входе \(x_0 = 1\) (трюк из урока 5). Подставь \(x_0 = 1\) в правило, и получится \(\Delta w_0 = \eta \cdot t\). После ошибки bias растёт, если нужно было ответить \(+1\), и падает, если нужно было \(-1\).

1 x₁ x₂ w₀ w₁ w₂ Σ Sign h h = t ? t ошибка: к каждому весу прибавить η·x·t цель три ручки
Рис. 1. Обучение — это обратная связь. Выход \(h\) сравнивают с целью \(t\). Не совпало — сигнал идёт назад и поворачивает каждую из трёх ручек на \(\eta \cdot x_i \cdot t\). Совпало — не происходит ничего.

Перцептрон учится только на ошибках: верно предсказанный пример не меняет ни одного веса.

«Веса обновляют после каждого примера». После каждого примера делают проверку. Обновление — только после ошибки. Если прибавлять \(\eta\, t\, \vb{x}\) всегда, веса будут расти и тогда, когда всё уже предсказано верно, и процедура никогда не закончится.

Хебб был психологом и свою идею сформулировал словами, без формулы. Знаменитый лозунг про нейроны, которые «fire together, wire together», в его книге не встречается: это более поздний пересказ. Есть и вторая тонкость. Формулой идею Хебба записывают так: \(\Delta w = \eta\, x\, y\), где \(y\) — собственный выход нейрона, а не цель. Учителя в ней нет, и условия «только на ошибке» тоже. Процедуру с целью \(t\) и этим условием в большинстве учебников называют perceptron learning rule. На экзамене называй её так, как на слайдах: Hebbian learning.

Почему цели — это −1 и +1

На слайде 10 лекции 2 входы и выходы были нулями и единицами. На слайде 12, где начинается обучение, таблица OR переписана через \(-1\) и \(+1\), а в облачке пометка: с функцией Sign жить проще. Вместе с кодировкой меняется и функция активации. Вместо ступеньки 0/1 теперь знак суммы с тремя значениями.

\[ h(\vb{w}\T\vb{x}) = \begin{cases} +1, & \vb{w}\T\vb{x} \gt 0 \\ \phantom{+}0, & \vb{w}\T\vb{x} = 0 \\ -1, & \vb{w}\T\vb{x} \lt 0 \end{cases} \]

Ноль на самой границе — честное «не знаю». Он не равен ни \(+1\), ни \(-1\), поэтому такой ответ всегда считается ошибкой.

Зачем понадобилась замена? Посмотри, что правило делает с весом при каждом сочетании знаков.

Четыре случая правила \(\Delta w_i = \eta\, x_i\, t\) в кодировке \(\pm 1\).
вход \(x_i\)цель \(t\)\(x_i \cdot t\)\(\Delta w_i\)на языке совета
+1+1+1\(+\eta\)голосовал «за», и надо было «за»
−1−1+1\(+\eta\)голосовал «против», и надо было «против»
+1−1−1\(-\eta\)голосовал «за», а надо было «против»
−1+1−1\(-\eta\)голосовал «против», а надо было «за»

Вход и цель совпали по знаку — связь усиливается. Разошлись — ослабевает. Все четыре строки что-то делают с весом.

Теперь те же строки с нулями. При цели \(t = 0\) поправка равна \(\eta \cdot x_i \cdot 0 = 0\) для любого входа. Правило молчит именно тогда, когда перцептрон ответил 1 вместо 0, то есть когда веса нужно уменьшить. С входами и целями 0/1 веса умеют только расти.

Проверка на AND в кодировке 0/1: старт с нулевых весов, \(\eta = 0.5\), выход 1 при \(a \gt 0\). Первые три записи имеют \(t = 0\) и выход 0 — верно. Четвёртая, \((1, 1)\) с \(t = 1\), даёт \(a = 0\) и выход 0: ошибка, веса становятся \((0.5,\ 0.5,\ 0.5)\). С ними перцептрон отвечает 1 на все четыре входа. Три ответа из четырёх неверны, но у всех трёх \(t = 0\), и поправка нулевая. Процедура застряла навсегда. В кодировке \(\pm 1\) та же задача решается за одно исправление: это видно в виджете ниже.

У кодировки \(\pm 1\) есть и второе удобство. Проверка «предсказано ли верно» записывается одним неравенством, где \(a = \vb{w}\T\vb{x}\) — взвешенная сумма:

\[ t \cdot a \gt 0 \]

При \(t = +1\) оно требует \(a \gt 0\), при \(t = -1\) требует \(a \lt 0\). Это неравенство ещё пригодится, когда будем выяснять, почему исправление помогает.

А если на экзамене дадут таблицу в 0/1?

Сначала посмотри, не задана ли кодировка в условии. Если выбор за тобой, перекодируй таблицу в \(\pm 1\): нули во входах и целях замени на \(-1\), и правило со слайда заработает. Одной строкой напиши, что так сделано. Найденные веса относятся к входам \(\pm 1\); обратно в 0/1 они пересчитываются по последней строке шпаргалки в конце урока.

Второй путь — запись того же правила для целей 0/1: \(\Delta w_i = \eta\,(t - h)\,x_i\), где \(h\) — выход перцептрона. При верном ответе \(t - h = 0\), при ошибке \(t - h = \pm 1\), то есть ровно та «цель со знаком», которой не хватало. На слайдах 11–12 лекции 2 этой записи нет, но в учебниках она встречается часто.

Пример со слайда 12 лекции 2: OR за три исправления

Условие со слайда: научить перцептрон оператору OR. Старт \(\vb{w} = [0\ 0\ 0]\), то есть \(w_0 = w_1 = w_2 = 0\): слайд приводит нули как пример «случайных» начальных весов. Learning rate \(\eta = 0.5\). Обучающие примеры — четыре строки таблицы истинности; слайд называет их records, дальше это «записи». Идут они в порядке таблицы.

OR в кодировке \(\pm 1\), как на слайде 12 лекции 2. Столбец \(x_0\) — постоянный вход для bias.
запись\(x_0\)\(x_1\)\(x_2\)цель \(t\)
11−1−1−1
21−1+1+1
31+1−1+1
41+1+1+1

На каждой записи три действия. Посчитать сумму \(a = \vb{w}\T\vb{x}\). Взять её знак. Сравнить с \(t\). Если не совпало, прибавить к весам \(\eta\, t\, \vb{x}\). Открывай шаги по одному и перед каждым прикидывай, будет ли исправление.

  1. Запись 1: \(\vb{x} = (1, -1, -1)\), \(t = -1\). Веса нулевые, поэтому сумма тоже ноль:

    \[ a = 0 \cdot 1 + 0 \cdot (-1) + 0 \cdot (-1) = 0 \]

    Sign(0) = 0, а нужно \(-1\). Ошибка. Прибавляем \(\eta\, t\, \vb{x} = 0.5 \cdot (-1) \cdot \vb{x}\):

    \[ \Delta\vb{w} = (-0.5,\ +0.5,\ +0.5) \] \[ \vb{w} = (-0.5,\ 0.5,\ 0.5) \]
  2. Запись 2: \(\vb{x} = (1, -1, +1)\), \(t = +1\). Считаем с новыми весами:

    \[ a = -0.5 - 0.5 + 0.5 = -0.5 \]

    Выход \(-1\), а нужно \(+1\). Ошибка. Прибавляем \(0.5 \cdot (+1) \cdot \vb{x}\):

    \[ \Delta\vb{w} = (+0.5,\ -0.5,\ +0.5) \] \[ \vb{w} = (0,\ 0,\ 1) \]
  3. Запись 3: \(\vb{x} = (1, +1, -1)\), \(t = +1\). Работает только \(w_2 = 1\):

    \[ a = 0 + 0 + 1 \cdot (-1) = -1 \]

    Выход \(-1\), а нужно \(+1\). Третья ошибка подряд:

    \[ \Delta\vb{w} = (+0.5,\ +0.5,\ -0.5) \] \[ \vb{w} = (0.5,\ 0.5,\ 0.5) \]
  4. Запись 4: \(\vb{x} = (1, +1, +1)\), \(t = +1\).

    \[ a = 0.5 + 0.5 + 0.5 = 1.5 \]

    Выход \(+1\) — верно. Веса не трогаем. Первая эпоха закончилась: три исправления.

  5. Вторая эпоха. Останавливаться рано: исправления могли испортить прежние записи. Проверяем все четыре с весами \((0.5,\ 0.5,\ 0.5)\):

    \[ a = -0.5,\quad 0.5,\quad 0.5,\quad 1.5 \]

    Выходы \(-1, +1, +1, +1\) совпали с целями. Эпоха без единого исправления — стоп.

За числами стоит простая геометрия. Тройка весов — это прямая \(w_0 + w_1 x_1 + w_2 x_2 = 0\) (урок 6), и каждое исправление её двигает. Вот что произошло на записи 2.

1 2 3 4 a = −0.5 w сторона +1 две ошибки

До: \(\vb{w} = (-0.5,\ 0.5,\ 0.5)\)

1 2 3 4 a = +1 w сторона +1 осталась одна

После: \(\vb{w} = (0,\ 0,\ 1)\)

Рис. 2. Второе исправление. Кружки — записи с целью \(+1\), крестик — с целью \(-1\); жёлтым обведена запись 2, которую проверяем. До исправления она лежит на стороне \(-1\). После — прямая повернулась (пунктир показывает, где она была), и запись 2 оказалась на стороне \(+1\). Красное кольцо — запись, которую текущие веса предсказывают неверно: запись 3 ждёт своей очереди.

На экзамене такой расчёт удобно вести таблицей: одна строка — одна запись, в каждой строке сумма считается с весами из предыдущей.

Весь расчёт для OR: \(\vb{w} = [0\ 0\ 0]\), \(\eta = 0.5\). Веса записаны как \((w_0, w_1, w_2)\).
эпохазапись\((x_0, x_1, x_2)\)\(t\)\(a = \vb{w}\T\vb{x}\)выход\(\Delta\vb{w} = \eta\, t\, \vb{x}\)\(\vb{w}\) после
11(1, −1, −1)−100(−0.5, +0.5, +0.5)(−0.5, 0.5, 0.5)
12(1, −1, +1)+1−0.5−1(+0.5, −0.5, +0.5)(0, 0, 1)
13(1, +1, −1)+1−1−1(+0.5, +0.5, −0.5)(0.5, 0.5, 0.5)
14(1, +1, +1)+11.5+1верно(0.5, 0.5, 0.5)
21(1, −1, −1)−1−0.5−1верно(0.5, 0.5, 0.5)
22(1, −1, +1)+10.5+1верно(0.5, 0.5, 0.5)
23(1, +1, −1)+10.5+1верно(0.5, 0.5, 0.5)
24(1, +1, +1)+11.5+1верно, стоп(0.5, 0.5, 0.5)
старт шаг 1 шаг 2 шаг 3 4 ошибки 2 ошибки 1 ошибка 0 ошибок
Рис. 3. Та же таблица картинками. В каждом кадре — четыре записи и прямая, которую задают текущие веса; закрашена сторона \(+1\), красным обведены записи, предсказанные неверно. На старте прямой нет вовсе: при нулевых весах сумма равна нулю в любой точке.

Итог: \(\vb{w} = (0.5,\ 0.5,\ 0.5)\). Граница \(0.5 + 0.5x_1 + 0.5x_2 = 0\), то есть \(x_2 = -x_1 - 1\). Она отрезает угол \((-1, -1)\) от трёх остальных, как и положено OR.

Теперь замкнём круг с прошлым уроком. Там OR был задан в кодировке 0/1 весами \(w_0 = -\tfrac{1}{2}\), \(w_1 = 1\), \(w_2 = 1\). Перейдём к тем же координатам подстановкой \(x = 2x' - 1\):

\[ \begin{aligned} &0.5 + 0.5\,(2x_1' - 1) + 0.5\,(2x_2' - 1) \\ &\qquad = -0.5 + x_1' + x_2' \end{aligned} \]

Получились те самые веса со слайда 10 лекции 2. Процедура за три исправления нашла то, что раньше приходилось подбирать глазами.

Теперь по шагам, своими руками

В виджете та же процедура, запись за записью. Главное, что здесь нужно увидеть: веса меняются только на ошибке, и процедура сама замирает, как только прямая отделила точки. А если отделить нельзя, она ходит по кругу.

Hebbian learning по шагам

Четыре записи таблицы на плоскости \((x_1, x_2)\). Кнопка «Следующая запись» проверяет одну запись и, если она предсказана неверно, исправляет веса. Стрелка \(\vb{w}\) — это пара \((w_1, w_2)\): она перпендикулярна границе и смотрит на сторону \(+1\).

  1. Настройки как на слайде 12 лекции 2: OR, старт \((0, 0, 0)\), \(\eta = 0.5\). Прежде чем нажимать: сколько из четырёх записей первой эпохи потребуют исправления? Потом иди по одной записи и сверяй числа с таблицей выше.
    Что должно получиться

    Три: записи 1, 2 и 3. Четвёртая уже верна, \(a = 1.5\). Вторая эпоха проходит без исправлений, и процедура останавливается на \((0.5,\ 0.5,\ 0.5)\) с границей \(x_2 = -x_1 - 1\). Следи за счётчиком «ошибок при этих весах»: 4, 2, 1, 0.

  2. Переключи функцию на AND, остальное не трогай. Исправлений будет больше, чем у OR, или меньше? А если взять обратный порядок записей?
    Что должно получиться

    Одно. Первое же исправление даёт \((-0.5,\ 0.5,\ 0.5)\), прямую \(x_2 = -x_1 + 1\), и она сразу отрезает угол \((1, 1)\). В обратном порядке исправлений три, а итоговые веса те же. Порядок поменял путь, но здесь не поменял финиш.

  3. Верни OR и порядок таблицы, выбери старт \((1, -1, 0.5)\). Получатся ли те же итоговые веса \((0.5,\ 0.5,\ 0.5)\)? И заодно: исчезнет ли красное кольцо у записи 1 после первого же исправления?
    Что должно получиться

    Веса другие: после четырёх исправлений процедура останавливается на \((1,\ 1,\ 0.5)\), граница \(x_2 = -2x_1 - 2\). Это тоже верный OR, просто другая прямая. А кольцо у записи 1 не исчезает: её сумма была 1.5, стала ровно 0, выход 0 — всё ещё не \(-1\). Её чинят второй раз в следующей эпохе.

  4. Теперь XOR со стартом \((0, 0, 0)\). Остановится ли процедура? Нажми «Эпоха целиком» несколько раз.
    Что должно получиться

    Нет. Все четыре записи первой эпохи оказываются ошибками, а четыре исправления в сумме дают ноль: веса возвращаются в \((0, 0, 0)\). Вторая эпоха повторяет первую шаг в шаг, и в строке «состояние» появляется слово «цикл». Нажми «Сначала» и пройди эпоху по одной записи: счётчик ошибок идёт 4, 3, 2, 1 и снова 4, до нуля он не доходит никогда.

Тот же OR в конспекте: читаем с красной ручкой

В конспекте (стр. 49, Example 3) учат тот же OR, но в других условиях: входы и цели 0/1, bias выброшен «для простоты», \(\eta = 0.1\), старт \(w_1 = w_2 = 0\). Расчёт там верный, если читать его с одной поправкой: выход равен 1 только при \(a \gt 0\).

Example 3 из конспекта: OR в кодировке 0/1, без bias, \(\eta = 0.1\). Веса записаны как \((w_1, w_2)\).
запись \((x_1, x_2)\)\(t\)\(a\)выход\(\Delta\vb{w}\)\(\vb{w}\) после
(0, 0)000верно(0, 0)
(0, 1)100(0, +0.1)(0, 0.1)
(1, 0)100(+0.1, 0)(0.1, 0.1)
(1, 1)10.21верно(0.1, 0.1)

Вторая эпоха: \(a = 0,\ 0.1,\ 0.1,\ 0.2\), выходы 0, 1, 1, 1. Ошибок нет, процедура закончена. Два исправления, итог \((w_1, w_2) = (0.1,\ 0.1)\).

Почему пример вообще сработал с целями 0/1, хотя выше правило с ними ломалось? У OR единственная запись с \(t = 0\) — это \((0, 0)\), а там сумма без bias равна нулю при любых весах. Ложному срабатыванию негде случиться. С AND такой удачи нет.

И про выброшенный bias. Без него граница обязана проходить через начало координат: здесь это прямая \(x_1 + x_2 = 0\), и точка \((0, 0)\) лежит прямо на ней. Верный ответ для неё получается только за счёт договорённости «на границе выход 0». А AND в кодировке 0/1 без bias не решается вовсе: нужно \(w_1 \le 0\), \(w_2 \le 0\) и одновременно \(w_1 + w_2 \gt 0\).

Почему исправление двигает в нужную сторону

Пока правило выглядит как удачная догадка про совет и голоса. У него есть обоснование в пять строк. Следить будем за одной величиной: \(t \cdot a\). Запись предсказана верно, когда \(t \cdot a \gt 0\). При одних и тех же весах чем это число больше, тем дальше точка от границы на своей стороне.

  1. Пусть запись \((\vb{x}, t)\) предсказана неверно. Знак суммы не совпал с целью:

    \[ t \cdot a_{\text{old}} \le 0, \qquad a_{\text{old}} = \vb{w}\T\vb{x} \]
  2. Правило прибавляет к весам \(\eta\, t\, \vb{x}\):

    \[ \vb{w}_{\text{new}} = \vb{w} + \eta\, t\, \vb{x} \]
  3. Считаем сумму для той же записи с новыми весами. Скобки раскрываются как обычно, а \(\vb{x}\T\vb{x}\) — это квадрат длины вектора:

    \[ \begin{aligned} a_{\text{new}} &= (\vb{w} + \eta\, t\, \vb{x})\T\vb{x} \\ &= a_{\text{old}} + \eta\, t\, \norm{\vb{x}}^2 \end{aligned} \]
  4. Умножим обе части на \(t\). Цель равна \(\pm 1\), поэтому \(t^2 = 1\):

    \[ t\, a_{\text{new}} = t\, a_{\text{old}} + \eta\, \norm{\vb{x}}^2 \]
  5. Числа из примера: у каждой записи \(\norm{\vb{x}}^2 = 1 + 1 + 1 = 3\), а \(\eta = 0.5\). Одно исправление поднимает \(t \cdot a\) ровно на 1.5. Проверь по записи 2: было \(-0.5\), стало \(+1\).

    \[ -0.5 + 0.5 \cdot 3 = 1 \]

Прибавка \(\eta \norm{\vb{x}}^2\) всегда положительна: каждое исправление тянет свою запись на правильную сторону. В картинке виджета это выглядит так: стрелка \(\vb{w}\) поворачивается к точке, если её цель \(+1\), и отворачивается от неё, если цель \(-1\). Отсюда два следствия.

Первое: одного исправления может не хватить. Со старта \((1, -1, 0.5)\) у записи 1 было \(t \cdot a = -1.5\). После исправления стало ровно 0: выход 0, всё ещё ошибка.

Второе: исправление для одной записи меняет сумму у всех остальных и может сломать то, что уже было верным. Пример из виджета: AND со старта \((1, -1, 0.5)\). Во второй эпохе исправление записи 2 портит сразу две записи, 3 и 4: их суммы были \(-0.5\) и \(0.5\), а стали 0, и счётчик ошибок вырастает с 1 до 2. Поэтому одного прохода мало, и процедура ходит по кругу, пока не случится круг без исправлений.

Два вопроса профессора

Теперь можно вернуться к вопросам со слайда 12 лекции 2.

Всегда ли процедура остановится?

Нет. Но известно точно, когда да, а когда нет. Нужно одно понятие. Данные линейно разделимы (linearly separable), если существует прямая — при большем числе входов гиперплоскость, — по одну сторону которой лежат все примеры с \(t = +1\), а по другую все с \(t = -1\).

Если обучающие примеры линейно разделимы, Hebbian learning делает конечное число исправлений и останавливается на весах, которые предсказывают все примеры верно. Если не разделимы, процедура не остановится никогда.

Вторая половина почти очевидна. Остановка — это эпоха без ошибок, то есть веса, которые делят классы прямой. Нет такой прямой — нет и остановки. Содержательна первая половина: если решение существует, исправления не могут продолжаться бесконечно. Доказательства на слайдах нет, и на экзамене нужна только формулировка.

OR и AND разделимы: три исправления и одно. А вот что делает правило с XOR, у которого цели \(-1, +1, +1, -1\).

(0, 0, 0) (−0.5, 0.5, 0.5) (0, 0, 1) (0.5, 0.5, 0.5) запись 1 запись 2 запись 3 запись 4 начало и конец эпохи и так без конца
Рис. 4. XOR, старт \((0, 0, 0)\), \(\eta = 0.5\). В рамках — веса \((w_0, w_1, w_2)\), каждая стрелка — одно исправление. Все четыре записи оказываются ошибками, и четвёртое исправление возвращает веса туда, откуда они вышли.

Первые три шага совпадают с OR: у XOR на первых трёх записях те же цели. На четвёртой записи \((1, 1, 1)\) сумма равна 1.5, а цель \(-1\). Ошибка, и исправление возвращает веса в \((0, 0, 0)\). Вторая эпоха начинается с того же места и повторяет первую шаг в шаг. Почему для XOR разделяющей прямой нет и что из этого следует, разберём в следующем уроке.

Сколько исправлений может понадобиться?

У теоремы есть количественная часть (Novikoff, 1962): при старте с нуля исправлений не больше \((R/\gamma)^2\). Оба числа считаются для векторов вместе с постоянным входом, \(\vb{x} = (1, x_1, x_2)\). \(R\) — длина самого длинного из них. \(\gamma\) — зазор лучшего решения: берём вектор весов \(\vb{u}\) единичной длины и смотрим на наименьшее \(t \cdot \vb{u}\T\vb{x}\) по всем записям; лучший \(\vb{u}\) тот, у которого это число самое большое.

Для нашего OR \(R^2 = 1 + 1 + 1 = 3\). Лучший вектор — \(\vb{u} = (1, 1, 1)/\sqrt{3}\), его зазор \(\gamma = 1/\sqrt{3}\), то есть \(\gamma^2 = \tfrac{1}{3}\). Оценка даёт \(R^2/\gamma^2 = 9\), а на деле хватило трёх. На слайдах этой оценки нет. Полезен её смысл: чем уже зазор между классами, тем больше исправлений может понадобиться.

Всегда ли на одних и тех же весах?

Тоже нет. Разделяющих прямых бесконечно много, а процедура останавливается на первой, до которой дошла. Какой она окажется, зависит от трёх вещей. Все три примера ниже — для OR, и все можно воспроизвести в виджете.

При старте с нуля \(\eta\) ничего не решает: все веса просто умножаются на одно число. При \(\eta = 0.1\) пример со слайда даёт \((0.1,\ 0.1,\ 0.1)\) — ту же прямую за те же три исправления. И ещё одно: процедуре всё равно, хороша ли прямая, проходит ли она посередине между классами или впритык к точкам. Нет ошибок — нет исправлений.

«Маленький \(\eta\) надёжнее, а большой может разойтись». Так бывает в gradient descent на гладкой функции ошибки (урок 13), и конспект на стр. 48 сравнивает \(\eta\) с ограничением скорости. Для Hebbian learning это сравнение не работает: на линейно разделимых данных процедура останавливается при любом \(\eta \gt 0\). Конспект советует \(\eta = 0.01\), слайд 12 лекции 2 берёт \(\eta = 0.5\). В задаче используй число из условия.

Процедура останавливается тогда и только тогда, когда данные линейно разделимы, а на каких именно весах — зависит от старта, порядка записей и \(\eta\).

Вот и ответы на загадку из начала урока: «не всегда» и «не всегда». Ручки Mark I замирают за конечное число поворотов, если задачу вообще можно решить одной прямой. А у двух студентов с разными стартовыми весами они замрут в разных положениях, и оба ответа будут верными.

Остался последний вопрос: почему поправка именно \(\eta\, t\, \vb{x}\), а не какая-нибудь другая? В уроке 16 окажется, что Hebbian learning — это stochastic gradient descent для функции ошибки \(D(\vb{w}, w_0)\), которая с точностью до множителя складывает расстояния от неверно предсказанных точек до границы. Пока достаточно знать, что такая функция есть и что каждое исправление — шаг против её градиента, посчитанного по одной ошибочной записи. Отсюда и слово online: одна запись — один шаг.

В формате экзамена

State the learning rule used in the course to train a single perceptron (Hebbian learning). Define every symbol, say when the rule is applied and when the procedure ends.

Show model answer

For every weight \(w_i\), \(i = 0, \dots, I\):

\[ w_i^{k+1} = w_i^{k} + \Delta w_i^{k}, \qquad \Delta w_i^{k} = \eta\, x_i^{k}\, t^{k} \]

\(\eta\) is the learning rate, \(x_i^{k}\) is the \(i\)-th input of the sample presented at step \(k\) (with \(x_0 = 1\), so the bias \(w_0\) changes by \(\eta\, t^{k}\)), and \(t^{k} \in \{-1, +1\}\) is the desired output. The weights start from a random initialisation. Samples are presented one at a time (online), and the weights are changed only if the sample is not correctly predicted, i.e. \(\mathrm{Sign}(\vb{w}\T\vb{x}) \ne t\). The records are cycled until a whole pass produces no error.

Проверяют четыре вещи: формулу, слово online, условие «только если предсказано неверно» и критерий остановки. Чаще всего теряют третье, а без него это другой алгоритм.

A perceptron with inputs \(x_1, x_2 \in \{-1, +1\}\), bias input \(x_0 = 1\) and activation Sign (the output is 0 when \(\vb{w}\T\vb{x} = 0\)) has to learn the OR operator by Hebbian learning. Initial weights \(\vb{w} = [0\ 0\ 0]\), learning rate \(\eta = 0.5\), records in truth-table order: \((-1,-1)\), \((-1,+1)\), \((+1,-1)\), \((+1,+1)\). How many weight updates are performed before the procedure ends?

Show model answer

Weights as \((w_0, w_1, w_2)\). Record 1: \(a = 0\), output 0, target \(-1\): update to \((-0.5,\ 0.5,\ 0.5)\). Record 2: \(a = -0.5\), wrong: update to \((0,\ 0,\ 1)\). Record 3: \(a = -1\), wrong: update to \((0.5,\ 0.5,\ 0.5)\). Record 4: \(a = 1.5\), correct. Second pass: \(a = -0.5,\ 0.5,\ 0.5,\ 1.5\), all correct, stop.

3 updates. Final boundary: \(x_2 = -x_1 - 1\).

Это упражнение со слайда 12 лекции 2 почти дословно. Две ловушки: Sign(0) = 0 считается ошибкой (иначе первая запись «уже верна»), и нельзя останавливаться после четвёртой записи без контрольного прохода.

The current weights of a perceptron are \((w_0, w_1, w_2) = (0.2,\ -0.4,\ 0.1)\) and the learning rate is \(\eta = 0.3\). The sample \((x_1, x_2) = (1, -1)\) with target \(t = +1\) is presented (bias input \(x_0 = 1\), Sign activation). Apply one step of Hebbian learning. What is the value of \(w_1\) after this step?

Show model answer

\(a = 0.2 - 0.4 - 0.1 = -0.3 \lt 0\), so the output is \(-1 \ne t\): the sample is misclassified and the weights are updated.

\[ \begin{aligned} \Delta\vb{w} &= 0.3 \cdot (+1) \cdot (1,\ 1,\ -1) \\ &= (0.3,\ 0.3,\ -0.3) \end{aligned} \]

New weights: \((0.5,\ -0.1,\ -0.2)\), so \(w_1 = -0.1\). Check: the new sum is \(0.5 - 0.1 + 0.2 = 0.6 \gt 0\), the sample is now correct.

Сначала проверка, потом исправление: если бы сумма была положительной, веса не менялись бы и ответом было бы −0.4. Вторая частая потеря — знак \(x_2 = -1\) в сумме. Контроль: сумма должна вырасти на \(\eta \norm{\vb{x}}^2 = 0.9\).

Does Hebbian learning of a perceptron always terminate? When it terminates, is the final weight vector always the same? Justify both answers.

Show model answer

It terminates after a finite number of updates if and only if the training set is linearly separable (perceptron convergence theorem). If it is not, e.g. XOR, some sample is always misclassified, so the updates never stop and the weights cycle: for XOR from \(\vb{w} = [0\ 0\ 0]\) they are back at \([0\ 0\ 0]\) after every epoch.

The solution is not unique. Infinitely many hyperplanes separate a separable set and the procedure stops at the first one it reaches; which one depends on the initial weights, on the order of the samples and, for non-zero initial weights, on \(\eta\).

Это два вопроса со слайда 12 лекции 2. Полный балл дают за «if and only if linearly separable» и за перечисление того, от чего зависит результат. Пример с XOR добавляет убедительности и стоит одной строки.

Which statements about Hebbian learning of a perceptron, as presented in the course, are correct? Select all that apply.

  • A correctly predicted sample leaves all the weights unchanged. Правило применяется только к неверно предсказанным записям.
  • On a misclassified sample the bias \(w_0\) changes by \(\Delta w_0 = \eta\, t\). Bias — вес при входе \(x_0 = 1\), формула та же.
  • After one update the presented sample is guaranteed to be correctly classified. \(t \cdot a\) вырастает на \(\eta \norm{\vb{x}}^2\); если до исправления оно было сильно отрицательным, этого не хватит.
  • With enough epochs the procedure also converges on XOR. XOR не линейно разделим: веса ходят по кругу при любом числе эпох.
  • Starting from \(\vb{w} = \vb{0}\), a different \(\eta\) rescales the final weights but does not change the decision boundary. Все суммы умножаются на одно число, их знаки и последовательность ошибок те же.
Show model answer

Correct: the first, the second and the fifth statements.

В вопросах «select all» каждое утверждение проверяется отдельно. Третье и четвёртое — самые частые заблуждения про это правило.

The rule \(\Delta w_i = \eta\, x_i\, t\) is used with targets in \(\{-1, +1\}\). Explain what goes wrong if the targets are coded as \(\{0, 1\}\).

Show model answer

With \(t = 0\) the update \(\eta\, x_i\, t\) is zero for every weight, so a sample with target 0 that is wrongly predicted as 1 can never be corrected: with 0/1 inputs the weights can only grow. Example: AND with 0/1 coding, zero initial weights, \(\eta = 0.5\). The only update, from record \((1, 1)\), gives \((0.5,\ 0.5,\ 0.5)\), which outputs 1 for all four records; the three wrong records have \(t = 0\), so the procedure is stuck.

With \(\pm 1\) targets a negative target gives a negative update, and correctness is the single test \(t \cdot \vb{w}\T\vb{x} \gt 0\).

Достаточно первой фразы и одного примера. Вопрос проверяет, что смена кодировки на слайде 12 лекции 2 понята, а не просто замечена.

Проверь себя

Перцептрон получил запись и предсказал её верно. Что делает Hebbian learning?

  • Прибавляет к весам \(\eta\, t\, \vb{x}\), чтобы закрепить успех Тогда веса росли бы без конца и процедура никогда бы не остановилась. Исправление бывает только после ошибки.
  • Ничего: веса остаются прежними Верный ответ не говорит, куда двигать прямую. Она уже стоит правильно относительно этой точки.
  • Вычитает \(\eta\, t\, \vb{x}\) Вычитание уменьшило бы \(t \cdot a\) и подвинуло бы границу к ошибке на этой же записи.
  • Уменьшает \(\eta\) В этой процедуре \(\eta\) постоянна от начала до конца.

Запись \((x_0, x_1, x_2) = (1, -1, +1)\) с целью \(t = -1\) предсказана неверно, \(\eta = 0.5\). Какая поправка \(\Delta\vb{w}\)?

  • \((-0.5,\ +0.5,\ -0.5)\) \(\eta\, t\, \vb{x} = 0.5 \cdot (-1) \cdot (1, -1, 1)\).
  • \((+0.5,\ -0.5,\ +0.5)\) Это \(\eta\, \vb{x}\) без множителя \(t = -1\): так было бы при цели \(+1\).
  • \((-0.5,\ -0.5,\ -0.5)\) Это \(\eta\, t\) для всех весов сразу. Забыт множитель \(x_i\), а он у каждого веса свой.
  • \((0,\ +0.5,\ -0.5)\) Bias — тоже вес, его вход \(x_0 = 1\), и поправка для него \(\eta\, t = -0.5\).

Данные линейно разделимы. От чего зависят веса, на которых процедура остановится?

  • От начальных весов OR: старт \((0,0,0)\) даёт \((0.5,\ 0.5,\ 0.5)\), старт \((1,-1,0.5)\) даёт \((1,\ 1,\ 0.5)\).
  • От порядка, в котором идут записи Другой порядок — другая последовательность ошибок, а значит, и исправлений.
  • От \(\eta\), если начальные веса не нулевые При нулевом старте \(\eta\) только масштабирует веса; при ненулевом может поменяться и сама прямая. OR со старта \((1,-1,0.5)\): \(\eta = 0.5\) даёт \((1,\ 1,\ 0.5)\), \(\eta = 0.6\) — \((0.4,\ 0.8,\ 1.1)\).
  • От того, сколько эпох прогнать после первой эпохи без ошибок После эпохи без ошибок ни одна запись не ошибочна, и ни одного исправления больше не случится.

Разделяющих прямых бесконечно много, и правило берёт первую, до которой дошло.

XOR, старт \((0, 0, 0)\), \(\eta = 0.5\). После первой эпохи веса снова \((0, 0, 0)\). Что из этого следует?

  • Процедура сошлась: веса перестали меняться Веса менялись четыре раза за эпоху. «Сошлась» — это эпоха без единого исправления.
  • Вторая эпоха повторит первую, и так без конца Те же веса, те же записи, тот же порядок — значит, те же шаги.
  • Нужно уменьшить \(\eta\), тогда сойдётся При нулевом старте \(\eta\) только масштабирует веса. XOR не разделим ни при каком \(\eta\).
  • Нужно просто больше эпох Цикл длиной в одну эпоху будет повторяться сколько угодно раз.

До исправления у записи было \(t \cdot a = -0.5\). Запись \(\vb{x} = (1, -1, +1)\), \(\eta = 0.5\). Чему равно \(t \cdot a\) для неё сразу после исправления?

  • \(+1\) Прибавка равна \(\eta \norm{\vb{x}}^2 = 0.5 \cdot 3 = 1.5\).
  • \(0\) Здесь прибавили только \(\eta = 0.5\) и забыли \(\norm{\vb{x}}^2 = 3\).
  • \(+2.5\) Прибавка 3 получилась бы при \(\eta = 1\). Здесь \(\eta = 0.5\).
  • \(-0.5\) Исправление меняет сумму именно для этой записи, и всегда в сторону цели.

Почему правило \(\Delta w_i = \eta\, x_i\, t\) ломается с целями 0/1?

  • При \(t = 0\) поправка равна нулю, и ложное срабатывание исправить нечем При входах 0/1 веса могут только расти: ответ 1 вместо 0 остаётся навсегда.
  • Потому что Sign не определён в нуле Определён: Sign(0) = 0. И дело не в функции активации, а в множителе \(t\).
  • Потому что в кодировке 0/1 данные перестают быть линейно разделимыми Перекодировка — это сдвиг и растяжение осей, разделимость от неё не меняется.
  • Потому что с 0/1 нужен меньший \(\eta\) Ноль, умноженный на любое \(\eta\), остаётся нулём.

Унести с собой

Что посмотреть и почитать