Experimente rund um eine einfache Idee zur Einführung mehrerer hierarchischer prädiktiver Codierungsmodelle innerhalb eines GPT. Es ist so einfach, dass es möglicherweise nicht funktioniert. Andererseits basieren tiefgreifende Lernfortschritte auf der Grundlage einfacher Ideen. Einen Versuch wert.
Bisher hat die Idee den Lackmustest eines Forschungsfreundes bestanden. Werde es in der nächsten Woche oder so fertigstellen. Wenn es nicht klappt, lasse ich die negativen experimentellen Ergebnisse sowie das Repository liegen, und vielleicht kann ein Doktorand darauf aufbauen.
Update: Ich denke, es funktioniert?
StabilityAI für die Unterstützung bei der Durchführung dieser unabhängigen Forschung
? Huggingface für ihre Beschleunigungsbibliothek
$ pip install simple-hierarchical-transformer
Drei Hierarchien, die alle das nächste Token vorhersagen
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 )
Wenn Sie hierarchies
und window_sizes
nicht angeben, verwenden Sie grundsätzlich standardmäßig einen regulären autoregressiven Transformator mit Berücksichtigung der gesamten Sequenzlänge.
# 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
)
Nun etwas Komplexeres. Experimente zeigen, dass Sie mit zunehmender Komprimierung der Hierarchien größere Modelldimensionen für eine entsprechende Kapazität benötigen.
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)
Verzweigen Sie auf zwei parallele Pfade, einen für hierarchische Token und einen für einfache feine Token.
zeigen, dass die lokale Aufmerksamkeit in feinen und hierarchischen Token der Grundlinie der vollständigen Aufmerksamkeit nahe kommen kann
einfaches dsconv scheint auszureichen, um eine Hierarchie zusammenzuführen
Setzt die Fenstergröße automatisch auf die Hälfte der maximalen Sequenzlänge für feine und alle Hierarchien
Finden Sie heraus, welche Auswirkungen es hat, wenn Sie alle feinen + hierarchischen Token vor dem Kreuzentropieverlust bündeln – kein großer Unterschied
vollständige Möglichkeit, eine beliebige Anzahl von Hierarchien hinzuzufügen und festzulegen, welche Hierarchie die Informationen der anderen zur Vorhersage zusammenfasst
vollständig anpassbare Dimensionen über Hierarchien hinweg, da höhere Hierarchien größere Modelldimensionen erfordern
Fügen Sie Prophetenverluste für hierarchische Zweige hinzu
Ermöglichen Sie die Wiederholung von Hierarchie-Tokens für feine Tokens in der Zukunft, da die Position möglicherweise weniger wichtig ist, wenn man in der Hierarchie aufsteigt. aber keine Priorität, bringen Sie die Dinge zuerst zum Laufen – implementiert als hierarchical_stride
Lassen Sie zu, dass sich einige Ebenen nur auf die Token-Verschiebung verlassen, ohne darauf zu achten
Zufallsprojektionen + VQ, wie es im Universal Speech Model Paper von Brain durchgeführt wurde – für hierarchische prädiktive Codierung
ermöglichen die Angabe, welche Hierarchie beim Zusammenführen Informationen von den anderen erhält, entwerfen möglicherweise eine spezielle Aufmerksamkeit mit Maskierung, müssen jedoch unterschiedliche Modelldimensionen über Hierarchien hinweg berücksichtigen
Erstellen Sie einen einfachen lokalen Aufmerksamkeitsblock zur Verwendung in allen Hierarchien
Fügen Sie Flash-Aufmerksamkeit zur lokalen Aufmerksamkeitsbibliothek hinzu
Finden Sie heraus, ob die Aufmerksamkeit über Hierarchien hinweg geteilt werden kann
Erstellen Sie einen sauberen Wandb-Bericht, der die 2-fache Komprimierung ohne großen Verlust für die Zeichenebene enwik8 zeigt
Probieren Sie einen auf Selbstaufmerksamkeit basierenden Kompressor für Hierarchien 4 oder höher aus
Erstellen Sie ganz am Anfang des Netzwerks einen kleinen Autoencoder, der die Token-Einbettungen als Eingabe verwendet, und verwenden Sie dann Zwischen-Feature-Maps für jedes parallele hierarchische Netzwerk
Die naheliegendste Idee wären Sanduhrtransformatoren.
Und mein erneutes Interesse an hierarchischen Ansätzen entstand durch die Lektüre dieser Zeilen.
@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 }
}