LLM-Model / islemler.py
YigitCahit's picture
Upload folder using huggingface_hub
ee0cacc verified
# file name 'islemler.py'
from rastgele import cos, PI
def carpim(A, B):
satir_A = len(A)
sutun_A = len(A[0])
satir_B = len(B)
sutun_B = len(B[0])
if sutun_A != satir_B:
raise ValueError("A'nin sutun sayisi B'nin satir sayisina esit olmali!")
sonuc = [[0 for _ in range(sutun_B)] for _ in range(satir_A)]
for i in range(satir_A):
for j in range(sutun_B):
for k in range(sutun_A):
sonuc[i][j] += A[i][k] * B[k][j]
return sonuc
def softmax(vektor):
e = 2.718281828459
maks = max(vektor)
ustel_degerler = [e ** (x - maks) for x in vektor]
toplam = sum(ustel_degerler)
return [deger / toplam for deger in ustel_degerler]
def transpoze(matris):
satir_sayisi = len(matris)
sutun_sayisi = len(matris[0])
yeni_matris = [[0 for _ in range(satir_sayisi)] for _ in range(sutun_sayisi)]
for i in range(satir_sayisi):
for j in range(sutun_sayisi):
yeni_matris[j][i] = matris[i][j]
return yeni_matris
def sin(x):
return cos(x - PI / 2)
def topla(A, B):
return [[A[i][j] + B[i][j] for j in range(len(A[0]))] for i in range(len(A))]
def embed(token_indexleri, embedding_tablosu):
return [embedding_tablosu[i] for i in token_indexleri]
def pozisyonel_encoding(uzunluk, boyut):
pe = [[0.0] * boyut for _ in range(uzunluk)]
for pos in range(uzunluk):
for i in range(0, boyut, 2):
pe[pos][i] = sin(pos / (10000 ** (i / boyut)))
if i + 1 < boyut:
pe[pos][i+1] = cos(pos / (10000 ** (i / boyut)))
return pe
def dogrusal(x, W, b):
sonuc = carpim(x, W)
return [[sonuc[i][j] + b[j] for j in range(len(b))] for i in range(len(sonuc))]
def gelu(x):
PI = 3.141592653589793
k = (2 / PI) ** 0.5
ic = k * (x + 0.044715 * x**3)
ic = max(-20.0, min(20.0, ic))
e = 2.718281828459
exp2 = e ** (2 * ic)
tanh_ic = (exp2 - 1) / (exp2 + 1)
return 0.5 * x * (1 + tanh_ic)
def katman_norm(x, gamma, beta, eps=1e-5):
sonuc = []
for satir in x:
ortalama = sum(satir) / len(satir)
varyans = sum((v - ortalama) ** 2 for v in satir) / len(satir)
normalize = [(v - ortalama) / ((varyans + eps) ** 0.5) for v in satir]
sonuc.append([gamma[i] * normalize[i] + beta[i] for i in range(len(satir))])
return sonuc
def attention(Q, K, V):
d = len(K[0])
olcek = d ** 0.5
kt = transpoze(K)
skorlar = carpim(Q, kt)
olceklenmis = [[s / olcek for s in satir] for satir in skorlar]
agirliklar = [softmax(satir) for satir in olceklenmis]
return carpim(agirliklar, V)
def cok_baslikli_attention(x, att_agirliklar):
kafalar = []
for kafa in att_agirliklar.kafalar:
Q = carpim(x, kafa.WQ)
K = carpim(x, kafa.WK)
V = carpim(x, kafa.WV)
kafalar.append(attention(Q, K, V))
birlesmis = [[] for _ in range(len(x))]
for kafa in kafalar:
for i in range(len(x)):
birlesmis[i].extend(kafa[i])
return dogrusal(birlesmis, att_agirliklar.WO, att_agirliklar.bO)
def ileri_besleme(x, ff_agirliklar):
ara = dogrusal(x, ff_agirliklar.W1, ff_agirliklar.b1)
aktivasyon = [[gelu(d) for d in satir] for satir in ara]
return dogrusal(aktivasyon, ff_agirliklar.W2, ff_agirliklar.b2)
def transformer_blok(x, katman_agirliklar):
att_cikti = cok_baslikli_attention(x, katman_agirliklar.attention)
x = katman_norm(topla(x, att_cikti), katman_agirliklar.gamma1, katman_agirliklar.beta1)
ff_cikti = ileri_besleme(x, katman_agirliklar.ff)
x = katman_norm(topla(x, ff_cikti), katman_agirliklar.gamma2, katman_agirliklar.beta2)
return x