<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AgentAtnaf</title>
    <description>The latest articles on DEV Community by AgentAtnaf (@agentatnaf).</description>
    <link>https://dev.to/agentatnaf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1413966%2Faceff721-4fc7-4633-96e8-6f800aa975fc.png</url>
      <title>DEV Community: AgentAtnaf</title>
      <link>https://dev.to/agentatnaf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agentatnaf"/>
    <language>en</language>
    <item>
      <title>การใช้ Reinforcement Q- learning ใน Python</title>
      <dc:creator>AgentAtnaf</dc:creator>
      <pubDate>Tue, 09 Apr 2024 12:14:48 +0000</pubDate>
      <link>https://dev.to/agentatnaf/kaaraich-reinforcement-q-learning-ain-python-2g1g</link>
      <guid>https://dev.to/agentatnaf/kaaraich-reinforcement-q-learning-ain-python-2g1g</guid>
      <description>&lt;p&gt;หากเราต้องการสอน AI ให้เรียนรู้ว่าสิ่งที่ทำนั้นเป็นสิ่งที่ถูกต้องหรือไม่เราจะสามารถใช้ Reinforcement Q-learning ซึ่งเป็นอัลกอริธึมการเรียนรู้ของ AI ประเภทหนึ่งที่ใช้ในเรียนรู้แบบ "Reinforcement" กล่าวง่าย ๆ ก็คือเป็นวิธีสำหรับการใช้ Agent ในการเรียนรู้การหาทางที่ดีที่สุดที่จะดำเนินการ(Action)ในสภาพแวดล้อม(environment )เฉพาะและให้รางวัล(Reward)แก่การดำเนินการที่ถูกต้องเพื่อให้เกิดประโยชน์สูงสุด&lt;/p&gt;

&lt;p&gt;โดยบทความนี้เราจะใช้ Reinforcement Q- learning เพื่อสอนรถแท็กซี่ให้รับและส่งผู้โดยสารไปยังสถานที่ที่ถูกต้อง โดยทั้งหมด Code ทั้งหมดนี้จะรันผ่าน Google colab ทัั้งหมด&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ขั้นตอนการทำงาน&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.ทำการติดตั้งและ Import เกม taxi มาก่อน&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;!pip install cmake 'gym[atari]' scipy
import gym

env = gym.make("Taxi-v3").env

env.reset() 
env.render()

print("Action Space {}".format(env.action_space))
print("State Space {}".format(env.observation_space))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ในตัวอย่างจะทำการสร้าง environment สำหรับเกมให้ด้วย&lt;br&gt;
จะได้ผลลัพท์ดังนี้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Action Space Discrete(6)
State Space Discrete(500)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;action space คือ การกระทำที่ทำได้ทั้งหมด&lt;br&gt;
0 = south&lt;br&gt;
1 = north&lt;br&gt;
2 = east&lt;br&gt;
3 = west&lt;br&gt;
4 = pickup&lt;br&gt;
5 = dropoff&lt;br&gt;
ส่วน State Space นั้นคือรหัสตำแหน่งของรถแท็กซี่ ตำแหน่งของผู้โดยสาร และสถานที่ปลายทาง ทั้งหมด&lt;br&gt;
โดย Q-Learning จะใช้ทั้งสองนี้ในการเรียนรู้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;state = env.encode(3, 1, 2, 0) # (taxi row, taxi column, passenger index, destination index)
print("State:", state)

env.s = state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เราสามารถเช็คได้ด้วยว่าในตรงนั้นคือ state ใด&lt;br&gt;
จะได้ออกมาเป็น&lt;br&gt;
&lt;code&gt;State: 328&lt;/code&gt;&lt;br&gt;
และเรายังสามารถเช็ค reward จาก state นั้นได้อีกด้วย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env.P[328]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;{0: [(1.0, 428, -1, False)],&lt;br&gt;
 1: [(1.0, 228, -1, False)],&lt;br&gt;
 2: [(1.0, 348, -1, False)],&lt;br&gt;
 3: [(1.0, 328, -1, False)],&lt;br&gt;
 4: [(1.0, 328, -10, False)],&lt;br&gt;
 5: [(1.0, 328, -10, False)]}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;0-5 นั้นคือ Action &lt;br&gt;
1.0 คือความน่าจำเป็น &lt;br&gt;
428 คือสถานะถัดไปหรือ state นั้นเอง &lt;br&gt;
-1 นั้นคือ reward จาก Action &lt;br&gt;
False สิ่งที่บอกว่าจากการเล่นว่า episode นี้เสร็จหรือยังโดยจะใช้ในระหว่างการเล่นหลาย ๆ ครั้ง&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fb79eu3osza4pqjwj1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fb79eu3osza4pqjwj1c.png" alt="Image description" width="501" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;รูปตัวอย่างเกม&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.ทำการ Import Q-Learing&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import numpy as np
q_table = np.zeros([env.observation_space.n, env.action_space.n])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังจาก import เสร็จแล้วก็ทำการสร้างตาราง Q-table เป็น 500 * 6 ตามเกม&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.ทำการ train Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;เป็นการสอนให้ Agent นั้นได้เรียนรู้ว่าการทำ Action ไหนเป็นทางเลือกที่มอบ Reward มากที่สุด&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%%time
"""Training the agent"""

import random
from IPython.display import clear_output

# Hyperparameters
alpha = 0.1
gamma = 0.6
epsilon = 0.1

# For plotting metrics
all_epochs = []
all_penalties = []

