Эксперименты вокруг простой идеи создания нескольких моделей иерархического прогнозирующего кодирования в GPT. Это настолько просто, что может не сработать. Но опять же, прогресс в глубоком обучении строится на основе простых идей. Стоит попробовать.
На данный момент идея прошла лакмусовую бумажку у друга-исследователя. Примерно на следующей неделе доведу его до конца. Если это не сработает, я оставлю отрицательные экспериментальные результаты, а также хранилище, и, возможно, какой-нибудь аспирант сможет использовать это.
Обновление: Я думаю, что это работает?
StabilityAI за спонсорскую поддержку для проведения этого независимого исследования
? Huggingface за библиотеку ускорения
$ pip install simple-hierarchical-transformer
Три иерархии, все из которых обслуживают прогнозирование следующего токена
import torch
from simple_hierarchical_transformer import HierarchicalTransformer
model = HierarchicalTransformer (
num_tokens = 20000 , # number of tokens
dim = 512 , # model dimensions
depth = 6 , # depth
dim_head = 64 , # dimension per attention head
heads = 8 , # attention heads
seq_len = 2048 , # sequence lengths
hierarchies = ( 1 , 2 , 8 ), # hierarchies - here we have 1x (like in a regular transformer), then 2x and 8x compressed hierarchical tokens that undergo their own transformer blocks. information is pooled into one hierarchy at each layer
window_sizes = ( 32 , 64 , None ) # local attention window sizes - the idea is that the higher hierarchies can pass distant information to the local one. None stands for full receptive field. Setting 0 would turn off attention at this hierarchy altogether (while token shift will still be in effect in each layer)
)
ids = torch . randint ( 0 , 20000 , ( 1 , 2048 ))
loss , _ = model ( ids , return_loss = True )
loss . backward ()
# after much training
logits = model ( ids )
Не указывая hierarchies
и window_sizes
, вы по умолчанию используете обычный авторегрессионный преобразователь с вниманием ко всей длине последовательности.
# non-hierarchical transformer
model = HierarchicalTransformer (
num_tokens = 20000 ,
dim = 512 ,
depth = 8 ,
dim_head = 64 ,
heads = 8 ,
seq_len = 2048 ,
hierarchies = 1 , # implied 1 if not set
window_sizes = None # implied None (full sequence length) if not set
)
Теперь нечто более сложное. Эксперименты показывают, что при сжатии иерархий для обеспечения соответствующей емкости необходимы более крупные размеры модели.
model = HierarchicalTransformer (
num_tokens = 256 ,
dim = ( 128 , 256 , 512 , 1024 ),
depth = 8 ,
seq_len = 1024 ,
use_flash_attn = True ,
ff_mult = ( 2 , 2 , 4 , 4 ),
dim_head = ( 16 , 32 , 64 , 64 ),
heads = ( 2 , 4 , 8 , 8 ),
hierarchies = ( 1 , 2 , 4 , 16 ),
hierarchical_stride = ( 1 , 1 , 1 , 8 ), # this would determine the stride when compressing, and when concatting the hierarchical tokens to the fine tokens, the past tokens will be repeated this amount of time. causality is not violated as using the trick from hourglass transformers where sequence is shifted by compression factor - 1. recommend sticking with 1 except for highly compressed hierarchies, as it becomes very uncompetitive with baseline and generations look off
window_sizes = ( 16 , 32 , 64 , None )
). cuda ()
# hierarchies
# 1x - dim 128 - attention (2 heads, 16 dim, receptive field 16)
# 2x - dim 256 - attention (4 heads, 32 dim, receptive field 32)
# 4x - dim 512 - attention (8 heads, 64 dim, receptive field 64)
# 8x - dim 1024 - attention (8 heads, 64 dim, receptive field of all)
разветвляются на два параллельных пути: один для иерархических токенов, другой для простых токенов.
показать, что локальное внимание в тонких + иерархических токенах может приближаться к базовому уровню полного внимания
простого dsconv кажется достаточным для слияния одной иерархии
автоматически установить размер окна равным половине максимальной длины последовательности для тонкой и всех иерархий
выяснить эффекты простого объединения всех штрафных + иерархических токенов до потери перекрестной энтропии - разница невелика
полная возможность добавлять любое количество иерархий и определять, какая иерархия будет объединять информацию от других для прогнозирования
полностью настраиваемые измерения в иерархиях, поскольку более высокие иерархии требуют больших размеров модели.
добавить потери пророков для иерархических ветвей
разрешить повторение токенов иерархии для токенов Fine в будущем, поскольку позиция может иметь меньшее значение по мере продвижения вверх по иерархии. но это не приоритет, сначала начните работать - реализовано как hierarchical_stride
разрешить некоторым слоям полагаться только на сдвиг токенов, без внимания
случайные проекции + vq, как это было сделано в статье с универсальной речевой моделью из мозга - для иерархического прогнозирующего кодирования
позволить указать, какая иерархия получает информацию от других во время слияния, возможно, сформулировать особое внимание с помощью маскировки, но необходимо учитывать различные измерения модели в иерархиях
создайте простой локальный блок внимания для использования во всех иерархиях
добавить мгновенное внимание в местную библиотеку внимания
выяснить, можно ли распределить внимание между иерархиями
сделайте чистый отчет wandb, показывающий 2-кратное сжатие без особых потерь для уровня персонажа enwik8
попробуйте компрессор на основе внимания для иерархий 4 или выше
создайте небольшой автоэнкодер, используя встраивания токенов в качестве входных данных, в самом начале сети, а затем используйте промежуточные карты объектов для каждой параллельной иерархической сети.
Ближайшая идея — трансформеры в виде песочных часов.
Прочитав это, я возобновил интерес к иерархическим подходам.
@article { Nawrot2021HierarchicalTA ,
title = { Hierarchical Transformers Are More Efficient Language Models } ,
author = { Piotr Nawrot and Szymon Tworkowski and Michal Tyrolski and Lukasz Kaiser and Yuhuai Wu and Christian Szegedy and Henryk Michalewski } ,
journal = { ArXiv } ,
year = { 2021 } ,
volume = { abs/2110.13711 }
}
@inproceedings { dao2022flashattention ,
title = { Flash{A}ttention: Fast and Memory-Efficient Exact Attention with {IO}-Awareness } ,
author = { Dao, Tri and Fu, Daniel Y. and Ermon, Stefano and Rudra, Atri and R{'e}, Christopher } ,
booktitle = { Advances in Neural Information Processing Systems } ,
year = { 2022 }
}
@misc { su2021roformer ,
title = { RoFormer: Enhanced Transformer with Rotary Position Embedding } ,
author = { Jianlin Su and Yu Lu and Shengfeng Pan and Bo Wen and Yunfeng Liu } ,
year = { 2021 } ,
eprint = { 2104.09864 } ,
archivePrefix = { arXiv } ,
primaryClass = { cs.CL }
}
@inproceedings { Sun2022ALT ,
title = { A Length-Extrapolatable Transformer } ,
author = { Yutao Sun and Li Dong and Barun Patra and Shuming Ma and Shaohan Huang and Alon Benhaim and Vishrav Chaudhary and Xia Song and Furu Wei } ,
year = { 2022 }
}
@software { peng_bo_2021_5196578 ,
author = { PENG Bo } ,
title = { BlinkDL/RWKV-LM: 0.01 } ,
month = { aug } ,
year = { 2021 } ,
publisher = { Zenodo } ,
version = { 0.01 } ,
doi = { 10.5281/zenodo.5196578 } ,
url = { https://doi.org/10.5281/zenodo.5196578 }
}
@article { Piergiovanni2023Mirasol3BAM ,
title = { Mirasol3B: A Multimodal Autoregressive model for time-aligned and contextual modalities } ,
author = { A. J. Piergiovanni and Isaac Noble and Dahun Kim and Michael S. Ryoo and Victor Gomes and Anelia Angelova } ,
journal = { ArXiv } ,
year = { 2023 } ,
volume = { abs/2311.05698 } ,
url = { https://api.semanticscholar.org/CorpusID:265129010 }
}