500 Satır SQL ile Yazılmış GPT
(explainextended.com)- Yalnızca PostgreSQL ve pgvector kullanarak GPT-2 çıkarım akışını SQL'e taşıyor; tokenization'dan Transformer bloklarına ve bir sonraki token üretimine kadar tüm süreci yeniden kuruyor
- Üretken LLM'ler, aynı girdide aynı aday token olasılıklarını veren deterministik işlevlere yakındır; yanıtın değiştiği nokta, aday token'ların seçildiği olasılıksal seçim aşamasıdır
- Uygulama, GPT-2'nin BPE tokenizer'ını, 50.257 token'ı, 768 boyutlu embedding'leri, 1.024 token context window'u, 12 blok, 12 attention head ve GELU tabanlı feedforward yapısını SQL sorguları ve tablolarla ifade ediyor
- PostgreSQL regex'lerinin Unicode özelliklerini desteklememesi ve
EXPfonksiyonunun çok küçük değerleri işlemedeki sınırları gibi nedenlerle, veritabanı ortamına uygun gerçekçi geçici çözümler gerekti - Örnek,
"Happy New Year! I wish you"ifadesinden 10 token üreterek"Happy New Year! I wish you all the best in your new year!"çıktısını verdi ve yazarın ortamında 2 dakika 44 saniye sürdü
SQL ile GPT-2 çıkarım hattı kurmak
- ChatGPT, SQL'in büyük dil modeli uygulamak için uygun olmadığını söylemiş olsa da, PostgreSQL SQL ile bir GPT-2 çıkarım hattı uygulanmış
- Başvurulan uygulama açıklaması Jay Mody'nin GPT in 60 Lines of NumPy yazısı ve aynı bileşenler veritabanı tabloları ile sorgulara taşınmış
- Üretken bir LLM,
llm(prompt: str) -> list[tuple[str, float]]biçiminde bir işlev gibi görülebilir- Girdi, metin prompt'udur
- Çıktı, sıradaki olası string'ler ve bunların olasılık dizisidir
- İç matematik ve parametreler aynıysa, aynı girdiye aynı sonucu döndürür
- ChatGPT gibi ürünlerin aynı soruya farklı yanıtlar verebilmesinin nedeni, modelin kendisinden çok bir sonraki token seçimi aşamasındaki olasılıksal tercihtir
Metin üretim döngüsü
- Üretim süreci, prompt'u bir token dizisine çevirdikten sonra modeli tekrar tekrar çağırıp bir sonraki token'ı seçerek bunu prompt'un sonuna ekleyen bir yapıdadır
- Temel akış şu adımlardan oluşur
tokenize(prompt)ile string'i token ID dizisine dönüştürmegpt2(tokens)ile 50.257 token için olasılık hesaplamaselect_next_token(candidates)ile sonraki token'ı seçme- Seçilen token'ı diziye ekleme
- Belirlenen token sayısı, timeout veya stopword gibi koşullarda durma
detokenize(tokens)ile token dizisini yeniden string'e çevirme
- Bu şekilde biriken token dizisi; dilbilgisi, sözdizimi, anlam ve akıl yürütme izlenimi taşıyan doğal dil metnine dönüşebilir
BPE tokenizer'ı SQL ile uygulamak
- Sinir ağına girdi olmadan önce metnin sayı listesine çevrilmesi gerekir; ancak Unicode code point'lerini doğrudan kullanmak token uzayı ve uzunluk açısından verimsizdir
- GPT-2, Byte pair encoding'in bir varyantını kullanır
- Token sözlüğü 50.257 code point kullanır
- UTF-8 byte dizilerini ve “end of text” token'ını içerir
- Başlangıçta 256 byte token ile başlar, ardından sık görülen bitişik token çiftlerini yeni token'lar olarak ekler
- Bu birleştirme işlemi 50.000 kez tekrarlanarak 50.256 token elde edilir ve son olarak end-of-text token'ı eklenir
- GPT-2 tokenizer'ında byte'ları string karakterlerine eşleyen ek bir katman vardır; bu eşleme OpenAI GPT-2'nin
encoder.pydosyasında tanımlanır - SQL uygulamasında OpenAI'den indirilen token sözlüğü
tokenizertablosuna, byte-karakter eşlemesi iseencodertablosuna kaydedilmiş "Mississippilessly"örneği, recursive CTE ile tek byte'lardan başlayıp birleştirilebilecek en iyi bitişik çifti tekrar tekrar birleştiriyor- Örnekte token sayısı 17'den 5'e düşüyor
- Unicode'un yaklaşık 150 bin code point'lik alanı yerine GPT-2'nin yaklaşık 50 bin token'lık alanı kullanılıyor
- Birden çok kelime işlenirken GPT-2, metni regex ile bölüp her kelimenin içinde birleştirme yapıyor
- PostgreSQL, regex içinde Unicode karakter özelliklerini desteklemediği için özgün GPT-2 regex'i kısmen değiştirilmiş
- Bu değişiklik uygun Unicode desteğini zedelemiş olabilir
"PostgreSQL is great", SQL tokenizer'da[6307, 47701, 318, 1049]biçimine dönüşür- Token kümeleri
Post,greSQL,Ġis,Ġgreatşeklindedir Ġboşluğu temsil eder
- Token kümeleri
Embedding ve context window
- Token ID'leri model hesaplamasında doğrudan kullanılmaz; önce embedding vektörlerine dönüştürülür
- GPT-2, token ve konumu ayrı ayrı embedding eder
WTE, word token embedding'dir ve 50257×768 matristirWPE, word position embedding'dir ve 1024×768 matristir
- Her token konumu için
WTEvektörü ileWPEvektörü toplanarak sonraki aşamanın giriş vektörü oluşturulur WPEyalnızca 1024 konum içerdiği için, GPT-2 prompt'unda kullanılabilecek azami token sayısı 1024'tür- Bu sayı, LLM'in context window'una karşılık gelir
- Model tasarlanırken belirlenen bir hiperparametredir; eğitimle değişmez
- SQL uygulaması pgvector kullanır
- Vektör işlemleri dizi üzerinde tanımlanarak saf SQL ile de yapılabilir, ancak performans düşer
- İlk sürüm saf SQL işlevleriyle çalışıyordu ama yavaştı
self-attention'ı SQL sorgularına açmak
- Transformer'ın çekirdeği self-attention mekanizmasıdır ve 2017 tarihli Attention is all you need makalesine dayanır
- Attention, token vektörlerinin birbirini etkilemesini sağlayarak prompt'un başındaki bilginin son vektöre taşınmasına imkan verir
- GPT-2 uygulaması 12 set
Q,K,Vmatrisi kullanır- Her set bir attention head'dir
- Her head 64 boyutludur
c_attn, 768×2304 doğrusal dönüşümdür; sonuç, yatay olarak birleştirilmişQ,K,Viçeren 2304 boyutlu vektördür- Ağırlıklar ve bias değerleri
c_attn_w,c_attn_btablolarında tutulur
- Attention hesabından önce layer normalization uygulanır
- Scale ve shift parametreleri
ln_1_g,ln_1_btablolarında saklanır
- Scale ve shift parametreleri
- Causal self-attention'da, sonraki token'ların önceki token'ları etkilemesini önlemek için causal mask uygulanır
- Modelin bir sonraki token adayı en sonunda son embedding'den belirlenir
- Bilgi akışı son vektöre doğru gitmelidir; son vektörün ara değerleri önceki vektörleri etkilememelidir
- SQL uygulaması, softmax hesabında PostgreSQL
EXP'nin çok küçük sayılarda başarısız olmasını önlemek için girdi -745.13'ten küçükse bunu 0 kabul eder - Causal mask sayesinde yeni token prompt'a eklendiğinde önceki token'lar için hesaplanan sonuçlar değişmez
- Özgün GPT-2 uygulaması bu özelliği kullanır
- SQL uygulaması ise sadelik için bu yeniden kullanımı yapmaz
multi-head attention ve residual connection
- 12 head'in attention sonuçları ayrı ayrı 64 boyutludur; bunlar yatay olarak birleştirilip yeniden 768 boyuta getirilir
- Ardından,
c_proj_w,c_proj_biçinde saklanan eğitilmiş doğrusal dönüşüm ile attention çıktısı projekte edilir - multi-head attention sonucuna özgün girdi yeniden eklenir
- Bu residual connection, özgün Transformer makalesinde yer alan bir tekniktir
- Eğitim sırasında vanishing gradient ve exploding gradient sorunlarını hafifletmek için sunulmuştur
feedforward aşaması ve Transformer blokları
- Attention'dan sonra bir feedforward sinir ağı gelir
- GPT-2'nin feedforward aşaması, 3 katmanlı bir multi-layer perceptron'dan oluşur
- Boyutlar 768 → 3072 → 768'dir
- Aktivasyon işlevi olarak GELU kullanılır
- Doğrusal dönüşüm parametreleri şu tablolarda tutulur
mlp_c_fc_w,mlp_c_fc_bmlp_c_proj_w,mlp_c_proj_b
- Feedforward girdisi de önce
ln_2parametreleri ile normalize edilirln_2_g,ln_2_bscale ve shift değerlerini saklar
- Feedforward çıktısına da girdiyi yeniden ekleyen residual connection uygulanır
- Bu attention + feedforward birleşimi bir block'tur ve GPT-2, 12 block'u bir hat gibi art arda bağlar
- Her block'un kendine ait eğitimli parametre kümesi vardır
- SQL'de block'lar recursive CTE ile bağlanır
- Son block çıktısı
ln_fparametreleri ile yeniden normalize edilir
Bir sonraki token'a geri dönmek
- Nihai çıktının son konumundaki 768 boyutlu vektör, bir sonraki token'ın embedding'idir
- Bu vektörü yeniden token'a çevirmek için, ilk token embedding'inde kullanılan
WTEmatrisi tekrar kullanılır - Tam ters dönüşüm genellikle mümkün değildir
- Tahmin edilen embedding,
WTEiçindeki belirli bir satırla tam olarak aynı olmayabilir - Bu yüzden her token embedding'i ile dot product hesaplanarak en yakın token bulunur
- Tahmin edilen embedding,
WTEile tahmin embedding'inin dot product sonucu 50.257 skor, yani logit üretir- Bu skorlar softmax ile olasılığa dönüştürülür
- En üst aday sayısı
top_n - Olasılık dağılımını ayarlayan değer temperature'dır
- Temperature yükseldikçe, ilk sıradaki olmayan token'ların seçilme ihtimali artar ve çıkarım daha az öngörülebilir hale gelir
- En üst aday sayısı
"PostgreSQL is great"örneğinde ilk 5 sonraki token adayı şunlardırĠfor,.ĠatĠto
- Temperature 0.5, 1 ve 2 olarak değiştirildiğinde aynı adayların softmax olasılık dağılımı farklılaşır
Gerçek çıkarım sonucu ve kod
- Nihai SQL, token'ları olasılığa göre seçip prompt'a ekleme işlemini tekrarlar
- Modelin kendisi deterministiktir; deterministik olmayan tek unsur token seçimi içindeki rastgeleliktir
- Örnek ayarlar şöyledir
- Prompt:
"Happy New Year! I wish you" - Üretilecek token sayısı: 10
- Temperature: 2
- top_n: 1
SETSEED(0.20231231)kullanılmış
- Prompt:
- Yazarın ortamında sorgu 2 dakika 44 saniyede çalıştı
- Çıktı
"Happy New Year! I wish you all the best in your new year!"oldu - Sorgu ve kurulum kodu GitHub deposu quassnoi/explain-extended-2024 içinde yer alıyor
1 yorum
Hacker News görüşleri
Güzel. Ben de SQLite ile benzer bir tavşan deliğine dalmıştım, ama henüz sinir ağlarını işin içine katacak aşamaya gelmemiştim
makemore ders serisinden[0] ilham almıştım; yaklaşık 1 saat sonra sayma yaklaşımından sinir ağlarına geçiyor, benim ulaştığım nokta da kabaca orasıydı
Bunu ilişkisel modele parçalayarak bakmak gerçekten iyi bir alıştırma
[0] https://www.youtube.com/watch?v=PaCmpygFfXo
İyi bir demo, ancak yazıdaki nedensel maskeleme açıklaması eğitim ile çıkarımı birbirine karıştırmış gibi
Nedensel maskelemenin amacı, eğitim sırasında gelecekteki token'lara “göz atılmasını” engellemek; GPT türü yapılarda çıkarım sırasında özbağlanımı zorunlu kılma amacı da var
Çıkarımda zaten yalnızca son token kullanıldığı için, o token tüm girdi dizisine dikkat eder; dolayısıyla bir sonraki token yalnızca son token'ın embedding'iyle belirlenmiş olmaz
Bunun GPT'nin sürücü döngüsünü doğru ifade edip etmediğini merak ediyorum: prompt'u tokenize etmek,
gpt2(tokens)ile 50257 token olasılığı elde etmek, sonraki token'ı seçmek, token listesine eklemek, durma koşulunu kontrol etmek ve en sonda ters tokenization yapmak gibi görünüyorAma bu, durum makinesinin Shlemiel the painter algoritmasını uygulaması gibi göründüğünden, üretim işinin özündeki hesaplama maliyeti konusunda soru işareti doğuruyor
Bu pencere kayan bir penceredir
gpt2fonksiyonunun içindeDaha çok, üretilen token'ların cümle halinde nasıl toplandığını göstermeye benziyor
İlgili kaynak: A GPT in 60 Lines of NumPy - https://news.ycombinator.com/item?id=34726115 - Şubat 2023, 146 yorum
Benzer bir bağlamda GPT'yi tamamen elektronik tablo fonksiyonlarıyla uyguladım ve yanında izlenebilecek bir video eğitim de hazırladım
https://spreadsheets-are-all-you-need.ai/
LLM'lerin oldukça havalı olduğunu düşünen ama gerçek çalışma biçimlerini mesleki olarak öğrenmesi gerekmemiş biri olarak, 10 dakikalık video bana yıllarca anlaşılması zor HN yorumları ve yüzeysel ana akım medya yazıları okumaktan daha fazlasını öğretti
Hesaplanmayı bekleyen muazzam sayıda kayan noktalı sayının yığıldığını görünce, bu teknolojinin neden bu kadar çok GPU tükettiğini de çok daha sezgisel biçimde anlıyorsunuz
Her eğitim örneğinde her parametrenin türevini hesaplayıp bunun ilgili parametreye nasıl eşlendiğini açıkça gösterirseniz, eğitim süreci de iyi açıklanabilir gibi
Güzel. Bir yıl önce bir tür sihir gibi görünen şey, artık böyle iyi, neredeyse bir çocuğun bile izleyebileceği kadar anlaşılır biçimde açıklanıyor
Yazıda açıklanan model, 2019 başında yayımlanan GPT-2
Bu yazıyı doğru anlamak için sağlam bir bilgisayar bilimi arka planı gerekir; başlığın kendisi bile insanlığın %99'u için erişilebilir değil
GPT ve LLM'lerden tamamen uzak durmuştum; bu yaklaşım metin çıktısında bir dereceye kadar akıcılık üretebiliyor gibi, ama soruları yorumlayıp cevaplama yeteneğine kadar uzanmıyor gibi görünüyor
Gerçekte nasıl çalıştığını açıklayan ya da Python gibi oyuncak bir motor gösteren basit bir blog yazısı veya eğitim var mı merak ediyorum
Şimdiye kadar gördüğüm eğitim materyalleri platformun nasıl kullanılacağına odaklanıyor, iç işleyişi pek ele almıyordu
Özellikle [0], [1], [2] iyi
[0] http://jalammar.github.io/illustrated-transformer/
[1] http://jalammar.github.io/illustrated-gpt2/
[2] https://jalammar.github.io/visualizing-neural-machine-transl...
İlginç biçimde modern makine öğrenmesi Turing tamlığı gerektirmiyor
Buna rağmen AGI olasılığını değerlendiriyoruz; Turing tamlığının gerekli olmadığı sonucuna varılırsa epey ilginç olurdu
Basit bir nedenle: kafamın içinde Turing tam kodun yürütülmesini takip edebiliyorum
Yazı harikaydı; her bileşenin açıklaması net ve oldukça kapsamlıydı, okuması keyifliydi
Ancak yanlışlıkla “+ expand source”a basıp o inanılmaz canavarı gördükten sonra, ChatGPT'nin “SQL büyük dil modeli uygulamak için uygun değildir” demesine hak verir hale geldim
“Sıradan Unicode sinir ağlarıyla iyi uyuşmaz” sözü doğru değil. Örneğin ByT5'e bakın
Yazıda “alfabe” denilen şeye genelde sözlük denir; UTF-8 baytlarını sözlük olarak kullanırsanız token sayısı 149186 değil, 256 olur
ByT5 de tam olarak bunu yapar
Piyasadaki en iyi performans gösteren modellerin hepsinin tokenization kullanması bunun kanıtı
Tokenization'ın temelde bir hack'e yakın olduğu ve idealde bir gün bir şekilde ortadan kaldırılmak istendiği sır değil (https://twitter.com/karpathy/status/1657949234535211009)
İlke olarak bayt düzeyi tokenization'ın kusurları daha büyük modeller ve daha büyük bağlamla telafi edilebilir; ama pratikte aynı zeka düzeyine sahip bir modeli eğitmek çok daha fazla kaynak gerektirir
Elbette bir kelimedeki harf sayısını saymak gibi tokenization'ın zekaya aksine zarar verdiği belirli görevler de var