强化学习和Q-Learning的综合研究

news2024/10/23 14:28:02

目录

一、说明

二、什么是强化学习?

三、监督学习、无监督学习和强化学习之间的区别。

四、强化学习中使用的术语。

五、强化学习中的智能体-环境交互:一个迷宫示例。

六、贝尔曼方程。

七、马尔可夫决策过程 (MDP)

八、马尔可夫决策过程 (MDP) 的代码实现

九、代码说明

十、什么是Q Learning?

10.1 Q 学习

19.2 Q 学习说明:

十一、结论

关键要点:


一、说明


在我今天的中等帖子中,我将教您如何实现 Q-Learning 算法。但在此之前,我将首先解释 Q-Learning 背后的想法及其局限性。请务必具备一些强化学习 (RL) 基础知识。否则,请查看我之前关于 RL 背后的直觉和关键数学的文章。

二、什么是强化学习?

        强化学习 (RL) 是一种机器学习 (ML) 技术,用于训练软件做出决策以实现最佳结果。它模仿了人类用来实现目标的试错学习过程。RL 算法在处理数据时使用奖励和惩罚范式。他们从每个动作的反馈中学习,并自行发现最佳处理路径,以实现最终结果。RL 是一种强大的方法,可帮助人工智能 (AI) 系统在看不见的环境中实现最佳结果。(来源:AWS)

强化学习框图

        为了更好地理解强化学习,请考虑一只我们必须训练的狗。在这里,狗是代理人,房子是环境。

        存在于其环境中的代理(狗)

        我们可以通过提供狗饼干等奖励来让狗执行各种动作。

        授予代理执行正确操作的奖励

        狗会遵循一项政策来最大化它的奖励,因此会遵循每一个命令,甚至可能自己学习一个新的动作,比如乞讨。狗也会想跑来跑去,玩耍和探索它的环境。模型的这种质量称为探索。狗最大化奖励的倾向称为剥削。勘探和开发之间总是存在权衡取舍,因为勘探行动可能会导致较少的回报。

特工因做错事而受到处罚

三、监督学习、无监督学习和强化学习之间的区别。

描述监督学习、无监督学习和强化学习之间基本区别的表格

四、强化学习中使用的术语。

代理():一个可以感知/探索环境并对其采取行动的实体。

环境():代理在场或被包围的情况。在RL中,我们假设随机环境,这意味着它本质上是随机的。

操作():操作是代理在环境中执行的移动。

状态():状态是代理执行每次操作后环境返回的情况。

奖励():从环境返回给代理的反馈,用于评估代理的操作。

策略():策略是代理根据当前状态为下一步操作应用的策略。

值():预期长期回报与贴现因子相反,与短期回报相反。

Q 值():它与该值基本相似,但它需要一个附加参数作为当前操作 (a)。(来源:Javatpoint)

五、强化学习中的智能体-环境交互:一个迷宫示例。

想象一个迷宫环境,一个机器人特工试图找到宝藏,在这种情况下,让我们假设它是一颗钻石。以下是交互的展开方式:

  1. 初始状态:环境首先为代理提供初始状态。这种状态可以是机器人在迷宫中的当前位置(例如,“左下角”)之类的信息。
    R = +1(奖励)
    R = -1(惩罚)

2. 行动选择:根据当前状态及其内部策略(策略),代理人选择行动。该策略一开始可能是随机的,也可能有一些初始的探索策略。机器人可能的动作可以是“向前移动”、“向左转”或“向右转”。

3. 操作执行:代理执行所选操作并与环境交互。在我们的示例中,机器人根据其选择向前移动、向左转或向右转。

4. 状态转换:作为操作的结果,环境转换到新状态。新状态可以是机器人在迷宫中的更新位置(例如,“从左下角向前一步”)。

5. 奖励反馈:环境根据所采取的行动和结果状态为智能体提供奖励信号。在迷宫中,达到目标(出口)的奖励可能很高,撞到墙上的奖励可能为负。

6. 学习和策略更新:代理收到奖励和新状态信息。使用此信息,将更新代理的内部策略。随着时间的流逝,智能体会了解哪些行为会带来更高的回报,并改进其策略以选择最大化长期回报的行动(例如快速到达出口)。

7. 重复:状态观察、行动选择、行动执行、奖励接收和策略更新的循环一直持续到智能体实现其目标(找到出口)或学习过程结束。

