強化學習詳解:理論基礎與核心演算法解析

techlead_krischang發表於2024-09-27

本文詳細介紹了強化學習的基礎知識和基本演算法,包括動態規劃、蒙特卡洛方法和時序差分學習,解析了其核心概念、演算法步驟及實現細節。

關注作者,復旦AI博士,分享AI領域全維度知識與研究。擁有10+年AI領域研究經驗、復旦機器人智慧實驗室成員,國家級大學生賽事評審專家,發表多篇SCI核心期刊學術論文,上億營收AI產品研發負責人。

file

一、導論

強化學習(Reinforcement Learning, RL)是機器學習中的一個重要分支,其目標是透過與環境的互動來學習決策策略,以最大化長期累積獎勵。在強化學習中,智慧體(agent)透過執行一系列動作來影響環境,從而獲得反饋訊號,即獎勵(reward)。這種學習機制模仿了生物體在自然界中的學習過程,因此具有很強的現實意義和應用前景。

強化學習已經在多個領域展示了其強大的能力,以下是幾個典型的應用場景:

遊戲中的強化學習

遊戲是強化學習的一個重要應用領域,特別是在複雜的策略遊戲中,RL演算法已經取得了顯著的成功。例如,AlphaGo利用深度強化學習和蒙特卡洛樹搜尋(Monte Carlo Tree Search, MCTS)技術,在圍棋比賽中擊敗了世界頂級棋手。此外,DQN(Deep Q-Network)在 Atari 遊戲中的表現也證明了強化學習在複雜策略環境中的潛力。

自動駕駛

自動駕駛汽車需要在複雜的交通環境中做出實時決策,強化學習在這一領域具有重要的應用價值。透過不斷與模擬環境互動,RL演算法可以學習如何處理各種駕駛場景,包括避障、變道和停車等,從而提高自動駕駛系統的安全性和效率。

機器人控制

機器人控制是另一個重要的應用領域,強化學習可以幫助機器人在未知或動態環境中自主學習如何完成任務。例如,透過RL演算法,機器人可以學會行走、抓取物體、組裝零件等任務,這為實現高效靈活的機器人系統提供了新的途徑。

二、基礎知識

在理解強化學習的高階演算法和應用之前,我們需要掌握其基礎知識。基礎知識部分將詳細介紹強化學習的定義和關鍵術語、馬爾可夫決策過程(MDP)的數學框架,以及策略與價值函式的定義和區別。這些概念是理解和應用強化學習的基石。

2.1 強化學習的定義和關鍵術語

強化學習(Reinforcement Learning, RL)是一種透過與環境互動來學習策略的機器學習方法。智慧體(agent)在環境(environment)中執行動作(action),從而改變環境的狀態(state)並獲取獎勵(reward)。智慧體的目標是透過學習策略(policy),在不同狀態下選擇最佳動作,以最大化累積獎勵。

2.1.1 關鍵術語

  • 智慧體(Agent): 在環境中執行動作並學習策略的主體。
  • 環境(Environment): 智慧體所處的外部系統,智慧體的動作會影響環境的狀態。
  • 狀態(State, S): 環境在某一時刻的描述,通常由一組變數表示。
  • 動作(Action, A): 智慧體在特定狀態下可以執行的行為。
  • 獎勵(Reward, R): 環境對智慧體動作的反饋訊號,表示動作的好壞。
  • 策略(Policy, π): 指導智慧體在各個狀態下選擇動作的規則,可以是確定性的(π(s) = a)或隨機的(π(a|s) = P(a|s))。
  • 價值函式(Value Function, V): 用來估計智慧體在某個狀態或狀態-動作對下的長期回報。
  • 動作價值函式(Action-Value Function, Q): 用來估計智慧體在某個狀態下執行某個動作後的長期回報。

2.2 馬爾可夫決策過程(MDP)

