在神奇的强化学习世界里,有三个超级厉害的“魔法”,它们叫贝尔曼最优公式、值迭代和策略迭代。学会了这三个“魔法”,我们就能帮智能体在游戏里找到最好的通关方法,做出最聪明的决定!

核心概念

贝尔曼最优公式就像是一个神秘的藏宝图公式,它能告诉我们在游戏的某个状态下,怎么做能得到最多的奖励。在一个叫做马尔可夫决策过程(MDP)的“游戏世界”里,有很多不同的状态(就像游戏里不同的关卡位置),还有很多可以做的动作(比如前进、后退、跳跃)。状态转移概率就是做了某个动作后,从一个关卡跳到另一个关卡,并且得到奖励的可能性。折扣因子 (\gamma) 是一个在 0 到 1 之间的数,它用来决定是现在拿到奖励更开心,还是以后拿到奖励更划算。

最优状态价值函数 (v^*(s)) 就是从某个关卡 (s) 出发,按照最聪明的玩法,能得到的奖励总分。它的贝尔曼最优公式是:
v∗(s)=max⁡a∈A(s)∑s′,rp(s′,r∣s,a)(r+γv∗(s′)) v^*(s) = \max_{a \in A(s)} \sum_{s', r} p(s', r | s, a) (r + \gamma v^*(s')) v(s)=aA(s)maxs,rp(s,rs,a)(r+γv(s))
用大白话来说,就是在当前关卡 (s),我们要在所有能做的动作 (a) 里,挑出那个能让我们拿到最多奖励的动作。这个奖励包括马上能拿到的奖励 (r),还有从下一个关卡 (s’) 出发,按照最聪明的玩法能拿到的奖励(要打个 (\gamma) 折哦)。

类似地,最优动作价值函数 (q^*(s, a)) 表示在关卡 (s) 做了动作 (a) 后,按照最聪明的玩法,能得到的奖励总分。它的贝尔曼最优公式是:
q∗(s,a)=∑s′,rp(s′,r∣s,a)(r+γmax⁡a′∈A(s′)q∗(s′,a′)) q^*(s, a) = \sum_{s', r} p(s', r | s, a) (r + \gamma \max_{a' \in A(s')} q^*(s', a')) q(s,a)=s,rp(s,rs,a)(r+γaA(s)maxq(s,a))
这就是说在关卡 (s) 做了动作 (a) 后,我们得到的奖励是马上拿到的奖励 (r),加上从下一个关卡 (s’) 出发,做最聪明的动作 (a’) 能拿到的奖励(同样要打个 (\gamma) 折)。

示例说明

我们来玩一个超级简单的“网格冒险游戏”!假设有一个小机器人在一个方格组成的世界里,它的目标是走到右上角的宝藏位置。每个方格就是一个关卡(状态),小机器人可以向上、向下、向左、向右走(动作)。如果走到宝藏位置,就能得到 10 分奖励,其他时候得到 0 分。折扣因子 (\gamma = 0.9),意思是未来的奖励要打 9 折。

比如说现在小机器人在某个方格 (s),它有三个相邻的方格 (s_1)、(s_2)、(s_3),从 (s) 分别做动作 (a_1)、(a_2)、(a_3) 可以到达它们,而且到达的可能性(状态转移概率)分别是 (p_1)、(p_2)、(p_3)。如果 (s_1)、(s_2)、(s_3) 按照最聪明的玩法能得到的奖励总分已经知道了,分别是 (v*(s_1))、(v(s_2))、(v^(s_3)),那么方格 (s) 按照最聪明的玩法能得到的奖励总分 (v^*(s)) 就是:
v∗(s)=max⁡ai∑j=13pj(0+0.9×v∗(sj)) v^*(s) = \max_{a_i} \sum_{j = 1}^{3} p_j (0 + 0.9 \times v^*(s_j)) v(s)=aimaxj=13pj(0+0.9×v(sj))
小机器人要从三个动作里挑出一个,让这个公式算出来的分数最大,这个最大的分数就是方格 (s) 的最优奖励总分啦!

值迭代算法

原理剖析

值迭代算法就像小机器人不断试错,慢慢找到最佳路线的过程。它的核心就是不停地更新每个关卡能得到的奖励分数,直到找到最准确的分数,然后根据这个分数找到最聪明的走法。

具体步骤如下:

  1. 初始化奖励分数:先给每个关卡随便猜一个奖励分数,一般都先猜 0 分。我们把这个初始的分数叫做 (V_0(s)),每个关卡 (s) 都有一个这样的初始分数。
  2. 迭代更新分数:每次“试错”(迭代)的时候,对于每个关卡 (s),我们把所有能做的动作 (a) 都试一遍,算出每个动作能得到的奖励期望(就是把马上得到的奖励和下一个关卡的奖励分数打折后加起来),然后挑出最大的那个期望,作为这个关卡新的奖励分数 (V_{k + 1}(s))。更新公式是:
    Vk+1(s)=max⁡a∈A(s)∑s′,rp(s′,r∣s,a)(r+γVk(s′)) V_{k + 1}(s) = \max_{a \in A(s)} \sum_{s', r} p(s', r | s, a) (r + \gamma V_k(s')) Vk+1(s)=aA(s)maxs,rp(s,rs,a)(r+γVk(s))
    就好像小机器人在每个关卡都把所有路走一遍,看看哪条路能得到最多的奖励,然后记住这条路的奖励分数。每次试完,都用新的分数更新之前猜的分数,慢慢地就越来越准确啦!
  3. 判断找没找对:每次试完后,我们检查一下每个关卡的奖励分数变化大不大。如果所有关卡里,分数变化最大的那个都小于一个很小的数 (\epsilon)(比如 0.001),就说明我们找得差不多对了,不用再试啦。这时候的分数 (V_{k + 1}(s)) 就很接近最准确的分数 (v^*(s)) 啦。
  4. 确定最佳路线:找到了每个关卡差不多准确的奖励分数后,小机器人就知道在每个关卡怎么做最划算了。它会选择在每个关卡做那个能得到最大奖励期望的动作,这个动作就是最佳路线 (\pi^*(s)),用公式表示就是:
    π∗(s)=arg⁡max⁡a∈A(s)∑s′,rp(s′,r∣s,a)(r+γV∗(s′)) \pi^*(s) = \arg \max_{a \in A(s)} \sum_{s', r} p(s', r | s, a) (r + \gamma V^*(s')) π(s)=argaA(s)maxs,rp(s,rs,a)(r+γV(s))

示例详解

还是刚才的“网格冒险游戏”,这次我们用 Python 代码来试试看值迭代算法!假设网格是 (3 \times 3) 的,右上角是宝藏,左下角是不能去的陷阱。

import numpy as np

# 初始化状态价值函数,所有状态价值设为0
V = np.zeros((3, 3))
# 折扣因子
gamma = 0.9
# 迭代停止阈值
epsilon = 0.001

# 定义动作:0上,1下,2左,3右
actions = [0, 1, 2, 3]

# 状态转移和奖励函数(简化示例,假设确定转移)
def get_transition_reward(state, action):
    x, y = state
    if action == 0 and y < 2:  # 上
        new_state = (x, y + 1)
        reward = 10 if new_state == (2, 2) else 0
    elif action == 1 and y > 0:  # 下
        new_state = (x, y - 1)
        reward = 10 if new_state == (2, 2) else 0
    elif action == 2 and x > 0:  # 左
        new_state = (x - 1, y)
        reward = 10 if new_state == (2, 2) else 0
    elif action == 3 and x < 2:  # 右
        new_state = (x + 1, y)
        reward = 10 if new_state == (2, 2) else 0
    else:
        new_state = state
        reward = 0
    return new_state, reward

# 值迭代
while True:
    delta = 0
    V_new = np.copy(V)
    for x in range(3):
        for y in range(3):
            state = (x, y)
            if state == (2, 2):  # 目标状态
                continue
            v_max = -float('inf')
            for action in actions:
                new_state, reward = get_transition_reward(state, action)
                v = reward + gamma * V[new_state]
                v_max = max(v_max, v)
            V_new[x, y] = v_max
            delta = max(delta, np.abs(V_new[x, y] - V[x, y]))
    V = V_new
    if delta < epsilon:
        break

# 根据最终的状态价值函数确定最优策略
policy = np.zeros((3, 3), dtype=int)
for x in range(3):
    for y in range(3):
        state = (x, y)
        if state == (2, 2):
            continue
        v_max = -float('inf')
        best_action = 0
        for action in actions:
            new_state, reward = get_transition_reward(state, action)
            v = reward + gamma * V[new_state]
            if v > v_max:
                v_max = v
                best_action = action
        policy[x, y] = best_action

print("最优状态价值函数:")
print(V)
print("最优策略:(0上,1下,2左,3右)")
print(policy)

运行这段代码,小机器人就能通过值迭代算法,找到每个方格的最优奖励分数,还有从每个方格出发的最佳路线哦!

策略迭代算法

原理阐释

策略迭代算法就像小机器人先随便定一个走法,然后不断改进这个走法,直到找到最聪明的走法。它有两个重要步骤:给当前走法打分(策略评估),然后改进走法(策略改进)。

  1. 给走法打分:小机器人先随便定一个走法 (\pi),然后计算按照这个走法,在每个关卡 (s) 能得到的奖励分数 (V^{\pi}(s))。打分的公式是:
    Vπ(s)=∑aπ(a∣s)(∑rp(r∣s,a)r+γ∑s′p(s′∣s,a)Vπ(s′)) V^{\pi}(s) = \sum_{a} \pi(a | s) \left( \sum_{r} p(r | s, a) r + \gamma \sum_{s'} p(s' | s, a) V^{\pi}(s') \right) Vπ(s)=aπ(as)(rp(rs,a)r+γsp(ss,a)Vπ(s))
    这里 (\pi(a | s)) 就是在关卡 (s) 按照当前走法,选择动作 (a) 的可能性。通过这个公式不断计算,就能知道当前走法在每个关卡的奖励分数,也就是给这个走法打个分,看看它好不好。
  2. 改进走法:知道了当前走法的分数后,小机器人就开始改进走法啦。在每个关卡 (s),它会看看做哪个动作能得到最多的奖励,这个动作就是新的走法 (\pi’)。判断的公式是:
    动作价值函数:
    Qπ(s,a)=∑rp(r∣s,a)r+γ∑s′p(s′∣s,a)Vπ(s′) Q^{\pi}(s, a) = \sum_{r} p(r | s, a) r + \gamma \sum_{s'} p(s' | s, a) V^{\pi}(s') Qπ(s,a)=rp(rs,a)r+γsp(ss,a)Vπ(s)
    新的走法:
    π′(s)=arg⁡max⁡aQπ(s,a) \pi'(s) = \arg \max_{a} Q^{\pi}(s, a) π(s)=argamaxQπ(s,a)
    小机器人不断重复打分和改进走法这两个步骤,直到走法不再变化,这时候就找到了最聪明的走法,也就是最优策略!

示例说明

同样是在 (3 \times 3) 的“网格冒险游戏”里,我们用 Python 代码来试试策略迭代算法。假设一开始小机器人在每个方格都是随机选择动作(每个动作概率都是 0.25)。

import numpy as np

# 初始化状态价值函数,所有状态价值设为0
V = np.zeros((3, 3))
# 折扣因子
gamma = 0.9
# 定义动作:0上,1下,2左,3右
actions = [0, 1, 2, 3]

# 状态转移和奖励函数(简化示例,假设确定转移)
def get_transition_reward(state, action):
    x, y = state
    if action == 0 and y < 2:  # 上
        new_state = (x, y + 1)
        reward = 10 if new_state == (2, 2) else 0
    elif action == 1 and y > 0:  # 下
        new_state = (x, y - 1)
        reward = 10 if new_state == (2, 2) else 0
    elif action == 2 and x > 0:  # 左
        new_state = (x - 1, y)
        reward = 10 if new_state == (2, 2) else 0
    elif action == 3 and x < 2:  # 右
        new_state = (x + 1, y)
        reward = 10 if new_state == (2, 2) else 0
    else:
        new_state = state
        reward = 0
    return new_state, reward

# 策略评估
def policy_evaluation(policy):
    V_new = np.copy(V)
    while True:
        delta = 0
        V_old = np.copy(V_new)
        for x in range(3):
            for y in range(3):
                state = (x, y)
                v = 0
                for action in actions:
                    if policy[x, y] == action:
                        new_state, reward = get_transition_reward(state, action)
                        v += (reward + gamma * V_old[new_state])
                V_new[x, y] = v
                delta = max(delta, np.abs(V_new[x, y] - V_old[x, y]))
        V = V_new
        if delta < 1e-6:
            break
    return V

# 策略改进
def policy_improvement(V):
    policy = np.zeros((3, 3), dtype=int)
    for x in range(3):
        for y in range(3):
            state = (x, y)
            v_max = -float('inf')
            best_action = 0
            for action in actions:
                new_state, reward = get_transition_reward(state, action)
                v = reward + gamma * V[new_state]
                if v > v_max:
                    v_max = v
                    best_action = action
            policy[x, y] = best_action
    return policy

# 初始随机策略
policy = np.random.choice(len(actions), size=(3, 3))

while True:
    V = policy_evaluation(policy)
    new_policy = policy_improvement(V)
    if np.array_equal(policy, new_policy):
        break
    policy = new_policy

print("最优状态价值函数:")
print(V)
print("最优策略:(0上,1下,2左,3右)")
print(policy)

通过这段代码,小机器人就能用策略迭代算法,从一开始的随机走法,慢慢找到每个方格的最佳路线啦!

总结

贝尔曼最优公式是这个“游戏”的核心秘诀,它告诉我们怎么计算最聪明的玩法能得到多少奖励。值迭代算法就像小机器人不断试错找最佳路线,策略迭代算法就像小机器人先随便走,然后慢慢改进走法。这三个“魔法”都很厉害,在不同的游戏里(实际应用场景中),我们可以根据游戏的特点(问题的特点),选择合适的“魔法”,帮助小机器人(智能体)找到得到最多奖励的最佳路线(最优策略)!以后遇到其他好玩的“冒险游戏”(复杂的决策问题),我们也能用这些“魔法”轻松解决啦!


Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