Yapay Zeka ile Metin Oluşturma: Q-Learning Algoritmasıyla Hedef Cümlelerin Üretilmesi
Tags: ai, qlearning, python, machinelearning
Published: 2024-03-21 15:23:06

## 1. Giriş

Yapay zeka ve makine öğrenimi, çağımızın en heyecan verici alanlarından biridir. Bu alanlar, insan benzeri zekanın yaratılması, karmaşık problemlerin çözülmesi ve veri odaklı kararların alınması gibi birçok uygulama alanında büyük potansiyel sunar. Bu kapsamda, doğal dil işleme (NLP) gibi alt alanlar, insanların doğal dilini anlama, işleme ve üretme yeteneği üzerine odaklanır.

Bu makalede, **Q-learning** algoritmasının doğal dil işleme alanındaki bir uygulamasına odaklanacağız. Özellikle, **belirli bir hedef cümleyi oluşturma** görevini ele alacağız. **Q-learning**, bir tür güçlendirme öğrenme tekniği olup, ajanın (burada algoritma) çevresiyle etkileşim kurarak en yüksek ödülü (reward) elde etmek için stratejiler geliştirmesine dayanır. Bu yöntemi kullanarak, hedef cümleyi oluşturmak için gereken karakter dizisini öğretecek ve modelin istenilen metni üretmesini sağlayacağız.

Bu bölümde, yapay zeka ve makine öğrenimi kavramlarına genel bir giriş yapacak ve ardından **Q-learning** algoritmasının temel prensiplerine odaklanacağız. Daha sonra, bu makalenin odaklanacağı spesifik problemi ve kullanılacak yaklaşımı tanıtacağız. Son olarak, makalenin geri kalanında ele alınacak konulara bir genel bakış sunacağız.

**1.2 Q-Learning Algoritması Nedir ve Nerelerde Kullanılır?**

Q-learning, güçlendirme öğrenme algoritmalarından biridir. Bu algoritma, ajanın (örneğin bir yapay zeka) çevresiyle etkileşimde bulunarak çevresinden öğrendiği bilgileri kullanarak en iyi eylemi seçmeyi amaçlar. Q-learning algoritması, ödül ve ceza gibi geri bildirimlerle ajanın davranışını şekillendirir. Bu algoritma, özellikle durumsal karar verme problemlerinde (örneğin oyunlar, robotik ve otomatik kontrol sistemleri) kullanılır.

Bu çalışmanın ilerleyen bölümlerinde, Q-learning algoritmasının metin oluşturma problemine uygulanması incelenecektir. Bu problemde, bir hedef cümle oluşturmak için Q-learning algoritmasını kullanarak modelin nasıl eğitileceği ve istenilen metni üretmek için nasıl kullanılacağı gösterilecektir.

---

## 2. Problem

![Writing_man](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5o8lsa8muaefexajlkk.jpeg)
Metin oluşturma problemi, yapay zeka tekniklerinin kullanıldığı bir alt alan olup, belirli bir metni (genellikle bir cümle veya paragrafı) otomatik olarak üretme amacını taşır. Bu problemde, bir hedef metin veya cümle belirlenir ve bu metni oluşturabilecek bir modelin eğitimi hedeflenir. Bu tür bir model, doğal dil işleme (NLP) alanında önemli bir uygulama alanına sahip olup, metin tabanlı sistemlerin geliştirilmesinde yaygın bir şekilde kullanılmaktadır.

**2.2 Hedeflenen Cümle ve Karakterler Arasındaki İlişki**

Bu belirli durumda, hedeflenen ifade _Hello, how are you?_ şeklindedir. Bu ifade, temel bir iletişim örneğidir ve metin oluşturma modelinin bu ifadeyi üretebilmesi amaçlanmaktadır. Model, bu ifadeyi oluşturmak için adım adım ilerleyerek her adımda doğru karakteri seçmelidir. Fakat modelin karakter seçimindeki başarısı, **Q-learning** algoritması tarafından öğrenilecek ve geliştirilecektir.


**2.3 Q-Learning ile Problem Çözme Yaklaşımı**

