当前位置: 首页 > news >正文

4. 奖励函数设置

奖励函数的设计取决于具体的任务目标,因为奖励函数直接影响智能体的行为和学习效果。在设计奖励函数时,通常需要根据任务的特性和最终目标来定义一个合理的奖励信号,使智能体能够通过最大化累积奖励来达到预期的效果。

以下是一些奖励函数设计的基本原则和常见示例。

1. 确定任务目标

首先明确任务的目标。奖励函数需要驱动智能体完成特定目标,因此奖励的定义应该直接反映任务的成功条件。例如:

  • 导航任务:奖励智能体接近目标点,惩罚偏离轨迹或撞到障碍物。
  • 控制任务:奖励智能体保持稳定或快速达到目标状态,惩罚能量消耗或抖动。
  • 连续动作任务:奖励智能体完成任务的效率和速度,惩罚不必要的动作。

2. 设计奖励的组成

一般来说,奖励函数可以包含多个组成部分。通常包括:

  • 主要目标奖励:基于智能体的核心任务。例如,在距离目标点最近时获得较大的正奖励。
  • 惩罚项:惩罚不期望的行为(如撞到障碍物、高速消耗能量等)。
  • 行为控制奖励:奖励平滑的行为或低消耗的动作,避免频繁的急剧变化。

示例奖励函数
假设您在设计一个机器人导航任务的奖励函数,希望机器人到达目标,同时避免障碍物。

例1:距离奖励
假设 d t d_t dt 是智能体当前的距离目标的距离, d t − 1 d_{t-1} dt1 是前一步的距离,那么我们可以根据距离的减少量来定义奖励:

reward = d_{t-1} - d_t

在这种奖励设计中,智能体接近目标时得到正奖励,远离时得到负奖励。

例2:基于目标的奖励和惩罚

def compute_reward(state, action, next_state):# 假设目标位置是 goal_pos,当前位置是 state 中的一个元素current_pos = state[:2]  # 假设位置在 state 的前两个元素中next_pos = next_state[:2]goal_pos = np.array([goal_x, goal_y])# 距离计算distance_to_goal = np.linalg.norm(next_pos - goal_pos)# 主要奖励:接近目标的奖励goal_reward = -distance_to_goal# 惩罚:不必要的动作或者偏离目标action_penalty = -0.1 * np.linalg.norm(action)  # 动作幅度惩罚# 组合奖励reward = goal_reward + action_penaltyreturn reward

在这个奖励函数中:

  • 主要奖励:基于智能体接近目标的距离。距离越小,奖励越大。
  • 动作惩罚:惩罚动作的幅度,鼓励智能体做出更节省能量的决策。

例3:带终止状态的奖励函数
在一些任务中,达到特定状态(如目标位置)时会触发终止状态,可以设计终止奖励和失败惩罚:

def compute_reward(state, action, next_state, done):goal_pos = np.array([goal_x, goal_y])next_pos = next_state[:2]distance_to_goal = np.linalg.norm(next_pos - goal_pos)# 距离奖励goal_reward = -distance_to_goal# 动作惩罚action_penalty = -0.1 * np.linalg.norm(action)# 终止奖励:如果达到目标,给较大的正奖励if done:if distance_to_goal < threshold:final_reward = 100  # 达到目标奖励else:final_reward = -100  # 未达到目标的失败惩罚else:final_reward = 0reward = goal_reward + action_penalty + final_rewardreturn reward

在这个奖励函数中:

  • 距离奖励:智能体接近目标时得到正奖励。
  • 动作惩罚:动作幅度越大,惩罚越大,鼓励智能体采用平滑的控制。
  • 终止奖励:当智能体达到目标(或者失败)时,给予额外的奖励或惩罚。

奖励函数设计的注意事项

1 ) 奖励的尺度:确保奖励的尺度合理,不要让奖励值过大或过小。过大的奖励可能导致训练不稳定,而过小的奖励会延缓学习速度。

2 ) 稀疏奖励 vs. 稠密奖励

  • 稀疏奖励:例如只有在任务完成时才给予奖励,训练可能较慢,但更符合实际情况。
  • 稠密奖励:例如每一步都给予一个基于距离的奖励,可以帮助智能体更快地收敛。

3 ) 避免正负奖励冲突:奖励函数应该清晰地表明智能体的优先目标,避免奖励和惩罚之间相互矛盾。

4 ) 任务依赖性:奖励函数应与任务紧密相关,不要过于复杂。简单明确的奖励往往更有助于模型的学习和收敛。

3. 案例分析

在我之前的算法中,定义了一个“值贪婪算法”(value greedy algorithm)来逐步改进 v_qualities,其中每个 v_qualities[i] 表示第 i 个客户端的质量等级。根据 obj_incre 值的增量,算法会决定是否增加质量等级,直到增量变为负值或者达到某些约束条件(如带宽限制)。

根据这个算法的过程,可以设计一个奖励函数来鼓励智能体最大化 v_qualities 的改进,同时避免过多地占用带宽和延迟,具体可以如下定义:

3.1 奖励函数设计思路

