DQN改进算法
简介
DQN 算法敲开了深度强化学习的大门,但是作为先驱性的工作,其本身存在着一些问题以及一些可以改进的地方。于是,在 DQN 之后,学术界涌现出了非常多的改进算法。本文将介绍其中两个非常著名的算法:Double DQN 和 Dueling DQN。这两个算法的实现非常简单,只需要在 DQN 的基础上稍加修改,它们能在一定程度上改善 DQN 的效果。如果读者想要了解更多、更详细的 DQN 改进方法,可以阅读 Rainbow 模型的论文及其引用文献。
Overestimate
普通的 DQN 算法通常会导致对QQQ值的过估计(overestimation)。传统 DQN 优化的 TD 误差目标为
r+γ maxa′ Qθ−(s′,a′)r+\gamma\,\underset{a'}{\mathrm{max}}\,Q_{\theta^-}(s',a')
r+γa′maxQθ−(s′,a′)
其中 maxa′ Qθ−(s′,a′)\underset{a'}{\mathrm{max}}\,Q_{\theta^-}(s',a')a′ ...
Markdown中常用的LaTex数学公式
在学习过程中,会涉及到大量的数学公式,并且考虑到写博客主要以 LaTex 写数学公式,因此,在这里对 Markdown 中 LaTeX 数学公式命令做一个汇总。
重要说明:示例中的 $formula$ 是生成公式的 LaTeX 语法。渲染器使用的是hexo-renderer-markdown-it-katex,最近一次更新在3年前,存在一些公式不能正常显示的现象,但由于不用过多配置且能满足大部分使用需要,故仍选择使用此渲染器。以下内容在typora中均能正常显示。
公式排版
LaTeX 公式有两种,一种是公式和文字在一行中混合排列的行内公式,一种是公式独占一行或几行的行间公式(独立公式):
行内公式:用 $formula$ 表示,例如: $\sum_{i=0}^{n}i^2$ 表示 ∑i=0ni2\sum_{i=0}^{n}i^2∑i=0ni2
行间公式(独立公式):用 $$formula$$ 表示,例如: $$\sum_{i=0}^{n}i^2$$ 表示
∑i=0ni2\sum_{i=0}^ ...
Q-learning和DQN算法总结
背景
Q-learning 算法主要是维护一个以状态空间和动作空间为行和列的表格,其中的 QQQ 值表示当前状态下采取动作能带来的价值。
DQN可以视为 Q-learning 的进阶版,是针对巨大的状态和动作空间、Q表格的维护和查找不现实所引入神经网络的方法。但是引入非线性函数、使用神经网络近似Q表,训练结果可能不收敛。
DQN有两版,2013版《Playing Atari with Deep Reinforcement Learning》伪代码:(LaTex格式的伪代码显示不了,所以就用图片代替了)
2015版《Human-level control through deep reinforcement learning》伪代码:
Q-learning算法
Q-learning 是一种 model-free 的强化学习算法,用于学习特定状态下动作的价值。该算法的核心为使用贝尔曼方程进行简单的值迭代更新,对当前值和新信息进行加权平均。
model-free 算法只用学习策略即可。model-based 算法让智能体学习环境的模型,在训练之后,智能体必须通过预测下一个状态和 r ...
小提琴图与分位点
处理数据时用到了小提琴图,看了四分位点的计算公式,但是和numpy的percentile()函数对应不上,记录一下具体的计算方式。
小提琴图
一般来说,小提琴图是一种绘制连续型数据的方法,可以认为是箱形图与核密度图的结合体。在小提琴图中,我们可以获取与箱形图中相同的信息。
中位数(小提琴图中的一个白点)
四分位数距(Inter Quartile Range, IQR):小提琴图中心的黑色粗条
Upper adjacent value:Third Quartile + 1.5 * IQR
Lower adjacent value:First Quartile - 1.5 * IQR
Upper/lower adjacent value(黑色细线)用来检测离群值,即位于这俩“栅栏“之外的值可被视为离群值。
离群值是一个统计学里的专业术语。在对同一样本进行多次重复测定时,经常会发现在一组测定数据中有某一个或数个测定值看似比其他测定值明显地偏小或偏大。称这种显著偏离的数据为离群值。有疑问的观察值可能是测试中随机波动的极度表现,但还处于统计控制 的范围之内,是属于同一总体的误差,不算离群 ...
boofuzz源码分析
简介
模糊测试框架 boofuzz 基于现已不再更新维护的 Sulley 框架开发,是一个基于生成的模糊测试框架。除了修复大量的错误外,boofuzz 还基于 Sulley 框架的数据生成方式更新了一系列功能,使得数据生成简单方便,同时增强了系统的兼容性和可扩展性。boofuzz 的主要特性在于最新且仍在更新和维护、安装简单、支持任意通信媒介、数据生成速度快、可扩展性强、可以实时监测并记录测试数据,因此 boofuzz 是一个理想的模糊测试工具。
boofuzz样例
以一个 TFTP Fuzzer 为例,大概看一下 boofuzz 的用法。
123456789101112131415161718from boofuzz import *import timedef main(): session = Session(sleep_time=1, target=Target(connection=SocketConnection("127.0.0.1",69,proto="udp"))) s_in ...
深入浅出理解什么是LLVM
什么是LLVM
LLVM项目是模块化、可重用的编译器以及工具链技术的集合。
美国计算机协会 (ACM) 将其2012年软件系统奖项颁给了LLVM,之前曾经获得此奖项的软件和技术包括:Java、Apache、Mosaic、the World Wide Web、Smalltalk、UNIX、Eclipse等等。
LLVM创始人:Chris Lattner,亦是Swift之父。
趣闻:Chris Latter本来只是想写一个底层的虚拟机,这也是LLVM名字的由来——low level virtual machine,跟Java的JVM虚拟机一样。可是后来,LLVM从来没有被用作过虚拟机,哪怕LLVM的名气已经传开了。所以人们决定仍然叫他LLVM,更多的时候只是当作“商标”一样的感觉在使用,但其实它跟虚拟机没有半毛钱关系。官方描述如下
The name “LLVM” itself is not an acronym; it is the full name of the project. “LLVM”这个名称本身不是首字母缩略词; 它是项目的全名。
传统的编译器架构
传统编译器架构
...
Modbus TCP协议学习
简介
Modbus是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年开发的一种串行通信协议,用于PLC通信。Modbus因其开源且无版权要求、易于部署和维护、供应商修改简单等特点而被广泛应用,并成为工业领域通信协议事实上的行业标准,现在是连接工业电子设备的常用方式。Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。
1996年施耐德电气公司推出基于以太网TCP/IP的Modbus协议:Modbus TCP,该协议采用TCP/IP协议栈,可以在以太网上传输数据,具有更好的可靠性和传输速度。
Modbus TCP数据帧
Modbus TCP的数据帧可分为两部分:MBAP(Modbus Application Protocol)报文头 + 协议数据单元(Protocol Data Unit, PDU)。其协议特征如图所示:
Modbus TCP协议报文组成
MBAP报文头
MBAP报文头长度为7字 ...