Just Add Functions: A Neural-Symbolic Language Model
David Demeter, Doug Downey
Статья: https://arxiv.org/abs/1912.05421
Прикольная статья про расширение нейросетевых языковых моделей (Neural Network Language Model, NNLM) более правильными inductive biases путём внедрения простых функций. Эти функции явно кодируют символьные отношения и выдают вероятностные распределения для слов.
У NNLM есть проблемы с некоторыми текстами, например, если там встречаются определённые пространственные, временные или количественные отношения.
Например, предсказание последнего слова в тексте:
William the Conqueror won the Battle of Hastings in 1066, and died in [1087]
где мы знаем, что это скорее всего четырёхзначное число большее (но не сильно) 1066.
Или в тексте:
Exciting European cities are Paris, Rome and [London]
где мы скорее всего ожидаем что-то географически близкое к перечисленным.
Эту всю логику довольно непросто заложить в классические NNLM, но можно легко описать простыми математическими или логическими выражениями.
Собственно после добавления в модель таких функций и получается нейро-символьная языковая модель (Neuro-Symbolic Language Model, NSLM).
NSLM представляет собой иерархическую NNLM (HNLM), генерирующую совместное распределение классов и слов. Простые функции используются для явного кодирования вероятностных распределений слов внутри класса. В работе такие функции называются микро-моделями (micro-models, MM). В обычных иерархических языковых моделях на месте микро-модели была бы какая-то другая сеточка.
Например, для класса <год> такой функцией может быть гауссиана (параметры которой выучены из данных), задающая дельту (в годах) между предыдущей уже встреченной в тексте датой (годом) и текущим словом, про которое модель решила, что это класс <год>.
Микро-модель задаётся метрической функцией (например, вычисляющей численную разницу между значениями двух токенов в случае класса <год>) и вероятностным распределением (PDF, в которую это значение трансформируется).
В работе NSLM делается на базе LSTM и разбираются классы про числа (year, day, round, decimal, range, convert) и географию (city, state, country).
NSLM бьёт по perplexity различные бейзлайны (LSTM NNLM, HNLM, character RNN, Neural cache models). На больших датасетах преимущество не настолько большое, но всё равно остаётся значительным на редких токенах. Более хитрые бейзлайны (например, с эмбеддингами, обученными на 6B корпусе, или с добавлением в эмбеддинги географических координат) тоже бьёт. И более продвинутую современную AWD-LSTM бьёт.
В общем получился красивый простой метод затачивания NNLM под доменно-специфичные задачи.
David Demeter, Doug Downey
Статья: https://arxiv.org/abs/1912.05421
Прикольная статья про расширение нейросетевых языковых моделей (Neural Network Language Model, NNLM) более правильными inductive biases путём внедрения простых функций. Эти функции явно кодируют символьные отношения и выдают вероятностные распределения для слов.
У NNLM есть проблемы с некоторыми текстами, например, если там встречаются определённые пространственные, временные или количественные отношения.
Например, предсказание последнего слова в тексте:
William the Conqueror won the Battle of Hastings in 1066, and died in [1087]
где мы знаем, что это скорее всего четырёхзначное число большее (но не сильно) 1066.
Или в тексте:
Exciting European cities are Paris, Rome and [London]
где мы скорее всего ожидаем что-то географически близкое к перечисленным.
Эту всю логику довольно непросто заложить в классические NNLM, но можно легко описать простыми математическими или логическими выражениями.
Собственно после добавления в модель таких функций и получается нейро-символьная языковая модель (Neuro-Symbolic Language Model, NSLM).
NSLM представляет собой иерархическую NNLM (HNLM), генерирующую совместное распределение классов и слов. Простые функции используются для явного кодирования вероятностных распределений слов внутри класса. В работе такие функции называются микро-моделями (micro-models, MM). В обычных иерархических языковых моделях на месте микро-модели была бы какая-то другая сеточка.
Например, для класса <год> такой функцией может быть гауссиана (параметры которой выучены из данных), задающая дельту (в годах) между предыдущей уже встреченной в тексте датой (годом) и текущим словом, про которое модель решила, что это класс <год>.
Микро-модель задаётся метрической функцией (например, вычисляющей численную разницу между значениями двух токенов в случае класса <год>) и вероятностным распределением (PDF, в которую это значение трансформируется).
В работе NSLM делается на базе LSTM и разбираются классы про числа (year, day, round, decimal, range, convert) и географию (city, state, country).
NSLM бьёт по perplexity различные бейзлайны (LSTM NNLM, HNLM, character RNN, Neural cache models). На больших датасетах преимущество не настолько большое, но всё равно остаётся значительным на редких токенах. Более хитрые бейзлайны (например, с эмбеддингами, обученными на 6B корпусе, или с добавлением в эмбеддинги географических координат) тоже бьёт. И более продвинутую современную AWD-LSTM бьёт.
В общем получился красивый простой метод затачивания NNLM под доменно-специфичные задачи.
Compressive Transformers for Long-Range Sequence Modelling
Jack W. Rae, Anna Potapenko, Siddhant M. Jayakumar, Timothy P. Lillicrap
Статья: https://arxiv.org/abs/1911.05507
Ещё более продвинутый трансформер от DeepMind’а. По сути расширение Transformer-XL путём добавления долговременной сжатой памяти.
Transformer-XL был достижением в том смысле, что позволил работать с более длинными последовательностями, которые не влезают в attention span трансформера. Там это достигалось за счёт сохранения состояний от предыдущего attention span и таким образом рекурсивно и от предыдущих ему тоже.
Увеличивать глубину памяти трансформера непросто, в основном из-за квадратичной вычислительной сложности механизма внимания, а также из-за дополнительных костов на хранение. Проблему вычислительной сложности решал Sparse Transformer от OpenAI, но он не решал проблему хранения, плюс его эффективная имплементация нетривиальна. Также был трансформер с адаптивным attention span (https://news.1rj.ru/str/gonzo_ML/99), но его вычисления вроде как не реализуются эффективно на текущем железе типа TPU (что впрочем противоречиво, потому что этот трансформер вроде как может быть обучен на довольно слабом железе за разумное время в отличие от других трансформеров, https://arxiv.org/pdf/1911.11423). В текущей работе авторы преследуют цель компактного хранения прошлого, желательно так чтобы это работало со стандартной простой dense линейной алгеброй.
В Compressive Transformer’е реализован двухуровневый механизм памяти. Первый уровень памяти (short-term) аналогичен памяти Transformer XL. Второй уровень (long-term) -- новый, в него память уходит из краткосрочной памяти, подвергаясь сжатию в процессе переноса. Механизм внимания смотрит на текущую последовательность + краткосрочную память + долгосрочную память.
Попутно с новым тратсформером авторы собрали и новый датасет для тестирования long-term dependencies. Это датасет из книг Проекта Гутенберг, называется PG-19 (книги до 1919 года, привет авторским правам). Датасет огромен, средняя длина последовательности сильно больше аналогов. Это круто.
Эксперименты как полагается показали, что новый трансформер лучше прежних, включая Transformer-XL (на мой взгляд важно также, что Adaptive Transformer также очень хорош и не особо сильно отстаёт). Разница больше заметна на новом датасете, а также на редких словах.
Также показали, что работает на звуке лучше Transformer-XL и даже не хуже WaveNet. А также делает IMPALA (штука из RL) лучше, если заменить им встроенный LSTM.
Предложенный механизм вполне ортогонален многим другим улучшениям трансформеров. Так что ждём новых комбинаций. И как полагается, теперь ждём новых BERT/XLNet/GPT-2/...
Jack W. Rae, Anna Potapenko, Siddhant M. Jayakumar, Timothy P. Lillicrap
Статья: https://arxiv.org/abs/1911.05507
Ещё более продвинутый трансформер от DeepMind’а. По сути расширение Transformer-XL путём добавления долговременной сжатой памяти.
Transformer-XL был достижением в том смысле, что позволил работать с более длинными последовательностями, которые не влезают в attention span трансформера. Там это достигалось за счёт сохранения состояний от предыдущего attention span и таким образом рекурсивно и от предыдущих ему тоже.
Увеличивать глубину памяти трансформера непросто, в основном из-за квадратичной вычислительной сложности механизма внимания, а также из-за дополнительных костов на хранение. Проблему вычислительной сложности решал Sparse Transformer от OpenAI, но он не решал проблему хранения, плюс его эффективная имплементация нетривиальна. Также был трансформер с адаптивным attention span (https://news.1rj.ru/str/gonzo_ML/99), но его вычисления вроде как не реализуются эффективно на текущем железе типа TPU (что впрочем противоречиво, потому что этот трансформер вроде как может быть обучен на довольно слабом железе за разумное время в отличие от других трансформеров, https://arxiv.org/pdf/1911.11423). В текущей работе авторы преследуют цель компактного хранения прошлого, желательно так чтобы это работало со стандартной простой dense линейной алгеброй.
В Compressive Transformer’е реализован двухуровневый механизм памяти. Первый уровень памяти (short-term) аналогичен памяти Transformer XL. Второй уровень (long-term) -- новый, в него память уходит из краткосрочной памяти, подвергаясь сжатию в процессе переноса. Механизм внимания смотрит на текущую последовательность + краткосрочную память + долгосрочную память.
Попутно с новым тратсформером авторы собрали и новый датасет для тестирования long-term dependencies. Это датасет из книг Проекта Гутенберг, называется PG-19 (книги до 1919 года, привет авторским правам). Датасет огромен, средняя длина последовательности сильно больше аналогов. Это круто.
Эксперименты как полагается показали, что новый трансформер лучше прежних, включая Transformer-XL (на мой взгляд важно также, что Adaptive Transformer также очень хорош и не особо сильно отстаёт). Разница больше заметна на новом датасете, а также на редких словах.
Также показали, что работает на звуке лучше Transformer-XL и даже не хуже WaveNet. А также делает IMPALA (штука из RL) лучше, если заменить им встроенный LSTM.
Предложенный механизм вполне ортогонален многим другим улучшениям трансформеров. Так что ждём новых комбинаций. И как полагается, теперь ждём новых BERT/XLNet/GPT-2/...
Telegram
gonzo-обзоры ML статей
Adaptive Attention Span in Transformers
Sainbayar Sukhbaatar, Edouard Grave, Piotr Bojanowski, Armand Joulin
Статья: https://arxiv.org/abs/1905.07799
Бенчмарки: https://paperswithcode.com/paper/adaptive-attention-span-in-transformers
Работа идейно близкая…
Sainbayar Sukhbaatar, Edouard Grave, Piotr Bojanowski, Armand Joulin
Статья: https://arxiv.org/abs/1905.07799
Бенчмарки: https://paperswithcode.com/paper/adaptive-attention-span-in-transformers
Работа идейно близкая…
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!
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!
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.
А если ещё это всё отдистиллировать…
Ам!
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.
А если ещё это всё отдистиллировать…
Ам!
GitHub
trax/trax/models/reformer at master · google/trax
Trax — Deep Learning with Clear Code and Speed. Contribute to google/trax development by creating an account on GitHub.
❤2