Заметки с MBC Symposium: попытки разобраться, почему работает deep learning

Продолжаю рассказывать об интересных докладах на MBC Symposium (MBC, кстати, расшифровывается как Mind Brain Computation).

image

Surya Ganguli — человек из теоретического neuroscience, то есть, занимается тем, чтобы понять, как работает мозг, на основе измерений импульсов нейронов на различных уровнях.

И вот тут независимо от neuroscience в мире случается deep learning, и у нас получается некую искусственную систему чему-то научить.
В отличие от мозга, в котором у нас ограниченное разрешение, сложность с повторяемостью, итд итп, про deep network-то мы знаем абсолютно все, про все веса, про все состояния. Возникает вопрос — если мы собираемся разобраться, как работает мозг, может попробуем для начала понять как и почему работает вот такая маленькая система?

Без надежд, что мозг работает также, скорее с прицелом разработать какие-то методы, которые могут быть применимы потом.

Disclaimer: пост написан на основе отредактированных логов чата closedcircles.com, отсюда и стиль изложения, и уточняющие вопросы.

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

Один из очень старых результатов из нейросетей до того, как они стали называться deep learning — что похоже сеть учится иерархично, сначала более высокоуровневые разделения, потом более детальные.


Что конкретно имеется ввиду

Вот было исследование из старых времен такого рода.

image
Дадим на вход сети какой-то объект и отношение, а на выходе попросим выучить фичу, типа «canary can move».
Замечу, что в отличие от текущих задач классификации это задача тупо на запоминание информации сетью, нет тестового датасета, есть только тренировочный.
На вход — one-hot encoding объекта и отношения, на выход надо получить вероятность набора фич, у сети всего один hidden layer.
Изучается только как сеть «учит» тренировочный датасет.

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

image
Причем собственно классов «животное» и «растение» нигде нет. Есть только конкретные виды животных и растений, про которые изначально сеть ничего не знает.


а как они определили что так получается?
Посмотри на вторую картинку, три графика кластеризации на ней — это на разных стадиях тренировки.
Сначала все случайно и все низенькое. В середине появляется «высокая» главная категория, отделяющая животных от растений, а только потом под ней «вырастают» вторичные.

ок как я понимаю активации в hidden layer — соответствуют каким то свойствам. поэтому объекты с близкими свойствами оказываются ближе друг к другу.
Да. Причем выкоуровневое разделение «животное/растение» учится первым, хотя оно напрямую нигде прописано не было, учится только из данных.

интересно! и это все повторимо естественно, с любыми начальными данными/весами.
Да.


Они пытаются понять, почему так происходит

Для этого они рассматривают еще более простую систему — сеть с одним hidden layer без нелинейности вообще.

image
Вот такая система — на вход дается one-hot id объекта, на выходе нужно выдать его свойства.
Опять же, проверяем только как оно учится, нет никакого тестового датасета.
Хотя такая сеть без нелинейности не имеет никакой representational power по сравнению с тупо линейной матрицей, наличие двух уровней делают обучение нелинейным, потому что оптимизируется уже квадратичное отклонение.
Оказывается, уравнения динамики обучения такой системы уже можно решить аналитически.

В целом, то что такая система «выучивает» в итоге, было известно давно — она стремится к singular value decomposition матрицы фичи-объекты.

(мне сложно описать, что такое SVD в двух словах, но можно себе представлять, что это некое линейное разложение, где для каждого объекта вводится вектор «внутреннего представления», из которого линейным преобразованием получаются итоговые фичи. Хороший туториал, например, здесь)


матрица N-мерная по количеству фич?.
NxM, где N — количество фич, а M — объектов.

То есть, получающийся embedding — это как раз внутренний вектор SVD.
Более интересно то, каким образом система «стремится» к этому разложению.
Оказывается, что сначала система «выучивает» разделение, соотвествующее самому большому singular value, потом учит следующее, и потом более маленькое.

Объясняется такое поведение наличием седловых точек.
Седловые точки — это точки, где градиент 0, но они не являются ни локальными минимумами, ни локальными максимумами, и градиентный спуск любит в них скатываться и из них сложно выбраться:

image

Вот на картинке ниже красная точка — это та самая седловая точка:

image

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


что это на графике слева — input/output mode strength?
Это собственно значение singular value для каждой моды.

И про SVD мы хорошо знаем, что определяет параметры системы — их определяет матрица корреляций между объектами, то есть, SVD находит наиболее скореллированное направление среди данных объектов.
И чем больше «выровнены» объекты по некому направлению, тем singular value этого направления больше.


а объясни еще раз про седловые точки и градиентный спуск — и связь с singular value.
Оказывается, что в пространстве оптимизации линейной сети каждой singular value соответствует седловая точка, и «обучению» соотвествующей singular value соотвествует «выход» из этой седловой точки.

