Upload folder using huggingface_hub
Browse files- .gitignore +3 -0
- CONTRIBUTING.md +48 -0
- LICENSE +21 -0
- README.md +136 -0
- app.py +20 -0
- egitim.py +170 -0
- egitim_dongusu.py +67 -0
- islemler.py +114 -0
- kaydet.py +94 -0
- model.py +20 -0
- rastgele.py +64 -0
- sinir_agi.py +60 -0
- teste.py +41 -0
- 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
|