Baeldung Pro – CS – NPI EA (类别 = Baeldung 关于计算机科学)
announcement - icon

通过超简洁的 Baeldung Pro 体验学习

>> 会员和 Baeldung Pro.

没有广告,深色模式,并免费获得 6 个月的 IntelliJ Idea Ultimate,供您入门。

1. 简介

在本教程中,我们将探讨强化学习的基础知识以及如何在其中使用神经网络。 此外,我们将开发一个小应用程序来深入了解基本概念。

2. 一些基础

在我们开始之前,让我们尝试理解我们所说的强化学习和神经网络是什么。

2.1. 机器学习和强化学习

机器学习指的是一类算法,它们承诺能够根据经验自动改进。 更笼统地说,机器学习是人工智能的一部分,人工智能是关于智能代理的研究,创立于1956年

我们可以根据算法随着时间学习可用的反馈类型,将机器学习大致划分为三个类别

  • 监督学习:监督学习的目标是学习一个可以将输入映射到输出的函数,利用带有标签的训练数据集。
  • 无监督学习:相反,无监督学习是关于在数据中学习未检测到的模式,通过探索而无需任何预先存在的标签。
  • 强化学习:最后,强化学习的目标是通过在环境中采取行动来最大化累积奖励,并在探索和利用之间取得平衡。

2.2. 神经网络和深度学习

现在让我们理解我们所说的神经网络是什么。 我们通常将神经网络用作解决机器学习问题的一种技术,例如监督学习。

神经网络由许多简单的处理节点组成,这些节点相互连接,并松散地基于人脑的工作方式。 我们通常将这些节点排列成层,并为它们之间的连接分配权重。 目的是通过多次前向和反向传播训练数据通过网络来学习这些权重。

那么什么是深度学习,它与神经网络有什么关系? 正如我们现在所知,神经网络由排列成层的处理节点组成。 从少量节点和层开始,网络可以发展到数百万个节点排列成数千层。

我们通常构建这些网络来解决复杂的问题并将它们归类为深度学习。 当我们在强化学习的背景下应用深度学习时,我们通常将其称为深度强化学习

3. 强化学习入门

强化学习是关于一个自主代理采取适当的行动以最大化特定环境中的奖励。 随着时间的推移,该代理从其经验中学习并尝试采用最佳行为

在强化学习的情况下,我们将人类交互限制在改变环境状态、以及奖励和惩罚系统。 这种设置被称为马尔可夫决策过程

3.1. 一个例子

为了更好地理解这一点,让我们以训练宠物为例。 我们可以将宠物视为一个自主代理。 如果我们试图在客厅里训练宠物,可以将那看作是环境

Reinforcement Learning

我们可以扔一个球,并期望宠物跑去捡回来。这里,扔球代表环境呈现的一种状态,而跑去捡球则代表宠物可能采取的行动。最后,我们可能会以拍拍宠物的背部作为奖励,或者通过忽略它来惩罚宠物。

可以立即给予奖励,也可以将奖励延迟到未来某个时间点。 当然,未来的奖励在现在往往价值较低,因此会打折扣。

3.2. 环境类型

强化学习主要包含两种类型的环境

  • 确定性:这指的是**状态转移模型和奖励模型都是确定性函数**的情况。简单来说,如果智能体在特定状态下重复执行某个动作,它可以预期获得相同的奖励和下一个状态。
  • 随机性:随机性指的是具有随机发生概率的事物。在这样的环境中,如果**智能体在某个状态下重复执行某个动作,无法保证获得相同的奖励或下一个状态。**

3.3. 强化学习类型

通常有两种类型的强化学习

  • 基于模型:在基于模型的算法中,**智能体利用经验构建环境中的转移和即时结果的内部模型**,并参考它来选择合适的动作。智能体可以外部接收状态转移和奖励概率函数。
  • 无模型:相反,在无模型的算法中,**智能体利用经验直接学习策略或价值函数,而无需使用环境的模型**。在这里,智能体只了解环境中可能的 states 和 actions,而不知道状态转移和奖励概率函数。

3.4. 价值函数和策略

奖励是智能体在给定状态下采取行动时从环境中获得的即时反馈。此外,智能体在其与环境的交互中,在离散的时间步长内接收一系列奖励。

