Eksperimen seputar ide sederhana untuk mendorong beberapa model pengkodean prediktif hierarkis dalam GPT. Ini sangat sederhana, mungkin tidak berhasil. Namun sekali lagi, kemajuan pembelajaran mendalam dibangun di atas fondasi ide-ide sederhana. Layak untuk dicoba.
Sejauh ini, ide tersebut telah lolos uji lakmus dari seorang teman peneliti. Akan menyelesaikannya sekitar minggu depan. Jika tidak berhasil, saya akan meninggalkan hasil eksperimen negatif serta penyimpanannya, dan mungkin beberapa mahasiswa PhD dapat mengembangkannya.
Pembaruan: Saya pikir ini berfungsi?
StabilityAI atas sponsor untuk melaksanakan penelitian independen ini
? Huggingface untuk perpustakaan akselerasi mereka
$ pip install simple-hierarchical-transformer
Tiga hierarki, semuanya melayani prediksi token berikutnya
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 )
Dengan tidak menentukan hierarchies
dan window_sizes
, pada dasarnya Anda menggunakan transformator autoregresif biasa dengan perhatian pada seluruh panjang urutan.
# 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
)
Sekarang sesuatu yang lebih kompleks. Eksperimen menunjukkan bahwa saat Anda mengompresi hierarki, Anda memerlukan dimensi model yang lebih besar untuk kapasitas yang sesuai.
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)
bercabang menjadi dua jalur paralel, satu untuk token hierarki, yang lain untuk token biasa.
menunjukkan bahwa perhatian lokal dalam token halus + hierarki dapat mendekati garis dasar perhatian penuh
dsconv sederhana tampaknya cukup untuk menggabungkan 1 hierarki
atur ukuran jendela secara otomatis menjadi setengah dari panjang urutan maksimal untuk denda dan semua hierarki
mencari tahu efek dari mengumpulkan semua token halus + hierarki sebelum kehilangan entropi silang - tidak banyak perbedaan
kemampuan lengkap untuk menambahkan sejumlah hierarki, dan menentukan hierarki mana yang akan mengumpulkan informasi dari hierarki lainnya untuk prediksi
dimensi yang sepenuhnya dapat disesuaikan di seluruh hierarki, karena hierarki yang lebih tinggi memerlukan dimensi model yang lebih besar
tambahkan kerugian nabi untuk cabang hierarki
izinkan pengulangan token hierarki untuk token yang bagus di masa mendatang, karena posisi mungkin tidak terlalu penting ketika seseorang naik hierarki. tetapi bukan prioritas, selesaikan semuanya terlebih dahulu - terapkan sebagai hierarchical_stride
izinkan beberapa lapisan hanya mengandalkan pergeseran token, tidak ada perhatian
proyeksi acak + vq, seperti yang dilakukan dalam makalah model ucapan universal dari otak - untuk pengkodean prediktif hierarkis
memungkinkan untuk menentukan hierarki mana yang menerima informasi dari yang lain selama penggabungan, mungkin merancang perhatian khusus dengan penyembunyian, namun perlu memperhitungkan dimensi model yang berbeda di seluruh hierarki
membangun blok perhatian lokal yang sederhana, untuk digunakan di semua hierarki
tambahkan perhatian kilat ke perpustakaan perhatian lokal
mencari tahu apakah perhatian dapat dibagikan antar hierarki
lakukan laporan tongkat bersih yang menunjukkan kompresi 2x tanpa banyak kehilangan untuk level karakter enwik8
coba kompresor berbasis perhatian diri untuk hierarki 4 atau lebih tinggi
buat autoencoder kecil menggunakan penyematan token sebagai masukan, di awal jaringan, lalu gunakan peta fitur perantara untuk setiap jaringan hierarki paralel
Ide yang paling mendekati adalah trafo jam pasir.
Dan minat saya yang baru terhadap pendekatan hierarki muncul dari membaca ini.
@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 }
}