{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyMABXXlE3rpStP4tMkjFwII"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"code","execution_count":6,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Uiy0voPRPkuT","executionInfo":{"status":"ok","timestamp":1782902543722,"user_tz":-180,"elapsed":8,"user":{"displayName":"Sinan KALKAN","userId":"09247726101570217229"}},"outputId":"bfe25e17-7521-4be0-d7f4-f23d21a29096"},"outputs":[{"output_type":"stream","name":"stdout","text":["=== TRANSFORMERS: ÖZ-DİKKAT (SELF-ATTENTION) CANLI DEMOSU ===\n","\n","1. Girdi Matrisi (X): 3 Kelime, 4 Boyut\n","[[0.37 0.95 0.73 0.6 ]\n"," [0.16 0.16 0.06 0.87]\n"," [0.6  0.71 0.02 0.97]]\n","--------------------------------------------------\n","2. Sorgu (Q), Anahtar (K), Değer (V) Matrisleri Oluşturuldu.\n","Q Matrisi:\n"," [[1.32 1.15 0.81 0.92]\n"," [0.61 0.8  0.29 0.54]\n"," [1.17 1.26 0.61 0.82]]\n","--------------------------------------------------\n","K Matrisi:\n"," [[0.58 1.29 1.67 1.7 ]\n"," [0.23 0.59 0.31 0.97]\n"," [0.53 1.18 1.1  1.57]]\n","--------------------------------------------------\n","V Matrisi:\n"," [[1.36 1.2  1.5  1.8 ]\n"," [0.26 0.35 0.27 0.54]\n"," [0.65 0.74 0.93 1.2 ]]\n","--------------------------------------------------\n","3. Ham Dikkat Skorları (Q x K.T):\n","[[5.17 2.12 4.39]\n"," [2.78 1.22 2.43]\n"," [4.73 2.   4.07]]\n","-> Dikkat: Köşegen (diagonal) değerlerin genellikle yüksek olduğuna dikkat edin.\n","--------------------------------------------------\n","4. Ölçeklenmiş Skorlar (Scores / sqrt(d_k)):\n","[[2.58 1.06 2.2 ]\n"," [1.39 0.61 1.21]\n"," [2.36 1.   2.04]]\n","--------------------------------------------------\n","5. Dikkat Ağırlıkları (Softmax Sonrası Olasılık Dağılımı):\n","[[0.527 0.115 0.358]\n"," [0.435 0.2   0.365]\n"," [0.506 0.129 0.365]]\n","-> Kontrol: Her satırın toplamı: [1. 1. 1.]\n","--------------------------------------------------\n","6. Final Çıktısı (Z - Öz-Dikkat Sonrası Vektörler):\n","[[0.98 0.94 1.16 1.44]\n"," [0.88 0.86 1.05 1.33]\n"," [0.96 0.92 1.14 1.42]]\n","==================================================\n","\n","=== BONUS: MASKELENMİŞ ÖZ-DİKKAT (DECODER İÇİN) ===\n","\n","Uygulanan Maske:\n"," [[ 0.e+00 -1.e+09 -1.e+09]\n"," [ 0.e+00  0.e+00 -1.e+09]\n"," [ 0.e+00  0.e+00  0.e+00]]\n","--------------------------------------------------\n","Maskelenmiş Skorlar:\n"," [[ 2.58000000e+00 -9.99999999e+08 -9.99999998e+08]\n"," [ 1.39000000e+00  6.10000000e-01 -9.99999999e+08]\n"," [ 2.36000000e+00  1.00000000e+00  2.04000000e+00]]\n","--------------------------------------------------\n","Maskeli Dikkat Ağırlıkları (Softmax Sonrası):\n","[[1.    0.    0.   ]\n"," [0.685 0.315 0.   ]\n"," [0.506 0.129 0.365]]\n","-> Sonuç: Model artık 1. kelimedeyken 2. ve 3. kelimeye odaklanamıyor (Ağırlıklar 0)!\n"]}],"source":["import numpy as np\n","\n","# Öğrencilerin kod her çalıştığında aynı çıktıları görmesi için seed ayarlıyoruz\n","np.random.seed(42)\n","\n","print(\"=== TRANSFORMERS: ÖZ-DİKKAT (SELF-ATTENTION) CANLI DEMOSU ===\\n\")\n","\n","# --- Adım 1: Girdiler (X) ---\n","# 3 kelimelik (\"Yapay\", \"Zeka\", \"Okulu\"), her biri 4 boyutlu bir cümle (embedding) düşünelim.\n","X = np.random.rand(3, 4)\n","print(\"1. Girdi Matrisi (X): 3 Kelime, 4 Boyut\")\n","print(np.round(X, 2))\n","print(\"-\" * 50)\n","\n","# --- Adım 2: Ağırlık Matrisleri (Wq, Wk, Wv) ---\n","# Modelin eğitim sırasında öğrendiği parametreler (basitlik için 4x4 rastgele matrisler)\n","W_q = np.random.rand(4, 4)\n","W_k = np.random.rand(4, 4)\n","W_v = np.random.rand(4, 4)\n","\n","# --- Adım 3: Q, K ve V'nin Doğuşu ---\n","Q = X @ W_q\n","K = X @ W_k\n","V = X @ W_v\n","\n","print(\"2. Sorgu (Q), Anahtar (K), Değer (V) Matrisleri Oluşturuldu.\")\n","print(\"Q Matrisi:\\n\", np.round(Q, 2))\n","print(\"-\" * 50)\n","print(\"K Matrisi:\\n\", np.round(K, 2))\n","print(\"-\" * 50)\n","print(\"V Matrisi:\\n\", np.round(V, 2))\n","print(\"-\" * 50)\n","\n","# --- Adım 4: Ham Skorlar ---\n","# Her kelimenin diğer tüm kelimelere ne kadar benzediğini/dikkat etmesi gerektiğini buluyoruz\n","scores = Q @ K.T\n","print(\"3. Ham Dikkat Skorları (Q x K.T):\")\n","print(np.round(scores, 2))\n","print(\"-> Dikkat: Köşegen (diagonal) değerlerin genellikle yüksek olduğuna dikkat edin.\")\n","print(\"-\" * 50)\n","\n","# --- Adım 5: Ölçekleme (Scaling) ---\n","d_k = K.shape[1]\n","scaled_scores = scores / np.sqrt(d_k)\n","print(\"4. Ölçeklenmiş Skorlar (Scores / sqrt(d_k)):\")\n","print(np.round(scaled_scores, 2))\n","print(\"-\" * 50)\n","\n","# --- Adım 6: Softmax ve Final Çıktısı ---\n","def softmax(x):\n","    # Sayısal kararlılık (numerical stability) için maksimum değeri çıkarıyoruz\n","    e_x = np.exp(x - np.max(x, axis=-1, keepdims=True))\n","    return e_x / np.sum(e_x, axis=-1, keepdims=True)\n","\n","attention_weights = softmax(scaled_scores)\n","print(\"5. Dikkat Ağırlıkları (Softmax Sonrası Olasılık Dağılımı):\")\n","print(np.round(attention_weights, 3))\n","print(\"-> Kontrol: Her satırın toplamı:\", np.sum(attention_weights, axis=-1))\n","print(\"-\" * 50)\n","\n","# Bağlamsal (contextualized) yeni kelime vektörleri\n","Z = attention_weights @ V\n","print(\"6. Final Çıktısı (Z - Öz-Dikkat Sonrası Vektörler):\")\n","print(np.round(Z, 2))\n","print(\"=\" * 50)\n","\n","# --- Adım 7: Bonus - Çözücü (Decoder) için Maskeleme ---\n","print(\"\\n=== BONUS: MASKELENMİŞ ÖZ-DİKKAT (DECODER İÇİN) ===\\n\")\n","\n","# 3x3 bir sıfır matrisi oluştur\n","mask = np.zeros((3, 3))\n","\n","# Üst üçgeni (gelecek adımları) -sonsuz yap\n","# np.triu_indices(n, k=1), k. köşegenin üzerindeki indisleri verir\n","mask[np.triu_indices(3, k=1)] = -1e9 # -np.inf yerine çok büyük bir negatif sayı kullanımı daha kararlıdır\n","\n","print(\"Uygulanan Maske:\\n\", np.round(mask, 2))\n","print(\"-\" * 50)\n","\n","masked_scores = scaled_scores + mask\n","print(\"Maskelenmiş Skorlar:\\n\", np.round(masked_scores, 2))\n","print(\"-\" * 50)\n","\n","masked_attention_weights = softmax(masked_scores)\n","print(\"Maskeli Dikkat Ağırlıkları (Softmax Sonrası):\")\n","print(np.round(masked_attention_weights, 3))\n","print(\"-> Sonuç: Model artık 1. kelimedeyken 2. ve 3. kelimeye odaklanamıyor (Ağırlıklar 0)!\")"]}]}