对强化学习和奖励函数的理解
Frozen_Ladybug · · 算法·理论
\text{Part I}. 深度学习中奖励函数的运用原理
在传统的深度学习中,虽然不像强化学习那样直接以奖励函数为核心,但在一些场景下也会涉及类似奖励的概念,主要体现在损失函数和优化目标上。
一般来讲有如下三种训练方式:
-
监督学习
监督学习的目标是让模型学习输入和输出之间的映射关系。例如在图像分类任务中,模型的输入是图像数据,输出是对应的类别标签。损失函数(如交叉熵损失)就类似于一种“反向奖励”机制。它衡量的是模型预测结果与真实标签之间的差异,模型的训练过程就是通过优化算法(如随机梯度下降)来最小化这个损失函数。从奖励的角度看,我们希望模型的预测结果尽可能准确,即预测正确时损失小,可视为获得了“奖励”(损失减少);预测错误时损失大,相当于受到了“惩罚”(损失增加)。例如,在训练一个手写数字识别模型时,若模型准确预测出数字,交叉熵损失就会降低,这可以类比为得到了某种形式的奖励,促使模型朝着正确预测的方向优化。
-
无监督学习
以聚类算法为例,虽然没有明确的真实标签,但会定义一个目标函数(如 K-means 算法中的簇内平方和最小化)。这个目标函数的优化过程也可以看作是一种奖励机制。当数据点被合理地分配到各个簇中,使得簇内数据点的相似度尽可能高(即簇内平方和减小)时,就相当于获得了 “奖励”,模型会朝着使这个目标函数值最小化的方向进行调整。
-
生成式对抗网络(GAN)
GAN 由生成器和判别器组成。对于生成器而言,它的目标是生成逼真的数据样本,使得判别器难以区分是真实数据还是生成数据。判别器的输出可以看作是对生成器的一种 “奖励反馈”。当判别器将生成器生成的数据误判为真实数据时,生成器就获得了“奖励”(如判别器输出为高概率的真实数据),从而促使生成器不断改进生成能力;对于判别器来说,准确区分真实数据和生成数据就是它的“奖励”,正确分类的概率越高,“奖励”越大。
\text{Part II.} 强化学习中奖励函数的运用原理
-
基本原理
智能体在每一个时间或步骤
t 根据当前的策略\pi 选择某个动作a_t ,产生新的状态s_{t+1} 并反馈一个奖励值r_{t+1} 。目标即得到一个策略\pi 使得即使奖励最大化。 -
引导学习过程
奖励函数引导着智能体的学习过程。如果智能体执行某个动作后获得了正奖励,那么它会倾向于在类似状态下再次选择这个动作;如果获得负奖励,就会尽量避免在相同或类似状态下选择该动作。通过不断地与环境交互并根据奖励调整策略,智能体逐渐学习到最优策略。例如在玩 Atari 游戏时,智能体通过尝试不同的游戏操作(动作),根据游戏得分(奖励)来调整自己的操作策略,以达到更高的得分。
-
长期规划与探索和利用的平衡
强化学习强调长期累积奖励,这使得智能体需要进行长期规划。它不能仅仅追求即时奖励,而要考虑当前动作对未来奖励的影响。同时,智能体还需要在探索新的动作和利用已有的经验之间进行平衡。如果只利用已有的经验(即选择那些曾经带来高奖励的动作),可能会陷入局部最优(导致循环);而过度探索则可能导致学习效率低下。奖励函数在这个过程中起到了关键的调节作用,合适的奖励设计可以促使智能体在探索和利用之间找到一个良好的平衡。
\text{Part III.} 三种基本奖励函数
-
基于历史信息的函数
\operatorname{HFC}_i(t)=\displaystyle\sum^m_{j=1}r_j -
基于历史失效密度的函数
\operatorname{HFD}_i(t)=\dfrac{1}{|T_f|}\displaystyle\sum_{t_i\in T_f}\exp\bigg(-\dfrac{|t-t_i|}{\alpha}\bigg) -
基于平均历史失效分布的函数
\operatorname{APHF}_i^{sw}(T_t)=1-\dfrac{\sum^n_{j=1}\operatorname{Rank}_j}{n\text{win}(m,sw)}+\dfrac{1}{2\operatorname{win}(m,sw)} 其中 win 函数表示一个用于评估和比较不同策略或动作在特定时间窗口内性能的指标。
以下为这三种奖励函数的基本解释以及应用。
\text{Part IV. HFC} 函数的理解
-
函数理解
该函数是对过去
m 个历史奖励r_j 的叠加,不考虑时间先后顺序和权重差异等因素。在编程场景中,可以表示不同时间或事件下产生的奖励数值,比如特定任务的积分和奖励等。
-
应用场景
在一个游戏中,玩家每完成一个任务后会获得一定经验值作为奖励,即每次的
r_i 。我们可以统计玩家在一定时间内的总经验值以及(可能升级)情况。
-
代码示例和性能评估
r_list = [10, 20, 15, 30, 25] # 假设这是完成5个任务获得的经验值,即m = 5 HFC_result = sum(r_list) print(HFC_result)
这个函数可以评估在处理
m 组数据后的总奖励以及总体表现。 -
可能优化
可以根据需求在奖励中加入权重(可能是线性或指数型),如
r_{it}=\alpha_i r_i 或r_{it}=r_i e^{\alpha_i} 。
\text{Part V. HFD} 函数的理解
-
函数理解
其中
T_f 表示历史失效时间的集合,对于每个t_i ,使用指数衰减函数横梁时间t 与t_i 的关联程度,\alpha 为参数。函数整体对所有历史失效时间对应的指数衰减项进行平均,意味着距离当前时间越近的失效事件对当前值的贡献越大,体现了当前时刻与历史失效情况的紧密联系。
-
应用场景
系统稳定性监测:在服务器编程中,记录每次服务器出现故障(失效)的时间。
T_f 就是这些故障时间的集合。通过计算\operatorname{HFD}_i(t) ,可以评估当前时刻服务器基于历史故障情况的失效风险。如果\operatorname{HFD}_i(t) 值较高,说明近期有较多的故障发生,服务器可能处于不稳定状态。 -
代码示例和性能评估
import math T_f = [10, 20, 30] # 假设这是服务器三次故障的时间点 t = 40 # 当前时间 alpha = 5 # 衰减参数 HFD_result = sum([math.exp(-abs(t - t_i) / alpha) for t_i in T_f]) / len(T_f) print(HFD_result)
在网络编程中,记录网络连接中断(失效)的时间点。通过
\operatorname{HFD} 可以判断当前网络连接基于历史中断情况的稳定性,为网络重连策略等提供参考。 -
可能优化
同上。
\text{Part VI. APHF} 函数的理解
-
函数理解
-
编程运用场景
异常检测系统:在数据处理程序中,对数据点的某些特征进行排名,比如数据点与正常数据分布的偏离程度排名。
n 个数据点的排名为\operatorname{Rank}_j ,通过\operatorname{APHF}^{sw}_i(T_t) 可以判断当前数据点相对于历史数据分布的异常程度。如果函数值较低,可能表示当前数据点是异常的。 -
代码示例和性能评估
def win(m, sw): return m * sw # 简单定义,实际需根据具体情况确定 Rank_list = [1, 2, 3, 4, 5] # 假设5个数据点的排名 n = len(Rank_list) m = 10 # 历史数据量 sw = 2 # 窗口大小 APHF_result = 1 - sum(Rank_list) / (n * win(m, sw)) + 1 / (2 * win(m, sw)) print(APHF_result)
在多智能体编程中,每个智能体的行为结果可以进行排名,通过
\operatorname{APHF} 评估某个智能体在历史行为结果中的相对表现,为智能体的策略调整提供依据。 -
可能优化
可以不检测数据点异常程度,而是从预测的角度看新的数据是否符合预期。
\text{Part VII.} 其他奖励函数的示例:
-
即时奖励函数
r_t=R(s_t,a_t) -
折扣累计奖励函数
G_t=\displaystyle\sum^{\infin}_{k=0}\gamma^kr_{t+k+1}\;(0\le\gamma\le1) -
优势函数
A(s,a)=Q(s,a)-V(a) 其中
V(s) 为状态价值函数,Q(s,a) 为动作价值函数。 -
联合奖励函数
-
分类任务和回归任务的奖励函数(与损失函数类似)
\text{Part VIII.} 总结
这三种函数(还有我后面列举的不同函数)在不同情况下会各自展现出优势,在具体情况下会按需求选择。
在实际案例中,一般情况会比示例复杂得多。这些函数需要根据具体的问题和需求进行适当的调整和优化,同时合理处理相关的参数和数据结构,以达到预期的效果。
(注:部分示例来源于网络)
(注:希望了解具体损失函数的可以参见 https://www.luogu.com.cn/article/5y196fm2 中的“期末课题 损失函数”部分)