gonzo-обзоры ML статей – Telegram
gonzo-обзоры ML статей
24K subscribers
2.75K photos
2 videos
3 files
1.36K links
Авторы:
Гриша Сапунов, ранее руководитель разработки Яндекс-Новостей, ныне CTO Intento. Области интересов: AI/ML/DL, биоинформатика.
Лёша Тихонов, ранее аналитик в Яндексе, автор Автопоэта, Нейронной Обороны... Области интересов: discrete domain, NLP, RL.
Download Telegram
Superposition of many models into one
Brian Cheung, Alex Terekhov, Yubei Chen, Pulkit Agrawal, Bruno Olshausen
Статья: https://arxiv.org/abs/1902.05522

Прикольная и малоизвестная работа с NeurIPS 2019 года. Авторы заходят с проблемы катастрофического забывания при мультизадачном обучении, но решение предлагают очень интересное.

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

Работа исходит из наблюдения, что сверхпараметризованные модели содержат избыточное количество весов, большинство из которых после обучения можно удалить. Но с нуля маленькую сеть почему-то обычно обучать до аналогичного уровня качества не получается (привет гипотезе лотерейного билета). Зато, как выясняется, эту избыточность можно частично использовать иным способом — обучить одну сеть с числом параметров L на множество задач K и таким образом уменьшить эффективное количество параметров на задачу до O(L/K). Это, наверное, применимо и к обычному multi-task обучению (к той же ExT5, https://news.1rj.ru/str/gonzo_ML/761), но конкретно здесь предлагается весьма любопытный механизм.

Для каждой задачи k выучивается свой набор параметров W_k, далее все такие параметры вместе зашиваются в суперпозицию моделей. К нужной в соответствии с задачей модели обращаются с помощью контекста C_k, который динамически “отправляет” входные данные с соответствующую модель, вытащенную из суперпозиции. В такой постановке параметры W итоговой модели являются аналогом “памяти”, а контекст C_k аналогом ключа для доступа к специфическим параметрам W_k. Эта интерпретация вдохновлена работами Пентти Канервы про ассоциативную память и hyperdimensional computing. Ну и вообще авторы текущей работы тесно работают с Канервой в Redwood Center for Theoretical Neuroscience в UC Berkeley.

Для мультизадачных сетей (а также и для всех кейсов, где распределения входных и выходных данных меняются, включая online learning) существенна проблема катастрофического забывания. Например, если учить модель последовательно на много задач, то к концу обучения модель почти всё забудет про первую задачу. Такого хочется избегать и существует множество наработок в этой теме. Хоть бы даже старый добрый replay buffer, активно используемый в RL. Но суперпозиция — это прям совершенно другой и новый подход.

Авторы называют свой метод PSP (Parameter Superposition). Они исходят из допущения, что входные данные являются сравнительно низко-размерными относительно всего пространства (что в целом кажется верно, вроде как есть консенсус про то, что, например, реальные картинки образуют некое низкоразмерное многообразие в более многомерном пространстве всех потенциально возможных картинок).

Фундаментальная операция, выполняемая сетью, это умножение входов x (из R^N) на матрицу весов W (из R^(M*N)), то есть y = Wx. Сверхпараметризация (over-parametrization) сети подразумевает, что только маленькое подпространство, охватываемое строками матрицы W в R^N, релевантно задаче.

Пусть W_1, W_2, …, W_K — это наборы параметров для каждой из K задач. Если для каждой из задач требуется только небольшое подпространство в R^N, то каждую матрицу W_k можно трансформировать с помощью задаче-специфичного линейного преобразования C^{-1}_k (это и есть контекст), так что строки каждой из итоговых матриц W_k*C^{-1}_k займут взаимно ортогональные подпространства в R^N. А раз так, то все эти преобразованные параметры можно сложить вместе в итоговую матрицу W и они не будут друг с другом интерферировать.

Получить эти параметры назад под конкретную задачу k можно с помощью обратного (к обратному C^{-1}_k :) ) преобразования с использованием контекста C_k. Полученные таким образом веса W_k’=W*C_k будут шумным вариантом W_k, так что W_k’*x = W_k*x + epsilon. Ну и вроде как можно добиться низкого значения этого шума.
👍6
Поскольку матричное умножение ассоциативно, y_k = (W*C_k)*x можно переписать как y_k = W*(C_k*x), то есть мы умножаем каждый входной вектор на соответствующую C_k, а затем уже умножаем на матрицу W. Для свёрток, кстати, разумнее делать наоборот, сначала умножать C_k на W, потому что весов там обычно меньше, чем входных данных.

