Memasuki paradigma baru di mana agen belajar dari interaksi: komponen agent, environment, action, dan reward, lalu algoritma dasar Q-Learning, DQN, dan PPO, dengan praktik Gymnasium pada bandit problem dan cartpole.

Semua model yang kita bangun sejauh ini belajar dari data statis: contoh berlabel yang sudah ada. Episode ini memperkenalkan paradigma yang sama sekali berbeda: reinforcement learning (RL) — belajar dari tindakan dan konsekuensinya.
Bayangkan belajar main sepeda: tidak ada dataset "cara menyeimbangkan badan". Kalian mencoba, jatuh, merasakan sakit (hukuman), menyesuaikan, dan akhirnya bisa. RL meniru proses ini: agent belajar kebijakan optimal melalui trial-and-error dengan sinyal reward. Ini cara model belajar hal yang belum pernah terjadi di data historis — relevan untuk robotika, game, dan optimasi keputusan berurutan.
RL dibangun dari lima komponen:
| Komponen | Definisi | Contoh: robot pembersih |
|---|---|---|
| Agent | Pembuat keputusan | Robot |
| Environment | Dunia tempat agent bertindak | Ruangan |
| State | Situasi yang diamati agent | Posisi robot + status lantai |
| Action | Keputusan yang diambil | Maju, belok, bersihkan |
| Reward | Umpan balik skalar | +1 lantai bersih, -1 nabrak |
Lingkaran inilah inti RL: agent mengamati state, memilih action, environment merespons dengan state baru dan reward, lalu berulang. Tujuan agent: memaksimalkan total reward kumulatif, bukan hanya reward langsung — kadang langkah yang tampak merugi sekarang membuahkan hasil besar di kemudian hari (exploration).
Dilema paling fundamental di RL: eksploitasi (lakukan action yang sudah terbukti bagus) vs eksplorasi (coba action baru yang bisa lebih baik). Terlalu banyak eksploitasi → agent terjebak di solusi suboptimal. Terlalu banyak eksplorasi → buang waktu.
Strategi paling umum: epsilon-greedy. Dengan probabilitas ε pilih action acak (eksplorasi), selebihnya pilih action terbaik menurut pengetahuan saat ini (eksploitasi):
import random
def choose_action(q_values, epsilon=0.1):
if random.random() < epsilon:
return random.randrange(len(q_values)) # eksplorasi
return int(q_values.argmax()) # eksploitasiepsilon biasanya diturunkan seiring waktu — awal banyak eksplorasi, makin lama makin eksploitasi.
Q-Learning adalah algoritma dasar RL: ia memelihara tabel Q-table berisi nilai Q(s, a) — "seberapa baik action a di state s". Agent memperbarui tabel ini setiap langkah menggunakan Bellman equation:
alpha = 0.1 # learning rate
gamma = 0.9 # discount factor
def update_q(q_table, state, action, reward, next_state):
best_next = q_table[next_state].max()
q_table[state, action] += alpha * (
reward + gamma * best_next - q_table[state, action]
)| Parameter | Arti |
|---|---|
alpha (learning rate) | Seberapa cepat nilai lama diganti nilai baru |
gamma (discount factor) | Seberapa jauh agent peduli pada reward masa depan |
gamma dekat 1 → agent mempertimbangkan reward jangka panjang; dekat 0 → hanya peduli reward segera. Q-Learning bagus untuk state terbatas; untuk state kontinu tak terbatas, tabel tidak mungkin — di situlah DQN masuk.
Deep Q-Network (DQN) mengganti tabel Q dengan neural network yang menghitung Q(s, a) dari state apa pun. Inilah RL yang mengalahkan manusia di game Atari (DeepMind, 2015).
import torch
import torch.nn as nn
class DQN(nn.Module):
def __init__(self, n_state, n_action):
super().__init__()
self.net = nn.Sequential(
nn.Linear(n_state, 128),
nn.ReLU(),
nn.Linear(128, n_action),
)
def forward(self, state):
return self.net(state) # Q(s, a) untuk semua actionDua trick yang membuat DQN stabil: experience replay (simpan transisi dan sampling acak untuk training — memutus korelasi antar langkah) dan target network (Q yang di-update pelan-pelan). Detail implementasi penuh ada di series learn-deep-learning; di sini yang penting memahami konsepnya.
PPO (Proximal Policy Optimization) adalah keluarga policy gradient: ia mengoptimalkan kebijakan (policy) langsung — memetakan state ke action — alih-alih nilai Q. PPO menambahkan batasan agar update kebijakan tidak terlalu besar per langkah, sehingga training stabil.
PPO adalah default pilihan industri 2026: stabil, bisa dilatih paralel, dan bekerja baik di robotika, game, dan fine-tuning LLM (RLHF). Untuk praktik langsung, kalian biasanya tidak menulis PPO dari nol — memakai library seperti Stable-Baselines3:
from stable_baselines3 import PPO
model = PPO("MlpPolicy", env, verbose=1)
model.learn(total_timesteps=100_000)Gymnasium (penerus OpenAI Gym) menyediakan banyak environment siap pakai — tempat terbaik untuk memulai.
Masalah bandit adalah RL paling sederhana: satu state, beberapa action, reward acak. Agent harus menemukan action terbaik. Ini pondasi eksplorasi vs eksploitasi.
import gymnasium as gym
import numpy as np
env = gym.make("BanditTwoArmedHighLowFixed-v0")
q = np.zeros(env.action_space.n)
counts = np.zeros(env.action_space.n)
for _ in range(200):
action = choose_action(q, epsilon=0.2)
_, reward, terminated, _, _ = env.step(action)
counts[action] += 1
q[action] += (reward - q[action]) / counts[action]
env.reset()
print(f"Q-values: {q}") # action terbaik punya Q tertinggiPerhatikan: Q diperbarui sebagai rata-rata bergerak dari reward per action — persis konsep Q-Learning dalam bentuk paling sederhana.
Cartpole adalah environment klasik: tiang di atas kereta, agent menggerakkan kereta kiri/kanan agar tiang tidak jatuh. State-nya kontinu (posisi, sudut), sehingga Q-Learning tabel tidak cukup — tempat ideal mencoba DQN atau PPO:
import gymnasium as gym
env = gym.make("CartPole-v1")
state, _ = env.reset()
for _ in range(10):
action = env.action_space.sample() # acak dulu
state, reward, terminated, truncated, _ = env.step(action)
if terminated or truncated:
state, _ = env.reset()
print(f"Action space: {env.action_space}")
print(f"Observation: {state}")Latih dengan PPO dari Stable-Baselines3, dan dalam ratusan ribu timesteps agent akan menjaga tiang tetap berdiri:
model = PPO("MlpPolicy", "CartPole-v1", verbose=0)
model.learn(total_timesteps=200_000)
state, _ = env.reset()
total_reward = 0
for _ in range(500):
action, _ = model.predict(state, deterministic=True)
state, reward, terminated, truncated, _ = env.step(action)
total_reward += reward
if terminated or truncated:
break
print(f"Total reward: {total_reward}") # 500 = sempurnaNote
RL butuh kesabaran: training sering terlihat "tidak belajar" di awal, lalu tiba-tiba melompat. Jangan menilai keberhasilan dari beberapa episode pertama — pantau kurva reward sepanjang training.
RL bukan solusi universal — ia untuk masalah keputusan berurutan dengan reward yang jelas:
| Cocok untuk RL | Tidak cocok |
|---|---|
| Game & simulasi | Klasifikasi/regresi standar |
| Robotika | Masalah yang bisa diselesaikan supervised |
| Optimasi keputusan jangka panjang | Data statis dengan label lengkap |
| Personalisasi dinamis | Masalah satu keputusan saja |
Aturan praktis: jika kalian bisa membuat dataset berlabel, supervised learning lebih mudah dan stabil. RL layak dipertimbangkan saat keputusan saling bergantung dan berurutan.
gamma terlalu kecil — agent hanya peduli reward segera, tidak belajar strategi jangka panjang.epsilon tidak diturunkan — terus eksplorasi, tidak pernah memantapkan strategi.env.reset() antar episode — state kotor, training kacau.Pada episode 21 ini, kalian telah mengenal paradigma reinforcement learning.
Inti yang harus dibawa pulang:
epsilon-greedy.Di episode 22 selanjutnya kita membahas scale: big data & AutoML — memproses dataset besar dengan Polars, Dask, dan Spark ML, lalu AutoML (auto-sklearn, H2O, Optuna + TPOT) dan kapan memakai AutoML vs manual. Sampai jumpa di episode 22!