强化学习的目标是最大化这种累积奖励,我们也将它称为价值。智能体遵循的**策略被称为策略**,而**最大化价值的策略被称为最优策略**。

形式上,**强化学习中的价值概念表示为价值函数**

Rendered by QuickLaTeX.com

这里,该函数考虑了**在给定策略下,从某个状态开始的未来折扣奖励**。我们也将它称为该策略的状态-价值函数。右侧的方程是所谓的贝尔曼方程,它与动态规划中的最优条件相关。

3.5. Q-值和Q-学习

Q-值是**智能体在给定策略下,在一个状态中获取的长期回报的度量,但它也考虑了智能体在该状态下采取的动作**。基本思想是捕捉到同一动作在不同状态下可能产生不同奖励的事实

Rendered by QuickLaTeX.com

这里,该函数创建了一个状态和动作对到奖励的映射。我们也将它称为策略的动作-价值函数。

Q 值是我们在Q 学习中使用的衡量标准,它是我们采用的一种主要的无模型强化学习方法。Q 学习强调在给定策略下,一个动作在某个状态下获得未来奖励的有用程度。

4. 实现强化学习

既然我们已经涵盖了足够的基础知识,我们应该能够尝试实现强化学习。我们将在这个教程中实现 Q 学习算法。

4.1. 测试环境

OpenAI 是一家开发了几种工具和技术的公司,旨在标准化和更广泛地采用人工智能。 gym 是 OpenAI 的一个工具包,可以帮助我们评估和比较强化学习算法。

基本上,gym 是一个包含共享接口的测试环境集合,用 Python 编写。我们可以将这些环境视为一个游戏,例如 FrozenLake 环境。FrozenLake 是一个简单的游戏,控制智能体在网格世界中的移动

Frozen Lake Game Iteration

这个游戏规则如下

  • 网格由 4×4 设置的 16 个方格组成
  • 有一个起始方格 (S) 和一个目标方格 (G)
  • 有些方格是可通行的 (F),而另一些方格可能会杀死智能体 (H)
  • 智能体的移动很大程度上是不可控的
  • 智能体在从起始方格到目标方格找到可通行路径时会获得奖励

我们将使用这个环境来测试我们将在后续章节中开发的强化学习算法

4.3. Q 学习过程

在开始实现 Q 学习算法之前,了解典型的 Q 学习过程是什么样子是值得的

Q learning Process 1

Q 值存储在一个 Q 表中并进行更新,该表的维度与环境中的动作数量和状态数量相匹配。该表在过程开始时初始化为零。

从上面的示意图可以看出,Q 学习过程从通过参考 Q 表来选择一个动作开始。在执行所选动作后,我们从环境中获得奖励并使用新的 Q 值更新 Q 表。我们重复此操作多次迭代,以获得一个合理的 Q 表。

4.4. 选择动作

我们之前已经看到,当过程开始时,Q 表全部为零。因此,智能体选择的动作不能基于 Q 表,必须是随机的。但是,随着 Q 表开始更新,智能体会根据状态的最大 Q 值来选择动作。

这可能会导致智能体过早地陷入重复一些最初不是最优的决策。本质上,智能体过早地从探索环境转向利用环境。因此,有必要引入一个**名为 \epsilon - greedy 的动作选择策略**。

这里我们随机取一个数,如果这个数小于 \epsilon,则随机选择动作。 这允许智能体进行随机探索,这在学习的初始迭代中可能非常有用。 当然,我们会逐渐降低这个参数的影响,随着学习的成熟,倾向于利用已知的知识。

4.5. 更新 Q 值

我们已经知道 Q 值的计算遵循贝尔曼方程,但它到底是如何工作的呢? 让我们更好地理解这个方程的不同部分

Rendered by QuickLaTeX.com

所以基本上,我们 不断地将一个时序差分添加到当前状态和动作对的 Q 值中。 这里有两个重要的参数,需要明智地选择

  • 学习率:这是一个参数,我们可以用它来控制算法学习的速度。 我们将其设置为 0 和 1 之间,有效值为 0,意味着完全不学习。
  • 折扣因子:我们之前已经看到,未来的奖励对当前动作的重要性较低。 我们使用折扣因子来模拟这一点,同样设置为 0 和 1 之间。