Для кейса, когда обратная матрица к C_k это транспонированный вариант C_k (С^{-1}_k = C^T_k) мы имеем матрицы, задающие вращения. В общем в этом фреймворке самая соль — это придумать, как вращением перемещать входные данные x в ортогональные подпространства внутри R^N. Эти ортогональные вращения просто сделать для свехрпараметризованного входа (и пожалуй должно быть верно и для сверхпараметризованных сетей, где вход для последующих слоёв это уже выход предыдущего слоя, а он как раз уже тоже over-parameterized).

Среди вариантов таких вращений предлагаются:

1) Вращательная суперпозиция (pspRotation): случайная ортогональная матрица из распределения Хаара (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ortho_group.html). Вещь универсальная, но тяжёлая ибо для матрицы M*M требует M^2 параметров. Число параметров можно уменьшить, если перейти к более ограниченным блочно-диагональным и диагональным матрицам.

2) Комплексная суперпозиция (pspComplex): сделать c_k векторами комплексных чисел, где каждый компонент вектора сэмплится равномерно с единичной окружности с фазой от [-pi, +pi], это даёт диагональную матрицу и M параметров (вернее, кажется, 2M).

3) Степени одного контекста (pspOnepower): взять целые степени одного вектора контекста, что даёт всего один доп.параметр на задачу.

4) Бинарная суперпозиция (pspBinary): использовать бинарные вектора контекста {-1, 1}, которые являются специальным вариантом комплексной суперпозиции с двумя разрешёнными значениями фазы {0, pi}.

Применение суперпозиции добавляется к линейным преобразованиям в каждом слое:

x^(l+1) = g(W^(l)*( c(k)^(l) ⊙ x^(l) )), где g() — нелинейность, например, ReLU.

Проверяют эти идеи на кейсах, когда распределения входных или выходных данных изменяются со временем.

В случае изменяющегося входного распределения взят Permuted MNIST, где каждые 1000 итераций производится случайная перестановка пикселей (метки классов не меняются) и это даёт новую задачу, для которой выбираются новые параметры контекста: для бинарной суперпозиции — случайный бинарный вектор, для комплексной — случайное число (так в статье, хотя по идее для комплексной это тоже вектор, а число только для варианта pspOnepower), а для вращательной — матрица. Всего итераций 50К и это соответствует 50 задачам. Качество измеряется на первой задаче. Если модель её быстро забывает, то с новыми задачами качество заметно деградирует.

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

В зависимости от типа суперпозиции качество тоже разное. Вращательная суперпозиция (pspRotation) ожидаемо даёт самое высокое качество, но требует очень много дополнительной памяти. Комплексная (pspComplex) работает лучше бинарной (pspBinary), что тоже ожидаемо, ибо бинарная это частный случай комплексной. Степени одного комплексного числа (pspOnepower) неожиданно хорошо работают, на графике они следующие по качеству после полной вращательной суперпозиции, но в тексте на этом результате почему-то не акцентируются. Два метода борьбы с катастрофическим забыванием из других статей тоже побили.
👍2
Также проверили на задачах, где включали постепенное вращение MNIST или Fashion MNIST, так что полный оборот происходит за 1000 шагов, а контекст меняется каждые 100 шагов (каждый шаг его менять не надо, к небольшим поворотам сеть устойчива), итого получается 10 задач. Оцениваются всегда на отсутствии вращения. Стандартная сеть безумно осциллирует с сильными просадками качества при уходе от нулевого вращения, а все PSP модели ведут себя очень достойно и не деградируют настолько сильно.

Отдельная интересная задача — это выбирать контекст как-то автоматически, не предоставляя эту информацию явно в сеть. Здесь попробовали генерить его на каждый поворот, то есть за цикл из 1000 шагов генерируется 1000 новых случайных контекстов, а далее они переиспользуются в новых циклах (этот способ назвали pspFast). Получилось лучше бэйзлайна, но хуже предыдущих моделей, что в общем ожидаемо — объёмы хранимого возросли в 100 раз и каждая отдельная сеть в итоге обучалась меньше времени. Также попробовали более хитрый вариант под названием pspFastLocalMix, где в каждый момент времени вектор контекста это микс фаз в соседних временных точках. Это получилось получше, чем pspFast, то есть получается можно в модель инкорпорировать грубую информацию о нестационарности входного распределения. Удобно, когда детальной информации нет, но некоторые свойства изменений входного распределения известны. В идеале вообще было бы круто находить контекст тем же backprop’ом, что по идее для операторов контекста с непрерывной топологией, например, для комплексной, должно работать. Не видел пока продолжения этой темы.

