“Attention Is All You Need” Nasıl Çalışır? Part 1/2

Cihan Yalçın
3 min readFeb 24, 2024

--

Bu yazıda ChatGPT, Gemini, BingAI gibi büyük dil modellerinin; Midjourney, Sora, Leaonardo.AI gibi metin-görüntü modellerinin çok kısa sürede inanılmaz seviyelere gelmesine sebep olan, yapay zeka alanındaki en popüler makaleyi,“Attention Is All You Need”i, Türkçe olarak açıklayacağım. Orijinal makalede olduğu gibi ben de ‘cümle çevirisi’ örneği üzerinden anlatacağım ancak çoğu matematik kısımlarını atlayacağım.

Yazacağım herşey benim ‘Transformers’ modellerini öğrenirken kendim tuttuğum notlar olacak, notebook’a buradan erişebilirsiniz.

Transformers nedir?

Transformer modelleri, resim/metin/görüntü oluşturma alanlarında kullanılan bir derin öğrenme ailesidir. Bu modeller ‘Dikkat’ mekanizması olarak bilinen bir yöntemi kullanarak uzun girdi dizilerini etkili bir şekilde öğrenebilen son derece esnek ve güçlü modellerdir. Girdilerin konumlarını ve anlamlarını öğrenmek için ‘Positional Encoding’ ve ‘Input Embedding’ kullanırlar.

https://lih-verma.medium.com/components-of-transformer-architecture-748f74a1a40d

Input Embedding (Girdi Gömme)

Input Embedding kullanarak girdi cümlesindeki her kelimenin diğer kelimelerle olan ‘anlamsal’ bağlantısını bir tablo olarak saklayabiliriz.

Örneğin, rastgele bir girdinin gömmesi bu şekilde görünür.

import torch
import torch.nn as nn

# Gömme Tablosunun boyutlarını tanımla
gömme_boyutu = 16
kelime_sayısı = 16

# Gömme Katmanı
embedding = nn.Embedding(kelime_sayısı, gömme_boyutu)

# Örnek girdi
girdi = torch.LongTensor(
[[1,2,3],
[4,5,6]]
)

çıktı = embedding(girdi)
print("Girdi Verisi Biçimi", girdi.shape) # [2, 3]
print("Çıktı Verisi Biçimi", çıktı.shape) # [2, 3, 16]

Artık yakın anlamlı kelimeler Gömme Tablosunda birbirlerine daha yakın konumlarda, model tahmin yaparken kelimeler arasındaki ilişkileri öğrenirken bu bilgileri kullanacak. Şimdi kelime sırasını da modelimize vermemiz gerek, bunun için Positional Encoding (Pozisyonel Kodlama –berbat bir çeviri-) kullanıyoruz. Eğer sadece input embedding kullanırsak “kedi, bu masanın üzerinde uyuyor” cümlesi ile “bu kedi, masanın üzerinde uyuyor” cümlesi tamamen aynı olur, çünkü input embedding sadece kelimelere bakıyor, kelime yerleriyle ilgilenmiyor.

Positional Encoding

Konuşurken kelimelerin konumları cümleye duygu katmak için kullanılabilir, örneğin “kedi, bu masanın üzerinde uyuyor” cümlesinde ‘bu’ ‘masa’yı işaret ediyor ama “bu kedi masanın üzerinde uyuyor” cümlesinde ‘bu’, ‘kedi’yi işaret ediyor. Her iki cümle de aynı kelimeleri içeriyor ama anlamları farklı, işte burada Positional Encoding devreye giriyor.

Kelimelerin konularını bir Gömme Tablosuna kaydediyoruz.

class PositionalEncoding(nn.Module):
def __init__(self, d_model, seq_len):
super().__init__()
self.d_model = d_model
self.seq_len = seq_len

pe = torch.zeros(seq_len, d_model) # Tamamen sıfırlardan oluşan 2D tensör
position = torch.arange(0, seq_len) # 0-seq_len arasındaki tüm sayılar
div_term = torch.exp(torch.arange(0, d_model, 2).float())i

# bu aşamadan sonra her pozisyon için ayrı ayrı matematiksel işlemler yapılacak
# karmaşık matematik kısımları atlıyorum
https://youtu.be/ISNdQcPhsts?si=6jp0mJcmGl8Uo7f_

Artık hem kelimelerin anlamları ile ilgili bilgilerimiz var hem de kelimelerin konumları ile. Şimdi bu bilgileri birleştiriyoruz, tüm bilgileri beraber modele vereceğiz.

Feed Forward Network (Beslemeli Ağ)

Feed Forward kullanmak çok önemlidir. Modelin girdilerdeki karmaşık ilişkileri anlaması ve gizli özellikleri keşfetmesine yardım eder, doğrusallığı azaltır.

ReLU nedir?

class FeedForward(nn.Module):
def __init__(self, d_model, d_ff, dropout):
super().__init__()
self.linear1 = nn.Linear(d_model, d_ff)
self.dropout = nn.Dropout(dropout)
self.linear2 = nn.Linear(d_ff, d_model)
def forward(self, x):
# (batch, seq_len, d_model) --> (batch, seq_len, d_ff) --> (batch, seq_len, d_model)
# sentence comes like this --> self.linear1 --> self.linear2
x = self.linear1(x)
x = torch.relu(x)
x = self.dropout(x)
x = self.linear2(x)
return x

Part 2'de nasıl Attention Mask oluşturabiliriz?, Attention Skorları nasıl hesaplanır?, MultiHeadAttention nedir?, Encoder-Decoder Blokları nasıl oluşturulur gibi soruların cevapları olacak.

--

--