Bu sorunun çözümü için, metin oluşturma sürecini modellemek için **Q-learning** algoritması kullanılmıştır. **Q-learning**, bir ajanın (_burada metin oluşturma modeli_) çevresiyle etkileşime girerek en iyi eylemi (_burada karakter seçimi_) öğrenmesini sağlar. Her adımda, model mevcut durumu değerlendirir, mevcut duruma bağlı olarak bir eylem seçer ve aldığı ödüle göre davranışını günceller. Bu süreç, hedeflenen cümle oluşturulana kadar devam eder. Bu çalışma kapsamında, metin oluşturma problemine odaklanacak ve **Q-learning** algoritmasının _nasıl kullanıldığını_ ve bu algoritmaya dayalı olarak modelin _nasıl eğitileceğini_ detaylı bir şekilde inceleyeceğiz. Ardından, eğitilen modelin kullanımı ve elde edilen _sonuçların değerlendirilmesiyle ilgili ayrıntılara_ odaklanacağız.

---

## 3.  Kod Yapısı ve Açıklamalar


![Code](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4yk8wlsr8ln434pfx9hq.jpeg)

Bu kısımda, kullanılan kodun yapısı, içeriği ve hedefleri detaylı bir şekilde ele alınacaktır. Kod, metin oluşturma problemi için Q-learning algoritmasının nasıl uygulandığını içermektedir. Ek olarak, kullanılan kütüphaneler, değişkenlerin rolleri ve algoritmanın işleyişi ile ilgili açıklamalar sunulacaktır.

**3.2 Kodun İçeriği ve Amaçları**

**Python** programlama dili ile yazdığımız kodumuzun temel amacı, **Q-Learning** algoritması ile belirli bir hedef cümleyi oluşturabilen vir modelin eğitilebilmesidir.

_Kodun Yapısı:_

1. _Hedeflenen cümlenin tanımlanması._
2. _Karakterlerin ve alfabenin belirlenmesi._
3. _Q-learning algoritmasının uygulanması._
4. _Eğitim ve öğrenme sürecinin gerçekleştirilmesi._
5. _Eğitilen modelin kullanılması ve tahminlerin yapılması._

**3.3 Kullanılan Kütüphaneler ve Araçlar**

