gonzo-обзоры ML статей – Telegram
gonzo-обзоры ML статей
24.1K subscribers
2.74K photos
2 videos
3 files
1.36K links
Авторы:
Гриша Сапунов, ранее руководитель разработки Яндекс-Новостей, ныне CTO Intento. Области интересов: AI/ML/DL, биоинформатика.
Лёша Тихонов, ранее аналитик в Яндексе, автор Автопоэта, Нейронной Обороны... Области интересов: discrete domain, NLP, RL.
Download Telegram
Tailoring: encoding inductive biases by optimizing unsupervised objectives at prediction time
Ferran Alet, Kenji Kawaguchi, Tomas Lozano-Perez, Leslie Pack Kaelbling
Статья: https://arxiv.org/abs/2009.10623

Очередная прикольная работа из серии “а что, так можно было?”.

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

Этот метод возвращается в новой ипостаси — Tailoring! Не знаю, как лучше по-русски назвать, пусть будет “подгонка”.

В чём суть?

В основе успеха многих решений лежит правильный inductive bias. Обычный классический подход подразумевает добавление inductive bias в архитектуру или через дополнительные лоссы. Первый подход неуниверсальный, а второй как и обучение с обычным лоссом приводит к generalization gap между данными обучения и предсказания, а также уводит objective в сторону от того, который нам реально важен.

Проблема здесь в том, что когда поступают запросы на инференс, модель уже не может использовать знание об этой новой конкретной точке, она “заморожена”. А собственно кто нам запретил воспользоваться этой новой информацией?

Вапник в своё время предложил подход под названием transductive learning (в противовес обычному inductive learning), где алгоритм получает не только обучающие данные, но и набор точек, на которых потом надо будет сделать предсказания, то есть делает предсказание от частного к частному без перехода к общему. Кстати, есть мнение, что Бертран Рассел сделал это ещё раньше, https://www.cs.bham.ac.uk/~jdk/transductive.html — не прогуливайте философию, в ML она тоже полезна!

