Skip to content

Latest commit

 

History

History
196 lines (159 loc) · 9.16 KB

File metadata and controls

196 lines (159 loc) · 9.16 KB

Interpretasi Hasil: Q-learning Tabular di FrozenLake

Dokumen ini menginterpretasikan output aktual dari notebook qlearning_frozenlake.ipynb setelah dijalankan di lingkungan offline (8000 episode, is_slippery=True, peta default 4x4).

1. Setup Environment

Jumlah state : 16
Jumlah aksi  : 4  (0=LEFT, 1=DOWN, 2=RIGHT, 3=UP)

Ini konsisten dengan peta default FrozenLake 4x4:

S F F F
F H F H
F F F H
H F F G

16 state = 16 sel grid (indeks 0–15, dibaca kiri-ke-kanan lalu atas-ke-bawah), 4 aksi diskrit per state. Ruang state-aksi ini kecil (64 pasangan (s,a)) — inilah yang membuat representasi tabel eksplisit (Q[s,a]) masih feasible di sini, berbeda dengan environment Stock-MARL pada main.py yang state-nya berdimensi tinggi dan kontinu (harga, indikator teknikal, dsb.) sehingga harus memakai neural network (DQN dengan MlpPolicy).

2. Inisialisasi Q-table

Bentuk Q-table: (16, 4)
array([[0., 0., 0., 0.], ... , [0., 0., 0., 0.]])

Seluruh 64 entri bernilai nol. Ini adalah titik awal yang wajar: agen belum punya pengalaman apa pun, sehingga semua pasangan state-aksi dianggap "tidak diketahui nilainya", bukan "buruk". Nilai-nilai ini baru akan terisi lewat TD-update begitu agen mulai bereksplorasi — perhatikan bagaimana angka ini berubah drastis maknanya begitu dibandingkan dengan kebijakan (policy) akhir di bagian 5.

3. Progres Training Loop

Episode  1000 | epsilon=0.611 | success rate=3.3%
Episode  2000 | epsilon=0.374 | success rate=8.7%
Episode  3000 | epsilon=0.231 | success rate=15.4%
Episode  4000 | epsilon=0.144 | success rate=24.7%
Episode  5000 | epsilon=0.091 | success rate=36.8%
Episode  6000 | epsilon=0.059 | success rate=45.5%
Episode  7000 | epsilon=0.040 | success rate=55.4%
Episode  8000 | epsilon=0.028 | success rate=59.8%

Tiga observasi penting:

  • Korelasi epsilon-turun vs sukses-naik. Setiap kali epsilon turun sekitar separuhnya (0.611 → 0.374 → 0.231 → ...), success rate 1000-episode-terakhir naik hampir dua kali lipat. Ini bukan kebetulan: makin kecil epsilon, makin sering agen memakai argmax(Q[s,:]) (exploit) alih-alih aksi acak (explore). Karena Q-table sudah cukup terisi di titik ini, exploit lebih sering berarti "ambil rute aman menuju goal" — jadi success rate naik seiring epsilon turun.
  • Tidak ada fase datar/stagnan. Kenaikan berlangsung nyaris linear-monoton dari 3.3% → 59.8%. Ini indikasi bahwa alpha=0.1 dan gamma=0.99 cukup seimbang: TD-update cukup agresif untuk memperbaiki tabel setiap episode, tapi tidak sampai membuat estimasi berosilasi liar (yang biasanya terlihat sebagai success rate naik-turun tajam antar checkpoint 1000-episode).
  • Growth belum jenuh di episode ke-8000. Angka 59.8% pada log terakhir masih di bawah target 70–80% — tapi ini angka rata-rata training yang masih bercampur eksplorasi (epsilon=0.028, artinya ~2.8% aksi masih acak). Ini penting untuk membaca bagian evaluasi di §5.

4. Plot Success Rate per 100 Episode (output.png)

Kurva pada output.png menunjukkan pola pembelajaran klasik untuk Q-learning tabular di environment stochastic:

  • 0–1000 episode: kurva menempel di dekat 0–5%. Q-table masih hampir kosong, dan eksplorasi tinggi (epsilon mendekati 1) membuat agen sering jatuh ke hole sebelum sempat belajar rute aman.
  • 1000–4000 episode: kenaikan bertahap dengan noise cukup besar antar blok 100 episode (naik-turun antara ~10–35%). Ini wajar: is_slippery=True membuat hasil satu blok 100 episode bervariasi meski policy dasarnya sudah membaik, karena transisi tidak deterministik.
  • 4000–8000 episode: tren naik makin jelas dan mendekati (bahkan sempat menyentuh) garis target 70% di sekitar episode ke-7800–8000, meski dengan fluktuasi blok-ke-blok yang masih terlihat (turun ke ~43% lalu naik lagi ke ~65%). Fluktuasi ini adalah sisa eksplorasi acak (epsilon belum nol) ditambah stochasticity lantai licin — bukan tanda Q-table gagal konvergen.

Secara keseluruhan bentuk kurva memenuhi kriteria deliverable: dari mendekati 0% naik menuju rentang 70–80%, meski nilai per-blok-100 masih berosilasi karena training belum sepenuhnya greedy.

5. Evaluasi Policy Murni (Greedy)

Success rate evaluasi (greedy, 1000 episode): 72.9%