for i in range(1, 100001):
    state = env.reset()

    epochs, penalties, reward, = 0, 0, 0
    done = False

    while not done:
        if random.uniform(0, 1) &amp;lt; epsilon:
            action = env.action_space.sample() # Explore action space
        else:
            action = np.argmax(q_table[state]) # Exploit learned values

        next_state, reward, done, info = env.step(action) 

        old_value = q_table[state, action]
        next_max = np.max(q_table[next_state])

        new_value = (1 - alpha) * old_value + alpha * (reward + gamma * next_max)
        q_table[state, action] = new_value

        if reward == -10:
            penalties += 1

        state = next_state
        epochs += 1

    if i % 100 == 0:
        clear_output(wait=True)
        print(f"Episode: {i}")

print("Training finished.\n")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตรงนี้เวลาในการ Train จะนานแค่ไหนนั้นขึ้นอยู่กับว่าเราตั้ง&lt;br&gt;
for i in range(1, 100001)ไว้เยอะแค่ไหน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;q_table[411]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หากเราเรียกดู Table ออกมาจะเห็นว่าซึ่งก็คือผล Reward จาก Table นั้น ๆ &lt;br&gt;
&lt;code&gt;array([ -2.27325183,  -2.3639511 ,  -2.27325183,  -2.27325184,&lt;br&gt;
        -2.1220864 , -11.2732516 ])&lt;/code&gt;&lt;br&gt;
array ทั้งหมดนี้คือผล Rewardจาก Action ทั้งหมดที่เกิดขึ้นได้โดยจะเห็นได้ว่า &lt;br&gt;
Action ที่ 4 นั้นมีค่ามากที่สุดคือ -2.1220864 หมายความว่านี้คือทางเลือกที่ดีที่สุดนั่นเอง&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.ทำการสรุปค่าและเปรียบเทียบความแตกต่าง&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total_epochs, total_penalties = 0, 0
episodes = 100

for _ in range(episodes):
    state = env.reset()
    epochs, penalties, reward = 0, 0, 0

    done = False

    while not done:
        action = np.argmax(q_table[state])
        state, reward, done, info = env.step(action)

        if reward == -10:
            penalties += 1

        epochs += 1

    total_penalties += penalties
    total_epochs += epochs


print(f"Results after {episodes} episodes:")
print(f"Average timesteps per episode: {total_epochs / episodes}")
print(f"Average penalties per episode: {total_penalties / episodes}")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลที่ออกมาคือ&lt;br&gt;
&lt;code&gt;Results after 100 episodes:&lt;br&gt;
Average timesteps per episode: 12.89&lt;br&gt;
Average penalties per episode: 0.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;เราเห็นได้ว่าประสิทธิภาพของตัว Agent ดีขึ้นอย่างมาก และไม่มีบทลงโทษ(penalties) ซึ่งหมายความว่า Action การรับส่งผู้โดยสาร 100 คนมีความถูกต้องทั้งหมด &lt;/p&gt;

&lt;p&gt;ทั้งนี้เรามาลองดูกับวิธีการที่ไม่ใช้ Q-learning กันบ้าง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;env.s = 411  # set environment to illustration's state

epochs = 0
penalties, reward = 0, 0


done = False

while not done:
    action = env.action_space.sample()
    state, reward, done, info = env.step(action)

    if reward == -10:
        penalties += 1

    epochs += 1


print("Timesteps taken: {}".format(epochs))
print("Penalties incurred: {}".format(penalties))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลที่ได้คือ&lt;br&gt;
&lt;code&gt;Timesteps taken: 1744&lt;br&gt;
Penalties incurred: 581&lt;/code&gt;&lt;br&gt;
ซึ่งเห็นได้ว่ามี Penalties ที่สูงมาก ๆ ถึง 581 ต่างกับการใช้ Q-learning และนี้เป็นการทดลองแค่ 1 episodes เท่านั้น&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;สรุปผล&lt;/strong&gt;&lt;br&gt;
เราจะเห็นได้อย่างชัดเจนเลยว่า Q-learning Agent นั้นมีสามารถรับส่งผู้โดยสารได้อย่างแม่นยำและไม่มี penalties เลย ต่างกับวิธีที่ไม่ใช้ นั้นจะมี penalties ที่สูงและไม่แน่นอนเป็นอย่างมาก &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcvy3laj3wcoewmqsgav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcvy3laj3wcoewmqsgav.png" alt="Image description" width="696" height="208"&gt;&lt;/a&gt; &lt;br&gt;
หากเราทำการหาค่าเฉลี่ย 100 ครั้งจากการให้เล่นเกมจะพบว่า Q-Learing นั้นมีเฉลี่ยที่ดีกว่าเห็นได้ชัดทั้ง 3 ด้าน&lt;/p&gt;

&lt;p&gt;เพราะฉะนั้นนี่เป็นหนึ่งในวิธีการ Train AI ที่ดีมากโดยการโยน AI เข้าไปใน environment ที่ต้องการและให้ AI เรียนรู้จากสิ่งเหล่านั้นแล้วเราส่งคำถามเข้าเพื่อเช็คสิ่งที่ AI นั้นเข้าใจและมอบ Reward จาก Action ที่ AI ทำว่าถูกต้องหรือไม่ &lt;/p&gt;

&lt;p&gt;ข้อมูลจาก&lt;br&gt;
&lt;a href="https://www.learndatasci.com/tutorials/reinforcement-q-learning-scratch-python-openai-gym/"&gt;https://www.learndatasci.com/tutorials/reinforcement-q-learning-scratch-python-openai-gym/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
