在強化學習(Reinforcement Learning, RL)中,價值函數的估計是核心任務之一。蒙特卡洛(Monte Carlo, MC)方法和時序差分(Temporal Difference, TD)方法是兩種常用的策略,用于估計狀態值函數(Value Function)。本文將詳細介紹這兩種算法的原理、應用場景以及它們之間的對比,并通過代碼示例展示它們的實際應用。
蒙特卡洛算法
原理
蒙特卡洛方法通過多次采樣完整的序列來估計價值函數。每次從初始狀態開始,直到達到終止狀態,并根據每個狀態序列的回報(Reward)來更新狀態值。
給定一個策略 ,蒙特卡洛方法估計狀態值函數
?為:
其中 ?是從時間步
?開始的總回報。總回報可以表示為:
其中 ?是折扣因子,
?是未來的回報。
實戰示例
以下是一個使用蒙特卡洛方法進行價值估計的簡單示例:
import numpy as np# 環境參數
num_states = 5
num_episodes = 1000
gamma = 0.9# 隨機策略
def random_policy(state):return np.random.choice([0, 1])# 環境
def env_step(state, action):if state == num_states - 1:return state, 0next_state = state + 1 if action == 1 else statereward = 1 if next_state == num_states - 1 else 0return next_state, reward# 蒙特卡洛價值估計
value_estimates = np.zeros(num_states)
returns = {state: [] for state in range(num_states)}for _ in range(num_episodes):state = 0episode = []while state != num_states - 1:action = random_policy(state)next_state, reward = env_step(state, action)episode.append((state, action, reward))state = next_stateG = 0for state, _, reward in reversed(episode):G = reward + gamma * Greturns[state].append(G)value_estimates[state] = np.mean(returns[state])print("狀態值估計:", value_estimates)
時序差分算法
原理
時序差分方法結合了蒙特卡洛方法和動態規劃的優點,可以在沒有模型的情況下進行在線學習。TD(0) 是最簡單的時序差分方法,它更新狀態值函數 $V(s)$ 的公式為:
其中 ?是學習率,
?是即時獎勵,
?是下一狀態。
實戰示例
以下是一個使用時序差分方法進行價值估計的簡單示例:
import numpy as np# 環境參數
num_states = 5
num_episodes = 1000
gamma = 0.9
alpha = 0.1# 隨機策略
def random_policy(state):return np.random.choice([0, 1])# 環境
def env_step(state, action):if state == num_states - 1:return state, 0next_state = state + 1 if action == 1 else statereward = 1 if next_state == num_states - 1 else 0return next_state, reward# 時序差分價值估計
value_estimates = np.zeros(num_states)for _ in range(num_episodes):state = 0while state != num_states - 1:action = random_policy(state)next_state, reward = env_step(state, action)value_estimates[state] += alpha * (reward + gamma * value_estimates[next_state] - value_estimates[state])state = next_stateprint("狀態值估計:", value_estimates)
對比
-
更新方式:
- 蒙特卡洛方法:僅在一個完整的序列結束后進行更新,需要等待一個回合結束才能得到狀態值的估計。
- 時序差分方法:可以在每一步進行更新,不需要等待整個回合結束,更適合在線學習。
-
方差與偏差:
- 蒙特卡洛方法:通常有較高的方差,但無偏估計。
- 時序差分方法:通常有較低的方差,但可能有偏差。
-
計算效率:
- 蒙特卡洛方法:計算量較大,適合離線處理和最終狀態明確的任務。
- 時序差分方法:計算量較小,適合在線處理和實時更新。
-
適用場景:
- 蒙特卡洛方法:適用于回報能夠在有限時間內觀察到的環境。
- 時序差分方法:適用于回報在未來不確定時間內才能完全觀察到的環境。
總結
蒙特卡洛方法和時序差分方法各有優缺點,在不同的應用場景下可以互為補充。蒙特卡洛方法通過完全序列的回報估計狀態值,適用于離線處理;時序差分方法通過每一步的即時回報和估計值更新狀態值,適合在線學習和實時更新。在實際應用中,可以根據具體需求選擇合適的方法,甚至可以結合使用,以達到最優的價值估計效果。