В задачах с изменяющимся выходным распределением взяли хитрый вариант incremental CIFAR, это когда к обычному CIFAR-10 добавляются в качестве новых задач случайные другие 10 классов из CIFAR-100. Здесь тупой бейзлайн (когда выходные слои остаются старыми) не очень хорош, поэтому сделали более умный, когда для новой задачи обучается новый выходной слой. Это проверили на ResNet-18 и всё равно здесь pspBinary оказался намного лучше, чем более хитрый бэйзлайн (причём в pspBinary выходной слой был таки один, универсальный).

Отдельная интересная тема в supplementary про композицию контекстов. Для контекстов возникает своя алгебра и новые контексты можно создавать из имеющихся с помощью заданной операции. Например, можно делать композицию двух контекстов в новый, или также можно делать mixture of contexts, скажем, усреднением по окну. Ну и, кстати, pspOnepower и был как раз одним из вариантов композиции, когда один и тот же контекст возводили в разные степени.

Интересная работа, короче. Даёт много пищи для размышлений. Во-первых, это красиво. Во-вторых, много с чем перекликается и даёт возможность посмотреть по-новому на старые вещи. Вот, например, dropout наверняка через суперпозицию тоже как-то выражается и объясняется. В-третьих, это в русле работ про hyperdimensional computing, что очень интересная, но почему-то недостаточно обсуждаемая область. Суперпозицию можно также рассматривать как альтернативу сжатию сетей, хотя это само по себе мне менее интересно. Ну и с квантовыми нейросетями, наверное, вообще круто будет.
👍2
Всем привет! Пара анонсов/записей.

1. На прошлой неделе выступил для школьников в рамках программы Академии Яндекса с рассказом про DL.

Запись тут:
https://www.youtube.com/watch?v=J7uWN0-_A2A

Может быть интересно не только школьникам, но и тем, кто хочет простыми словами про область в целом за час времени. Ну насколько это можно в таком режиме :) Надеюсь, что худо-бедно получилось.

"Нынешняя революция Deep Learning началась уже примерно десять лет назад. За это время много всего произошло. Мы научились решать множество ранее нерешённых задач: распознавать изображения на уровне лучше человека, играть в го, предсказывать структуру белков, генерировать картинки фотографического качества и неотличимые от человеческих тексты. Появились новые архитектуры нейросетей, высокоэффективные и мощные фреймворки и библиотеки, высокопроизводительное железо. Мы продвинулись в научном понимании того, что происходит. Но вопросов ещё множество.

В лекции я сделаю краткий обзор важных вех на этом пути, расскажу про перспективы области и открытые вопросы. Возможно, кто-то из вас поможет продвинуться по этому пути дальше."

2. На этой неделе в пятницу 18 февраля выступаю на конференции OpenTalks.ai с рассказом про достижения в NLP в 2021 году.

https://opentalks.ai/ru/timetable#!/tab/404591939-3

Постарался собрать вместе всё интересное и важное, что можно уместить в 40 минут :)
👍26
Supermasks in Superposition
Mitchell Wortsman, Vivek Ramanujan, Rosanne Liu, Aniruddha Kembhavi, Mohammad Rastegari, Jason Yosinski, Ali Farhadi
Статья: https://arxiv.org/abs/2006.14769
Пост: https://mitchellnw.github.io/blog/2020/supsup/
Код: https://github.com/RAIVNLab/supsup

Ещё про суперпозицию, но другого рода. И снова в контексте борьбы с catastrophic forgetting.