4.6. 设置 Q-learning 算法

现在让我们将我们迄今为止讨论的所有步骤以程序的形式呈现出来,以完成 Q-learning 算法。 我们将使用 Python 开发一个基本的示例进行演示,主要是因为 Python 拥有丰富的数据操作和机器学习库生态系统。

我们首先进行必要的导入

import gym
import numpy as np

接下来,让我们获取我们的测试环境 FrozenLake,如前所述

env = gym.make('FrozenLake-v0')

现在我们需要设置一些学习参数,如折扣因子、ϵ 值及其衰减参数、学习率和要运行的剧集数

discount_factor = 0.95
eps = 0.5
eps_decay_factor = 0.999
learning_rate = 0.8
num_episodes = 500

我们在这里选择的值是基于经验的,必须将其视为需要调整的超参数。 作为最后的准备工作,我们需要初始化我们的 Q 表

q_table = np.zeros([env.observation_space.n,env.action_space.n])

4.7. 执行 Q-learning 算法

现在我们准备开始在所选环境中为我们的智能体进行学习过程了

for i in range(num_episodes):
    state = env.reset()
    eps *= eps_decay_factor
    done = False
    while not done:
        if np.random.random() < eps or np.sum(q_table[state, :]) == 0:
            action = np.random.randint(0, env.action_space.n)
        else:
            action = np.argmax(q_table[state, :])
        new_state, reward, done, _ = env.step(action)
        q_table[state, action] += 
          reward + 
            learning_rate * 
              (discount_factor * np.max(q_table[new_state, :]) - q_table[state, action])
        state = new_state

让我们了解这段代码中发生的事情

  • 我们 循环遍历选定的迭代次数,并通过其衰减参数减少 ϵ 值。
  • 在每次迭代中,我们 执行步骤直到游戏结束(我们也可以选择执行固定次数的步骤)。
  • 我们根据 \epsilon - greedy 动作选择策略,选择一个随机动作或 Q 表建议的动作
  • 我们采取行动并从环境中获得奖励和新状态
  • 最重要的是,我们 使用贝尔曼方程更新 Q 表中当前状态和所选动作的 Q 值
  • 最后,我们将状态设置为从环境中接收到的新状态,并重复该步骤

按照上述算法进行足够多的次数,我们将得到一个能够相当有效地预测游戏中动作的 Q 表。 这就是 Q-learning 算法的目标,在每一步都使用反馈循环来丰富经验并从中受益。

5. 使用神经网络的强化学习

虽然为简单的环境创建和使用 q-table 是可管理的,但在一些现实环境中却非常困难。现实环境中动作和状态的数量可能成千上万,这使得管理 q 值表格变得效率极低。

这时我们可以使用神经网络来预测给定状态下动作的 q 值,而不是使用表格。在 q-learning 过程中,我们不再初始化和更新 q-table,而是初始化和训练一个神经网络模型。

5.1. 选择神经网络架构

正如我们所讨论的,神经网络由多个处理节点组成,这些节点构成多层,并且通常是密集连接的。

这些层包括以下内容

  • 输入层:输入层中的节点数量通常是固定的,并且对应于输入数据,例如环境中的状态数量。
  • 隐藏层:神经网络架构中通常有一个或多个隐藏层。 层数和每层中的节点数是架构的超参数
  • 输出层:最后,输出层也具有固定数量的节点,这些节点对应于所需的输出,例如环境中的动作数量

让我们看一下我们之前在 q-learning 算法中使用的测试环境的简单神经网络架构

Neural Network Architecture Fully Connected

这里我们的 输入层有 16 个节点,对应于我们环境中状态的数量。它接收到 one-hot 编码的状态输入向量。有一个由 20 个节点组成的单个完全连接的隐藏层。最后,有一个 由 4 个节点组成的输出层,对应于此环境中的动作数量

5.2. 选择激活函数

神经网络中的处理节点根据其从先前节点接收到的输入、其学习到的权重和偏差来生成输出

Activation Function LaTex Explained

正如我们在上面的处理节点中所看到的,它还 使用激活函数。这必要性的一个最重要的原因在于,它为输出提供了非线性,否则输出将是相当线性的。这种非线性使神经网络能够学习复杂和现实世界的模式。