чтоб выучить все фичи нужно попасть во все седловые точки?
Да. Понятно, здесь имеются ввиду фичи «эмбеддинга», а не финальные.
Причем не только попасть, а выйти из них, т.е. например растения и животные разделяет седловая точка.

фичи эмбеддинга — это активации нейронов скрытого слоя?
Да. Пока ты в ней копошишься — ты не можешь понять, что есть что, а вот если свалился в одну сторону — опа, там все деревья!

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

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

и тут глупый вопрос — у gradient descent разве не цель свалиться в яму?
Ну да. Но седловые точки его притягивают, хотя минимумом не являются. Из них сложно вылезти, но когда вылез — градиентный спуск вывезет дальше вниз, вдаль от седловой точки.

а от датасета это зависит? если например больше данных для рыба/птица скажем, чем между животное/растение
Да, зависит. Singular values — это свойство всего датасета, глобальное, не локальное.

А что все это говорит нам применительно к изначальной задаче?.
Мы разобрались, что в её несколько упрощённой формулировке (но которая сохраняет описанное свойство), обучение происходит согласно SVD разложению начиная с самого большого singular value.
Главная движущая сила — это наиболее сильные корреляции между объектами.
Это пока не полностью объясняет ситуацию, но важный промежуточный результат.

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

Они демонстируют это вот такой простой моделью.
Сгененируем объекты следующим простым образом — сначала сгенерируем одну фичу случайно, потом для объектов где получился 0 сгенерируем случайно другую фичу, а у тех что 1 — третью, и так по иерархии.

На следующей картинке это показано деревом сверху справа:
image
Оказывается, что если так нагенерить объектов, самое сильное singular value соотвествует как раз первой ноде (что в целом достаточно очевидно, это как раз направление, по которому можно разделить большинство объектов)

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


Эту идею можно развивать в разные стороны

Например, в психологии есть такой мистический момент — формирование категорий.
Вот есть в мире объекты, у них есть фичи. Каким образом мозг выделяет категорию, например «животные»?

image

Если об этом думать последовательно, возникает chicken and egg problem:


  • Мы могли бы сгруппировать объекты в категорию, но надо понять на основе каких фич.
  • Мы могли бы придумать категорию на основе набора фич, но тогда нужно понять, какие объекты туда включить, чтобы взять фичи!

И вот известно, что то, насколько категория «coherent» — важно.
Классический пример, что для категории «собаки» у нас есть слово «собака», а для категории «вещи синего цвета» — нет. Именно потому что вещи синего цвета друг на друга не похожи.
Чтобы попробовать продемонстрировать этот эффект в обучении, давайте сгенерируем случайных данных:

image

Вот мы сгенерировали случайные объекты со случайными фичами, справа — визуализация матрицы. Кормим эти объекты на вход уже полюбившейся нам линейной сети, чтобы она выучила соотвествие фич объектам.
Это считай такая же ситуация, что и обсуждалась раньше — вот суп объектов и фичей, есть ли тут категории?
Категории на самом деле в данных есть — мы генерировали данные не случайно, а кидая монетку приналдлежит ли объект некой категории. Если столбцы-строки переставить, то выглядит это так:

image

То есть, в этом шуме есть на самом деле три категории. Спрашивается, выучит ли их наша сеть?

Оказывается, можно аналитически показать, что это зависит от размера вот этого прямоугольника по отношению ко всему датасету. Eсли категория достаточно большая — выучится, а если нет — потонет в шуме. Кроме того, факт возможности идентификации категории зависит не только от количества объектов в ней, а именно от соотношения размера ко всему датасету.
Критическое значение размера категории — пропорционально sqrt (N*M).


Кстати, а мне пока не очень понятно, почему мы тогда не имеем слова для «Все синие вещи». Как раз соотношение ко всем данных весьма приличное.
Нет! У синих объектов слишком мало совпадающих фич.
Квадрат большой, но очень разреженный. Для появления категории есть ограничения и по размеру области, и по ее «плотности».

Ну так вот, последний пойнт.
То, что понятие «категории» зависит от всего датасета поясняет, почему так сложно об этом говорить в традиционной психологии.
Выделение объектов в категорию зависит от всего опыта человечества, и подступиться к нему «локально» очень сложно.
Но даже такая простая модель демонстрирует, как обучение решает эту chicken and egg problem, находя в шуме структуру.


Подытожу

С одной стороны, эта работа намекает, за счет чего так эффективно обучаются сети — потому что данные в реальном мире имеют определенную структуру, и это выражается в ландшафте оптимизации, по которому «скатывается» обучение градиентным спуском.
С другой, она опять же хорошо показывает, насколько теория пока далека от практики — обсуждаемая модель крайне примитивна даже по меркам нейросетей прошлого, не говоря уж о современных очень глубоких архитектурах.
Выводы, впрочем, можно экстраполировать.

© Habrahabr.ru