Implementasi Alphafold 3 di Pytorch
Anda dapat mengobrol dengan peneliti lain tentang penelitian ini di sini
Review makalah oleh Sergey
Panduan bergambar oleh Elana P. Simon
Pembicaraan oleh Max Jaderberg
Fork dengan dukungan penuh Lightning + Hydra dikelola oleh Alex di repositori ini
Visualisasi molekul kehidupan yang digunakan dalam repositori dapat dilihat dan berinteraksi di sini
Joseph atas kontribusinya dalam Pengodean Posisi Relatif dan Kerugian LDDT yang Halus!
Felipe yang telah menyumbangkan modul Weighted Rigid Align, Express Coordinates In Frame, Compute Alignment Error, dan Center Random Augmentation!
Alex untuk memperbaiki berbagai masalah dalam algoritma yang ditranskripsi
Heng karena telah menunjukkan ketidakkonsistenan dengan makalah tersebut dan meminta solusinya
Heng untuk menemukan masalah dengan indeks atom molekul untuk hilangnya distogram
Wei Lu karena menemukan beberapa hyperparameter yang salah
Alex untuk skrip persiapan dataset PDB!
Milot untuk mengoptimalkan skrip pengelompokan dataset PDB!
Alex yang pada dasarnya menulis seluruh alur besar mulai dari penguraian PDB hingga input molekul dan atom untuk pelatihan
Andrey yang telah mengerjakan pengambilan sampel kumpulan data PDB tertimbang!
Jimin karena telah mengirimkan perbaikan kecil pada masalah koordinat yang diteruskan ke WeightedRigidAlign
@ xluo233 karena telah menyumbangkan langkah-langkah kepercayaan, peringkat penalti bentrokan, dan contoh logika peringkat!
sj900 untuk mengintegrasikan dan menguji WeightedPDBSampler
dalam PDBDataset
dan untuk menambahkan dukungan awal untuk MSA dan penguraian templat!
@ xluo233 sekali lagi telah menyumbangkan logika untuk menghitung skor pemilihan model serta rasa yang belum terselesaikan!
Fandi yang menemukan beberapa ketidakkonsistenan antara modul difusi atom yang dijelaskan dengan modul tambahannya
Paolo yang mengajukan hipotesis PDB neutral stable molecule
!
Dhuvi untuk memperbaiki bug yang terkait dengan penetapan ID molekul ion logam untuk Alphafold3Inputs
!
Dhuvi karena telah menggunakan logika untuk menerjemahkan Alphafold3Input
ke BioMolecule
untuk disimpan ke mmCIF!
Tom (dari saluran Discord) yang mengidentifikasi perbedaan antara distogram basis kode ini dan penghitungan vektor unit templat dan OpenFold (dan Andrei yang membantu mengatasi masalah distogram)!
Kaihui karena mengidentifikasi bug dalam cara penanganan atom non-standar dalam residu polimer!
Andrey yang telah menggunakan antarmuka frontend gradio!
Patrick untuk jaxtyping, Florian untuk einx, dan tentu saja, Alex untuk einops
Soumith dan organisasi Pytorch yang telah memberi saya kesempatan untuk membuat karya ini menjadi open source
$ pip install alphafold3-pytorch
import torch
from alphafold3_pytorch import Alphafold3
from alphafold3_pytorch . utils . model_utils import exclusive_cumsum
alphafold3 = Alphafold3 (
dim_atom_inputs = 77 ,
dim_template_feats = 108
)
# mock inputs
seq_len = 16
molecule_atom_indices = torch . randint ( 0 , 2 , ( 2 , seq_len )). long ()
molecule_atom_lens = torch . full (( 2 , seq_len ), 2 ). long ()
atom_seq_len = molecule_atom_lens . sum ( dim = - 1 ). amax ()
atom_offsets = exclusive_cumsum ( molecule_atom_lens )
atom_inputs = torch . randn ( 2 , atom_seq_len , 77 )
atompair_inputs = torch . randn ( 2 , atom_seq_len , atom_seq_len , 5 )
additional_molecule_feats = torch . randint ( 0 , 2 , ( 2 , seq_len , 5 ))
additional_token_feats = torch . randn ( 2 , seq_len , 33 )
is_molecule_types = torch . randint ( 0 , 2 , ( 2 , seq_len , 5 )). bool ()
is_molecule_mod = torch . randint ( 0 , 2 , ( 2 , seq_len , 4 )). bool ()
molecule_ids = torch . randint ( 0 , 32 , ( 2 , seq_len ))
template_feats = torch . randn ( 2 , 2 , seq_len , seq_len , 108 )
template_mask = torch . ones (( 2 , 2 )). bool ()
msa = torch . randn ( 2 , 7 , seq_len , 32 )
msa_mask = torch . ones (( 2 , 7 )). bool ()
additional_msa_feats = torch . randn ( 2 , 7 , seq_len , 2 )
# required for training, but omitted on inference
atom_pos = torch . randn ( 2 , atom_seq_len , 3 )
distogram_atom_indices = molecule_atom_lens - 1
distance_labels = torch . randint ( 0 , 37 , ( 2 , seq_len , seq_len ))
resolved_labels = torch . randint ( 0 , 2 , ( 2 , atom_seq_len ))
# offset indices correctly
distogram_atom_indices += atom_offsets
molecule_atom_indices += atom_offsets
# train
loss = alphafold3 (
num_recycling_steps = 2 ,
atom_inputs = atom_inputs ,
atompair_inputs = atompair_inputs ,
molecule_ids = molecule_ids ,
molecule_atom_lens = molecule_atom_lens ,
additional_molecule_feats = additional_molecule_feats ,
additional_msa_feats = additional_msa_feats ,
additional_token_feats = additional_token_feats ,
is_molecule_types = is_molecule_types ,
is_molecule_mod = is_molecule_mod ,
msa = msa ,
msa_mask = msa_mask ,
templates = template_feats ,
template_mask = template_mask ,
atom_pos = atom_pos ,
distogram_atom_indices = distogram_atom_indices ,
molecule_atom_indices = molecule_atom_indices ,
distance_labels = distance_labels ,
resolved_labels = resolved_labels
)
loss . backward ()
# after much training ...
sampled_atom_pos = alphafold3 (
num_recycling_steps = 4 ,
num_sample_steps = 16 ,
atom_inputs = atom_inputs ,
atompair_inputs = atompair_inputs ,
molecule_ids = molecule_ids ,
molecule_atom_lens = molecule_atom_lens ,
additional_molecule_feats = additional_molecule_feats ,
additional_msa_feats = additional_msa_feats ,
additional_token_feats = additional_token_feats ,
is_molecule_types = is_molecule_types ,
is_molecule_mod = is_molecule_mod ,
msa = msa ,
msa_mask = msa_mask ,
templates = template_feats ,
template_mask = template_mask
)
sampled_atom_pos . shape # (2, , 3)
Contoh penanganan masukan tingkat molekul
import torch
from alphafold3_pytorch import Alphafold3 , Alphafold3Input
contrived_protein = 'AG'
mock_atompos = [
torch . randn ( 5 , 3 ), # alanine has 5 non-hydrogen atoms
torch . randn ( 4 , 3 ) # glycine has 4 non-hydrogen atoms
]
train_alphafold3_input = Alphafold3Input (
proteins = [ contrived_protein ],
atom_pos = mock_atompos
)
eval_alphafold3_input = Alphafold3Input (
proteins = [ contrived_protein ]
)
# training
alphafold3 = Alphafold3 (
dim_atom_inputs = 3 ,
dim_atompair_inputs = 5 ,
atoms_per_window = 27 ,
dim_template_feats = 108 ,
num_molecule_mods = 0 ,
confidence_head_kwargs = dict (
pairformer_depth = 1
),
template_embedder_kwargs = dict (
pairformer_stack_depth = 1
),
msa_module_kwargs = dict (
depth = 1
),
pairformer_stack = dict (
depth = 2
),
diffusion_module_kwargs = dict (
atom_encoder_depth = 1 ,
token_transformer_depth = 1 ,
atom_decoder_depth = 1 ,
)
)
loss = alphafold3 . forward_with_alphafold3_inputs ([ train_alphafold3_input ])
loss . backward ()
# sampling
alphafold3 . eval ()
sampled_atom_pos = alphafold3 . forward_with_alphafold3_inputs ( eval_alphafold3_input )
assert sampled_atom_pos . shape == ( 1 , ( 5 + 4 ), 3 )
Untuk memperoleh kumpulan data PDB AlphaFold 3, pertama-tama unduh semua kompleks perakitan pertama (dan unit asimetris) di Bank Data Protein (PDB), lalu proses terlebih dahulu dengan skrip yang direferensikan di bawah. PDB dapat diunduh dari RCSB: https://www.wwpdb.org/ftp/pdb-ftp-sites#rcsbpdb. Dua skrip Python di bawah ini (yaitu, filter_pdb_{train,val,test}_mmcifs.py
dan cluster_pdb_{train,val,test}_mmcifs.py
) berasumsi Anda telah mengunduh PDB dalam format file mmCIF , menempatkan perakitan pertama dan file mmCIF unit asimetris di data/pdb_data/unfiltered_assembly_mmcifs/
dan data/pdb_data/unfiltered_asym_mmcifs/
, masing-masing.
Agar dapat direproduksi, kami merekomendasikan mengunduh PDB menggunakan snapshot AWS (misalnya, 20240101
). Untuk melakukannya, lihat dokumentasi AWS untuk menyiapkan AWS CLI secara lokal. Cara lainnya, di situs web RCSB, navigasikan ke bawah ke "Unduh Protokol", dan ikuti petunjuk pengunduhan tergantung pada lokasi Anda.
Misalnya, seseorang dapat menggunakan perintah berikut untuk mengunduh PDB sebagai dua kumpulan file mmCIF:
# For `assembly1` complexes, use the PDB's `20240101` AWS snapshot:
aws s3 sync s3://pdbsnapshots/20240101/pub/pdb/data/assemblies/mmCIF/divided/ ./data/pdb_data/unfiltered_assembly_mmcifs
# Or as a fallback, use rsync:
rsync -rlpt -v -z --delete --port=33444
rsync.rcsb.org::ftp_data/assemblies/mmCIF/divided/ ./data/pdb_data/unfiltered_assembly_mmcifs/
# For asymmetric unit complexes, also use the PDB's `20240101` AWS snapshot:
aws s3 sync s3://pdbsnapshots/20240101/pub/pdb/data/structures/divided/mmCIF/ ./data/pdb_data/unfiltered_asym_mmcifs
# Or as a fallback, use rsync:
rsync -rlpt -v -z --delete --port=33444
rsync.rcsb.org::ftp_data/structures/divided/mmCIF/ ./data/pdb_data/unfiltered_asym_mmcifs/
PERINGATAN: Mengunduh PDB memerlukan ruang hingga 700 GB.
CATATAN: PDB menampung semua snapshot AWS yang tersedia di sini: https://pdbsnapshots.s3.us-west-2.amazonaws.com/index.html.
Setelah mengunduh, Anda akan memiliki dua direktori dengan format seperti ini: https://files.rcsb.org/pub/pdb/data/assemblies/mmCIF/divided/ & https://files.rcsb.org/pub/pdb/data /struktur/dibagi/mmCIF/
00/
01/
02/
..
zz/
Untuk direktori ini, unzip semua file:
find ./data/pdb_data/unfiltered_assembly_mmcifs/ -type f -name " *.gz " -exec gzip -d {} ;
find ./data/pdb_data/unfiltered_asym_mmcifs/ -type f -name " *.gz " -exec gzip -d {} ;
Selanjutnya jalankan perintahnya
wget -P ./data/ccd_data/ https://files.wwpdb.org/pub/pdb/data/monomers/components.cif.gz
wget -P ./data/ccd_data/ https://files.wwpdb.org/pub/pdb/data/component-models/complete/chem_comp_model.cif.gz
dari direktori utama proyek untuk mengunduh versi terbaru Kamus Komponen Kimia (CCD) PDB dan model strukturalnya. Ekstrak masing-masing file ini menggunakan perintah berikut:
find data/ccd_data/ -type f -name " *.gz " -exec gzip -d {} ;
Kemudian jalankan perintah berikut dengan pdb_assembly_dir
, pdb_asym_dir
, ccd_dir
, dan mmcif_output_dir
diganti dengan lokasi salinan lokal PDB perakitan pertama, unit asimetris PDB, CCD, dan direktori keluaran kumpulan data yang Anda inginkan (yaitu, ./data/pdb_data/unfiltered_assembly_mmcifs/
, ./data/pdb_data/unfiltered_asym_mmcifs/
, ./data/ccd_data/
, dan ./data/pdb_data/{train,val,test}_mmcifs/
).
python scripts/filter_pdb_train_mmcifs.py --mmcif_assembly_dir < pdb_assembly_dir > --mmcif_asym_dir < pdb_asym_dir > --ccd_dir < ccd_dir > --output_dir < mmcif_output_dir >
python scripts/filter_pdb_val_mmcifs.py --mmcif_assembly_dir < pdb_assembly_dir > --mmcif_asym_dir < pdb_asym_dir > --output_dir < mmcif_output_dir >
python scripts/filter_pdb_test_mmcifs.py --mmcif_assembly_dir < pdb_assembly_dir > --mmcif_asym_dir < pdb_asym_dir > --output_dir < mmcif_output_dir >
Lihat skrip untuk opsi lebih lanjut. Setiap mmCIF perakitan pertama yang berhasil melewati semua langkah pemrosesan akan ditulis ke mmcif_output_dir
dalam subdirektori yang diberi nama sesuai dengan karakter ID PDB kedua dan ketiga mmCIF (misalnya 5c
).
Selanjutnya, jalankan perintah berikut dengan mmcif_dir
dan {train,val,test}_clustering_output_dir
diganti, masing-masing, dengan direktori keluaran lokal Anda yang dibuat menggunakan skrip pemfilteran kumpulan data di atas dan dengan direktori keluaran pengelompokan yang Anda inginkan (yaitu, ./data/pdb_data/{train,val,test}_mmcifs/
dan ./data/pdb_data/data_caches/{train,val,test}_clusterings/
):
python scripts/cluster_pdb_train_mmcifs.py --mmcif_dir < mmcif_dir > --output_dir < train_clustering_output_dir > --clustering_filtered_pdb_dataset
python scripts/cluster_pdb_val_mmcifs.py --mmcif_dir < mmcif_dir > --reference_clustering_dir < train_clustering_output_dir > --output_dir < val_clustering_output_dir > --clustering_filtered_pdb_dataset
python scripts/cluster_pdb_test_mmcifs.py --mmcif_dir < mmcif_dir > --reference_1_clustering_dir < train_clustering_output_dir > --reference_2_clustering_dir < val_clustering_output_dir > --output_dir < test_clustering_output_dir > --clustering_filtered_pdb_dataset
Catatan : Tanda --clustering_filtered_pdb_dataset
direkomendasikan ketika mengelompokkan kumpulan data PDB yang difilter seperti yang dikurasi menggunakan skrip di atas, karena tanda ini akan memungkinkan runtime yang lebih cepat dalam konteks ini (karena pemfilteran membuat ID residu setiap rantai berbasis 1). Namun, tanda ini tidak boleh diberikan saat mengelompokkan kumpulan data file mmCIF lainnya (yaitu non-PDB). Jika tidak, pengelompokan antarmuka mungkin dilakukan secara tidak benar, karena file mmCIF kumpulan data ini mungkin tidak menggunakan pengindeksan residu berbasis 1 yang ketat untuk setiap rantai.
Catatan : Seseorang dapat mengunduh file mmCIF ( train
/ val
/ test
) yang telah diproses sebelumnya (yaitu, difilter) (~25 GB, terdiri dari 148 ribu kompleks) dan file pengelompokan rantai/antarmuka ( train
/ val
/ test
) (~3 GB) untuk PDB 20240101
Snapshot AWS melalui folder OneDrive bersama. Masing-masing arsip tar.gz
ini harus didekompresi dalam direktori data/pdb_data/
misalnya, melalui tar -xzf data_caches.tar.gz -C data/pdb_data/
. Anda juga dapat mengunduh dan menyiapkan data distilasi PDB dengan menggunakan skrip scripts scripts/distillation_data_download.sh
sebagai referensi. Setelah diunduh, seseorang dapat menjalankan scripts/reduce_uniprot_predictions_to_pdb.py
untuk memfilter kumpulan data ini menjadi hanya contoh yang terkait dengan setidaknya satu entri PDB. Selain itu, demi kenyamanan, pemetaan ID aksesi UniProt ke ID PDB untuk pelatihan data distilasi PDB telah diunduh dan diekstraksi sebagai data/afdb_data/data_caches/uniprot_to_pdb_id_mapping.dat
.
Di root proyek, jalankan
$ sh ./contribute.sh
Kemudian, tambahkan modul Anda ke alphafold3_pytorch/alphafold3.py
, tambahkan pengujian Anda ke tests/test_af3.py
, dan kirimkan permintaan penarikan. Anda dapat menjalankan tes secara lokal dengan
$ pytest tests/
Dockerfile
yang disertakan berisi dependensi yang diperlukan untuk menjalankan paket dan untuk melatih/inferensi menggunakan PyTorch dengan GPU.
Gambar dasar defaultnya adalah pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime
dan menginstal versi terbaru paket ini dari cabang main
GitHub.
# # Build Docker Container
docker build -t af3 .
Alternatifnya, gunakan argumen build untuk membangun kembali image dengan versi perangkat lunak yang berbeda:
PYTORCH_TAG
: Mengubah gambar dasar dan dibuat dengan versi PyTorch, CUDA, dan/atau cuDNN yang berbeda.GIT_TAG
: Mengubah tag repo ini untuk mengkloning dan menginstal paket.Misalnya:
# # Use build argument to change versions
docker build --build-arg " PYTORCH_TAG=2.2.1-cuda12.1-cudnn8-devel " --build-arg " GIT_TAG=0.1.15 " -t af3 .
Kemudian, jalankan container dengan GPU dan pasang volume lokal (untuk pelatihan) menggunakan perintah berikut:
# # Run Container
docker run -v .:/data --gpus all -it af3
@article { Abramson2024-fj ,
title = " Accurate structure prediction of biomolecular interactions with
{AlphaFold} 3 " ,
author = " Abramson, Josh and Adler, Jonas and Dunger, Jack and Evans,
Richard and Green, Tim and Pritzel, Alexander and Ronneberger,
Olaf and Willmore, Lindsay and Ballard, Andrew J and Bambrick,
Joshua and Bodenstein, Sebastian W and Evans, David A and Hung,
Chia-Chun and O'Neill, Michael and Reiman, David and
Tunyasuvunakool, Kathryn and Wu, Zachary and {v Z}emgulyt{.e},
Akvil{.e} and Arvaniti, Eirini and Beattie, Charles and
Bertolli, Ottavia and Bridgland, Alex and Cherepanov, Alexey and
Congreve, Miles and Cowen-Rivers, Alexander I and Cowie, Andrew
and Figurnov, Michael and Fuchs, Fabian B and Gladman, Hannah and
Jain, Rishub and Khan, Yousuf A and Low, Caroline M R and Perlin,
Kuba and Potapenko, Anna and Savy, Pascal and Singh, Sukhdeep and
Stecula, Adrian and Thillaisundaram, Ashok and Tong, Catherine
and Yakneen, Sergei and Zhong, Ellen D and Zielinski, Michal and
{v Z}{'i}dek, Augustin and Bapst, Victor and Kohli, Pushmeet
and Jaderberg, Max and Hassabis, Demis and Jumper, John M " ,
journal = " Nature " ,
month = " May " ,
year = 2024
}
@inproceedings { Darcet2023VisionTN ,
title = { Vision Transformers Need Registers } ,
author = { Timoth'ee Darcet and Maxime Oquab and Julien Mairal and Piotr Bojanowski } ,
year = { 2023 } ,
url = { https://api.semanticscholar.org/CorpusID:263134283 }
}
@article { Arora2024SimpleLA ,
title = { Simple linear attention language models balance the recall-throughput tradeoff } ,
author = { Simran Arora and Sabri Eyuboglu and Michael Zhang and Aman Timalsina and Silas Alberti and Dylan Zinsley and James Zou and Atri Rudra and Christopher R'e } ,
journal = { ArXiv } ,
year = { 2024 } ,
volume = { abs/2402.18668 } ,
url = { https://api.semanticscholar.org/CorpusID:268063190 }
}
@article { Puny2021FrameAF ,
title = { Frame Averaging for Invariant and Equivariant Network Design } ,
author = { Omri Puny and Matan Atzmon and Heli Ben-Hamu and Edward James Smith and Ishan Misra and Aditya Grover and Yaron Lipman } ,
journal = { ArXiv } ,
year = { 2021 } ,
volume = { abs/2110.03336 } ,
url = { https://api.semanticscholar.org/CorpusID:238419638 }
}
@article { Duval2023FAENetFA ,
title = { FAENet: Frame Averaging Equivariant GNN for Materials Modeling } ,
author = { Alexandre Duval and Victor Schmidt and Alex Hernandez Garcia and Santiago Miret and Fragkiskos D. Malliaros and Yoshua Bengio and David Rolnick } ,
journal = { ArXiv } ,
year = { 2023 } ,
volume = { abs/2305.05577 } ,
url = { https://api.semanticscholar.org/CorpusID:258564608 }
}
@article { Wang2022DeepNetST ,
title = { DeepNet: Scaling Transformers to 1, 000 Layers } ,
author = { Hongyu Wang and Shuming Ma and Li Dong and Shaohan Huang and Dongdong Zhang and Furu Wei } ,
journal = { ArXiv } ,
year = { 2022 } ,
volume = { abs/2203.00555 } ,
url = { https://api.semanticscholar.org/CorpusID:247187905 }
}
@inproceedings { Ainslie2023CoLT5FL ,
title = { CoLT5: Faster Long-Range Transformers with Conditional Computation } ,
author = { Joshua Ainslie and Tao Lei and Michiel de Jong and Santiago Ontan'on and Siddhartha Brahma and Yury Zemlyanskiy and David Uthus and Mandy Guo and James Lee-Thorp and Yi Tay and Yun-Hsuan Sung and Sumit Sanghai } ,
year = { 2023 }
}
@article { Ash2019OnTD ,
title = { On the Difficulty of Warm-Starting Neural Network Training } ,
author = { Jordan T. Ash and Ryan P. Adams } ,
journal = { ArXiv } ,
year = { 2019 } ,
volume = { abs/1910.08475 } ,
url = { https://api.semanticscholar.org/CorpusID:204788802 }
}
@ARTICLE { Heinzinger2023.07.23.550085 ,
author = { Michael Heinzinger and Konstantin Weissenow and Joaquin Gomez Sanchez and Adrian Henkel and Martin Steinegger and Burkhard Rost } ,
title = { ProstT5: Bilingual Language Model for Protein Sequence and Structure } ,
year = { 2023 } ,
doi = { 10.1101/2023.07.23.550085 } ,
journal = { bioRxiv }
}
@article { Lin2022.07.20.500902 ,
author = { Lin, Zeming and Akin, Halil and Rao, Roshan and Hie, Brian and Zhu, Zhongkai and Lu, Wenting and Santos Costa, Allan dos and Fazel-Zarandi, Maryam and Sercu, Tom and Candido, Sal and Rives, Alexander } ,
title = { Language models of protein sequences at the scale of evolution enable accurate structure prediction } ,
elocation-id = { 2022.07.20.500902 } ,
year = { 2022 } ,
doi = { 10.1101/2022.07.20.500902 } ,
publisher = { Cold Spring Harbor Laboratory } ,
URL = { https://www.biorxiv.org/content/early/2022/07/21/2022.07.20.500902 } ,
eprint = { https://www.biorxiv.org/content/early/2022/07/21/2022.07.20.500902.full.pdf } ,
journal = { bioRxiv }
}
@article { Li2024SwitchEA ,
title = { Switch EMA: A Free Lunch for Better Flatness and Sharpness } ,
author = { Siyuan Li and Zicheng Liu and Juanxi Tian and Ge Wang and Zedong Wang and Weiyang Jin and Di Wu and Cheng Tan and Tao Lin and Yang Liu and Baigui Sun and Stan Z. Li } ,
journal = { ArXiv } ,
year = { 2024 } ,
volume = { abs/2402.09240 } ,
url = { https://api.semanticscholar.org/CorpusID:267657558 }
}
@article { Nguyen2023MitigatingOI ,
title = { Mitigating Over-smoothing in Transformers via Regularized Nonlocal Functionals } ,
author = { Tam Nguyen and Tan M. Nguyen and Richard G. Baraniuk } ,
journal = { ArXiv } ,
year = { 2023 } ,
volume = { abs/2312.00751 } ,
url = { https://api.semanticscholar.org/CorpusID:264300597 }
}
@inproceedings { Zhou2024ValueRL ,
title = { Value Residual Learning For Alleviating Attention Concentration In Transformers } ,
author = { Zhanchao Zhou and Tianyi Wu and Zhiyun Jiang and Zhenzhong Lan } ,
year = { 2024 } ,
url = { https://api.semanticscholar.org/CorpusID:273532030 }
}