1 ) 质量改进奖励:每次成功提升 v_qualities 中任意一项的质量等级,可以获得一定的奖励,这可以鼓励智能体提高视频流的整体质量。

2 ) 带宽使用惩罚:如果超过了客户端的带宽限制或总带宽限制,则会有惩罚,这样可以确保智能体不会为了提升质量而过度使用带宽。

3 ) 延迟和抖动惩罚delay_portionvar_portion 分别衡量延迟和抖动的变化。这两个值越大,表示系统延迟和抖动越大,因此可以在奖励函数中引入惩罚项来限制这些值的增大。

4 ) 整体改进奖励:最终的 v_improve 代表了总的改进,可以用于奖励函数的正向激励。

3.2 奖励函数示例

下面是一个基于上述思路的奖励函数:

def compute_reward(v_qualities, bandwidth_clients, users, pred_delays, config, time_slot, ALPHA, GAMMA):v_improve = 0  # 总改进penalty = 0    # 总惩罚# 遍历每个客户端计算改进量和惩罚项for index in range(len(v_qualities)):rate_high = cal_bandwidth(v_qualities[index] + 1)rate_low = cal_bandwidth(v_qualities[index])# 计算延迟变化if self.delay_pred == 0:delay_portion = users[index].next_delay[v_qualities[index] + 1] - users[index].next_delay[v_qualities[index]]else:delay_portion = pred_delays[index][v_qualities[index]] - pred_delays[index][v_qualities[index] - 1]# 计算抖动变化old_mean = users[index].dynamic_meanvar_portion = users[index].est_pred * (time_slot - 1) * ((v_qualities[index] + 1 - old_mean) ** 2 - (v_qualities[index] - old_mean) ** 2) / time_slot# 质量增益奖励quality_reward = users[index].est_pred - ALPHA * delay_portion - GAMMA * var_portionif quality_reward > 0:v_improve += quality_reward  # 增加正向奖励# 带宽限制惩罚cur_rate = cal_bandwidth(v_qualities[index])if cur_rate > bandwidth_clients[index] or sum([cal_bandwidth(q) for q in v_qualities]) > config.RATE_LIMIT_SERVER:penalty += 10  # 惩罚过度使用带宽# 额外的延迟和抖动惩罚penalty += ALPHA * max(0, delay_portion) + GAMMA * max(0, var_portion)# 总奖励为改进减去惩罚reward = v_improve - penaltyreturn reward

3.3 奖励函数说明

  • v_improve:累计质量改进奖励,每次成功提升 v_qualities 的某个质量等级时,就会根据 quality_reward 增加奖励。
  • 带宽惩罚:当 v_qualities 的提升导致超出客户端或服务器带宽限制时,penalty 会增加一个固定的惩罚值(可以根据具体情况调整)。
  • 延迟和抖动惩罚:如果延迟或抖动增加,也会相应增加惩罚,以鼓励智能体保持较低的延迟和稳定性。

3.4 这个奖励函数的特点

  • 鼓励提高质量:智能体可以通过提升 v_qualities 来获得奖励,这样可以引导它寻找提升质量的策略。
  • 限制带宽和延迟:带宽和延迟的惩罚项帮助智能体在提升质量时不会过度占用资源。
  • 可调节性:可以通过调整 ALPHAGAMMA 来平衡质量、延迟和抖动之间的权重。

http://www.mrgr.cn/news/75032.html

相关文章:

  • FFMPEG录屏(22)--- Linux 下基于X11枚举所有显示屏,并获取大小和截图等信息
  • 大数据面试题--kafka夺命连环问(后10问)
  • 本溪与深圳市新零售产业互联协会共商世界酒中国菜湾区农业发展
  • 【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测
  • AlphaFold3中文安装教程
  • Unity类银河战士恶魔城学习总结(P117 Ice And Fire Item Effec 制作一把冰火属性的剑)
  • 详细介绍Transformer!
  • LeetCode100之删除链表的倒数第N个节点(19)--Java
  • halcon3D gen_image_to_world_plane_map的图像高精度拼接技术
  • 企业风险监控4.0时代,大家都在关心什么问题?这20+个QA为你揭晓!
  • 2024软件测试面试题(持续更新)
  • 38.安卓逆向-壳-smali语法2(条件语句和for循环)
  • CSR 和 SSR 分别是什么?
  • 力扣 LeetCode 459. 重复的子字符串(Day4:字符串)
  • UVa 11288 Carpool
  • 打造专业问答社区:Windows部署Apache Answer结合cpolar实现公网访问
  • Cocos Creator《星际征服者》3D实时对战战机类游戏
  • 基于Springboot+微信小程序的健康饮食小程序 (含源码数据库)
  • 飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问
  • 什么?postman 还可以做性能测试?
  • C++的返回值在内存中的传递过程
  • 【微信小程序】关于小程序开发过程中的一些经验之谈,很有用!!
  • StableDiffusion系列教程 |SD提示词编写指南
  • PSRR仿真笔记
  • 37拼购模式后期可能面临的问题及解决方案
  • 数据分析师证书怎么考