Angka ini lebih tinggi dan lebih stabil dibanding pembacaan terakhir kurva training (59.8% pada window training, atau puncak ~65–70% pada plot per-100-episode), dan alasannya bukan sekadar keberuntungan sampel:

  1. Tidak ada eksplorasi acak. Evaluasi memakai epsilon=0 — 100% argmax(Q[s,:]). Selama training, meski epsilon sudah kecil (0.028), rata-rata sukses masih "didiskon" oleh keputusan acak yang sesekali membawa agen ke hole.
  2. Ukuran sampel lebih besar & seragam. Evaluasi memakai 1000 episode sekaligus sebagai satu estimasi, sedangkan plot per-100-episode memecah histori menjadi blok-blok kecil yang secara statistik jauh lebih noisy (variansi estimasi proporsi dari 100 sampel jauh lebih besar dibanding dari 1000 sampel).

Kesimpulannya: 72.9% adalah estimasi performa policy akhir yang lebih representatif dibanding angka-angka yang terlihat berfluktuasi di training log/plot, dan ini memenuhi target deliverable 70–80%.

6. Q-table & Policy yang Dipelajari

← ↑ ↑ ↑
← ← ← ←
↑ ↓ ← ←
← → ↓ ←

Dipetakan ke layout grid (S=start, H=hole, G=goal):

State 0 (S) 1 2 3
Peta S F F F
Aksi
State 4 5 (H) 6 7 (H)
Peta F H F H
Aksi (tidak relevan) (tidak relevan)
State 8 9 10 11 (H)
Peta F F F H
Aksi (tidak relevan)
State 12 (H) 13 14 15 (G)
Peta H F F G
Aksi (tidak relevan) (tidak relevan)

Catatan penting: aksi pada state 5, 7, 11, 12 (semua hole) dan state 15 (goal) tidak bermakna secara praktis — begitu agen menginjak salah satu state ini, episode langsung berakhir (terminated=True), sehingga aksi apa pun yang tersimpan di baris Q-table tersebut tidak pernah benar-benar dieksekusi oleh policy. Nilainya hanya kebetulan lebih tinggi dari nol akibat mekanisme update yang tetap menyentuh baris tersebut (mis. sebagai next_state dalam update max(Q[s']) sebelum diketahui bahwa episode akan berakhir).

Yang lebih penting untuk dievaluasi adalah 11 state yang benar-benar dapat dilalui (0,1,2,3,4,6,8,9,10,13,14):

  • Rute yang tersirat dari state 0: 0 →(←) 4 →(←) 8 →(↑) ... — pada is_slippery=True, memilih aksi yang "tampak menuju dinding/mundur" seperti LEFT di state 0 dan 4 bukan berarti policy buruk. Ini adalah pola yang sudah dikenal luas pada FrozenLake stochastic: karena satu aksi yang dipilih hanya punya ⅓ peluang benar-benar dieksekusi (⅓ lainnya terpeleset ke dua arah tegak lurus), agen kadang belajar memilih aksi yang tampak tidak produktif secara Euclidean tapi sebenarnya meminimalkan peluang "terpeleset" ke arah hole terdekat.
  • Segmen akhir rute — 13 →(→) 14 →(↓) 15(G) — sudah benar dan optimal secara intuitif: dari state 13 bergerak ke kanan menuju 14, lalu dari 14 bergerak ke bawah langsung menuju goal (15). Ini konsisten dengan success rate evaluasi 72.9%: policy cukup andal begitu agen berhasil mencapai "setengah bawah" grid.
  • Tidak adanya satu pun aksi yang secara eksplisit mengarah langsung ke hole (5, 7, 11, 12) dari state tetangganya yang valid adalah sinyal kuat bahwa Q-table sudah menginternalisasi "aksi yang meningkatkan risiko jatuh ke hole" sebagai bernilai rendah — sesuai harapan dari TD-update Bellman: setiap kali episode berakhir di hole (reward=0), TD-error negatif menekan Q(s,a) yang mengarah ke sana.

7. Kesimpulan

Kriteria deliverable Hasil aktual Status
Success rate naik dari ~0% 3.3% di episode ke-1000
Success rate akhir di atas 70–80% 72.9% (evaluasi greedy, 1000 episode)
Q-table konvergen ke policy yang masuk akal Rute valid menghindari semua hole, mengarah ke goal

Training berhasil memenuhi seluruh target notebook. Perbedaan angka antara training log (59.8%), plot per-100-episode (berfluktuasi, sempat menyentuh ~65–70%), dan evaluasi greedy (72.9%) bukan inkonsistensi, melainkan tiga cara pengukuran yang berbeda atas policy yang sama — masing-masing dengan tingkat noise eksplorasi dan ukuran sampel yang berbeda pula. Untuk menilai kualitas policy akhir secara adil, angka evaluasi greedy (72.9%) adalah yang paling representatif.

Bridge kembali ke main.py (Stock-MARL)

Pola yang sama akan muncul saat mengevaluasi ReinforcementAgent hasil DQN(...) di main.py: jangan menilai kualitas agen hanya dari reward selama training (yang masih tercampur eksplorasi exploration_final_eps=0.1), tetapi evaluasi terpisah dengan epsilon=0 (model.predict(obs, deterministic=True)) — persis seperti fungsi evaluate_policy() pada notebook ini — untuk mendapat estimasi performa yang lebih representatif dan bebas dari noise eksplorasi.