神经网络中激活函数的选择是一个优化问题,因此它属于架构的超参数。但是,输入数据的性质和我们期望的输出可以帮助我们获得良好的开端。我们将使用整流线性单元 (ReLU) 作为隐藏层中的激活函数,并将线性激活函数用于输出层。

5.3. 损失函数和优化器

神经网络通过迭代更新模型的权重和偏差来减少其能够做出的预测中的误差。因此,对于我们来说,能够随时计算模型误差是必要的。损失函数使我们能够做到这一点。通常,我们在神经网络模型中使用诸如交叉熵和均方误差之类的损失函数。

均方误差损失函数测量预测值与目标值之间差异的平方值

Rendered by QuickLaTeX.com

计算损失函数的背后的直觉是将反馈向后传递到网络中并更新权重。我们称之为反向传播,并且可以使用几种算法来实现它,从经典的随机梯度下降开始。一些算法在计算上更有效率,并且内存需求更少,例如Adam(源自自适应矩估计)。我们将使用它在我们的算法模型中。

5.4. 使用神经网络设置Q-learning

Keras是一个高级库,它构建在数据流计算库之上,例如TensorflowTheano。我们将使用Keras构建带有神经网络的q-learning算法。

q-learning算法的整体结构将与我们之前实现的一样。关键的变化在于使用神经网络模型代替q-table,以及我们每一步如何更新它。

让我们从导入必要的例程开始

import gym
import numpy as np
from keras.models import Sequential
from keras.layers import InputLayer
from keras.layers import Dense

然后我们将获得我们的测试环境,FrozenLake,用于运行该算法

env = gym.make('FrozenLake-v0')

接下来,我们将设置一些必要的超参数,并带有合理的默认值

discount_factor = 0.95
eps = 0.5
eps_decay_factor = 0.999
num_episodes=500

这里没有什么新的;然而,下一步是在Keras中设置神经网络模型。我们还可以欣赏Keras如何简单地定义像这样的复杂模型

model = Sequential()
model.add(InputLayer(batch_input_shape=(1, env.observation_space.n)))
model.add(Dense(20, activation='relu'))
model.add(Dense(env.action_space.n, activation='linear'))
model.compile(loss='mse', optimizer='adam', metrics=['mae'])

这正是我们之前讨论过的选择此类工作的神经网络架构。需要注意的是,使用了Keras类Sequential,它允许我们一个接一个地堆叠模型中的层

5.5. 使用神经网络进行Q-learning

既然我们已经完成了所有必要的设置,我们就可以使用神经网络实现我们的q-learning算法了

for i in range(num_episodes):
    state = env.reset()
    eps *= eps_decay_factor
    done = False
    while not done:
        if np.random.random() < eps:
            action = np.random.randint(0, env.action_space.n)
        else:
            action = np.argmax(
              model.predict(np.identity(env.observation_space.n)[state:state + 1]))
        new_state, reward, done, _ = env.step(action)
        target = reward + 
          discount_factor * 
            np.max(
              model.predict(
                np.identity(env.observation_space.n)[new_state:new_state + 1]))
        target_vector = model.predict(
          np.identity(env.observation_space.n)[state:state + 1])[0]
        target_vector[action] = target
        model.fit(
          np.identity(env.observation_space.n)[state:state + 1], 
          target_vec.reshape(-1, env.action_space.n), 
          epochs=1, verbose=0)
        state = new_state

该算法与我们之前实现的内容非常相似;因此,我们将仅讨论神经网络引入的显著变化

  • 请注意,我们像以前一样基于\epsilon - greedy策略选择一个动作,但使用神经网络模型来进行预测。
  • 我们基于贝尔曼方程,使用模型对新状态的预测来计算目标值。
  • 最后,我们使用one-hot编码的当前状态,以及转换为向量的目标值来训练模型,完成单个步骤。

如果我们为足够多的迭代运行此算法,我们将得到一个可以以更高的准确度预测游戏中给定状态的操作的神经网络模型。当然,神经网络模型比简单的q-table更有能力识别复杂的模式

6. 结论

在本文中,我们讨论了强化学习的基础知识。我们详细探讨了q-learning算法。

最后,我们检查了神经网络以及它们在强化学习中的优势。

© .