YigitCahit commited on
Commit
ee0cacc
·
verified ·
1 Parent(s): e8d6889

Upload folder using huggingface_hub

Browse files
Files changed (14) hide show
  1. .gitignore +3 -0
  2. CONTRIBUTING.md +48 -0
  3. LICENSE +21 -0
  4. README.md +136 -0
  5. app.py +20 -0
  6. egitim.py +170 -0
  7. egitim_dongusu.py +67 -0
  8. islemler.py +114 -0
  9. kaydet.py +94 -0
  10. model.py +20 -0
  11. rastgele.py +64 -0
  12. sinir_agi.py +60 -0
  13. teste.py +41 -0
  14. veri.py +41 -0
.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ model.json
2
+ veri.txt
3
+ .*.*
CONTRIBUTING.md ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Projeye Katkıda Bulunma
2
+ Öncelikle bu projeye zaman ayırdığınız ve katkıda bulunmak istediğiniz için teşekkür ederiz!
3
+
4
+ Bu belge, projeye sorunsuz bir şekilde katkıda bulunabilmeniz için izlemeniz gereken adımları ve proje standartlarını içermektedir.
5
+
6
+ ## Geliştirme Süreci
7
+ Bu projenin temel odak noktası, dış kütüphanelere ve hazır paketlere olan bağımlılığı en aza indirerek yapay zeka çekirdek mimarilerini sıfırdan inşa etmektir.
8
+ * Yeni bir özellik eklerken ağır dış bağımlılıklar getirmekten kaçının.
9
+ * Yorum satırlarını yalnızca gerekli yerlerde kullanmaya özen gösterin.
10
+ * Yeni modüllerin test edilmiş ve sorunsuz çalışır olduğundan emin olun.
11
+
12
+ ## Hata Bildirimi ve Çözülmesi
13
+ Karşılaştığınız bir hatayı düzeltmek veya bildirmek için şu adımları izleyin:
14
+ 1. **Hata Kontrolü:** Karşılaştığınız sorunla ilgili daha önce bir Issue açılıp açılmadığını kontrol edin.
15
+ 2. **Issue Açma:** Hata daha önce bildirilmediyse yeni bir Issue açın. Hata ile ilgili beklenen sonucu, karşılaştığınız sonucu ve hatayı gidermek için izlenebilecek adımları detaylıca yazın.
16
+ 3. **Çözüm Önerisi:** Hata ile ilgili çözüm önerilerinizi veya hata üzerinde kendiniz çalışıyorsanız ilgili Issue altına yorum olarak bildirin. Ardından aşağıdaki katkı sürecini izleyerek bir Pull Request açın.
17
+
18
+ ## Yeni Özellik Ekleme ve Kod Katkısı Süreci
19
+ Yeni bir özellik eklemek veya kodda bir iyileştirme yapmak için doğrudan ana depoya kod gönderemezsiniz. Lütfen aşağıdaki **Fork > Test > Pull Request** iş akışını takip edin:
20
+
21
+ 1. Projeyi Forklayın
22
+ Ana projeyi kendi GitHub hesabınıza Forklayın
23
+
24
+ 2. Klonlayın ve Dal Oluşturun
25
+ Forkladığınız projeyi çalışma ortamınızda klonlayın ve ardından üzerinde çalışacağınız yeni bir dal oluşturun. main ve master dalları üzerinde çalışmaktan kaçının.
26
+
27
+ 3. Geliştirme ve Test
28
+ * Gerekli geliştirme ve eklemeleri yapın.
29
+ * Yaptığınız geliştirme ve eklemelerin mevcut depoyu bozmadığından emin olmak için yerel çalışma ortamınızda **mutlaka test edin.**
30
+
31
+ 4. Değişiklikleri Gönderin
32
+ Yaptığınız değişiklikleri anlaşılır commit mesajlarıyla kaydedin ve kendi forkladığınız deponuza gönderin.
33
+
34
+ 5. Pull Request Açın
35
+ * Orijinal projenin GitHub sayfasına gidin ve kendi deponuzdaki dalı, orijinal projenin ana dalı ile karşılaştırarak Pull Request oluşturun.
36
+ * Pull Request açıklamasında nelerin değiştirdiğinizi, hangi problemi çözdüğünüzü (eğer bir Issue çözüyorsa Fixes #IssueNumarası şeklinde) ve yerel ortamınızda hangi testleri uyguladığınızı detaylıca yazın.
37
+
38
+ ## Pull Request Değerlendirme Standartları
39
+ Açılan PR'lar proje yöneticileri tarafından incelenir. Pull Request'inizin şu şartları sağlaması beklenir:
40
+ * **Test Edilmiş Olmalı:** Çalışmama veya mevcut mimariyi bozma potansiyeli içeren değişiklikler kabul edilmez.
41
+ * **Temiz Kod:** Geliştirme standartlarına ve dosya yapısına uygun olmalıdır.
42
+ * **Açıklayıcı Olmalı:** Ne yapıldığı PR metninde net bir şekilde ifade edilmelidir.
43
+
44
+ İnceleme sonucunda sizden Review Changes olarak bazı düzeltmeler veya değişiklikler istenebilir.
45
+
46
+ ---
47
+
48
+ Katkılarınız için **Teşekkürler**
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mert Cahit Yiğit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Transformer Tabanlı Türkçe Dil Modeli
2
+
3
+ Bu proje, Transformer mimarisine dayalı, saf Python ile yazılmış bir yapay sinir ağı kullanan Türkçe metin üreticisidir. PyTorch veya NumPy dahil hiçbir kütüphane kullanılmamıştır. Model, verilen başlangıç kelimesinden başlayarak yeni metinler üretebilir. Sürekli güncellenecek ve geliştirilecektir.
4
+
5
+ ## Proje Özellikleri
6
+
7
+ - **Transformer Mimarisi**: Multi-head attention mekanizması ile gelişmiş metin işleme
8
+ - **Pozisyonel Kodlama**: Token pozisyonlarını modellemek için positional encoding
9
+ - **Layer Normalization**: Ağ katmanlarında normalizasyon
10
+ - **Geri Yayılım Algoritması**: Backpropagation ile eğitim
11
+ - **Model Kaydı/Yükleme**: Eğitilmiş modeli kaydetme ve yükleme özelliği
12
+ - **Metin Üretimi**: Eğitilmiş model ile dinamik metin üretme
13
+
14
+ ## Dosya Yapısı
15
+
16
+ ```
17
+ ├── app.py # Ana uygulama - model eğitimi ve metin üretimi
18
+ ├── sinir_agi.py # Sinir ağı mimarisi ve yapı tanımları
19
+ ├── model.py # İleri geçiş (forward pass) işlemleri
20
+ ├── egitim.py # Eğitim algoritmaları ve loss fonksiyonları
21
+ ├── egitim_dongusu.py # Eğitim döngüsü ve metin üretim fonksiyonları
22
+ ├── islemler.py # Matematiksel işlemler (çarpım, softmax, vb.)
23
+ ├── kaydet.py # Model kaydı ve yükleme işlemleri
24
+ ├── rastgele.py # Rastgele sayı üretimi ve matematiksel fonksiyonlar
25
+ ├── veri.txt # Eğitim verisi (Türkçe metinler)
26
+ ├── model.json # Kaydedilmiş model ağırlıkları
27
+ ├── teste.py # Test kodları
28
+ └── README.md # Bu dosya
29
+ ```
30
+
31
+ ## Nasıl Kullanılır
32
+
33
+ ### Gereksinimleri
34
+ Python 3.7 veya daha yüksek bir sürüm gereklidir. Harici kütüphane bağımlılığı yoktur.
35
+
36
+ ### Eğitim ve Metin Üretimi
37
+
38
+ Ana programı çalıştırın:
39
+
40
+ ```bash
41
+ python app.py
42
+ ```
43
+
44
+ `app.py` şunları yapar:
45
+ 1. Mevcut bir model varsa (`model.json`) yükler
46
+ 2. Model yoksa yeni bir model eğitir
47
+ 3. Eğitilmiş model ile metin üretimi yapar
48
+
49
+ ### Örnek Kullanım
50
+
51
+ ```python
52
+ from egitim_dongusu import egit, uret
53
+ from kaydet import modeli_kaydet, modeli_yukle
54
+
55
+ # Yeni model eğitimi
56
+ ag, kelime_sayi, sayi_kelime = egit(
57
+ dosya_adi="veri.txt",
58
+ epochs=100,
59
+ ogrenme_hizi=0.001,
60
+ pencere=4
61
+ )
62
+
63
+ # Model kaydı
64
+ modeli_kaydet(ag, kelime_sayi, sayi_kelime, "model.json")
65
+
66
+ # Metin üretimi
67
+ uret(ag, kelime_sayi, sayi_kelime,
68
+ baslangic_kelime="merhaba",
69
+ uzunluk=10)
70
+ ```
71
+
72
+ ## Ana Bileşenler
73
+
74
+ ### `SinirAgi` Sınıfı
75
+ Transformer modelinin ana yapısını tanımlar:
76
+ - Embedding tablosu
77
+ - Pozisyonel encoding
78
+ - Transformer katmanları
79
+ - Çıkış doğrusal katmanı
80
+
81
+ ### Transformer Bloğu
82
+ - **Multi-Head Attention**: Birden fazla dikkat başı ile gelişmiş ilişki modelleme
83
+ - **Feed-Forward Network**: Non-lineer dönüşümler
84
+ - **Layer Normalization**: Katman çıktılarının normalizasyonu
85
+
86
+ ### Eğitim
87
+ - **Cross-Entropy Loss**: Sınıflandırma kaybı hesaplaması
88
+ - **Backpropagation**: Gradyan hesaplaması ve parametre güncelleme
89
+ - **Softmax**: Çıkış olasılıkları
90
+
91
+ ## Eğitim Parametreleri
92
+
93
+ Default parametreler:
94
+ - **Epochs**: 100 - Eğitim iterasyonu sayısı
95
+ - **Learning Rate**: 0.001 - Öğrenme hızı
96
+ - **Window Size**: 4 - Giriş token sayısı
97
+ - **Hidden Dimension**: 64 - Gizli katman boyutu
98
+ - **Feedforward Dimension**: 256 - Feedforward katman boyutu
99
+ - **Number of Heads**: 4 - Attention başlarının sayısı
100
+ - **Number of Layers**: 2 - Transformer katman sayısı
101
+
102
+ Bu parametreler `app.py` dosyasında değiştirilebilir.
103
+
104
+ ## Veri Formatı
105
+
106
+ `veri.txt` dosyası, her satırın bir cümle olduğu Türkçe metinler içerir:
107
+
108
+ ```
109
+ merhaba bugün nasılsın umarım iyisindir
110
+ merhaba bugün hava çok güzel
111
+ selam bugün neler yapacaksın
112
+ ...
113
+ ```
114
+
115
+ ## Metin Üretimi
116
+
117
+ Eğitilmiş model, verilen başlangıç kelimesinden başlayarak ardışık tokenlar predikt eder:
118
+
119
+ ```python
120
+ uret(ag, kelime_sayi, sayi_kelime,
121
+ baslangic_kelime="merhaba",
122
+ uzunluk=20)
123
+ ```
124
+
125
+ Bu, "merhaba" ile başlayan ve 20 kelime uzunluğunda bir metin üretir.
126
+
127
+ ## Notlar
128
+
129
+ - Model tamamıyla sıfırdan geliştirilmiştir (harici ML kütüphaneleri kullanılmamıştır)
130
+ - Tüm matematiksel işlemler NumPy veya benzeri kütüphaneler olmadan uygulanmıştır
131
+ - Model yapısı ve eğitim algoritması tamamen Python ile kodlanmıştır
132
+ - Proje eğitsel amaçlı geliştirilmiştir ve aktif geliştirme aşamasındadır
133
+
134
+ ## Lisans
135
+
136
+ MIT
app.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from egitim_dongusu import egit, uret
2
+ from kaydet import modeli_kaydet, modeli_yukle
3
+ import os
4
+
5
+ MODEL_DOSYASI = "model.json"
6
+
7
+ if os.path.exists(MODEL_DOSYASI):
8
+ print("Model bulundu, yükleniyor...")
9
+ ag, kelime_sayi, sayi_kelime = modeli_yukle(MODEL_DOSYASI)
10
+ else:
11
+ print("Yeni model egitiliyor...")
12
+ ag, kelime_sayi, sayi_kelime = egit(
13
+ dosya_adi="veri.txt",
14
+ epochs=100,
15
+ ogrenme_hizi=0.001,
16
+ pencere=4
17
+ )
18
+ modeli_kaydet(ag, kelime_sayi, sayi_kelime, MODEL_DOSYASI)
19
+
20
+ uret(ag, kelime_sayi, sayi_kelime, baslangic_kelime="merhaba", uzunluk=10)
egitim.py ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # file name 'egitim.py'
2
+ from model import ileri_gecis
3
+ from islemler import carpim, transpoze, embed, pozisyonel_encoding, transformer_blok, dogrusal, topla, katman_norm, cok_baslikli_attention
4
+
5
+ def cross_entropy_kayip(olasiliklar, hedef_index):
6
+ p = max(olasiliklar[hedef_index], 1e-10)
7
+ y = (p - 1) / (p + 1)
8
+ y2 = y * y
9
+ sonuc = 0.0
10
+ for i in range(100):
11
+ n = 2 * i + 1
12
+ sonuc += (y ** n) / n
13
+ return -2 * sonuc
14
+
15
+ def softmax_cross_entropy_gradyan(olasiliklar, hedef_index):
16
+ grad = olasiliklar[:]
17
+ grad[hedef_index] -= 1.0
18
+ return grad
19
+
20
+ def dogrusal_gradyan(grad_cikti, x, W):
21
+ grad_x = carpim(grad_cikti, transpoze(W))
22
+ grad_W = carpim(transpoze(x), grad_cikti)
23
+ grad_b = [sum(grad_cikti[i][j] for i in range(len(grad_cikti)))
24
+ for j in range(len(grad_cikti[0]))]
25
+ return grad_x, grad_W, grad_b
26
+
27
+ def guncelle(agirlik, grad, ogrenme_hizi):
28
+ return [
29
+ [agirlik[i][j] - ogrenme_hizi * grad[i][j] for j in range(len(agirlik[0]))]
30
+ for i in range(len(agirlik))
31
+ ]
32
+
33
+ def vektor_guncelle(vektor, grad, ogrenme_hizi):
34
+ return [vektor[i] - ogrenme_hizi * grad[i] for i in range(len(vektor))]
35
+
36
+ def egitim_adimi(ag, token_indexleri, hedef_index, ogrenme_hizi=0.001):
37
+ from islemler import embed, pozisyonel_encoding, topla, transformer_blok
38
+
39
+ olasiliklar = ileri_gecis(ag, token_indexleri)
40
+ kayip = cross_entropy_kayip(olasiliklar, hedef_index)
41
+
42
+ grad = softmax_cross_entropy_gradyan(olasiliklar, hedef_index)
43
+ grad_matris = [grad]
44
+
45
+ vektorler = embed(token_indexleri, ag.embedding)
46
+ pe = pozisyonel_encoding(len(token_indexleri), ag.model_boyutu)
47
+ x = topla(vektorler, pe)
48
+
49
+ ara_x = [x]
50
+ for katman in ag.katmanlar:
51
+ x = transformer_blok(x, katman)
52
+ ara_x.append(x)
53
+
54
+ son_token = [ara_x[-1][-1]]
55
+ grad_x, grad_W, grad_b = dogrusal_gradyan(grad_matris, son_token, ag.cikti_W)
56
+ ag.cikti_W = guncelle(ag.cikti_W, grad_W, ogrenme_hizi)
57
+ ag.cikti_b = vektor_guncelle(ag.cikti_b, grad_b, ogrenme_hizi)
58
+ son_token_grad = grad_x[0]
59
+ grad_katman = [son_token_grad for _ in range(len(token_indexleri))]
60
+
61
+ for i in reversed(range(len(ag.katmanlar))):
62
+ grad_katman = transformer_blok_gradyan(
63
+ grad_katman,
64
+ ara_x[i],
65
+ ag.katmanlar[i]
66
+ )
67
+
68
+ return kayip
69
+
70
+ def gelu_gradyan(x):
71
+ PI = 3.141592653589793
72
+ k = (2 / PI) ** 0.5
73
+ ic = k * (x + 0.044715 * x**3)
74
+ ic = max(-20.0, min(20.0, ic))
75
+ e = 2.718281828459
76
+ exp2 = e ** (2 * ic)
77
+ tanh_ic = (exp2 - 1) / (exp2 + 1)
78
+
79
+ dtanh = 1 - tanh_ic ** 2
80
+ dic = k * (1 + 3 * 0.044715 * x**2)
81
+ return 0.5 * (1 + tanh_ic) + 0.5 * x * dtanh * dic
82
+
83
+ def ileri_besleme_gradyan(grad_cikti, x, ff_agirliklar):
84
+ ara = [[0.0] * len(ff_agirliklar.b1) for _ in range(len(x))]
85
+ ara_aktif = dogrusal(x, ff_agirliklar.W1, ff_agirliklar.b1)
86
+ aktivasyon = [[max(0.0, v) for v in satir] for satir in ara_aktif]
87
+
88
+ grad_x2, grad_W2, grad_b2 = dogrusal_gradyan(grad_cikti, aktivasyon, ff_agirliklar.W2)
89
+
90
+ grad_aktif = [
91
+ [grad_x2[i][j] * gelu_gradyan(ara_aktif[i][j]) for j in range(len(ara_aktif[0]))]
92
+ for i in range(len(ara_aktif))
93
+ ]
94
+
95
+ grad_x1, grad_W1, grad_b1 = dogrusal_gradyan(grad_aktif, x, ff_agirliklar.W1)
96
+
97
+ return grad_x1, grad_W1, grad_b1, grad_W2, grad_b2
98
+
99
+ def transformer_blok_gradyan(grad_cikti, x, katman_agirliklar):
100
+ if isinstance(grad_cikti[0], (int, float)):
101
+ grad_cikti = [grad_cikti]
102
+
103
+ att_cikti = cok_baslikli_attention(x, katman_agirliklar.attention)
104
+ x_att = katman_norm(topla(x, att_cikti), katman_agirliklar.gamma1, katman_agirliklar.beta1)
105
+
106
+ grad_ln2 = []
107
+ grad_gamma2_toplam = [0.0] * len(katman_agirliklar.gamma2)
108
+ grad_beta2_toplam = [0.0] * len(katman_agirliklar.beta2)
109
+
110
+ for i in range(len(grad_cikti)):
111
+ gx, gg, gb = katman_norm_gradyan(grad_cikti[i], x_att[i], katman_agirliklar.gamma2)
112
+ grad_ln2.append(gx)
113
+ for j in range(len(gg)):
114
+ grad_gamma2_toplam[j] += gg[j]
115
+ grad_beta2_toplam[j] += gb[j]
116
+
117
+ katman_agirliklar.gamma2 = vektor_guncelle(katman_agirliklar.gamma2, grad_gamma2_toplam, 0.001)
118
+ katman_agirliklar.beta2 = vektor_guncelle(katman_agirliklar.beta2, grad_beta2_toplam, 0.001)
119
+
120
+ grad_ff_x, gW1, gb1, gW2, gb2 = ileri_besleme_gradyan(grad_ln2, x_att, katman_agirliklar.ff)
121
+ katman_agirliklar.ff.W1 = guncelle(katman_agirliklar.ff.W1, gW1, 0.001)
122
+ katman_agirliklar.ff.b1 = vektor_guncelle(katman_agirliklar.ff.b1, gb1, 0.001)
123
+ katman_agirliklar.ff.W2 = guncelle(katman_agirliklar.ff.W2, gW2, 0.001)
124
+ katman_agirliklar.ff.b2 = vektor_guncelle(katman_agirliklar.ff.b2, gb2, 0.001)
125
+
126
+ grad_x_att = [
127
+ [grad_ff_x[i][j] + grad_ln2[i][j] for j in range(len(grad_ff_x[0]))]
128
+ for i in range(len(grad_ff_x))
129
+ ]
130
+
131
+ grad_ln1 = []
132
+ grad_gamma1_toplam = [0.0] * len(katman_agirliklar.gamma1)
133
+ grad_beta1_toplam = [0.0] * len(katman_agirliklar.beta1)
134
+
135
+ for i in range(len(grad_x_att)):
136
+ gx, gg, gb = katman_norm_gradyan(grad_x_att[i], x[i], katman_agirliklar.gamma1)
137
+ grad_ln1.append(gx)
138
+ for j in range(len(gg)):
139
+ grad_gamma1_toplam[j] += gg[j]
140
+ grad_beta1_toplam[j] += gb[j]
141
+
142
+ katman_agirliklar.gamma1 = vektor_guncelle(katman_agirliklar.gamma1, grad_gamma1_toplam, 0.001)
143
+ katman_agirliklar.beta1 = vektor_guncelle(katman_agirliklar.beta1, grad_beta1_toplam, 0.001)
144
+
145
+ return grad_ln1
146
+
147
+ def katman_norm_gradyan(grad_cikti, x, gamma, eps=1e-5):
148
+ n = len(x)
149
+ ortalama = sum(x) / n
150
+ varyans = sum((v - ortalama) ** 2 for v in x) / n
151
+ std = (varyans + eps) ** 0.5
152
+
153
+ x_norm = [(v - ortalama) / std for v in x]
154
+
155
+ grad_gamma = [grad_cikti[i] * x_norm[i] for i in range(n)]
156
+ grad_beta = grad_cikti[:]
157
+
158
+ grad_x_norm = [grad_cikti[i] * gamma[i] for i in range(n)]
159
+
160
+ grad_varyans = sum(grad_x_norm[i] * (x[i] - ortalama) for i in range(n)) * (-0.5) * (varyans + eps) ** (-1.5)
161
+ grad_ortalama = sum(-grad_x_norm[i] / std for i in range(n)) + grad_varyans * sum(-2 * (x[i] - ortalama) for i in range(n)) / n
162
+
163
+ grad_x = [
164
+ grad_x_norm[i] / std +
165
+ grad_varyans * 2 * (x[i] - ortalama) / n +
166
+ grad_ortalama / n
167
+ for i in range(n)
168
+ ]
169
+
170
+ return grad_x, grad_gamma, grad_beta
egitim_dongusu.py ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # file name 'egitim_dongusu.py'
2
+ from sinir_agi import SinirAgi
3
+ from egitim import egitim_adimi
4
+ from veri import dosyadan_yukle, sozluk_olustur, egitim_ornekleri_olustur
5
+ from model import ileri_gecis
6
+
7
+ def egit(dosya_adi="veri.txt", epochs=10, ogrenme_hizi=0.001, pencere=4):
8
+ cumleler = dosyadan_yukle(dosya_adi)
9
+ kelime_sayi, sayi_kelime = sozluk_olustur(cumleler)
10
+ ornekler = egitim_ornekleri_olustur(cumleler, kelime_sayi, pencere)
11
+
12
+ sozluk_boyutu = len(kelime_sayi)
13
+ print(f"Sozcuk sayisi: {sozluk_boyutu}")
14
+ print(f"Egitim ornegi: {len(ornekler)}")
15
+
16
+ ag = SinirAgi(
17
+ sozluk_boyutu=sozluk_boyutu,
18
+ model_boyutu=64,
19
+ ff_boyutu=256,
20
+ kafa_sayisi=4,
21
+ katman_sayisi=2
22
+ )
23
+
24
+ for epoch in range(epochs):
25
+ toplam_kayip = 0.0
26
+ for i, (girdi, hedef) in enumerate(ornekler):
27
+ if len(girdi) == 0:
28
+ continue
29
+ kayip = egitim_adimi(ag, girdi, hedef, ogrenme_hizi)
30
+ toplam_kayip += kayip
31
+
32
+ if i % 100 == 0:
33
+ print(f"Adim {epoch+1} | Ornek {i}/{len(ornekler)} | Kayip: {kayip:.4f}")
34
+
35
+ ort_kayip = toplam_kayip / len(ornekler)
36
+ print(f"\nAdim {epoch+1} tamamlandi | Ortalama Kayip: {ort_kayip:.4f}\n")
37
+
38
+ return ag, kelime_sayi, sayi_kelime
39
+
40
+ def uret(ag, kelime_sayi, sayi_kelime, baslangic_kelime, uzunluk=10, pencere=4, temperature=0.8):
41
+ if baslangic_kelime not in kelime_sayi:
42
+ print("Kelime bulunamadı.")
43
+ return
44
+
45
+ from rastgele import rastgele, tohum_uret
46
+
47
+ indexler = [kelime_sayi[baslangic_kelime]]
48
+ for _ in range(uzunluk):
49
+ girdi = indexler[-pencere:]
50
+ olasiliklar = ileri_gecis(ag, girdi)
51
+
52
+ olasiliklar = [p ** (1 / temperature) for p in olasiliklar]
53
+ toplam = sum(olasiliklar)
54
+ olasiliklar = [p / toplam for p in olasiliklar]
55
+
56
+ r = rastgele(tohum_uret(), 1)[0]
57
+ kumulatif = 0.0
58
+ tahmin = 0
59
+ for j, p in enumerate(olasiliklar):
60
+ kumulatif += p
61
+ if r < kumulatif:
62
+ tahmin = j
63
+ break
64
+
65
+ indexler.append(tahmin)
66
+
67
+ print(" ".join(sayi_kelime[i] for i in indexler))
islemler.py ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # file name 'islemler.py'
2
+ from rastgele import cos, PI
3
+
4
+ def carpim(A, B):
5
+ satir_A = len(A)
6
+ sutun_A = len(A[0])
7
+ satir_B = len(B)
8
+ sutun_B = len(B[0])
9
+
10
+ if sutun_A != satir_B:
11
+ raise ValueError("A'nin sutun sayisi B'nin satir sayisina esit olmali!")
12
+
13
+ sonuc = [[0 for _ in range(sutun_B)] for _ in range(satir_A)]
14
+
15
+ for i in range(satir_A):
16
+ for j in range(sutun_B):
17
+ for k in range(sutun_A):
18
+ sonuc[i][j] += A[i][k] * B[k][j]
19
+
20
+ return sonuc
21
+
22
+ def softmax(vektor):
23
+ e = 2.718281828459
24
+ maks = max(vektor)
25
+ ustel_degerler = [e ** (x - maks) for x in vektor]
26
+ toplam = sum(ustel_degerler)
27
+ return [deger / toplam for deger in ustel_degerler]
28
+
29
+ def transpoze(matris):
30
+ satir_sayisi = len(matris)
31
+ sutun_sayisi = len(matris[0])
32
+ yeni_matris = [[0 for _ in range(satir_sayisi)] for _ in range(sutun_sayisi)]
33
+ for i in range(satir_sayisi):
34
+ for j in range(sutun_sayisi):
35
+ yeni_matris[j][i] = matris[i][j]
36
+ return yeni_matris
37
+
38
+ def sin(x):
39
+ return cos(x - PI / 2)
40
+
41
+ def topla(A, B):
42
+ return [[A[i][j] + B[i][j] for j in range(len(A[0]))] for i in range(len(A))]
43
+
44
+ def embed(token_indexleri, embedding_tablosu):
45
+ return [embedding_tablosu[i] for i in token_indexleri]
46
+
47
+ def pozisyonel_encoding(uzunluk, boyut):
48
+ pe = [[0.0] * boyut for _ in range(uzunluk)]
49
+ for pos in range(uzunluk):
50
+ for i in range(0, boyut, 2):
51
+ pe[pos][i] = sin(pos / (10000 ** (i / boyut)))
52
+ if i + 1 < boyut:
53
+ pe[pos][i+1] = cos(pos / (10000 ** (i / boyut)))
54
+ return pe
55
+
56
+ def dogrusal(x, W, b):
57
+ sonuc = carpim(x, W)
58
+ return [[sonuc[i][j] + b[j] for j in range(len(b))] for i in range(len(sonuc))]
59
+
60
+ def gelu(x):
61
+ PI = 3.141592653589793
62
+ k = (2 / PI) ** 0.5
63
+ ic = k * (x + 0.044715 * x**3)
64
+ ic = max(-20.0, min(20.0, ic))
65
+ e = 2.718281828459
66
+ exp2 = e ** (2 * ic)
67
+ tanh_ic = (exp2 - 1) / (exp2 + 1)
68
+ return 0.5 * x * (1 + tanh_ic)
69
+
70
+ def katman_norm(x, gamma, beta, eps=1e-5):
71
+ sonuc = []
72
+ for satir in x:
73
+ ortalama = sum(satir) / len(satir)
74
+ varyans = sum((v - ortalama) ** 2 for v in satir) / len(satir)
75
+ normalize = [(v - ortalama) / ((varyans + eps) ** 0.5) for v in satir]
76
+ sonuc.append([gamma[i] * normalize[i] + beta[i] for i in range(len(satir))])
77
+ return sonuc
78
+
79
+ def attention(Q, K, V):
80
+ d = len(K[0])
81
+ olcek = d ** 0.5
82
+ kt = transpoze(K)
83
+ skorlar = carpim(Q, kt)
84
+ olceklenmis = [[s / olcek for s in satir] for satir in skorlar]
85
+ agirliklar = [softmax(satir) for satir in olceklenmis]
86
+ return carpim(agirliklar, V)
87
+
88
+ def cok_baslikli_attention(x, att_agirliklar):
89
+ kafalar = []
90
+ for kafa in att_agirliklar.kafalar:
91
+ Q = carpim(x, kafa.WQ)
92
+ K = carpim(x, kafa.WK)
93
+ V = carpim(x, kafa.WV)
94
+ kafalar.append(attention(Q, K, V))
95
+
96
+ birlesmis = [[] for _ in range(len(x))]
97
+ for kafa in kafalar:
98
+ for i in range(len(x)):
99
+ birlesmis[i].extend(kafa[i])
100
+
101
+ return dogrusal(birlesmis, att_agirliklar.WO, att_agirliklar.bO)
102
+
103
+ def ileri_besleme(x, ff_agirliklar):
104
+ ara = dogrusal(x, ff_agirliklar.W1, ff_agirliklar.b1)
105
+ aktivasyon = [[gelu(d) for d in satir] for satir in ara]
106
+ return dogrusal(aktivasyon, ff_agirliklar.W2, ff_agirliklar.b2)
107
+
108
+ def transformer_blok(x, katman_agirliklar):
109
+ att_cikti = cok_baslikli_attention(x, katman_agirliklar.attention)
110
+ x = katman_norm(topla(x, att_cikti), katman_agirliklar.gamma1, katman_agirliklar.beta1)
111
+
112
+ ff_cikti = ileri_besleme(x, katman_agirliklar.ff)
113
+ x = katman_norm(topla(x, ff_cikti), katman_agirliklar.gamma2, katman_agirliklar.beta2)
114
+ return x
kaydet.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # file name 'kaydet.py'
2
+ def modeli_kaydet(ag, kelime_sayi, sayi_kelime, dosya_adi="model.json"):
3
+ import json
4
+
5
+ veri = {
6
+ "sozluk_boyutu": ag.sozluk_boyutu,
7
+ "model_boyutu": ag.model_boyutu,
8
+ "ff_boyutu": ag.ff_boyutu,
9
+ "kafa_sayisi": ag.kafa_sayisi,
10
+ "katman_sayisi": ag.katman_sayisi,
11
+ "kelime_sayi": kelime_sayi,
12
+ "sayi_kelime": {str(k): v for k, v in sayi_kelime.items()},
13
+ "embedding": ag.embedding,
14
+ "cikti_W": ag.cikti_W,
15
+ "cikti_b": ag.cikti_b,
16
+ "katmanlar": []
17
+ }
18
+
19
+ for katman in ag.katmanlar:
20
+ katman_veri = {
21
+ "gamma1": katman.gamma1,
22
+ "beta1": katman.beta1,
23
+ "gamma2": katman.gamma2,
24
+ "beta2": katman.beta2,
25
+ "ff": {
26
+ "W1": katman.ff.W1,
27
+ "b1": katman.ff.b1,
28
+ "W2": katman.ff.W2,
29
+ "b2": katman.ff.b2,
30
+ },
31
+ "attention": {
32
+ "WO": katman.attention.WO,
33
+ "bO": katman.attention.bO,
34
+ "kafalar": [
35
+ {
36
+ "WQ": kafa.WQ,
37
+ "WK": kafa.WK,
38
+ "WV": kafa.WV,
39
+ }
40
+ for kafa in katman.attention.kafalar
41
+ ]
42
+ }
43
+ }
44
+ veri["katmanlar"].append(katman_veri)
45
+
46
+ with open(dosya_adi, "w", encoding="utf-8") as f:
47
+ json.dump(veri, f, ensure_ascii=False)
48
+
49
+ print(f"Model kaydedildi: {dosya_adi}")
50
+
51
+
52
+ def modeli_yukle(dosya_adi="model.json"):
53
+ import json
54
+ from sinir_agi import SinirAgi, KatmanAgirliklari, FFAgirliklari, AttentionAgirliklari, KafaAgirliklari
55
+
56
+ with open(dosya_adi, "r", encoding="utf-8") as f:
57
+ veri = json.load(f)
58
+
59
+ ag = SinirAgi(
60
+ sozluk_boyutu=veri["sozluk_boyutu"],
61
+ model_boyutu=veri["model_boyutu"],
62
+ ff_boyutu=veri["ff_boyutu"],
63
+ kafa_sayisi=veri["kafa_sayisi"],
64
+ katman_sayisi=veri["katman_sayisi"]
65
+ )
66
+
67
+ ag.embedding = veri["embedding"]
68
+ ag.cikti_W = veri["cikti_W"]
69
+ ag.cikti_b = veri["cikti_b"]
70
+
71
+ for i, katman_veri in enumerate(veri["katmanlar"]):
72
+ ag.katmanlar[i].gamma1 = katman_veri["gamma1"]
73
+ ag.katmanlar[i].beta1 = katman_veri["beta1"]
74
+ ag.katmanlar[i].gamma2 = katman_veri["gamma2"]
75
+ ag.katmanlar[i].beta2 = katman_veri["beta2"]
76
+
77
+ ag.katmanlar[i].ff.W1 = katman_veri["ff"]["W1"]
78
+ ag.katmanlar[i].ff.b1 = katman_veri["ff"]["b1"]
79
+ ag.katmanlar[i].ff.W2 = katman_veri["ff"]["W2"]
80
+ ag.katmanlar[i].ff.b2 = katman_veri["ff"]["b2"]
81
+
82
+ for j, kafa_veri in enumerate(katman_veri["attention"]["kafalar"]):
83
+ ag.katmanlar[i].attention.kafalar[j].WQ = kafa_veri["WQ"]
84
+ ag.katmanlar[i].attention.kafalar[j].WK = kafa_veri["WK"]
85
+ ag.katmanlar[i].attention.kafalar[j].WV = kafa_veri["WV"]
86
+
87
+ ag.katmanlar[i].attention.WO = katman_veri["attention"]["WO"]
88
+ ag.katmanlar[i].attention.bO = katman_veri["attention"]["bO"]
89
+
90
+ kelime_sayi = veri["kelime_sayi"]
91
+ sayi_kelime = {int(k): v for k, v in veri["sayi_kelime"].items()}
92
+
93
+ print(f"Model yüklendi: {dosya_adi}")
94
+ return ag, kelime_sayi, sayi_kelime
model.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # file name 'model.py'
2
+ from islemler import embed, pozisyonel_encoding, topla, transformer_blok, dogrusal, softmax
3
+ from sinir_agi import SinirAgi
4
+
5
+ def ileri_gecis(ag, token_indexleri):
6
+ vektorler = embed(token_indexleri, ag.embedding)
7
+ pe = pozisyonel_encoding(len(token_indexleri), ag.model_boyutu)
8
+ x = topla(vektorler, pe)
9
+
10
+ for katman in ag.katmanlar:
11
+ x = transformer_blok(x, katman)
12
+
13
+ son_token = [x[-1]]
14
+ logitler = dogrusal(son_token, ag.cikti_W, ag.cikti_b)
15
+ olasiliklar = softmax(logitler[0])
16
+ return olasiliklar
17
+
18
+ def tahmin_et(ag, token_indexleri):
19
+ olasiliklar = ileri_gecis(ag, token_indexleri)
20
+ return olasiliklar.index(max(olasiliklar))
rastgele.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # file name 'rastgele.py'
2
+ import time
3
+
4
+ PI = 3.141592653589793
5
+ COS_TABLOSU = []
6
+ HASSASIYET = 2000
7
+
8
+ def log(x, iterasyon=100):
9
+ if x <= 0:
10
+ raise ValueError("log tanimsiz")
11
+ y = (x - 1) / (x + 1)
12
+ y2 = y * y
13
+ sonuc = 0.0
14
+ for i in range(iterasyon):
15
+ n = 2 * i + 1
16
+ sonuc += (y ** n) / n
17
+ return 2 * sonuc
18
+
19
+ def cos(x):
20
+ x = x % (2 * PI)
21
+ if x > PI:
22
+ x -= 2 * PI
23
+
24
+ sonuc = 0.0
25
+ terim = 1.0
26
+ for i in range(1, 20):
27
+ sonuc += terim
28
+ terim *= -x * x / ((2 * i - 1) * (2 * i))
29
+ return sonuc
30
+
31
+ def tohum_uret():
32
+ t = time.time()
33
+ mikrosaniye = int(t * 1_000_000)
34
+
35
+ a = mikrosaniye & 0xFFFF
36
+ b = (mikrosaniye >> 16) & 0xFFFF
37
+ c = (mikrosaniye >> 32) & 0xFFFF
38
+
39
+ karisik = (a * b * c) ^ (a << 3) ^ (b >> 2) ^ c
40
+ return karisik
41
+
42
+ def rastgele(tohum, n):
43
+ A = 1664525
44
+ C = 1013904223
45
+ M = 2**32
46
+
47
+ sonuclar = []
48
+ durum = tohum
49
+ for _ in range(n):
50
+ durum = (A * durum + C) % M
51
+ sonuclar.append(durum / M)
52
+ return sonuclar
53
+
54
+ def gauss_rastgele(tohum, n):
55
+ tekil = rastgele(tohum, n * 2 + 2)
56
+ sonuclar = []
57
+ for i in range(0, n * 2, 2):
58
+ u1 = max(tekil[i], 1e-10)
59
+ u2 = tekil[i+1]
60
+ ln = -2 * log(u1)
61
+ kok = ln ** 0.5
62
+ cos_deg = cos(2 * PI * u2)
63
+ sonuclar.append(kok * cos_deg)
64
+ return sonuclar[:n]
sinir_agi.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # file name 'sinir_agi.py'
2
+ from rastgele import gauss_rastgele, tohum_uret
3
+
4
+ def agirlik_olustur(satirlar, sutunlar):
5
+ degerler = gauss_rastgele(tohum_uret(), satirlar * sutunlar)
6
+ return [
7
+ [degerler[i * sutunlar + j] * 0.02 for j in range(sutunlar)]
8
+ for i in range(satirlar)
9
+ ]
10
+
11
+ def sifir_vektor(boyut):
12
+ return [0.0] * boyut
13
+
14
+ def bir_vektor(boyut):
15
+ return [1.0] * boyut
16
+
17
+ class KafaAgirliklari:
18
+ def __init__(self, model_boyutu, kafa_boyutu):
19
+ self.WQ = agirlik_olustur(model_boyutu, kafa_boyutu)
20
+ self.WK = agirlik_olustur(model_boyutu, kafa_boyutu)
21
+ self.WV = agirlik_olustur(model_boyutu, kafa_boyutu)
22
+
23
+ class AttentionAgirliklari:
24
+ def __init__(self, kafa_sayisi, model_boyutu):
25
+ kafa_boyutu = model_boyutu // kafa_sayisi
26
+ self.kafalar = [KafaAgirliklari(model_boyutu, kafa_boyutu) for _ in range(kafa_sayisi)]
27
+ self.WO = agirlik_olustur(model_boyutu, model_boyutu)
28
+ self.bO = sifir_vektor(model_boyutu)
29
+
30
+ class FFAgirliklari:
31
+ def __init__(self, model_boyutu, ff_boyutu):
32
+ self.W1 = agirlik_olustur(model_boyutu, ff_boyutu)
33
+ self.b1 = sifir_vektor(ff_boyutu)
34
+ self.W2 = agirlik_olustur(ff_boyutu, model_boyutu)
35
+ self.b2 = sifir_vektor(model_boyutu)
36
+
37
+ class KatmanAgirliklari:
38
+ def __init__(self, kafa_sayisi, model_boyutu, ff_boyutu):
39
+ self.attention = AttentionAgirliklari(kafa_sayisi, model_boyutu)
40
+ self.ff = FFAgirliklari(model_boyutu, ff_boyutu)
41
+ self.gamma1 = bir_vektor(model_boyutu)
42
+ self.beta1 = sifir_vektor(model_boyutu)
43
+ self.gamma2 = bir_vektor(model_boyutu)
44
+ self.beta2 = sifir_vektor(model_boyutu)
45
+
46
+ class SinirAgi:
47
+ def __init__(self, sozluk_boyutu, model_boyutu, ff_boyutu, kafa_sayisi, katman_sayisi):
48
+ self.sozluk_boyutu = sozluk_boyutu
49
+ self.model_boyutu = model_boyutu
50
+ self.ff_boyutu = ff_boyutu
51
+ self.kafa_sayisi = kafa_sayisi
52
+ self.katman_sayisi = katman_sayisi
53
+
54
+ self.embedding = agirlik_olustur(sozluk_boyutu, model_boyutu)
55
+ self.katmanlar = [
56
+ KatmanAgirliklari(kafa_sayisi, model_boyutu, ff_boyutu)
57
+ for _ in range(katman_sayisi)
58
+ ]
59
+ self.cikti_W = agirlik_olustur(model_boyutu, sozluk_boyutu)
60
+ self.cikti_b = sifir_vektor(sozluk_boyutu)
teste.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from sinir_agi import SinirAgi
2
+ from islemler import embed, dogrusal, softmax
3
+ from egitim import dogrusal_gradyan, guncelle, vektor_guncelle, cross_entropy_kayip
4
+
5
+ def basit_ileri(ag, token_idx):
6
+ x = [ag.embedding[token_idx]] # [1 x model_boyutu]
7
+ logitler = dogrusal(x, ag.cikti_W, ag.cikti_b)
8
+ return softmax(logitler[0])
9
+
10
+ def basit_egitim(ag, girdi_idx, hedef_idx, ogrenme_hizi=0.01):
11
+ olasiliklar = basit_ileri(ag, girdi_idx)
12
+ kayip = cross_entropy_kayip(olasiliklar, hedef_idx)
13
+
14
+ grad = olasiliklar[:]
15
+ grad[hedef_idx] -= 1.0
16
+ grad_matris = [grad]
17
+
18
+ x = [ag.embedding[girdi_idx]]
19
+ grad_x, grad_W, grad_b = dogrusal_gradyan(grad_matris, x, ag.cikti_W)
20
+
21
+ ag.cikti_W = guncelle(ag.cikti_W, grad_W, ogrenme_hizi)
22
+ ag.cikti_b = vektor_guncelle(ag.cikti_b, grad_b, ogrenme_hizi)
23
+
24
+ # Embedding güncelle
25
+ for j in range(len(ag.embedding[girdi_idx])):
26
+ ag.embedding[girdi_idx][j] -= ogrenme_hizi * grad_x[0][j]
27
+
28
+ return kayip
29
+
30
+ # Test
31
+ ag = SinirAgi(sozluk_boyutu=10, model_boyutu=16, ff_boyutu=32, kafa_sayisi=2, katman_sayisi=1)
32
+
33
+ MERHABA = 0
34
+ BUGÜN = 1
35
+
36
+ print("Egitim başlıyor: 'merhaba → bugün'")
37
+ for epoch in range(200):
38
+ kayip = basit_egitim(ag, MERHABA, BUGÜN)
39
+ if epoch % 20 == 0:
40
+ olasiliklar = basit_ileri(ag, MERHABA)
41
+ print(f"Epoch {epoch:3d} | Kayıp: {kayip:.4f} | P(bugün|merhaba): {olasiliklar[BUGÜN]:.4f}")
veri.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # file name 'veri.py'
2
+ def dosyadan_yukle(dosya_adi="veri.txt"):
3
+ bitis = ".!?\n"
4
+ noktalamalar = ",;:\"'()[]{}-_/#*"
5
+
6
+ with open(dosya_adi, "r", encoding="utf-8") as f:
7
+ metin = f.read()
8
+
9
+ metin = metin.replace("İ", "i").replace("I", "ı").replace("Ş", "ş") \
10
+ .replace("Ğ", "ğ").replace("Ü", "ü").replace("Ö", "ö") \
11
+ .replace("Ç", "ç").lower()
12
+
13
+ for isaret in bitis:
14
+ metin = metin.replace(isaret, "|")
15
+ for isaret in noktalamalar:
16
+ metin = metin.replace(isaret, " ")
17
+
18
+ cumleler = [c.split() for c in metin.split("|") if c.split()]
19
+ return cumleler
20
+
21
+ def sozluk_olustur(cumleler):
22
+ kelime_sayi = {}
23
+ sayi_kelime = {}
24
+ sayac = 0
25
+ for cumle in cumleler:
26
+ for kelime in cumle:
27
+ if kelime not in kelime_sayi:
28
+ kelime_sayi[kelime] = sayac
29
+ sayi_kelime[sayac] = kelime
30
+ sayac += 1
31
+ return kelime_sayi, sayi_kelime
32
+
33
+ def egitim_ornekleri_olustur(cumleler, kelime_sayi, pencere=4):
34
+ ornekler = []
35
+ for cumle in cumleler:
36
+ indexler = [kelime_sayi[k] for k in cumle if k in kelime_sayi]
37
+ for i in range(1, len(indexler)):
38
+ girdi = indexler[max(0, i - pencere):i]
39
+ hedef = indexler[i]
40
+ ornekler.append((girdi, hedef))
41
+ return ornekler