Size: a a a

gonzo-обзоры ML статей

2020 January 08
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
2020 January 11
gonzo-обзоры ML статей
Ithemal: Accurate, Portable and Fast Basic Block Throughput Estimation using Deep Neural Networks
Charith Mendis, Alex Renda, Saman Amarasinghe, Michael Carbin
Статья: https://arxiv.org/abs/1808.07412
Прикольная статья достойная конференции SysML. Авторы представили тул, Ithemal (Instruction THroughput Estimator using MAchine Learning), который предсказывает throughput (количество циклов процессора, требуемых для выполнения) набора машинных инструкций. И делает это лучше, чем родная интеловская тулза или тулза из комплекта LLVM. Ещё и так же быстро.

Тулза пока работает только с простыми блоками (без ветвления и переходов)

Задача состоит в том, что чтобы сгененировать эффективный код под конкретную архитектуру (рассматриваются x86-64), надо хорошо уметь оценивать различные альтернативы и правильно предсказывать их производительность на конкретной микроархитектуре. Ибо те же микроархитектуры Haswell и Skylake внутри довольно различны, хоть внешне и предоставляют одинаковый набор команд.

Решить эту задачу довольно сложно. Лучший подход -- взять и всё померять (много раз), но он долгий. Поэтому приходится пользоваться суррогатами. Например, моделью процессора. Но модель получается довольно сложной, должна учитывать много тонкостей работы современного процессора (out-of-order execution, micro-op fusion, register renaming и т.д.). Плюс, в реальных процессорах многое недокументировано (по крайней мере для широкой публики), так что сделать такую модель кому-то кроме Интела/АМД довольно сложно. Да и те ошибаются, как показано в работе. Да ещё и под свежие микроархитектуры не умеют быстро выпускать обновления модели.

Раз всё так сложно, давайте попробуем решить задачу сеточками. Пусть производительность последовательности инструкций предсказывает hierarchical multiscale LSTM.

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

Подход хорош тем, что он целиком data driven. Собираем набор бенчмарков (кодов), компилим с оптимизациями под конкретные архитектуры, извлекаем блоки инструкций и их коды, многократно замеряем время выполнения. Сбор данных занимает 4-5 дней на каждую микроархитектуру. Затем обучаем модель на имеющихся данных. Получает state-of-the-art prediction performance. Profit!
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
2020 January 16
gonzo-обзоры ML статей
Reformer: The Efficient Transformer
Nikita Kitaev, Łukasz Kaiser, Anselm Levskaya
Статья: https://arxiv.org/abs/2001.04451
Код: https://github.com/google/trax/tree/master/trax/models/reformer

Больше трансформеров, хороших и разных! Łukasz Kaiser, кстати, соавтор оригинальной работы, а также работы про Universal Transformer, да и многого другого по теме (https://scholar.google.ru/citations?hl=en&user=JWmiQR0AAAAJ&sortby=pubdate).

Реформер -- это по сути техническая оптимизация оригинального трансформера, чтобы он занимал меньше памяти и быстрее считался.

Проблема обычного трансформера, что он большой и тяжёлый, плюс сложность механизма внимания квадратичная. Из-за всего этого обучать трансформеры (особенно на длинных последовательностях) становится невозможно без кластера. И даже файнтюнить не всегда можно на одном GPU.

Например, в одной из больших конфигураций трансформера (не из оригинальной работы, а из более навороченной https://arxiv.org/abs/1811.02084, которая конечно не про типичный трансформер, а скорее про историю типа Мегатрона от Нвидии), число параметров в слое может достигать полумиллиарда. И слоёв таких много.

Плюс для обучения надо сохранять активации, плюс feed-forward слои в трансформере ещё большую размерность эмбеддингов имеют.

Соответственно в работе предлагаются три техники для облегчения этих проблем.

1. Reversible layers по типу как здесь https://arxiv.org/abs/1707.04585. Позволяют сократить на хранении активаций в N раз (N -- число слоёв).

2. Работа с активациями feed-forward слоёв блоками уменьшает потребление памяти ff-слоями.

3. Приближённое вычисление внимания через механизм Locality-sensitive hashing (LSH) сокращает сложность в этом месте с квадратичной O(L^2) до O(L*logL) (L -- размер последовательности).

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

В чём-то идейно похоже на Sparse Transformer от OpenAI, только через LSH.

В экспериментах показывается, что всё это добро не ухудшает качество трансформера.

Query и Keys в трансформере можно считать одной матрицей, а не раздельными. Это ок, хуже не становится (иногда даже чуть лучше).

Обратимые слои тоже ок, тоже хуже не становится.

LSH делает чуть хуже, если хешей мало (скажем 2), но если сделать их побольше (8 или 16), то в целом тоже ок.

Ну и профит.

Если взглянуть шире, то за последнее время накопилось несколько интересных улучшений, которые выглядят ортогональными друг другу. Я бы занёс сюда:
* ALBERT (или как альтернатива ему Universal Transformer) от Гугла
* Compressive Transformer (как более продвинутый вариант Transformer-XL) от DeepMind
* Adaptive attention span от Фейсбука
* Ещё были оптимизации от Фейсбука про All-attention layer (https://ai.facebook.com/blog/making-transformer-networks-simpler-and-more-efficient/)
* Reformer вот теперь
* Наверное, если подумать, ещё что-то можно сюда добавить.

Коммьюнити ждёт своих героев, которые [имеют под рукой кластер или суперпомпьютер и] соберут все эти улучшения вместе и создатут новый супер-трансформер, а потом сделают на нём новый супер-BERT и супер-GPT2.

А если ещё это всё отдистиллировать…

Ам!
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
2020 January 18
gonzo-обзоры ML статей
R-Transformer: Recurrent Neural Network Enhanced Transformer
Zhiwei Wang, Yao Ma, Zitao Liu, Jiliang Tang
Статья: https://arxiv.org/abs/1907.05572
Код: https://github.com/DSE-MSU/R-transformer

Ещё вариация на тему трансформера -- химера с RNN.

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

Решение простое: давайте постороим гибрид, где сначала будет left-to-right RNN с ограниченным окном (здесь она называется LocalRNN), а поверх её эмбеддингов будет уже работать трансформер (никаких позиционных эмбеддингов уже не используем). LocalRNN имеет шаринг весов для всех позиций.

В работе рассматривают не полный кейс с seq2seq, а моделирование последовательности (смотрим только влево на предыдущий контекст, вправо не смотрим).

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

Построили, получили более хороший результат, чем у обычного трансформера.

Среди прочего сравниваются со свёрточной TCN (temporal convolutional network, малоизвестная, но с хорошими способностями, она отсюда: https://arxiv.org/abs/1803.01271) Про ней пишут, что TCN тоже локальную информацию о последовательности игнорирует. Спорно, мне кажется.

Следующим гибридом просится CNN-RNN-Transformer. Ибо гибриды CNN-LSTM вполне хорошо работают.
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник
gonzo-обзоры ML статей
источник