Начать стоит издалека. Уже давно в работе про Lottery Ticket Hypothesis (https://arxiv.org/abs/1803.03635) было показано, что в обученной сети есть подсети, которые дают такое же (или даже более высокое) качество, будучи натренированы с нуля с той же инициализации, что и большая сеть, в которой их нашли. Потом много чего было, например, работа про супермаски (и не только, https://arxiv.org/abs/1905.01067), где показали, что в рандомно инициализированной сети уже есть подсети с высоким качеством (и маска задаёт такую подсеть). Потом была работа “What's Hidden in a Randomly Weighted Neural Network?” (https://news.1rj.ru/str/gonzo_ML/196), где авторы предложили алгоритм Edge-Popup для нахождения таких подсетей. Коллектив (почти) этих же авторов написал через год другую интересную работу (была принята на NeurIPS 2020).

Здесь также стоит отвлечься и вспомнить интересную работу про альтернативу файнтюнингу под названием “Piggyback: Adapting a Single Network to Multiple Tasks by Learning to Mask Weights” (https://arxiv.org/abs/1801.06519), где с помощью маскирования весов обученной сети добивались адаптации сети к новым задачам. У этого метода было преимущество в том, что оригинальные веса не трогались, соответственно не происходило забывания, свойственного файнтюнингу при обучении сети новым задачам.

Авторы текущей работы в каком-то смысле сочетают эти две. Они предложили метод под названием SupSup (Supermasks in Superposition), позволяющий в базовой рандомно инициализированной сети находить маски под разные задачи. Причём в том числе и для кейсов, когда конкретная задача в данный момент неизвестна и сеть должна догадаться, какая это задача была.

Первым делом авторы предложили таксономию сценариев continual learning и специальный трёхбуквенный код для описания. Используя буквы G (Given) и N (Not given) они описывают, известны ли id задач во время обучения (первая буква кода) и тестирования (вторая буква). И ещё есть третья буква, которая говорит, расшарены ли метки классов между задачами (s) или нет (u). Получаются разные варианты, но практически полезные среди них следующие: GG (самый лёгкий, id задач известны в трейне и тесте, а GGs и GGu эквивалентны, поэтому просто GG), GNs (id задачи известен в трейне и неизвестен в тесте, метки классов общие), GNu (то же, но метки раздельные, что оказывается более сложным, потому что эффективно надо предсказывать классов больше в число раз равное числу задач), и наконец NNs (потому что сценарий NNu невалиден).

Во всех сценариях мы работаем со случайно инициализированной сетью. Веса её заморожены и вообще не обучаются. Все bias термы установлены в 0, в параметры весов в ±c с равной вероятностью, где c — это стандартное отклонение соответствующего Kaiming normal distribution (про важность выбора распределения инициализации было в предыдущей их работе).

Для сценария GG всё просто — информация о задаче есть и в режиме обучения, и в режиме тестирования. Здесь для каждой новой задачи можно выучить новую бинарную маску (тем же Edge-Popup), при вычислении сети веса маски {0,1} перемножаются с соответствующими весами модели. Маску, кстати, можно хранить в разреженном формате, а веса сети можно вообще не хранить, а зная seed просто генерировать. Получается весьма мало места. И разреженность можно также регулировать, находя баланс между качеством и занимаемым местом.
👍7
Сценарии GNs и GNu хитрее — в обучении id задачи известен, но в режиме инференса этой информации нет и сеть должна сама что-то выбрать. Идея, как это можно сделать, основана на энтропии распределения выходных классов — мы считаем, что правильно выбранная маска должна генерировать распределение с низкой энтропией. Это, конечно, может быть проблемным местом, зная тенденцию к выдаче over-confident результатов.

Здесь в качестве маски берётся суперпозиция всех масок отдельных задач, взвешенных с коэффициентами alpha_i, а эти коэффициенты можно найти градиентным спуском, минимизируя энтропию (начинают с равномерного распределения). Альтернативно можно просто перебрать все маски и выбрать с наименьшей энтропией (но для этого надо k forward passes). Тут хочется иметь сублинейную сложность от количества масок и для этого предлагают два алгоритма One-Shot и Binary. В первом берётся задача, для координаты которой энтропия уменьшается сильнее всего и это можно посчитать по одному градиенту; во втором за log(k) шагов наподобие бинарного поиска отсеиваются задачи, где энтропия уменьшается минимально.

Для сценария NNs задача неизвестна даже при обучении и здесь, если алгоритм SupSup не уверен насчёт конкретной задачи (для этого в статье есть критерий, что распределение примерно равномерное), то вероятно это новая задача. В таком случае создаётся новая маска и их число k инкрементируется. Авторы сумели обучить сеть на 2500 задач (перестановки MNIST) без знания информации о задаче.

В процессе всех экспериментов авторы сравниваются с описанным в прошлый раз PSP (https://news.1rj.ru/str/gonzo_ML/870) и с методом BatchEnsemble (https://arxiv.org/abs/2002.06715). SupSup рулит, обходя обоих конкурентов, а в сценарии NNs достигает сравнимого с GNu качества.

Есть отдельные интересные предложения про кодирование масок внутри сети Хопфилда (это называется методом HopSupSup). Получается резервуар фиксированного размера, где маски это аттракторы в сети.

Для сценария GNu HopSupSup нужно L*K выходных нейронов, в то время как SupSup обходится без такого количества и может использовать всего L. Что интересно, хотя в теории L обычному SupSup и достаточно, но добавление “излишних” (superfluous) нейронов (s-нейроны) на практике помогает.

В целом интересная работа. Я по-прежнему уверен, что тема со случайными большими сетями ещё недоисследована.
👍2