1. Numpy: Sayısal hesaplamalar için kullanılan bir kütüphane olup, matris işlemleri ve veri manipülasyonu için idealdir
(Kaynak: [Numpy](https://medium.com/bilişim-hareketi/veri-bilimi-i̇çin-temel-python-kütüphaneleri-1-numpy-750429a0d8e5))
2. Matplotlib: Veri görselleştirmesi için kullanılan bir kütüphanedir ve eğitim sonrası elde edilen Q değerlerinin ısı haritası şeklinde görselleştirilmesinde kullanılacaktır.
(Kaynak: [Matplotlib](https://medium.com/datarunner/matplotlibkutuphanesi-1-99087692102b))

**3.4 Değişkenlerin Tanımları ve Rolü**

_Hedef cümle:_ Öğretmek istediğimiz cümle.
```
sentence = "Hello, how are you?"
```

_Karakter listesi:_ Öğrenirken kullanacağı karakterler
```
characters = " abcdefghijklmnopqrstuvwxyz,?"
```

_Learning rate:_ Öğrenme eğrisi
```
alpha = 0.1  # Learning rate
```
_Gelecekteki ödüller için indirim faktörü:_
```
gamma = 0.9
```
_Epochs:_ Kaç kere öğreneceği
```
num_episodes = 10000
```
Bu değişkenlerin her biri, algoritmanın belirli bir adımında hangi eylemin seçileceğini, ödüllerin nasıl hesaplanacağını ve modelin nasıl güncelleneceğini belirlemek için rol oynar.

---


## 4. Kod

Bu bölümde kodu parça parça inceleyip açıklayacağız.

**4.2 Kütüphanelerin indirilmesi**

```
import numpy as np
import matplotlib.pyplot as plt
```
Burada _Numpy_ ve _Matplotlib_ kütüphanelerini import ediyoruz.


**4.3 Gerekli değerlerin belirlenmesi**

```
sentence = "Hello, how are you?"
characters = " abcdefghijklmnopqrstuvwxyz,?"

alpha = 0.1  # Learning rate
gamma = 0.9  # Discount factor for future rewards
num_episodes = 10000  # Number of training episodes

Q = np.zeros((len(sentence), len(characters)))
```

Zaten  **3.3** Bölümde burada belirlediğim değerleri açıkladım. Sadece _Q_ değerini açıklamamız gerekiyor.

> **Q**: Her bir durum ve eylem kombinasyonu, o kombinasyonun değerini ifade eder. Bu değer, o durumda yapılan eylemin ne kadar arzu edildiğini veya avantajlı olduğunu gösterir. (Burada durum cümlenin oluşması eylem ise Harflerin seçilmesidir.)

**4.4 Eğitimin yapılması**

```
for episode in range(num_episodes):
    state = 0  
    done = False
    while not done:
        action = np.random.randint(len(characters))
        
        if state == len(sentence) - 1:
            done = True
        else:
            # Determine the next state
            next_state = state + 1
            
            if sentence[state] == characters[action]:
                reward = 1
            else:
                reward = 0
            
            Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
            
            state = next_state

```
Kodumuz yukarıda görüldüğü gibidir.

Parçalamak gerekirse:

```
state = 0 
done = False
```
Bu bölümde:
- _state_ **0** sayısı ile belirlenir. Bu modelin cümlenin kaçıncı harfinde olduğunu gösterir.

- _done_ **False** olarak belirlenir. Bu bir eğitim sürecinin tamamlanıp tamamlanmadığını gösterir.

---

```
while not done:
        action = np.random.randint(len(characters))
```
Bu bölümde:
- While Loop'umuz başlar ve _action_ içinde rastgele bir karakter atanır.

---

```
if state == len(sentence) - 1:
            done = True
```
Bu bölümde:
- Eğer _state_, cümlenin sonuna geldiyse _done_ değerini **True** yapıyoruz.

---

```
if state == len(sentence) - 1:
            done = True
```
Bu bölümde:
- Eğer _state_, cümlenin sonuna geldiyse _done_ değerini **True** yapıyoruz. Bu sayede eğitim son buluyor.

---

```
else:
     next_state = state + 1
```

Bu bölümde:
- Eğerki cümlenin sonuna gelinmediyse _state_ değerini bir arttırıyoruz ve _next_state_ diye bir değerde tutuyoruz.

---

```
if sentence[state] == characters[action]:
                reward = 1
            else:
                reward = 0
```

Bu bölümde:
- Eğerki cümlede tahmin edilmesi gereken karakteri, modelimiz doğru tahmin edebildiyse _reward_'ı **1**, eğerki doğru tahmin edemediyse _reward_'ı **0** yapıyoruz.

---

```
Q[state, action] += alpha * (reward + gamma *np.max(Q[next_state]) - Q[state, action])
            
state = next_state
```

Bu bölümde:
- Bu bölümde _Q_ değerimiz _reward_ değeri ve diğer değerlerle güncelliyor ve öğrenmeyi sağlıyoruz. Bununla birlikte en sonunda _state_ değerini _next_state_ değerine eşitliyor bu sayede cümle içindeki sonraki karaktere geçiş işlemini sağlıyoruz.

**4.5 Tahminin yapılması**

Tahmin süreci Eğitim sürecine kıyasla daha basit.

```
predicted_sentence = ""
state = 0
while state < len(sentence):
    action = np.argmax(Q[state])
    predicted_sentence += characters[action]
    state += 1
print("Predicted Sentence:", predicted_sentence)
```

Bu tahmin kodumuz. Kısaca:
- Tahmin etmek istediğimiz cümlenin her harfini  eğittimiz _Q_ değerine göre modele tahmin ettiriyor ve bunu sırası ile bir String değerine kaydediyoruz (Kaydetme kısmı opsiyonel)

_Örnek bir çıktı:_

1. 100 Tekrar ile eğitilmiş:

![100Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i58aahzmhdaf0nwlnu69.PNG)

2. 500 Tekrar ile eğitilmiş:

![500Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2upy6k36fn072ltbhht.PNG)

3. 1000 Tekrar ile eğitilmiş:

![1000Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqg9d3n8gt8xtvo22dxz.PNG)

İlerleyen zamanlarda örnek çıktıları karşılaştıracağız ama şimdilik Eğitim süresinin arttması ile modelimizin doğru tahmin etme beceresi paralel yükseliyor diyebiliriz. Bu çıkarımımız da bizi modelin öğrendiği düşüncesine götürüyor.

**4.6 Modelin Göselleştirilmesi**

En önemli bölümlerden biri olan **Görselleştirme**...

```
plt.figure(figsize=(12, 8))
plt.imshow(Q, cmap='hot', interpolation='nearest')
plt.colorbar(label='Q Value')
plt.title("Distribution of Q Values")
plt.xlabel("Action (Character)")
plt.ylabel("State")
plt.xticks(np.arange(len(characters)), list(characters))
plt.yticks(np.arange(len(sentence)), list(sentence))
plt.show()
```

Yukarıda ki kod bloğu ile birlikte modelimizin Hangi durumda hangi aksiyonu daha doğru bulduğunu gösteriyor. Bu görselleştirme için _Isı Haritası_ mdoelini seçtim. Çünkü anlaması ve okumasını daha basit olduğunu düşünüyorum ama siz dilediğiniz gibi diğer görselleştirme modellerini deneyebilirsiniz.


_Örnek bir çıktı:_

1. 100 Tekrar ile eğitilmiş:


![100Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ygwm2wnjdnb8x38mm7eh.png)

2. 500 Tekrar ile eğitilmiş:


![500Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f6uj7jc102x1z7zk6qky.png)

3. 1000 Tekrar ile eğitilmiş:


![1000Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/94l3xsgu4qcyq755km3r.png)


## 5. Sonuçları karşılaştırma

1. 100 Tekrar ile eğitilmiş:

![100Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i58aahzmhdaf0nwlnu69.PNG)

![100Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ygwm2wnjdnb8x38mm7eh.png)

2. 500 Tekrar ile eğitilmiş:

![500Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2upy6k36fn072ltbhht.PNG)

![500Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f6uj7jc102x1z7zk6qky.png)

3. 1000 Tekrar ile eğitilmiş:

![1000Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yqg9d3n8gt8xtvo22dxz.PNG)

![1000Ep](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/94l3xsgu4qcyq755km3r.png)
Sonuç olarak 3 ayrı tekrar sayısı ile eğitilmiş modelimiz var (_100-500-1000_). Modellerimizin hiç biri _'?'_ bilemedi. Yüz tekrar ile eğitilmiş modelin çıktısı anlamsız olurken. Bin tekrar ile eğitilmis modelin çıktısı bir nebze daha anlaşılıt olmuş.

Ayrıca görüyoruz ki; Bin tekrar ile eğitilmiş modelimiz _'E'_ harfini nerelerde kullanacağını çok iyi bir şekilde öğrenmiş eğerki biraz daha eğitmeye devam etseydik yada parametlerimizi daha isabetli parametreler ile değiştirseydik, belkide soru işaretini de öğrenebilirdi ?..

**Bunu da kendiniz deneyin...**


## 6. Özet ve Kaynakça

_Özetlemek Gerekirse:_

> Bu yazımda Q-Learning algoritmasına bir **cümle tahmini** projesi ile değindik. Kendiniz denemek isterseniz Github üzerinden kodu indirebilir veya Fotoğraflara ulaşabilirsiniz.

Github:{% embed https://github.com/Ertugrulmutlu/Q_learning_Sentence_prediction_with %}

**Detaylı öğrenim için İngilizce Kaynaklar:**

- https://www.youtube.com/watch?v=qhRNvCVVJaA
- https://www.techtarget.com/searchenterpriseai/definition/Q-learning#:~:text=Q-learning%20is%20a%20machine,way%20animals%20or%20children%20learn.

**Detaylı öğrenim için Türkçe Kaynaklar:**

- https://www.youtube.com/watch?v=zDKGmJMGoDg
- https://medium.com/deep-learning-turkiye/q-learninge-giriş-6742b3c5ed2b

Eğer ki bir "Öneri-İstek-Soru"'nuz var ise lütfen yorum bırakın yada mail üzerinden bana ulaşın...