📜  强化学习中的 Epsilon-Greedy 算法(1)

📅  最后修改于: 2023-12-03 14:54:13.624000             🧑  作者: Mango

强化学习中的 Epsilon-Greedy 算法

简介

Epsilon-Greedy 算法是强化学习中常用的一种基础算法,主要用于平衡探索和利用之间的关系。在强化学习任务中,智能体需要在短期内得到最大的回报,同时还需要在长期内积累经验,以便能够找到最佳策略。Epsilon-Greedy 算法就是通过引入一个 $\epsilon$ 参数来实现这一平衡。当随机数小于 $\epsilon$ 时,智能体会进行探索;当随机数大于等于 $\epsilon$ 时,智能体会采用当前最优策略。这样一来,智能体能够在快速收敛和探索未知状态之间达到平衡。

算法原理

Epsilon-Greedy 算法基于一个简单的思想,即在每个时间步 $t$,智能体以 $\epsilon$ 的概率进行探索,以 $1-\epsilon$ 的概率进行利用。具体而言,算法流程如下:

  1. 初始化一个 $Q$ 表,包含了所有可能的状态和动作,并将所有元素初始化为 0。
  2. 在每个时间步 $t$,根据当前状态 $s_t$,根据以下公式选择一个动作 $a_t$:
    • 如果随机数 $r < \epsilon$,那么随机选择一个动作 $a_t$。
    • 如果随机数 $r \ge \epsilon$,那么选择当前状态下 $Q$ 值最大的动作 $a_t$。即 $a_t = \operatorname*{argmax}_a Q(s_t, a)$。
  3. 执行动作 $a_t$,观察新的状态 $s_{t+1}$ 和回报 $r_t$。
  4. 根据以下公式更新 $Q$ 表:$Q(s_t, a_t) \gets Q(s_t, a_t) + \alpha(r_t + \gamma \operatorname*{max}{a'} Q(s{t+1}, a') - Q(s_t, a_t))$,其中 $\alpha$ 和 $\gamma$ 分别是学习率和折扣因子。
  5. 重复步骤 2-4 直到收敛或达到最大步数。
代码实现
import random

class EpsilonGreedy:
    def __init__(self, epsilon, n_actions):
        self.epsilon = epsilon
        self.n_actions = n_actions
        self.q_table = [0] * n_actions
        
    def choose_action(self, state):
        if random.random() < self.epsilon:
            action = random.randint(0, self.n_actions - 1)
        else:
            action = self.get_best_action(state)
        return action
        
    def get_best_action(self, state):
        best_action = 0
        best_value = self.q_table[0]
        for i in range(1, self.n_actions):
            if self.q_table[i] > best_value:
                best_value = self.q_table[i]
                best_action = i
        return best_action
        
    def update(self, state, action, reward, next_state, done, lr, gamma):
        td_error = reward + gamma * max(self.q_table[next_state]) - self.q_table[state][action]
        self.q_table[state][action] += lr * td_error

在上面的代码中,我们实现了一个基本的 Epsilon-Greedy 算法。其中包含了以下函数:

  • __init__(self, epsilon, n_actions):初始化函数。epsilon 表示探索概率,n_actions 表示动作空间大小。q_table 表示状态-动作值函数表,初始值全为 0。
  • choose_action(self, state):根据当前状态 state,使用 Epsilon-Greedy 策略选择一个动作。返回值为选择的动作。
  • get_best_action(self, state):在当前状态 state 下,选择最优动作。返回值为最优动作的索引。
  • update(self, state, action, reward, next_state, done, lr, gamma):使用经验元组 (state, action, reward, next_state, done),更新状态-动作值函数表 q_table。其中 lrgamma 分别为学习率和折扣因子。
总结

Epsilon-Greedy 算法是强化学习中的一种基础算法,它能够平衡探索和利用之间的关系,从而在快速收敛和探索未知状态之间达到平衡。在实际应用中,我们可以通过调整参数 $\epsilon$ 来平衡探索和利用之间的关系,以达到最佳的性能效果。