Attention görselleştirmesi: Transformer'ın kalbi [Video]
(3blue1brown.com)- Transformer’daki attention, token embedding’lerini bağlama uygun şekilde güncelleyerek aynı kelimenin bile çevresindeki kelimelere göre farklı anlamlar taşıyan vektörlere kaymasını sağlayan bir mekanizmadır
- Bir attention head, her tokenden query/key/value vektörleri üretir ve key-query iç çarpımı ile softmax kullanarak kelimeler arası ilişki ağırlıkları olan attention pattern’ı hesaplar
- GPT tarzı otoregresif modeller, sonraki tokenların önceki tokenları etkilemesini engellemek için masking uygular; ayrıca attention pattern’ın boyutu bağlam uzunluğunun karesi olduğundan büyük context window’ları genişletmek maliyetlidir
- GPT-3 örneğinde key/query matrislerinin her biri 1.572.864 parametreye sahiptir; value map ise düşük dereceli bir dönüşüme bölünerek head başına yaklaşık 6,3 milyon parametreye ulaşır
- Çok sayıda attention head ve block’u yineleyen Transformer, bağlam güncellemenin farklı yollarını öğrenir; başarısının büyük bir kısmı da GPU üzerinde çok sayıda hesabı hızlıca işleyebilen paralelleştirilebilirlik özelliğinden gelir
Transformer'da attention'ın üstlendiği rol
- Transformer, giriş metnini bir sonraki tokenı tahmin etmek için kullanır; giriş önce tokenization ile kelimelere veya kelime parçalarına ayrılır
- Her token, yüksek boyutlu bir vektör olan embedding’e dönüştürülür
- Bu embedding uzayındaki yönler anlamla eşleşebilir
- Örneğin belirli bir yöndeki hareket, erkek isim embedding’ini karşılık gelen kadın isim embedding’ine taşıyabilir
- Attention’ın amacı, başlangıç embedding’lerini kademeli olarak ayarlayarak yalnızca tekil kelime bilgisini değil, daha zengin bir bağlamsal anlamı da taşımalarını sağlamaktır
Aynı kelime neden bağlama göre değişir?
- “American shrew mole”, “One mole of carbon dioxide”, “Take a biopsy of the mole” örneklerinde mole farklı anlamlara gelir
- İlk embedding aşamasında mole’un vektörü bağlama bakmayan bir lookup table’a yakındır, bu yüzden üç durumda da aynıdır
- Sonraki aşama olan attention block içinde çevredeki embedding’ler mole embedding’ine bilgi aktararak değerini güncelleyebilir
- İyi eğitilmiş bir model, mole’un farklı anlamlarını embedding uzayındaki farklı yönlerle ilişkilendirir ve bağlama göre genel embedding’e ne eklenmesi gerektiğini hesaplar
- “Eiffel tower” ile “miniature Eiffel tower” örneklerinde olduğu gibi bir kelimenin embedding’i yalnızca yakın kelimelerden değil, uzaktaki tokenlardan gelen bilgilerle de güncellenebilir
- Bir sonraki kelime tahmininde yalnızca son vektör kullanıldığından, uzun bir girdinin son kelime embedding’i tahmin için gerekli tüm bağlam bilgisini belli ölçüde taşımalıdır
Tek bir attention head’in hesaplama akışı
- Temel açıklama single head of attention üzerinden yapılır
- “A fluffy blue creature roamed the verdant forest.” örnek cümlesinde sıfatların karşılık gelen ismin başlangıç embedding’ini güncellediği bir durum varsayılır
- Bu örnek, bir attention head’in yapabileceği işlemleri göstermek içindir
- Gerçek bir head’in davranışı, çok sayıda parametrenin maliyet fonksiyonunu azaltacak şekilde ayarlanmasının sonucu olduğundan yorumlanması zordur
- Başlangıç embedding’leri yalnızca kelime bilgisini değil, konum bilgisini de içerir ve
\vec{E}ile gösterilir - Amaç, mevcut embedding’den bağlamı yansıtan yeni bir embedding
\vec{E}'üretmektir -
Query
- İlk adımda her token embedding’i query matrix
W_Qile çarpılarak query vektörü\vec{Q}oluşturulur - Bunu, ismin “önümde bir sıfat var mı?” diye sorması gibi düşünebiliriz
W_Q’nun elemanları öğrenilen model parametreleridir; pratikte belirli bir head’in tam olarak ne yaptığını yorumlamak zordur- Örnek olarak, isim embedding’lerini “önceki konumdaki sıfatı bulma” yönüne eşleyen bir dönüşüm olarak görülebilir
- İlk adımda her token embedding’i query matrix
-
Key
- Aynı anda her embedding, key matrix
W_kile çarpılarak key vektörü\vec{K}oluşturulur - Key, query’ye verilebilecek potansiyel bir yanıt gibi düşünülebilir ve query ile aynı daha düşük boyutlu uzayda yer alır
- Key ile query’nin ne kadar hizalandığı iç çarpım ile ölçülür
- İç çarpım ne kadar büyükse, iki vektör o kadar güçlü hizalanmıştır
- fluffy ve blue’nun key’leri creature’ın query’siyle iyi eşleşirse büyük pozitif değerler alır
- Tüm key-query çiftlerinin iç çarpımı hesaplandığında, hangi kelimenin başka bir kelimenin anlam güncellemesi için ne kadar ilgili olduğunu gösteren bir puan ızgarası oluşur
- Aynı anda her embedding, key matrix
Attention pattern ve softmax
- İç çarpım puanları
-\inftyile\inftyarasında değer alabileceğinden, her sütuna softmax uygulanarak bunlar 0 ile 1 arasına normalize edilir - Normalize edilmiş bu ızgaraya attention pattern denir
- Her sütun, soldaki kelimenin üstteki kelimeyi güncellemekte ne kadar ilgili olduğuna dair bir ağırlık olarak görülebilir
- Orijinal Transformer makalesi bunu daha sıkıştırılmış biçimde yazar
QveK, query ve key vektörlerinin tüm dizilerini ifade ederK^TQ, mümkün olan tüm key-query iç çarpımlarının ızgarasını temsil eder- Makaledeki gösterimde query ve key satırlara yerleştirilir ve
QK^Tbiçimi kullanılır; bu da burada anlatılan şeklin köşegen yönünde ters çevrilmiş haline karşılık gelir
- Sayısal kararlılık için key-query uzayının boyutunun karekökü olan
\sqrt{d_k}ile bölme terimi eklenir - Softmax tüm ifadeyi sarıyor gibi yazılsa da anlam olarak her sütuna ayrı uygulanır
Masking ve context boyutu kısıtı
- Eğitim sırasında model, verilen metinden yalnızca tek bir sonraki tokenı tahmin etmez; her alt dizinin ardından gelebilecek sonraki tokenları da aynı anda tahmin eder
- Böylece tek bir metin örneği birden çok eğitim örneği gibi çalışır ve verimlilik artar
- GPT örneğinde, sonraki tokenların önceki tokenları etkilemesi bir sonraki tokenın doğru cevabını sızdırabileceği için masking kullanılır
- Softmax’tan önce ilgili konumların değeri negatif sonsuza ayarlanır
- Softmax sonrasında bu konumlar 0 olur ve sütun yine normalize kalır
- Her attention türünde masking zorunlu değildir, ancak GPT örneğinde sonraki tokenların önceki tokenları etkilememesi için sürekli kullanılır
- Attention pattern’ın boyutu context size’ın karesine eşittir
- Bu yüzden context size, büyük dil modellerinde önemli bir sınırlayıcı olabilir
- Daha büyük context window’lar için attention mekanizmasını daha ölçeklenebilir hale getiren varyasyonlar ortaya çıkmıştır; ancak burada yalnızca temel biçim ele alınır
Value ile embedding’lerin fiilen nasıl güncellendiği
- Attention pattern, hangi kelimenin hangi kelimeyi güncelleyeceğine dair ağırlıkları sağlar; sonraki adım ise embedding’deki gerçek değişim miktarını üretmektir
- Her embedding, value matrix
W_Vile çarpılarak bir value vektörü oluşturur- Value vektörleri embedding ile aynı yüksek boyutlu uzayda yer alır
- İlgili bir kelime başka bir kelimenin anlamını ayarlarken hangi somut değişikliğin eklenmesi gerektiğini ifade eder
- Her sütunda value vektörleri attention pattern’daki ilgili ağırlıklarla çarpılıp toplanınca değişim miktarı
\Delta \vec{E}elde edilir - Bu değişim, orijinal embedding’e eklenince bağlamı yansıtan yeni embedding
\vec{E}'oluşur- Örnekte creature, fluffy ve blue bilgisini içine alarak “fluffy blue creature”a daha yakın bir anlam taşımaya başlar
- Aynı süreç tüm sütunlara uygulanınca tüm token dizisi için rafine edilmiş embedding’ler attention block’tan çıkar
- Tek bir attention head, key matrix, query matrix ve value matrix olmak üzere üç tür öğrenilebilir parametre matrisiyle tanımlanır
GPT-3’e göre parametre hesabı
- GPT-3 örneğinde key ve query matrislerinin her biri, embedding boyutuna karşılık gelen 12.288 sütuna ve key-query uzayının boyutuna karşılık gelen 128 satıra sahiptir
- Her matris 1.572.864 parametre içerir
- Value matrix 12.288×12.288’lik kare bir matris olarak alınırsa, buna 150.994.944 parametre daha eklenir ve bu sayı key/query’ye göre çok daha büyüktür
- Pratikte, value map’i iki küçük matrise ayırarak parametre sayısını key/query ile benzer seviyede tutmak daha verimlidir
- İlk matris büyük embedding uzayını 128 boyut gibi daha küçük bir uzaya indirir
- İkinci matris küçük uzaydan yeniden embedding uzayına çıkarır
- Lineer cebir açısından bakıldığında bu, tüm value map’i düşük dereceli bir dönüşümle sınırlamak anlamına gelir
- Bu anlatımda iki matrise
Value_\downarrowveValue_\uparrowadı verilir, ancak bunlar yerleşik adlar değildir - Dört matris birlikte düşünüldüğünde bir attention head yaklaşık 6,3 milyon parametreye sahip olur
Self-attention ve cross-attention
- Buraya kadar anlatılan yapı daha doğru ifadeyle bir self-attention head’dir
- Cross-attention head, iki farklı veri kümesini işleyen modellerde ortaya çıkar
- Örneğin çeviri modellerinde key bir dilden, query ise başka bir dilden gelebilir
- Attention pattern, bir dildeki kelimelerin diğer dildeki kelimelerle nasıl eşleştiğini gösterebilir
- Cross-attention’da self-attention’dan farklı olan nokta, key ve query map’lerinin farklı veri kümelerine uygulanmasıdır
- Çeviri gibi kurulumlarda sonraki tokenların öncekileri etkilemesi gibi bir kavram olmadığından genelde masking kullanılmaz
Multi-headed attention ve tekrarlanan block’lar
- Gerçek bir attention block, birden çok head’in paralel çalıştığı multi-headed attention yapısından oluşur
- GPT-3, her block içinde 96 attention head kullanır
- 96 farklı key/query matrisi, 96 farklı attention pattern üretir
- Her head, kendi value matrisiyle bir value vektörü dizisi üretir
- Her token konumunda tüm head’lerin önerdiği değişim miktarları
\Delta \vec{E}toplanarak orijinal embedding’e eklenir
- Birden çok head’i paralel çalıştırmak, modele bağlamın anlamı değiştirdiği birçok farklı yolu öğrenme kapasitesi kazandırır
- GPT-3 ölçeğinde 96 head içeren tek bir multi-headed attention block yaklaşık 600 milyon parametreye sahiptir
- Makalelerde ve gerçek uygulamalarda, her head’in
Value_\uparrowkısmına karşılık gelen matrisler tek bir büyük output matrix içinde birleştirilerek tüm multi-headed attention block’a bağlanır- Genellikle belirli bir head’in value matrix’inden söz edildiğinde, burada
Value_\downarrowdenilen ilk projeksiyon adımı kastedilir
- Genellikle belirli bir head’in value matrix’inden söz edildiğinde, burada
Daha derin Transformer’larda anlamın nasıl biriktiği
- Transformer içindeki veri yalnızca tek bir attention block’tan geçmez; birden çok attention block ve multi-layer perceptron katmanından geçer
- Bir kelimenin embedding’i bağlamın bir kısmını aldıktan sonra bile, daha incelikli hale gelmiş çevre embedding’lerinden yeniden etkilenme fırsatı bulur
- Ağ derinleştikçe her embedding diğer embedding’lerden daha fazla anlam devralır ve duygu, ton, alay içerip içermediği gibi daha üst düzey soyut özellikleri kodlayabilecek kapasiteye ulaşır
- GPT-3’ün 96 katmanı vardır ve key/query/value ile ilgili parametrelerin toplamı 58 milyardan az olarak açıklanır
- Bu, tüm ağ parametrelerinin yaklaşık üçte birine karşılık gelir; geri kalan büyük bölüm attention katmanları arasındaki block’lardan gelir
- Attention mekanizmasının başarısının büyük kısmı tek bir özel davranıştan değil, GPU’lar üzerinde çok sayıda hesabı kısa sürede çalıştırmaya elverişli yüksek paralelleştirilebilirlik özelliğinden gelir
- Derin öğrenmede ölçek büyütmenin model performansında büyük niteliksel iyileşmeler sağlayabildiği görüldüğünden, ölçeklenmeye izin veren paralelleştirilebilir mimariler büyük avantaj sunar
1 yorum
Hacker News yorumları
Kuantum kimyası ve biraz da makine öğrenmesiyle uğraşmış biri olarak, bu videoyu izlerken Transformer modeli ile kuantum mekaniği arasındaki benzerlikler epey gözüme çarptı.
Kuantum mekaniğinde tüm fiziksel sistemin durumu çok yüksek boyutlu normalize bir vektör, yani Hilbert uzayında bir yarı doğru olarak kodlanır; zamana göre değişimi de kabaca unitary matris U = exp(-iHt) olarak görülebilecek zaman öteleme operatörü üstlenir.
Videoda, bir sonraki token tahmininin yalnızca son bağlam farkındalıklı embedding vektöründen bir sonraki bağlam farkındalıklı embedding vektörünün hesaplanmasıyla belirlendiği söyleniyor; bu da yüksek boyutlu bir vektöre doğrusal bir durum fonksiyonu uygulanmasının sonucu gibi görünüyor.
Tüm sistemin Hamiltonian'ını eğitim verisiyle çevrimdışı üretüp, belirli bir alt sistem olan bağlam penceresini o Hamiltonian'a uygun bir baza göre yeniden parametrize etmek, bir adımlık zaman ötelemesi uygulamak ve ardından özgün baza geri döndürmek gibi hissettiriyor.
Yine de belli bir alanda araştırma yapmış kişiye tüm sorunlar o alanın çekicine uygun çiviler gibi görünebildiğinden, bu benzerliğin başkalarına da görünüp görünmediğini, yoksa fazla mı zorlama olduğunu merak ediyorum.
Operatörün bir kez uygulanması evrenin durumunu bir Planck zamanı kadar ileri taşıyorsa, böyle bir evren ile zamanın sürekli olduğu bir evren arasındaki farkı gözlemleyip gözlemleyemeyeceğimizi de merak ediyorum.
O dönemde fizikte neler olduğuyla bağlantısı ancak şimdi aklıma geldi.
CodeEmporium'un YouTube videosunu takip etmek daha kolaydı: https://www.youtube.com/watch?v=Nw_PJdmydZY
Transformer'ları analojilerle açıklamak zor; aslında neden çalıştıklarına dair iyi bir açıklama da yok. Bu yüzden sadece mekanizmayı gösterip yorumu izleyiciye bırakmak daha iyi olabilir.
Ayrıca nokta çarpımını vektörlerin birbirleri üzerine izdüşümü olarak açıklamak daha basit.
“the cat sat on the ...” ifadesinden sonra “mat” gelmesinin nedeni, veri kümesinde en sık çıkan kelimenin bu olmasıdır; sinir ağı da bu tür frekansların modelidir.
“London in UK”yi biliyor ama “London in France”ı bilmiyor gibi görünmesinin nedeni de veri kümesinde “UK”nin çok daha sık geçmesidir.
Algoritmanın kendisi, hesaplamayı donanıma uygun hizalamanın dışında özellikle ilginç bir şey yapmaz. Değer, verinin içindeki koşullu olasılık yapısından gelir; bu yapı da insanların birbirlerine bilgi aktarmak için kelimeleri kullanışlı biçimde dizmesinin sonucudur.
Eksik bir açıklama olduğunu biliyorum, ama hiçbir şey olmamasından iyidir diye düşünüyorum.
Basit bir isteği işlerken LLM'in nasıl çalıştığını gösteren ikna edici bir görselleştirme var: https://bbycroft.net/llm
3blue1brown'un ayrıntılı anlatımını güzel tamamlıyor.
Harika bir video. Q*K matris çarpımının neden darboğaz olduğunu iyi gösteriyor. Dizi, yani bağlam penceresi uzunluğu S ise, tüm query'ler ile tüm key'lerin sonucu olan SxS boyutlu matrisi bellekte tutmak gerekiyor.
Bu darboğazı iyileştiren yeni-ish fikirlerden biri Ring Attention; şu yazı bunu iyi açıklıyor: https://learnandburn.ai/p/how-to-build-a-10m-token-context
Söz konusu yazıyı ben düzenledim.
Unsloth'ta Flash Attention sayesinde bellek kullanımı karesel değil doğrusal artıyor; fine-tuning 2 kat hızlanıyor, VRAM kullanımı %80 azalıyor ve inference da 2 kat hızlanıyor. Ancak işlem miktarı hâlâ O(N^2).
Uzun bağlamlarda Unsloth'un son sürümü, HF+FA2'ye kıyasla +%1,9 overhead ile 4 kat daha uzun bağlam sığdırarak H100 üzerinde 228K bağlama kadar çıkabiliyor.
Önceki yazı olan “But what is a GPT?” de gerçekten iyi: https://www.3blue1brown.com/lessons/gpt
Bu video sayesinde attention mekanizmasının belirli bir fonksiyondan çok, bir tür meta fonksiyona daha yakın olduğunu fark ettim
Doğru anladıysam, Attention + öğrenilmiş ağırlıklar, transformer’ın bir dereceye kadar keyfi fonksiyonlar öğrenmesini sağlıyor; bu fonksiyonun içinde de scaled dot-product gibi bir eşleştirme mekanizması yer alıyor
Bu yüzden linear attentionın standart attention’ın yeteneklerine asla yaklaşmasının zor olduğunu düşünüyorum. Tüm girdi-çıktı çiftlerini keşfeden karesel terim temel bir özellik çünkü
Bu videonun hazmı kolay olmasının büyük nedeni animasyonlardı. Konuşmanın zamanlamasına uyacak şekilde genişleyip daralan ve açılan yapı çok iyi yapılmıştı
Yakından ilgili bir alanda çalışıyorum; bu video hemen ekibimizin onboarding dokümanına girdi
Görselleştirme kodlarının önemli bir kısmının GitHub’da bulunması da önemli: https://github.com/3b1b/videos/tree/master/_2024/transformers
Sonunda anladım. Diğer videolar bunu neden bu kadar kafa karıştırıcı hâle getirmiş, bilmiyorum
Eğitim verme becerisi ile araştırma becerisinin genel olarak birbirini dışlayan yetenekler olup olmadığını düşündürüyor
Birincisi, standart terminoloji iyi değil. “attention” zar zor sezgisel, “self-attention” daha da kötü; “key” ve “value”dan söz etmiyorum bile
İkincisi, temel makaleler olan Attention is All You Need, BERT makalesi vb. iyi yazılmış değildi. Başarılarını küçümsemek istemiyorum; ancak muazzam bir atılım içeren etkili bir makale bile anlatımda zayıf olabilir ve bence gerçekten de öyleydiler
Üçüncüsü, bu yapılar genel olarak şunu bunu deneyip iyi tutanı bulma yöntemiyle keşfedildi. Böyle bir yapının iyi çalışacağı öngörüsüne götüren bir düşünme süreci önce yaşanıp sonra deneylerle doğrulanmış değildi; baştan sona ampirikti
Bu yüzden neden bu kadar iyi çalıştığını tam olarak anlamıyoruz; tüm açıklamalar daha çok sonradan gerekçelendirme gibi ve son zamanlarda yeterince ayarlanırsa başka yapıların da benzer şekilde iyi çalışabileceğini ima eden çalışmalar var. Tam olarak anlamadığınız bir şeyi açıklamak zordur
Mevcut mimarinin nasıl evrildiğini açıklayan bir kaynak olup olmadığını merak ediyorum. Çok basit bir çekirdek fikirden ünlü “all you need” makalesine uzanan akışı görmek isterdim
Aksi hâlde birçok düzenek birdenbire ortaya çıkmış gibi hissediliyor; hesap çok, sezgi az
Jeremy Howard Twitter’da bu fikrin farklı versiyonlarını birçok kez gördüğünü söylemişti; bu bana bunun doğal bir fikir olduğu anlamına geliyor gibi geldi. Bu fikrin başka yerlerde nasıl ortaya çıktığına dair örnekler görmek sezgi geliştirmeye yardımcı olabilir
Bu RNN/LSTM yaklaşımının sabit boyutlu temsil gibi bir zayıflığı ve çıktının belirli bir bölümünü üretirken girdi dizisinin hangi bölümünün kullanılacağına karar vermenin zor olması gibi bir zayıflığı vardı. Bahdanau ve diğerleri, encoder-decoder RNN’e attention mekanizması ekleyen bir yapıyla bunu çözdü; yalnızca nihai duruma değil, RNN’in tüm geçmiş durumlarına bakmasını sağladı
RNN’lerin eğitimi verimsizdi; bu yüzden Jakob Uszkoreit büyük ölçekli paralel donanımdan daha iyi yararlanmanın yollarını aradı ve dilin yalnızca sıralı değil, aynı zamanda hiyerarşik de olduğuna dikkat etti. Her katmanda alt dizilerdeki token’ları paralel işlerken, token’ların birbirine referans vermesini sağlayan Bahdanau tarzı attention’ı koruyup sonraki katmanı tahmin eden self-attention tabanlı katmanlı bir yapı önerdi
İlk uygulama çalıştı ama o dönemdeki convolution gibi diğer yaklaşımlardan daha iyi değildi; sonrasında bildiğim kadarıyla Noam Shazeer bu fikri geliştirerek çok daha iyi çalışan bir yapı oluşturdu ve gereksiz bileşenleri kaldırmaya yönelik deneylerin ardından orijinal transformer ortaya çıktı. Nihai yapıdaki key tabanlı attention biçimini kimin düşündüğünü pek bilmiyorum
Attention is All You Need makalesindeki orijinal transformer, önceki RNN tabanlı yaklaşımları izleyerek ayrı bir encoder ve decoder’a sahipti ve Google’ın BERT gibi erken modellerinde de kullanıldı. Ancak dil modelleri için bu şart değil; OpenAI’nin GPT’si yalnızca decoder kısmını kullandı ve bugün herkes büyük ölçüde bu yöntemi kullanıyor. Decoder-only transformer’da girdi cümlesi en alt katmana girer, ardından her katmandan geçerken adım adım dönüştürülür ve üstten çıkar. Girdi dizisinin sonuna bir bitiş token’ı eklenir; bu da çıktı dizisinin bir sonraki token’ına, yani son token’a dönüştürülür