深度强化学习血泪调参史:从人工智障到人工智能

2023-10-21 15:10

本文主要是介绍深度强化学习血泪调参史:从人工智障到人工智能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

深度强化学习血泪调参史:从人工智障到人工智能——粗调

  • 背景
  • 应用深度强化学习经常遇到的问题
  • 调参大法
    • 针对问题1:不能达到预期效果,AI宛如神经智障。导致这种问题的源头可能有太多太多种,但是一旦遇到这种问题,建议从以下几个方面入手:
    • 针对问题2:神经网络的cost不下降,一直在高位(有时候的cost能达到二位数)徘徊。产生这种情况的原因很有可能是神经网络的初始化存在问题,举例:神经网络的初始化输出落在了[10,20]的区间内,但是你期望的reward输出却在[-1,1]的区间内,导致神经网络存在很长的一段距离才能训练到合适的参数(有时候根本就训练不出来)
    • 针对问题3:神经网络不收敛。产生这种情况的原因有很多种,下面分别讨论吧
    • 其他通用的建议

背景

初学者在学习了强化学习或深度强化学习理论之后,总想找个应用背景验证一下自己所学的知识。然而,在没有实践经验的条件下,很容易遭受当头一棒,大部分人可能从此开始深度强化学习的从入门到放弃。我也曾经(其实经常)产生放弃的想法,但是好在能够坚持下来,在电脑前死磕代码,一行一行地调试,终于能够解决大部分遇到的问题。

首先说明,一般的多阶段规划问题,以目前的DRL算法能力来看,都能够有不错的表现,如果效果不好,大概率是自己代码的问题。

为了避免各位同学重走深度强化学习的万里长征路,我把我自己总结的调参经验,结合网络上公开的知识,形成这个博客的内容:从人工智障到人工智能。

这篇博客的目的是:先抛开效果不说,能够先让强化学习的神经网络收敛,在下篇博客中将继续深入讲解如何调整具体的算法参数,来搜索使效果最好的那些参数空间

应用深度强化学习经常遇到的问题

1:不能达到预期效果,AI宛如神经智障
2:神经网络的cost不下降,一直在高位(有时候的cost能达到二位数)徘徊
3:神经网络不收敛,AI的表现时好时坏

调参大法

针对问题1:不能达到预期效果,AI宛如神经智障。导致这种问题的源头可能有太多太多种,但是一旦遇到这种问题,建议从以下几个方面入手:

(1)仔细检查代码,尤其是状态的输入是不是和你预期的一样,有时候状态向量中一位的0和1的区别就能让AI疯狂
(2)再次仔细检查代码,看看保存到记忆库(如果使用的是DQN)中的数据,是否能够一一对应,另外,在计算loss函数的时候,一定要保证,是针对同一个状态下的同一个action,计算预测价值和真实价值之间的gap,作为loss值,千万不要搞错,否则,AI不智障是不可能的
(3)检查神经网络的结构,尤其是最后输出的时候,建议不要激活函数(除非你用基于策略的强化学习算法,最后输出的激活函数通常是sigmoid),因为激活函数毕竟有可能导致信息空间的扭曲,从而导致可能输出空间不包含你想要的值,中间隐含层的输出函数建议用Relu
(4)仔细检查环境的逻辑,是否存在同一个状态输入,对应不同reward的情况,如果存在这种不一致的情况,AI将不知所措,因为你一会告诉AI在这个状态下要这么做,一会又告诉AI要那样做

针对问题2:神经网络的cost不下降,一直在高位(有时候的cost能达到二位数)徘徊。产生这种情况的原因很有可能是神经网络的初始化存在问题,举例:神经网络的初始化输出落在了[10,20]的区间内,但是你期望的reward输出却在[-1,1]的区间内,导致神经网络存在很长的一段距离才能训练到合适的参数(有时候根本就训练不出来)

(1)调整神经网络的初始化参数,一般就是w和b的初始化。怎么调整呢,当初始化输出和你期望的输出差不多落在同一区间的时候,基本就可以了,注意,只是基本可以,如果想要更好的效果,则需要大师级的调参了,这里就不赘述了,请各位同学自己查资料

针对问题3:神经网络不收敛。产生这种情况的原因有很多种,下面分别讨论吧

(1)学习率太大,导致神经网络在一个区间内来回跌宕,就是收敛不到最优点。解决办法:调整学习率,一般都是小于0.001的。另外,还可以采用这种办法:随着训练逐渐减小学习率,这样,既可以在开始的时候较快的训练神经网络,又能保证当神经网络训练到差不多的时候,避免产生大规模动荡
(2)仔细检查环境的逻辑,是否存在同一个状态输入,对应不同reward的情况,如果存在这种不一致的情况,AI也有可能会动荡,因为你一会告诉AI在这个状态下要这么做,一会又告诉AI要那样做
(3)环境的reward是否有最优,如果你这个

其他通用的建议

(1)增加记忆库,设置到10万-100万级别;记忆库太小,选择的训练样本之间很有可能不是独立的,即有前后关联,这样是不满足DQN训练的前提条件的(具体理论参考教学书籍)
(2)加一行代码:改为Double-DQN。这个可以尝试着去做一下
(3)检查状态的描述是否合理,如果你自己都不能够基于当前的状态做出正确的决策,那怎么期望AI可以做到呢?注意,初学者经常犯先入为主的错误,自以为状态的描述没有问题,实际上,状态的描述经常是有问题的。比如我们之前做过的一个搜救项目,在一个二维网格上设置目标可能的概率,我们期望AI能够在20步之内遍历尽可能大的概率区域,一开始我们的输入就是概率矩阵,后来才发现,根据这个矩阵,根本就无法知道当前的Agent位于哪个位置,当时也是太傻了。后来做了如下更改:1)AI走过的区域,值改为-1,AI当前的位置,值设为1,这样就可以保证AI既知道历史走过的路径,又知道当前的位置。
在这里插入图片描述

(4)如果能够保证每个action获得即时奖励,那就用即时奖励。如果非得用回合奖励(也就是玩完一局游戏后才有奖励,每一步action没有奖励),那也尽量给每个action赋予一个即时奖励,然后把回合奖励分配给这一回合的每个action中(具体分配方法,可以参考具体问题背景,如果前面几步的action重要,就分配更多的回合奖励给前面的action,比如在上面的问题中,如果你希望AI可以尽早地搜索概率大的区域,就可以把回合奖励更多地分配给前面的action中)
(5)为了加快效率,可以一开始先用一个较大的学习率,让神经网络迅速收敛,然后看AI是否能学到一点东西,如果AI在向着正确的方向训练,说明算法的总体框架基本没问题,然后再调整学习率开始真正训练
(6)状态空间记得要进行归一化操作
(7)reward进行 rescale和clipping操作,实践证明这两个操作无论在收敛速度还是最终性能上都会带来明显提升,参考形式为: r = c l i p ( r / ( s t d ( R e t u r n ) + e ) , − 10 , 10 ) r=clip(r/(std(Return)+ e ),-10,10) r=clip(r/(std(Return)+e),10,10) [1]

[1]https://zhuanlan.zhihu.com/p/99901400

这篇关于深度强化学习血泪调参史:从人工智障到人工智能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/255204

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程