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

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

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


原文地址:https://blog.csdn.net/xz15873139854/article/details/109176752
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/255204

相关文章

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实