馬爾可夫決策過程(Markov Decision Process, MDP)是強化學習問題的數學框架。MDP透過五元組 (S, A, P, R, γ) 來描述,其中:

  • S: 狀態空間,表示所有可能狀態的集合。
  • A: 動作空間,表示智慧體可以執行的所有動作的集合。
  • P: 狀態轉移機率矩陣,P(s'|s,a) 表示在狀態 s 執行動作 a 後轉移到狀態 s' 的機率。
  • R: 獎勵函式,R(s,a) 表示在狀態 s 執行動作 a 後獲得的即時獎勵。
  • γ: 折扣因子,0 ≤ γ ≤ 1,用於度量未來獎勵的當前價值。

2.2.1 MDP的性質

MDP具有馬爾可夫性質,即當前狀態的轉移只依賴於當前狀態和當前動作,而與之前的狀態無關。這一性質簡化了強化學習問題的求解,使得智慧體可以透過遞推方式計算最優策略和價值函式。

2.2.2 狀態轉移與獎勵

狀態轉移和獎勵是MDP的核心,決定了智慧體與環境的互動方式。狀態轉移機率矩陣 P 定義了環境的動態行為,而獎勵函式 R 則評估了智慧體動作的效果。透過不斷試驗和觀察,智慧體可以逐漸學會如何在不同狀態下選擇動作,以實現長期回報的最大化。

2.3 策略與價值函式

策略(Policy)和價值函式(Value Function)是強化學習中的兩個關鍵概念,它們分別描述了智慧體的行為規則和狀態的價值評估。

2.3.1 策略(Policy, π)

策略 π 定義了智慧體在每個狀態下選擇動作的規則。策略可以是確定性的,也可以是隨機的。確定性策略 π(s) = a 表示在狀態 s 下總是選擇動作 a,而隨機策略 π(a|s) = P(a|s) 則表示在狀態 s 下以機率 P(a|s) 選擇動作 a。

策略的目標是指導智慧體選擇最優動作,從而最大化累積獎勵。學習最優策略是強化學習的核心任務之一。

2.3.2 價值函式(Value Function, V)

價值函式 V 用來估計某個狀態或狀態-動作對的長期回報。價值函式的定義有兩種形式:
file

2.3.3 貝爾曼方程

file

貝爾曼方程提供了計算價值函式的遞迴公式,是求解最優策略和價值函式的基礎。

三、基本演算法

強化學習中,演算法的設計和實現是智慧體能夠學習和最佳化策略的關鍵。基本演算法包括動態規劃(Dynamic Programming, DP)、蒙特卡洛方法(Monte Carlo Methods)和時序差分(Temporal-Difference, TD)學習。這些演算法各有特點,適用於不同的場景和問題。

3.1 動態規劃(Dynamic Programming, DP)

動態規劃是一種透過遞推方式求解最佳化問題的演算法。在強化學習中,動態規劃用於計算最優策略和價值函式。動態規劃的前提是模型已知,即環境的狀態轉移機率和獎勵函式是已知的。

3.1.1 價值迭代(Value Iteration)

價值迭代是一種透過不斷更新價值函式來逼近最優價值函式的方法。其核心思想是利用貝爾曼最優方程遞迴地更新狀態價值函式,直到收斂。

演算法步驟:
file

程式碼示例:

import numpy as np

def value_iteration(P, R, gamma, theta):
    V = np.zeros(len(P))
    while True:
        delta = 0
        for s in range(len(P)):
            v = V[s]
            V[s] = max(sum([P[s][a][s'] * (R[s][a] + gamma * V[s']) for s' in range(len(P))]) for a in range(len(P[s])))
            delta = max(delta, abs(v - V[s]))
        if delta < theta:
            break
    policy = np.zeros(len(P), dtype=int)
    for s in range(len(P)):
        policy[s] = np.argmax([sum([P[s][a][s'] * (R[s][a] + gamma * V[s']) for s' in range(len(P))]) for a in range(len(P[s]))])
    return V, policy

# 示例用法
P = [[[0.8, 0.2], [0.1, 0.9]], [[0.7, 0.3], [0.2, 0.8]]]
R = [[1, 0], [0, 1]]
gamma = 0.9
theta = 1e-6
V, policy = value_iteration(P, R, gamma, theta)
print("Value Function:", V)
print("Policy:", policy)

3.1.2 策略迭代(Policy Iteration)

策略迭代透過交替進行策略評估和策略改進來找到最優策略。其核心思想是基於當前策略計算價值函式,然後改進策略,直到策略不再改變。

演算法步驟:
file

程式碼示例:

def policy_iteration(P, R, gamma, theta):
    policy = np.zeros(len(P), dtype=int)
    V = np.zeros(len(P))
    
    def policy_evaluation(policy):
        while True:
            delta = 0
            for s in range(len(P)):
                v = V[s]
                a = policy[s]
                V[s] = sum([P[s][a][s'] * (R[s][a] + gamma * V[s']) for s' in range(len(P))])
                delta = max(delta, abs(v - V[s]))
            if delta < theta:
                break

    while True:
        policy_stable = True
        policy_evaluation(policy)
        
        for s in range(len(P)):
            old_action = policy[s]
            policy[s] = np.argmax([sum([P[s][a][s'] * (R[s][a] + gamma * V[s']) for s' in range(len(P))]) for a in range(len(P[s]))])
            if old_action != policy[s]:
                policy_stable = False
        if policy_stable:
            break

    return V, policy

# 示例用法
V, policy = policy_iteration(P, R, gamma, theta)
print("Value Function:", V)
print("Policy:", policy)

3.2 蒙特卡洛方法(Monte Carlo Methods)

蒙特卡洛方法是一種基於隨機取樣的強化學習方法。它透過多次模擬智慧體與環境的互動過程,來估計狀態價值或動作價值。與動態規劃不同,蒙特卡洛方法不需要已知的環境模型,因此適用於模型未知的情況。

3.2.1 首訪蒙特卡洛(First-Visit Monte Carlo)

首訪蒙特卡洛方法透過記錄智慧體在每個狀態第一次訪問時的回報,來估計狀態價值函式。具體步驟如下:

演算法步驟:
file

程式碼示例:

def first_visit_mc(env, num_episodes, gamma):
    V = np.zeros(env.observation_space.n)
    N = np.zeros(env.observation_space.n)

    for _ in range(num_episodes):
        state = env.reset()
        trajectory = []
        done = False
        while not done:
            action = env.action_space.sample()
            next_state, reward, done, _ = env.step(action)
            trajectory.append((state, action, reward))
            state = next_state
        
        visited_states = set()
        G = 0
        for state, action, reward in reversed(trajectory):
            G = reward + gamma * G
            if state not in visited_states:
                visited_states.add(state)
                N[state] += 1
                V[state] += (G - V[state]) / N[state]
                
    return V

# 示例用法
import gym
env = gym.make('FrozenLake-v1')
num_episodes = 5000
gamma = 0.9
V = first_visit_mc(env, num_episodes, gamma)
print("Value Function:", V)

3.2.2 每次訪問蒙特卡洛(Every-Visit Monte Carlo)

每次訪問蒙特卡洛方法透過記錄智慧體在每個狀態每次訪問時的回報,來估計狀態價值函式。具體步驟如下:

演算法步驟:

file

程式碼示例:

def every_visit_mc(env, num_episodes, gamma):
    V = np.zeros(env.observation_space.n)
    N = np.zeros(env.observation_space.n)

    for _ in range(num_episodes):
        state = env.reset()
        trajectory = []
        done = False
        while not done:
            action = env.action_space.sample()
            next_state, reward, done, _ = env.step(action)
            trajectory.append((state, action, reward))
            state = next_state
        
        G = 0
        for state, action, reward in reversed(trajectory):
            G = reward + gamma * G
            N[state] += 1
            V[state] += (G - V[state]) / N[state]
                
    return V

# 示例用法
V = every_visit_mc(env, num_episodes, gamma)
print("Value Function:", V)

3.3 時序差分(Temporal-Difference, TD)學習

時序差分學習結合了蒙特卡洛方法和動態規劃的優點。它既不需要完整的軌跡,也不需要已知的環境模型,透過每一步的經驗更新價值函式。

3.3.1 SARSA(State-Action-Reward-State-Action)

SARSA 是一種基於策略的 TD 學習演算法,其名稱代表了五元組 ((S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}))。SARSA 透過每一步的經驗更新動作價值函式。

演算法步驟:

file

程式碼示例:

def sarsa(env, num_episodes, alpha, gamma, epsilon):
    Q = np.zeros((env.observation_space.n, env.action_space.n))

    def epsilon_greedy_policy(state):
        if np.random.rand() < epsilon:
            return np.random.choice(env.action_space.n)
        else:
            return np.argmax(Q[state])

    for _ in range(num_episodes):
        state = env.reset()
        action = epsilon_greedy_policy(state)
        done = False
        while not done:
            next_state, reward, done, _ = env.step(action)
            next_action = epsilon_greedy_policy(next_state)
            Q[state, action] += alpha * (reward + gamma * Q[next_state, next_action] - Q[state, action])
            state, action = next_state, next_action
            
    return Q

# 示例用法
alpha = 0.1
Q = sarsa(env, num_episodes, alpha, gamma, epsilon)
print("Q-Value Function:", Q)

3.3.2 Q學習(Q-Learning)

Q學習是一種無策略的 TD 學習演算法,其目標是直接逼近最優動作價值函式。Q學習透過每一步的經驗更新 Q 值函式,但不同於 SARSA,Q學習使用最大化未來 Q 值的動作來更新當前 Q 值。

演算法步驟:

file

程式碼示例:

def q_learning(env, num_episodes, alpha, gamma, epsilon):
    Q = np.zeros((env.observation_space.n, env.action_space.n))

    def epsilon_greedy_policy(state):
        if np.random.rand() < epsilon:
            return np.random.choice(env.action_space.n)
        else:
            return np.argmax(Q[state])

    for _ in range(num_episodes):
        state = env.reset()
        done = False
        while not done:
            action = epsilon_greedy_policy(state)
            next_state, reward, done, _ = env.step(action)
            Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
            state = next_state
            
    return Q

# 示例用法
Q = q_learning(env, num_episodes, alpha, gamma, epsilon)
print("Q-Value Function:", Q)

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章