对于代理来说,他应该上升还是下降将是一个困难的情况,因为每个区块都具有相同的值。因此,上述方法不适合代理到达目的地。因此,为了解决这个问题,引入了贝尔曼方程,这是强化学习背后的主要概念。

六、贝尔曼方程。

        贝尔曼方程由数学家理查德·欧内斯特·贝尔曼于 1953 年提出,因此被称为贝尔曼方程。它与动态规划相关联,用于通过包含先前状态的值来计算决策问题在某个点的值。

        它是一种在动态规划或环境中计算值函数的方法,导致了现代强化学习。

        贝尔曼方程中使用的关键元素是:

·代理执行的操作称为“a”

·通过执行操作发生的状态为“s”。

·每个好动作和坏动作获得的奖励/反馈是“R”。

·折扣因子是 Gamma “γ”。

贝尔曼方程可以写成:

贝尔曼方程

这里

·V(s)= 在特定点计算的值。

·R(s,a) = 通过执行操作在特定状态 s 下的奖励。

·γ = 折扣系数

·V(s') = 前一状态的值。

所以现在,使用贝尔曼方程,我们将找到给定环境的每个状态的值。我们将从目标块旁边的块开始。

数值描述了贝尔曼方程在上述给定状态示例中的应用。

第 5 个块中的代理状态

现在,我们将进一步移动到第 6 个块,在这里代理可能会更改路线,因为它总是试图找到最佳路径。所以现在,让我们从火坑旁边的街区考虑。

具有 S7block 的 S6 块中的代理状态

现在,代理有三个移动选项;如果他移动到蓝色盒子,那么如果他移动到火坑,他会感觉到颠簸,那么他将获得 -1 奖励。但在这里,我们只获得积极的回报,因此,他只会向上移动。完整的块值将使用此公式计算。请看下图:

代理达到的最终状态,以及访问的所有状态代理的状态值。

(来源: Javatpoint)

七、马尔可夫决策过程 (MDP)

        马尔可夫决策过程(MDP)用于形式化强化学习问题。如果环境是完全可观察的,那么它的动态可以建模为马尔可夫过程。在 MDP 中,代理不断与环境交互并执行操作;在每次操作中,环境都会响应并生成新状态。

马尔可夫决策过程框图

MDP 用于描述 RL 的环境,几乎所有的 RL 问题都可以使用 MDP 进行形式化。

MDP 包含四个元素(S、A、Pa、Ra)的元组:

·一组有限状态 S

·一组有限动作 A

·从状态 S 过渡到状态 S' 后因行动 (Ra) 而获得的奖励。

·概率 (Pa)。

MDP 使用马尔可夫性质,为了更好地理解 MDP,我们需要了解它。

马尔可夫属性:

它说“如果代理处于当前状态 S1,执行操作 a1 并移动到状态 s2,则从 s1 到 s2 的状态转换仅取决于当前状态和未来操作,状态不依赖于过去的操作、奖励或状态。

马尔可夫过程:

马尔可夫过程是一个无内存过程,具有一系列使用马尔可夫性质的随机状态 S1、S2、.....、St。马尔可夫过程也称为马尔可夫链,它是状态 S 和转移函数 P 上的元组 (S, P)。这两个分量(S 和 P)可以定义系统的动力学。

八、马尔可夫决策过程 (MDP) 的代码实现

马尔可夫决策过程 (MDP) 的实施涉及需要注意的某些步骤:

实施步骤:

  1. 环境设置:定义环境,包括迷宫布局、开始状态、目标状态、障碍物和奖励。
  2. 定义 MDP 组件:根据环境设置指定状态、操作、转换概率和奖励。此步骤涉及将环境的动态编码到数学模型中。
  3. 策略迭代或值迭代:使用迭代算法(如策略迭代或值迭代)来查找导航迷宫的最佳策略。这些算法涉及迭代更新值函数或策略,直到收敛。
  4. 路径提取:确定最佳策略后,提取代理应遵循的最佳路径,以从开始状态到达目标状态。此路径表示最大化预期累积奖励的操作序列。
  5. 路径执行:在真实或模拟环境中执行从MDP算法获得的最优路径。这涉及根据规定的操作移动代理,并根据环境的动态更新代理的状态。
  6. 评估和改进:评估路径规划算法在效率、最优性和鲁棒性方面的性能。如有必要,请优化算法以提高其性能。

使用健身房

现在,让我们谈谈健身房。它是 OpenAI 提供的库,可以模拟各种环境并绘制它们,这有助于我们轻松可视化强化学习算法。

可以通过运行以下命令来安装它:

pip install gym

您必须确保系统中也安装了 matplotlib。如果没有,您可以通过运行下面给出的命令来执行此操作:

%pip install matplotlib

导入库

import gym
import pygame
import warnings
import numpy as np
from gym import spaces
from pygame import gfxdraw
from IPython import display
import matplotlib.pyplot as plt
from matplotlib import animation
from IPython.display import HTML
from gym.error import DependencyNotInstalled
from typing import Tuple, Dict, Optional, Iterable

使用健身房创建迷宫

(来源:https://colab.research.google.com/github/deepmind/dm_control/blob/master/tutorial.ipynb)

class Maze(gym.Env):

    def __init__(self, exploring_starts: bool = False,
                 shaped_rewards: bool = False, size: int = 5) -> None:
        super().__init__()
        self.exploring_starts = exploring_starts
        self.shaped_rewards = shaped_rewards
        self.state = (size - 1, size - 1)
        self.goal = (size - 1, size - 1)
        self.maze = self._create_maze(size=size)
        self.distances = self._compute_distances(self.goal, self.maze)
        self.action_space = spaces.Discrete(n=4)
        self.action_space.action_meanings = {0: 'UP', 1: 'RIGHT', 2: 'DOWN', 3: "LEFT"}
        self.observation_space = spaces.MultiDiscrete([size, size])

        self.screen = None
        self.agent_transform = None

    def step(self, action: int) -> Tuple[Tuple[int, int], float, bool, Dict]:
        reward = self.compute_reward(self.state, action)
        self.state = self._get_next_state(self.state, action)
        done = self.state == self.goal
        info = {}
        return self.state, reward, done, info

    def reset(self) -> Tuple[int, int]:
        if self.exploring_starts:
            while self.state == self.goal:
                self.state = tuple(self.observation_space.sample())
        else:
            self.state = (0, 0)
        return self.state

    def render(self, mode: str = 'human') -> Optional[np.ndarray]:
        assert mode in ['human', 'rgb_array']

        screen_size = 600
        scale = screen_size / 5

        if self.screen is None:
            pygame.init()
            self.screen = pygame.Surface((screen_size, screen_size))

        surf = pygame.Surface((screen_size, screen_size))
        surf.fill((22, 36, 71))


        for row in range(5):
            for col in range(5):

                state = (row, col)
                for next_state in [(row + 1, col), (row - 1, col), (row, col + 1), (row, col - 1)]:
                    if next_state not in self.maze[state]:

                        # Add the geometry of the edges and walls (i.e. the boundaries between
                        # adjacent squares that are not connected).
                        row_diff, col_diff = np.subtract(next_state, state)
                        left = (col + (col_diff > 0)) * scale - 2 * (col_diff != 0)
                        right = ((col + 1) - (col_diff < 0)) * scale + 2 * (col_diff != 0)
                        top = (5 - (row + (row_diff > 0))) * scale - 2 * (row_diff != 0)
                        bottom = (5 - ((row + 1) - (row_diff < 0))) * scale + 2 * (row_diff != 0)

                        gfxdraw.filled_polygon(surf, [(left, bottom), (left, top), (right, top), (right, bottom)], (255, 255, 255))

        # Add the geometry of the goal square to the viewer.
        left, right, top, bottom = scale * 4 + 10, scale * 5 - 10, scale - 10, 10
        gfxdraw.filled_polygon(surf, [(left, bottom), (left, top), (right, top), (right, bottom)], (40, 199, 172))

        # Add the geometry of the agent to the viewer.
        agent_row = int(screen_size - scale * (self.state[0] + .5))
        agent_col = int(scale * (self.state[1] + .5))
        gfxdraw.filled_circle(surf, agent_col, agent_row, int(scale * .6 / 2), (228, 63, 90))

        surf = pygame.transform.flip(surf, False, True)
        self.screen.blit(surf, (0, 0))

        return np.transpose(
            np.array(pygame.surfarray.pixels3d(self.screen)), axes=(1, 0, 2)
        )

    def close(self) -> None:
        if self.screen is not None:
            pygame.display.quit()
            pygame.quit()
            self.screen = None

    def compute_reward(self, state: Tuple[int, int], action: int) -> float:
        next_state = self._get_next_state(state, action)
        if self.shaped_rewards:
            return - (self.distances[next_state] / self.distances.max())
        return - float(state != self.goal)

    def simulate_step(self, state: Tuple[int, int], action: int):
        reward = self.compute_reward(state, action)
        next_state = self._get_next_state(state, action)
        done = next_state == self.goal
        info = {}
        return next_state, reward, done, info

    def _get_next_state(self, state: Tuple[int, int], action: int) -> Tuple[int, int]:
        if action == 0:
            next_state = (state[0] - 1, state[1])
        elif action == 1:
            next_state = (state[0], state[1] + 1)
        elif action == 2:
            next_state = (state[0] + 1, state[1])
        elif action == 3:
            next_state = (state[0], state[1] - 1)
        else:
            raise ValueError("Action value not supported:", action)
        if next_state in self.maze[state]:
            return next_state
        return state

    @staticmethod
    def _create_maze(size: int) -> Dict[Tuple[int, int], Iterable[Tuple[int, int]]]:
        maze = {(row, col): [(row - 1, col), (row + 1, col), (row, col - 1), (row, col + 1)]
                for row in range(size) for col in range(size)}

        left_edges = [[(row, 0), (row, -1)] for row in range(size)]
        right_edges = [[(row, size - 1), (row, size)] for row in range(size)]
        upper_edges = [[(0, col), (-1, col)] for col in range(size)]
        lower_edges = [[(size - 1, col), (size, col)] for col in range(size)]
        walls = [
            [(1, 0), (1, 1)], [(2, 0), (2, 1)], [(3, 0), (3, 1)],
            [(1, 1), (1, 2)], [(2, 1), (2, 2)], [(3, 1), (3, 2)],
            [(3, 1), (4, 1)], [(0, 2), (1, 2)], [(1, 2), (1, 3)],
            [(2, 2), (3, 2)], [(2, 3), (3, 3)], [(2, 4), (3, 4)],
            [(4, 2), (4, 3)], [(1, 3), (1, 4)], [(2, 3), (2, 4)],
        ]

        obstacles = upper_edges + lower_edges + left_edges + right_edges + walls

        for src, dst in obstacles:
            maze[src].remove(dst)

            if dst in maze:
                maze[dst].remove(src)

        return maze

    @staticmethod
    def _compute_distances(goal: Tuple[int, int],
                           maze: Dict[Tuple[int, int], Iterable[Tuple[int, int]]]) -> np.ndarray:
        distances = np.full((5, 5), np.inf)
        visited = set()
        distances[goal] = 0.

        while visited != set(maze):
            sorted_dst = [(v // 5, v % 5) for v in distances.argsort(axis=None)]
            closest = next(x for x in sorted_dst if x not in visited)
            visited.add(closest)

            for neighbour in maze[closest]:
                distances[neighbour] = min(distances[neighbour], distances[closest] + 1)
        return distances


def display_video(frames):
    orig_backend = matplotlib.get_backend()
    matplotlib.use('Agg')
    fig, ax = plt.subplots(1, 1, figsize=(5, 5))
    matplotlib.use(orig_backend)
    ax.set_axis_off()
    ax.set_aspect('equal')
    ax.set_position([0, 0, 1, 1])
    im = ax.imshow(frames[0])
    def update(frame):
        im.set_data(frame)
        return [im]
    anim = animation.FuncAnimation(fig=fig, func=update, frames=frames,
                                   interval=50, blit=True, repeat=False)
    return HTML(anim.to_html5_video())

将环境定义为迷宫

env = Maze()

重置环境

env.reset()

这会将环境及其初始状态重置为其初始位置。

initial_state = env.reset()
print(f"The new episode will start in state: {initial_state}")

渲染环境

env.render()

呈现环境。

支持的模式集因环境而异。(某些第三方环境可能根本不支持渲染。

frame = env.render(mode = 'rgb_array')
plt.axis('off')
plt.title(f"State: {initial_state}")
plt.imshow(frame)

代理处于状态时提供的输出:(0,0)

代理在给定环境中执行操作

env.step()

接受操作并返回元组(观察、奖励、完成、信息)。

Args:action(对象):代理提供的操作

返回值: 观察值 (object):代理对当前环境的观察 奖励 (float) : 完成先前操作后返回的奖励金额 (bool):事件是否已结束,在这种情况下,进一步的 step() 调用将返回未定义的结果 info (dict):包含辅助诊断信息(有助于调试、日志记录,有时还有学习)

action = 2
next_state, reward, done, info = env.step(action)
print(f"After moving down 1 row, the agent is in state: {next_state}")
print(f"After moving down 1 row, we got a reward of: {reward}")
print("After moving down 1 row, the task is" , "" if done else "not", "finished")
frame = env.render(mode = 'rgb_array')
plt.axis('off')
plt.title(f"State: {next_state}")
plt.imshow(frame)

代理移动到状态时提供的输出:(1,0)

关闭环境

env.close()
env = Maze()
print(f"For example, the initial state is: {env.reset()}")
print(f"The space state is of type: {env.observation_space}")

例如,初始状态为:(0, 0) 空间状态的类型为:MultiDiscrete([5 5])

print(f"An example of a valid action is: {env.action_space.sample()}")
print(f"The action is of type: {env.action_space}")

有效操作的示例如下: 3 该操作的类型为:Discrete(4)

定义智能体在其状态空间中运动的第一条轨迹

env = Maze()
state = env.reset()
trajectory = []
for _ in range(3):
  action = env.action_space.sample()
  next_state, reward, done, extra_info = env.step(action)
  trajectory.append([state, action, reward, done, next_state])
  state = next_state
env.close()

print(f"First Trajectory:\n {trajectory}")

第一个轨迹:[[(0, 0), 1, -1.0, False, (0, 1)], [(0, 1), 3, -1.0, False, (0, 0)], [(0, 0), 0, -1.0, False, (0, 0)]]

定义代理运动在其状态空间中的第一集

env = Maze()
state = env.reset()
episode = []
done = False
while not done:
  action = env.action_space.sample()
  next_state, reward, done, extra_info = env.step(action)
  episode.append([state, action, reward, done, next_state])
  state = next_state
env.close()

print(f"First Episode:\n {episode}")

First Episode: [[(0, 0), 3, -1.0, False, (0, 0)], [(0, 0), 2, -1.0, False, (1, 0)], [(1, 0), 3, -1.0, False, (1, 0)], [(1, 0), 1, -1.0, False, (1, 0)], [(1, 0), 3, -1.0, False, (1, 0)], [(1, 0), 2, -1.0, False, (2, 0)], [(2, 0), 0, -1.0, False, (1, 0)], [(1, 0), 1, -1.0, False, (1, 0)], [(1, 0), 0, -1.0, False, (0, 0)], [(0, 0), 0, -1.0, False, (0, 0)], [(0, 0), 0, -1.0, False, (0, 0)], [(0, 0), 0, -1.0, False, (0, 0)], [(0, 0), 3, -1.0, False, (0, 0)], [(0, 0), 0, -1.0, False, (0, 0)], [(0, 0), 0, -1.0, False, (0, 0)], [(0, 0), 3, -1.0, False, (0, 0)], [(0, 0), 2, -1.0, False, (1, 0)], [(1, 0), 2, -1.0, False, (2, 0)], [(2, 0), 3, -1.0, False, (2, 0)], [(2, 0), 2, -1.0, False, (3, 0)], [(3, 0), 1, -1.0, False, (3, 0)], [(3, 0), 0, -1.0, False, (2, 0)], [(2, 0), 3, -1.0, False, (2, 0)], [(2, 0), 2, -1.0, False, (3, 0)], [(3, 0), 2, -1.0, False, (4, 0)], [(4, 0), 2, -1.0, False, (4, 0)], [(4, 0), 3, -1.0, False, (4, 0)], [(4, 0), 1, -1.0, False, (4, 1)], [(4, 1), 0, -1.0, False, (4, 1)], [(4, 1), 1, -1.0, False, (4, 2)], [(4, 2), 0, -1.0, False, (3, 2)], [(3, 2), 1, -1.0, False, (3, 3)], [(3, 3), 2, -1.0, False, (4, 3)], [(4, 3), 1, -1.0, True, (4, 4)]]

获取代理在其状态空间中执行的操作的输出

env = Maze()
state = env.reset()
action = env.action_space.sample()
_, reward, _, _  = env.step(action)

print(f"We achived a reward of {reward} by taking action {action} in state {state}")

我们通过在状态 (0, 0) 中执行操作 1 获得了 -1.0 的奖励

计算代理从迷宫中找到出口所需的移动量以及它获得的奖励/惩罚。

env = Maze()
state = env.reset()
done = False

gamma = 0.99
G_0 = 0
t = 0

while not done:
  action = env.action_space.sample()
  _, reward, done, _ = env.step(action)
  G_0 += gamma ** t * reward
  t += 1

env.close()
print(f"It took us {t} moves to find the exit, and each reward r(s,a) = -1, so the return amounts to {G_0}")

我们花了 32 步才找到出口,每个奖励 r(s,a) = -1,因此回报为 -27.501966404214624

输出

代理已达到目标状态

九、代码说明

1. 初始化:“__init__”方法通过指定环境的特征来设置环境,例如是否采用探索开始、形状奖励和迷宫的大小。它初始化状态、目标、迷宫结构、动作空间和观察空间。

2. 步骤函数:“步骤”方法定义了环境如何随着代理采取的每个操作而演变。它计算奖励,根据操作更新状态,并检查剧集是否完成。

3. 重置功能:“重置”方法重置环境,使代理恢复到其启动状态。如果启用了“exploring_starts”,则代理可以从目标以外的任何状态启动。

4. 渲染:“渲染”方法将环境可视化。它创建迷宫的图形表示,包括代理的位置和目标。它返回图像(如果“mode”设置为“rgb_array”)或将其显示在屏幕上(如果“mode”设置为“human”)。

5. 奖励计算:“compute_reward”方法计算代理在给定状态和操作下收到的奖励。如果启用了“shaped_rewards”,则会根据与目标的距离计算奖励;否则,如果代理未达到目标,则它会提供 -1 的稀疏奖励。

6. 效用函数:有“_get_next_state”、“_create_maze”和“_compute_distances”等效用函数,分别有助于计算下一个状态、创建迷宫结构和计算与目标的距离。

7.显示视频功能:此功能从一系列帧生成HTML视频。它用于显示代理轨迹的可视化表示。

十、什么是Q Learning?

Q-Learning 是一种算法,旨在找到给定当前状态的最佳决策。让我们想象一下,如果一个孩子只是保持在一个随机的状态,在它周围的某个地方,躺着一块巧克力,它会做什么。孩子会多次尝试站立、爬行,失败很多次,最终会得到巧克力。这类似于 q-learning 算法的作用。代理暴露在完全未知的环境中。它采取一些随机行动,因这些行动而获得奖励或惩罚,并学会做出进一步的决定。(来源:甲骨文)

10.1 Q 学习

Q-learning 是一种 Off policy RL 算法,用于时间差 Learning。时间差异学习方法是比较时间连续预测的方法。它学习值函数 Q (S, a),这意味着在特定状态 “s” 下采取行动 “a” 有多好。

展示Q Learning实施的流程图

19.2 Q 学习说明:

        Q-learning是一种流行的基于贝尔曼方程的无模型强化学习算法。Q-learning的主要目标是学习策略,该策略可以告知智能体在什么情况下应该采取什么行动来最大化奖励。

·它是一种非策略 RL,它试图找到在当前状态下要采取的最佳操作。

·Q-learning 中智能体的目标是最大化 Q 的值。

·Q-learning的值可以从贝尔曼方程中推导出来。

请看下图:

Q- 表示每个状态下操作的质量。因此,我们将使用一对状态和动作,即 Q(s, a),而不是在每个状态下使用一个值。Q 值指定哪个动作比其他动作更具润滑性,根据最佳 Q 值,智能体采取下一步行动。贝尔曼方程可用于推导 Q 值。

要执行任何操作,智能体将获得奖励 R(s, a),并且他最终将处于某种状态,因此 Q 值方程为:

从贝尔曼最优方程推导的 Q 学习方程

· 问:a:这是当前的 Q 值,表示在状态 s 中执行操作 a 的预期未来奖励。

· R(s, a):这是代理在状态 s 中执行操作 a 时收到的即时奖励。

· γ(伽玛):这是折扣系数(介于 0 和 1 之间)。它控制着代理对未来奖励的重视程度。较高的伽玛值更看重未来,而较低的伽玛值则侧重于眼前的奖励。

· 最大(Q(s', a')):这表示从下一个状态 s' 可获得的最大预期未来奖励,考虑到代理在该状态下可以采取的所有可能操作。

更新了 Q 学习方程式(来源:Oracle AI 和数据科学博客)

Q表

在执行 Q 学习时创建 Q 表或矩阵。该表遵循状态和操作对,即 [s, a],并将值初始化为零。每次操作后,都会更新表,并将 q 值存储在表中。RL 代理使用此 Q 表作为参考表,根据 q 值选择最佳操作。

在代理计算状态操作值时更新 Q 表的图形表示。

十一、结论

强化学习 (RL) 提供了一种独特的方法来训练智能体。与使用标记数据的监督学习或使用未标记数据的无监督学习不同,RL 将智能体置于通过反复试验进行学习的环境中。通过与环境互动、采取行动和获得奖励(或惩罚),智能体逐渐学会最佳行动方案,以最大化其长期回报。

Q-Learning 是一种流行的 RL 算法,以其无模型特性而闻名。它不需要完整的环境地图,使其能够适应各种情况。Q-Learning 利用 Q 值,它表示在特定状态下采取特定操作的估计未来奖励。通过贝尔曼方程,代理会迭代更新这些 Q 值,使其能够了解哪些操作在不同场景中最有价值。

关键要点:

·RL 允许智能体通过交互和反馈进行学习,使其适用于复杂和动态的环境。

·Q-Learning 是一种功能强大的 RL 算法,在无法获得完整环境模型的情况下表现出色。

·通过学习 Q 值,智能体发现最佳行动方案,以最大化其长期回报。

超越Q-Learning:

虽然 Q-Learning 是一种流行的选择,但存在其他 RL 算法,每种算法都有其优点和缺点。一些例子包括:

1. SARSA(State-Action-Reward-State-Action):类似于Q-Learning,但它遵循特定的行动选择策略。

2. 深度问答:利用深度神经网络处理具有高维状态空间的复杂环境。

3. 策略梯度方法:专注于直接学习智能体的策略(行动选择策略)。

乌特卡什·拉斯托吉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebHttpServletRequestResponse(完整知识点汇总)

额外知识点 Web核心 Web 全球广域网&#xff0c;也成为万维网&#xff08;www&#xff09;&#xff0c;可通过浏览器访问的网站 JavaWeb 使用Java技术来解决相关Web互联网领域的技术栈 JavaWeb技术栈 B/S架构&#xff1a;Browser/Server&#xff0c;即浏览器/服务器 架构模式…

功能测试 之 单模块测试----轮播图、登录、注册

单功能怎么测&#xff1f; 需求分析 拆解测试点 编写用例 1.轮播图 &#xff08;1&#xff09;需求分析 位置&#xff1a;后台--页面--广告管理---广告列表(搜索index页面增加广告位2) 操作完成后需要点击admin---更新缓存,前台页面刷新生效 &#xff08;2&#xff09;拆解…

生信算法8 - HGVS转换与氨基酸字母字母表

HGVS 概念 HGVS 人类基因组变异协会(Human Genome Variation Society)提出的转录本编号&#xff0c;cDNA 参考序列(以前缀“c.”表示)、氨基酸参考序列(以前缀“p.”表示)。cDNA 中一种碱基被另一种碱基取代&#xff0c;以“>”进行表示&#xff0c;如&#xff1a;c.2186A&…

ETO MARKETS:美债高额利息——美国财政的不可承受之重

摘要 2024年&#xff0c;美国联邦政府债务的利息支出预计将达到8920亿美元&#xff0c;这一数字比国防开支还要多&#xff0c;凸显了政府债务和利率上升的双重压力。国会预算办公室&#xff08;CBO&#xff09;预测&#xff0c;利息支出占GDP的比例将继续上升&#xff0c;这意…

【IDEA】Spring项目build失败

通常因为环境不匹配需要在file->projectstructure里面调整一下。

Flink Sql Redis Connector

经常做开发的小伙伴肯定知道用flink连接redis的时候比较麻烦&#xff0c;更麻烦的是解析redis数据&#xff0c;如果rdis可以普通数据库那样用flink sql连接并且数据可以像表格那样展示出来就会非常方便。 历时多天&#xff0c;我终于把flink sql redis connector写出来了&…

性能测试(五)—— 数据库性能测试-mysql

1 mysql性能测试的主要内容 MySQL数据库介绍MySQL数据库监控指标MySQL慢查询工作原理及操作SQL的分析与调优方法MySQL索引的概念及作用MySQL索引的工作原理与设计规范MySQL存储引擎MySQL实时监控MySQL集群监控方案MySQL性能测试的用例准备使用Jmeter开发MySQL性能测试脚本执行…

【从零到一】电子元器件网站建设/开发方案、流程及搭建要点全解

电子元器件行业在数字化转型的大潮下也迎来了前所未有的发展机遇。一个高效、专业、用户友好的电子元器件网站&#xff0c;不仅能够提升品牌形象&#xff0c;还能显著提高销售转化率&#xff0c;增强客户粘性。道合顺芯站点将详细阐述电子元器件开发方案、实施流程&#xff0c;…

【ai】tx2-nx:搭配torch的torchvision

微雪的教程pytorch_version 1.10.0 官方教程安装torch官方教程 依赖项 nvidia@tx2-nx:~/twork/03_yolov5$ $ sudo apt-get install libjpeg-dev zlib1g-dev lib

如何避免群发引起反感?

微信群发信息引起反感主要是因为缺乏情感&#xff0c;尽管最初微信群发旨在传递有价值信息&#xff0c;但由于滥用&#xff0c;现在人们对其印象非常负面。但是&#xff0c;还是有办法挽救的&#xff01; 群发消息时按照这3个标准发&#xff0c;可以避免被反感。 1、短信群发目…

wps要会员才能把pdf分开,这不纯属智商税吗

我有一个文档 然后 我给你们写好了一个代码 from PyPDF2 import PdfReader, PdfWriterdef split_pdf(file_path, ranges, output_names):# Open the input PDF filewith open(file_path, rb) as pdf_file:reader = PdfReader(pdf_file)total_pages = len(reader.pages)if len…

Humanize,一个很有人情味的 Python 库

目录 01初识 Humanize 为什么选择 Humanize&#xff1f; 安装 Humanize 02时间与日期的处理 时间差的展示 日期的展示 03数字的处理 数字的单位转换 数字的精确度控制 数字的千位分隔符 04文件大小的处理 文件…

【Linux工具】yum软件包管理器与Vim编辑器的高效运用

目录 Linux 软件包管理器 YUM 什么是软件包 安装工具 rzsz 及注意事项 查看软件包 安装和卸载软件 安装软件 卸载软件 Linux 开发工具 编辑器 - Vim 使用 ​编辑 Vim 与 Vi 的区别 Vim 的基本概念 三种模式 Vim 的基本操作 操作尝试&#xff1a; Vim 命令集解释…

Windows更新报错 0xc1900101 0x30018 解决方案

卸载自带的电脑管家&#xff08;比如华硕、联想、华为等&#xff09; 通过禁用第三方驱动启动Windows&#xff08;winr 运行 msconfig&#xff09;&#xff0c;然后禁用掉第三方服务&#xff0c;重启系统。 检查更新&#xff0c;应该问题就能解决 记得重新运行msconfig&…

【机器学习】线性回归:从基础到实践的深度解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 线性回归&#xff1a;从基础到实践的深度解析引言一、线性回归基础1.1 定义与目…

Electron+vite+vuetify项目搭建

最近想用Electron来进行跨平台的桌面应用开发。同时想用vuetify作为组件&#xff0c;于是想搭建一个这样的开发环境。其中踩了不少坑&#xff0c;总是会出现各种的编译错误和问题&#xff0c;依赖的各种问题&#xff0c;搞了好久最终环境终于弄好可正常开发了。这里分享下快速搭…

最新OPPO 真我手机 一加手机 使用adb命令永久关闭系统更新教程

使用adb命令永久关闭系统更新 一、先了解手机系统二、Android 11 以下使用adb 命令永久关闭系统更新1、adb 官方下载2、小白开启 USB 调试模式教程&#xff08;熟手跳过&#xff09;三、Android 12 以上使用adb 命令永久关闭系统更新什么您还是不会弄&#xff01;赞赏我&#x…

git中的多人协作开发场景

✨前言✨ &#x1f4d8; 博客主页&#xff1a;to Keep博客主页 &#x1f646;欢迎关注&#xff0c;&#x1f44d;点赞&#xff0c;&#x1f4dd;留言评论 ⏳首发时间&#xff1a;2024年6月20日 &#x1f4e8; 博主码云地址&#xff1a;博主码云地址 &#x1f4d5;参考书籍&…

告别夏季粉尘螨虫困扰,这些空气净化器品牌你不能错过!

夏季来临&#xff0c;粉尘螨虫肆虐&#xff0c;对家居环境造成巨大威胁。俗话说&#xff1a;“病从口入&#xff0c;祸从口出。”夏季是粉尘和螨虫的活跃期&#xff0c;常规的清洁手段如吸尘、抹布擦拭等已无法彻底清除这些顽固的过敏源。尤其是在空调使用频繁的日子里&#xf…

民宿小程序在线预约系统开发,提高品牌影响力

在旅游业发展旺盛的当下&#xff0c;也带动了各地民宿的发展。在科技的支持下&#xff0c;民宿小程序得到了快速发展&#xff0c;凭借方便快捷的优势为大众带来新的体验。 民宿小程序的发展为用户提供了便捷的预订渠道&#xff0c;用户可以根据对房间的要求选择&#xff0c;能…