Красивый пример, когда трансдукция полезнее обычной индукции, реализованной в виде supervised модели, есть в английской википедии — это классификация точек (https://en.wikipedia.org/wiki/Transduction_(machine_learning)#Example_problem). Действительно, обладая полным набором точек, хоть бы большинство из них и было без разметки, сделать разумную классификацию гораздо проще, проведя сначала unsupervised кластеризацию. И вообще говоря, множество подходов с предобучением или semi-supervised подходов, по сути делают что-то подобное. Теперь мы знаем, как это называется! :)

Но проблема с этим подходом в том, что обычно заранее мы не знаем, на чём надо будет потом применять модель, и хочется подход, который умеет делать предсказания в режиме онлайн по мере поступления новых точек. А гонять на каждом предсказании полный вариант transductive learning это too much.

Авторы предлагают подход tailoring и meta-tailoring. При “подгонке” (tailoring) мы при поступлении новой точки на предсказание файн-тюним модель на специальный unsupervised tailoring loss, а затем делаем предсказание. При “мета-подгонке” у нас есть двухуровневый процесс оптимизации по типу как в мета-обучении, где по сути мы обучаем модель с учётом последующей подгонки, чтобы она прошла легче — во внешнем цикле мы оптимизируем лосс, который нам важен (например, какой-то из supervised), а во внутреннем цикле оперируем этим нашим unsupervised tailoring loss. И, кстати, широко известный MAML (https://arxiv.org/abs/1703.03400) легко транслируется в текущий сеттинг с мета-подгонкой.

Если чуть больше конкретики, то мы, например, знаем, что данные должны обладать какими-то гарантиями: гладкость, симметрия, сохранение момента или энергии, что-нибудь ещё — мы можем использовать это в tailoring loss. Можно также заюзать какой-нибудь contrastive loss.

Отдельный практический челлендж — сделать так, чтобы можно было параллельно делать подгонку одной модели для всего батча.
1👍1
Авторы предлагают алгоритм под названием CNGrad, использующий подход conditional normalization. В этом подходе мы, похожим на BatchNorm образом, выучиваем два параметра (γ, β), которые масштабируют и сдвигают соответственно выход каждого определённого узла сети. И задача оптимизации заключается в адаптации этих двух параметров под конкретный запрос. Легко добавить подгонку в обученную без неё модель — достаточно навесить куда надо (γ = 1, β = 0), что даёт identity transformation, а дальше тюнить. Авторы доказывают, что глобального минимума в обучении можно достичь только модификациями этих вот двух параметров, не трогая основные веса сети.

Прогоняют эксперименты на трёх задачах: предсказание эволюции физической системы из 5 тел (tailoring loss основан на сохранении энергии и момента); классификация с целью добиться устойчивости к adversarial examples (tailoring loss стремится оптимизировать KL divergence для слегка возмущённых входов x + δ в каком-то небольшом радиусе); и классификация CIFAR-10 (где tailoring loss оптимизирует косинусное расстояние для слегка возмущённых точек, но делает это уже не только для предсказаний классов, но и для активаций предпоследнего слоя). Результаты везде интересные, предсказания более качественные и устойчивые.

В общем любопытный подход, в сочетании с contrastive loss и не только ещё много чего можно придумать, это всё только начало!

Да, очевидным образом это, конечно, удорожает предсказание, инференс становится более вычислительно требовательным. Для нескольких шагов градиентной оптимизации фактор увеличения вычислений в описанных задачах от 1.5x до 10x (но число параметров зато меняется несильно). Понятно, это не везде допустимо, но тут как обычно trade-off. Возможно зато, что можно получать то же качество с меньшими по размеру сетями и отыграть сколько-то вычислений.
Linformer: Self-Attention with Linear Complexity
Sinong Wang, Belinda Z. Li, Madian Khabsa, Han Fang, Hao Ma
Статья: https://arxiv.org/abs/2006.04768

Хочется написать про свежий Performer, но пожалуй стоит перед ним написать про Linformer.

Это всё из серии про уменьшить квадратичную сложность полного механизма внимания в трансформере. Линформер, очевидно по названию, уменьшает сложность до линейной и по времени и по месту. За последние полгода таких работ уже несколько, недавний Big Bird (https://news.1rj.ru/str/gonzo_ML/381) из свежего, или чуть более ранняя работа с многообещающим названием “Transformers are RNNs” (https://arxiv.org/abs/2006.16236).

Разберём Linformer.

Идея в общем проста — заменим полную матрицу внимания на низкоранговую аппроксимацию. Авторы исходят из наблюдения, что self-attention низкоранговый. Для этого они анализируют спектр матрицы и утверждают, что особенно в верхних слоях, больше информации сконцентрировано в наибольших сингулярных значениях. И грубо говоря, считаем SVD для матрицы внимания и оставляем только k сингулярных значений (например, 128).

SVD только дорого считать на каждый чих, поэтому делаем проще, вводим две линейные проекции для K и V (Q не трогаем) перед расчётом внимания, так что в итоге считать придётся меньше. Оригинальные размерности n*d матрицы ключей и значений конвертятся в k*d и дальше внимание уже скейлится линейно, получается матрица внимания n*k вместо n*n.

Для пущей оптимизации эти матрицы проекций (E и F) можно ещё и пошарить между головами или слоями.

В экспериментах получают для k=128 качество как у трансформера с n=512, а для k=256 сравнимо с n=1024. И шаринг тоже работает, даже если шарить матрицы на все слои (то есть вообще одна матрица E на всю сеть).

Ну в общем работает вроде как, качество норм. Получают качество сравнимое с BERT’ом или RoBERTa, но при в 4 раза меньшем k. Плюс всё получается быстрее и памяти жрёт меньше.