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

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

相关文章

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操