强化学习第四部分
目标导向的强化学习对于一个使用场景:策略 $\pi$ 操控机械臂抓取桌上的物体,每次任务中物体的位置可能不一样,即需要完成一系列相似但不相同的任务。在使用传统的强化学习算法时,采用单一策略只能抓取同一个位置的物体,对于不同的目标位置,需要训练多个策略,即同一个策略无法完成不同的目标。
目标导向的强化学习的数学基础是目标条件化的 MDP,其元组定义为 $(S,A,G,P,R,\gamma)$ ,相比于 MDP 多了一项目标集合 $G$ ,通常为状态空间的子集。
HERHER 算法即事后经验回放策略。目标导向的强化学习的奖励往往是比较稀疏的,由于智能体在训练初期难以完成目标而只能得到 -1 的奖励,从而使整个算法的训练速度较慢。HER 算法能有效地利用这些失败地经验。
假设现在使用策略 $\pi$ 在环境中以 $g$ 为目标进行探索,得到轨迹 $s_1,\cdots,s_T$ ,并且 $g\not=s_1,\cdots,s_T$ ,这就意味着整条路径上得到的奖励都是 -1,这对训练起到的帮助很小。所以在 HER 中设定一个新的目标 $g^\prime$ 来重新审视这条轨迹,也就是虽然没有达 ...
强化学习第三部分
模仿学习虽然强化学习不需要有监督学习的标签数据,但是它十分依赖于奖励函数的设置,在很多场景中,奖励函数并未给定,或奖励信号极其稀疏,此时随机设计的奖励函数将无法保证强化学习训练出来的策略满足实际需要。假设存在一个专家智能体,其策略可以看成最优策略,就可以通过直接模仿这个专家在环境中交互的状态动作数据来训练一个策略,并且不需要用到环境提供的奖励信号。
在模仿学习的框架下,专家能提供一系列状态动作对 $(s_t,a_t)$ ,表示专家在 $s_t$ 环境下做出了 $a_t$ 的动作,而模仿者的任务就是利用这些专家数据进行训练,无须奖励信号就可以达到一个接近专家的策略。
行为克隆行为克隆 BC 就是直接使用监督学习算法,将专家数据 $(s_t,a_t)$ 中的 $s_t$ 作为输入, $a_t$ 作为标签,则学习的目标为
\theta^\star=\underset{\theta}{\argmax}E_{(s,a)\sim D}[L(\pi_\theta(s),a)]其中 $D$ 是专家的数据集, $L$ 是对应监督学习框架下的损失函数。在训练数据量比较大的时候,BC 能很快学习到一个不错 ...
强化学习—第二部分
DQN 算法
在上述的 Q-Learning 算法中,以矩阵的方式建立了一个存储了所有状态动作对的动作价值函数 Q 表,表格中每个动作价值函数都表示在对应状态下选择相应动作然后继续遵循某一策略预期得到的期望回报。但是这种构建表格存储动作价值的做法只适用于环境的状态和动作都是离散的,并且只在空间都比较小的情况下使用。当状态是一个 RGB 图像时,则它的状态是非常庞大的,所以此时就放弃表格形式记录 Q 值。
可以使用函数拟合的方式来估计 Q 值,即将这个复杂的 Q 值表格视作数据,利用参数化的函数来拟合这些数据。DQN 方法可以用来解决这种连续状态下离散动作的问题。于是可以使用一个神经网络来表示函数 Q,若动作是连续的,神经网络的输入为状态 $s$ 和动作 $a$ ,然后输出一个标量,表示在状态 $s$ 下采取动作 $a$ 能获得的价值。若动作是离散的,那就可以只将状态 $s$ 输入到神经网络中,使其同时输出每一个动作的 Q 值。
但是由于在 DQN 中,动作价值函数 $Q$ 的更新过程中有个 $\max$ 操作,所以它只能用于处理动作离散的情况。在 DQN 方法中维护了两个用于拟合函数 ...
强化学习—第一部分
多臂老虎机问题多臂老虎机问题是概率论中的一个经典的问题,也属于是强化学习的范畴。例如对于一个拥有多个拉杆的老虎机,每拉动一根拉杆都对应着一个关于奖励的概率分布 R,每次拉动一根拉杆都能从它对应的奖励概率分布中得到一个奖励 r。在每一根拉杆的奖励概率分布都未知的情况下,需要在探索其他拉杆的获奖概率和根据经验选择最多的拉杆中进行权衡,选择什么样的操作策略能使得累积奖励最高就是多臂老虎机的问题。
epsilon 贪婪算法完全贪婪算法就是在每一时刻采取期望奖励估计值最大的动作,这就是纯粹的利用,而没有探索,所以通常要对其进行一些修改,就有了 $\epsilon$ 贪婪算法。
$\epsilon$ 贪婪算法是强化学习和多臂老虎机问题中最经典的探索-利用平衡策略,核心是通过参数 $\epsilon$ 控制随机探索与最优利用的比例,在最大化即时奖励的同时避免陷入局部最优。
在每个决策步中,算法都有两种选择:
Exploitation:以概率 $1-\epsilon$ 选择当前已知的最优动作,也就是价值最高的动作
Exploration:以 $\epsilon$ 的概率随机从动作空间中选择任一动作
...
生成对抗网络GAN
前言生成对抗网络 GAN 在 2014 年被 lan Goodfellow 提出,主要用于图像生成、图像风格迁移、数据增强、超分辨率重建等领域,是深度学习的重要分支。GAN 的出现彻底改变了生成模型的训练方式,不再依赖传统的似然函数优化,而是通过对抗训练实现对复杂数据分布的隐式建模。
一些需要用到的知识散度KL 散度
KL 散度又称为相对熵,是两个概率分布,真实分布 $P$ 和近似分布 $Q$ 之间差异的核心指标,它的核心本质就是利用分布 $Q$ 近似分布 $P$ 时,所产生的信息损失。KL 散度非对称(即 $D_{KL}(P\Vert Q)\not=D_{KL}(Q\Vert P)$ )且非负,当 $P$ 和 $Q$ 完全相同时,散度值为 0。计算公式为
D_{KL}(P\Vert Q)=E_{x\sim P}[\log\frac{P(x)}{Q(x)}]\\\Downarrow\\D_{KL}(P\Vert Q)=\sum P(x)\log\frac{P(x)}{Q(x)}\\D_{KL}(P\Vert Q)=\int P(x)\log\frac{P(x)}{Q(x)}dx在信息 ...
Transformer 模型
前言Transformer 模型的提出源于传统序列建模架构在长距离依赖的捕捉与计算效率上的瓶颈。Transformer 在 2017 年由 Google 团队提出,在此之前的自然语言处理和语音处理等序列建模任务的主流架构就是循环神经网络和它的变体 LSTM 和 GRU,它们通过隐藏状态传递信息,但是存在着严重的梯度消失的问题。另外还有卷积神经网络,虽然可以并行计算,但是需要堆叠多层才能捕捉长距离的依赖,且对序列建模能力较弱,而且还会导致信息在多层传递中丢失。所以 Transformer 完全摒弃了循环和卷积结构,仅依靠注意力机制构建端到端的序列建模模型,并且基于注意力机制实现全局依赖建模,同时支持全并行计算,彻底解决了传统方法的核心痛点。
核心思想
自注意力机制:直接计算序列内的所有位置的依赖关系,高效捕捉长距离的关联
多头注意力:多子空间并行注意力计算
位置编码:通过正余弦函数注入序列顺序信息,弥补注意力机制的顺序无关性
编码器-解码器结构:模块化堆叠设计,兼顾特征编码与生成能力
自注意力机制自注意力机制的核心就是计算 query 和 key 之间的相似度,进而为 value 分配 ...
前馈神经网络
前言前馈神经网络是人工神经网络的一种,研究始于20世纪60年代。其结构由输入层、隐含层和输出层单向连接组成,信号通过有向无环图单向传播,各层神经元仅与相邻层建立连接。前馈神经网络的核心特征就是信息的单向传递,即输入数据从输入层流向隐藏层,最终到达输出层,不存在层与层之间的反向连接或循环连接。
如图中所示,每个圆圈都是一个神经元,神经元是模拟生物神经元的接收-处理-输出的结构,通过接收来自于上一层的信号,每个输入对于一个可学习的权重和偏置参数,输出结果为 $z=\vec{w}\vec{x}+b$ 。之后加上激活函数,激活函数对上述的线性输出结果进行非线性变换,输出结果为 $a=f(z)$ ,这个主要是向网络中引入非线性,让网络能拟合复杂的函数模型。神经网络学习的本质就是不断调整这些权重和偏置的过程。
网络结构输入层输入层是网络的数据入口,接收原始的特征数据,不进行任何计算操作,神经元数量等于输入数据的特征维度。输入层的神经元只起到数据传递的作用,无激活函数
隐藏层隐藏层是位于输入层和输出层之间的核心计算层
层数与神经元数量:隐藏层的层数和每层的神经元数量是 FNN 的核心超参数。
隐 ...
循环神经网络
前言循环神经网络 RNN 是一种对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。它的核心特点就是网络中存在循环,可以使得信息可以从当前步骤传递到下一步骤,从而能够记住之前的信息。相当于是它是一个有记忆的网络,特别适合处理句子、时间序列等有前后依赖关系的数据。
传统的神经网络都有一个主要局限:假设输入是相互独立的,没有记忆功能,每次输入单独处理。循环神经网络中引入了上下文信息,作为当前时间步下网络的输出,传递给下一个时间步
模型识别评估方法ACF 自相关函数自相关指的是一个时间序列与其自身在不同时间点上的相似度,自相关系数范围为 $[-1,1]$
ACF 的作用:
周期性检测:通过观察 ACF 图中是否有显著的周期性波动,可以判断时间序列是否存在周期性
趋势分析:ACF 图可以帮助识别时间序列中的趋势,如果 ACF 随滞后增加而逐渐减小,说明序列存在趋势
随机性判断:如果 ACF 在所有滞后下都接近于 0,说明时间序列是随机的,可能不存在显著的自相关性
ACF 的自相关系数的计算公式如下
ACF(k)=\frac{\sum_{t=1}^{T-p}(x_t-\ ...
卷积神经网络
前言卷积神经网络时一种在计算机视觉领域的深度学习的模型,它的设计主要来自于生物学中的视觉系统,旨在模拟人类视觉处理的方式。卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。卷积神经网络是多层感知机的变种。
基本概念不变性不变性意味着即时目标的外观发生了某种变化,但是依然可以识别出来。不变性在图像识别中是一种很好的特性,都希望图像中的目标无论是被平移、旋转还是缩放,甚至是不同的光照条件、视角下都能被很好的识别出来。
平移不变性:识别物体的能力不因物体在图像中的位置变化而改变。
在卷积层中,使用相同的卷积核在图像中滑动,无论特征出现在哪里都会被识别到
在池化层中,对局部区域进行下采样,即使特征有微小偏移,池化后也能得到相同输出
旋转不变性:识别物体的能力不因物体的旋转角度而改变
在训练时随机旋转图像
旋转等变卷积
尺度不变性:识别物体的能力不因物体在图像中的大小变化而改变
将输入图像缩放成不同的尺寸,然后分别送入网络检测,最后合并结果
在训练时随机缩放图像,迫使网络学习不同尺度下识别物体
光照不变性:识别物体能力不因光照条件而改变
将像素 ...
傅里叶变换
前言傅里叶变换是一种将信号从时间域转换到频率域的数学方法,傅里叶变换的核心思想就是:任何复杂的信号,都可以分解为一系列不同频率、不同振幅、不同相位的简单正弦波的叠加。在频域中,横轴是频率,对应的纵轴就是该频率的强度。傅里叶变换有连续和离散的两种形式。
卷积线性卷积
在离散时间信号处理中,对于输入信号 $x[n]$ ,系统的单位脉冲响应为 $h[n]$ ,那么系统的输出信号就是 $x[n]$ 和 $h[n]$ 的线性卷积
y[n]=\sum_{k=-\infty}^{\infty}x[k]h[n-k]当序列移动时,多出来的部分就是 0,结果的序列通常会比原序列长,结果的长度为 $M+N-1$ ,其中 $M$ 和 $N$ 就是两个输入序列的长度
循环卷积
对于上述的卷积信号,对于两个长度为 $N$ 的输入信号 $x[n]$ 和 $h[n]$ ,循环卷积的公式为
y[n]=\sum_{k=0}^{N-1}x[k]h[(n-k)\;mod\;N]循环卷积的结果序列的长度与两个输入序列的长度相同
周期卷积
周期卷积与上述不同的是,参与运算的两个输入信号 $\tilde{x}[n]$ 和 $\ ...
Clion+AT32 配置
前言最近在做一个基于 AT32 的 FOC 的项目,在开始写代码之前对整体的代码框架构思了一下,有些部分打算用 C++ 来写。另外由于之前的经验,用 keil 中的 arm 编译器编译出来的 C++ 的程序有很大问题,所以就打算使用 Clion 来做这个。网络上很多教程说的不是很清楚,或者说并没有把整个部分做完整,所以打算自己记录下来。
软件版本
Clion 2025.2.4
AT32 WorkBench 1.2.00
芯片型号芯片型号为 AT32F403ACGT7
编译工具配置整个项目编译过程需要 AT32 官方提供的工具包 OpenOCD 下载支持和 arm-none-eabi-gcc 等编译器。可以直接从官网上下载,也可以点击下面的链接进行下载。
OpenOCD_v2.0.7
mingw 这个需要自己选择一个合适的版本,最新的不一定是最好的,因为 Clion 对 GDB 的支持是有版本限制的。
GNU Arm Embedded Toolchain 10.3
上述的 OpenOCD 和 mingw 是不需要自己安装的,所以它需要你将它解压到某个你熟悉的位置,方便查找,然后需要 ...
webots+ros 机器人仿真
前言之前我做机器人仿真一直是在 windows 上,利用 webots+vs 进行仿真的,但是在 vs 上进行的仿真,移植到硬件上时需要改动的东西太多,几乎得重新写一遍,所以打算在 linux 上利用 ros 进行仿真。但是问题又来了,ros 中比较常用的仿真的软件就是 gazebo,但是 gazebo 的电机模块的力矩控制在我测试之后好像是有问题的,一旦施加力矩就会疯转。后来偶然间发现 linux 上是可以使用 webots 的,而且网络上的配置资料不算少,所以就打算使用 webots 来进行仿真。
ros 安装
ros1 安装可以参考 https://seashore.top/Blog_ButterFly/2024/03/24/ros%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/,这个版本是 ubuntu20.04
ros2 安装可以参考 https://seashore.top/Blog_ButterFly/2024/03/24/ros2%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/,这个版本是 ubuntu22.04
w ...
进入ubuntu之后必做的配置
安装显卡驱动众所周知,在 ubuntu 上很多项目都需要利用 CUDA 调用 GPU 来进行高效的并行计算,CUDA通过CPU任务分发和GPU并行处理的方式,显著提升计算效率,尤其在需要大规模并行计算的人工智能和深度学习领域发挥着关键作用。但是想要使用 CUDA 就需要安装 NVIDIA 的显卡驱动,但是很多时候安装就很容易出问题,所以如果要用的话,就把它作为第一件事,降低时间成本。
查找驱动在 NVIDIA 官网的驱动页面,可以自己选择手动搜索驱动程序,根据自己电脑的显卡型号(可以上网查查,或者查看购买记录),搜索适合自己显卡的驱动
查看合适的版本号需要利用外部的工具来查看合适的 NVIDIA 合适的版本号,ubuntu-drivers-common 是 ubuntu 系统中用于管理硬件驱动的核心工具,特别是针对专有驱动程序(如 NVIDIA/AMD 显卡驱动、无线网卡驱动等)。它提供了 ubuntu-drivers 命令行工具,能够自动扫描硬件并列出可用的驱动版本(包括开源和专有驱动)
12sudo apt install ubuntu-drivers-commonubuntu-d ...
状态估计器
前言状态估计是根据可以获取的测量数据估算动态系统内部状态的方法,对系统的输入和输出进行测量而得到的数据只能反映系统的外部特性,而系统的动态规律需要通过内部状态变量来描述,因此状态估计对于系统控制很重要。
状态估计器介绍状态估计器是控制系统和信号处理中的一个重要组件,用于根据系统的测量数据和数学模型来估计系统的内部状态
主要功能
从带有噪声的观测数据中推断系统的内部状态
当某些状态变量无法直接测量时进行估计
提高系统状态信息的准确性
常见类型
最小二乘估计
卡尔曼滤波器
扩展卡尔曼滤波器
无迹卡尔曼滤波器
粒子滤波器
Luenberger 观测器
最小二乘估计基本最小二乘估计对于线性观测模型
y=Cx+v其中 $C$ 是观测矩阵, $v$ 是观测噪声, $x$ 是待估计状态。最小二乘法状态估计就是找到 $x$ 的最优估计 $\hat{x}$ 以最小化残差平方和
J(x)=\Vert y-Cx\Vert^2=(y-Cx)^T(y-Cx)对上述代价函数求导并令其梯度为 0,即最小化残差平方和,得到
\frac{\partial J}{\partial x}=-2C^T(y-Cx)= ...
系统的可观测性和可估计性
前言线性系统线性系统是一种数学模型,是指同时满足叠加性与均匀性的系统
叠加性:当几个输入信号共同作用于系统时,总的输出等于每个输入单独作用时产生的输出之和
均匀性:当输入信号增大若干倍时,输出也相应增大同样的倍数
非线性系统非线性系统是输出与输入不成正比的系统,特征是叠加性原理不再成立
时不变系统时不变系统,指特性不随时间变化的系统
T(x(n))=y(n)\\\Downarrow\\T(x(n-n_0))=y(n-n_0)时变系统时变系统是指系统中一个或多个参数值随着时间而变化,从而整个特性也随着时间而变化的系统,其数学模型是一个变系数线性微分方程
时变系统的特点是,其输出响应的波形不仅同输入波形有关,而且也同输入信号加入的时刻有关,这一特点增加了分析和研究的复杂性
可观测性系统是完全可观测的,当且仅当通过有限时间内的输出测量 $y(t)$ 和输入 $u(t)$ 可以唯一确定系统的初始状态 $x_0$
对于 $n$ 阶的线性时不变系统
\dot{x}=Ax+Bu\\y=Cx+Du其可观测矩阵为
O=\begin{bmatrix}C\\CA\\\vdots\\CA^{n-1} ...
将 PyQt 项目编译为安装包
前言对于做网站的我来说,有一个好用的能管理网站的图片的工具确实很实用,但是网络上比较流行的 PicGo 不能从 github 网站上读取图片,所以就是在下载 PicGo 之后是无法使用它读取到 github 上之前上传的图片的,而且我用的时候老是上传失败,所以就自己利用 PyQt 做了一个软件,用以实现这些功能,并且可以对 github 上的图床进行管理。写完测试完成之后,又想把这东西打包成安装包,那之后的使用就很方便了,所以就有了此文章
感兴趣的可以看看这个软件 GitPic
将 PyQt 项目打包为可执行文件可以利用可视化的工具,Auto-py-to-exe,实际上也是一个基于 Pyinstaller 的工具,但是它有 Gui 界面,能更方便的打包
安装在终端输入
1pip install auto-py-to-exe
安装完成之后,就可以在终端中输入 auto-py-to-exe.exe 打开软件
打包流程软件如图所示
基本上只需要设置上述的几个选项
Script Location:选择脚本文件的位置,只需要选择一个脚本文件,这个脚本文件需要包含 python 的入口函数,即 ...
SK6812 炫彩灯珠控制
介绍炫彩灯珠内置 IC,可以显示 $256\times256\times256$ 种颜色,仅凭一根信号线即可实现多种多样的效果
硬件电路根据 SK6812 的电气参数和手册上的典型应用电路来设计其硬件电路
参数
符号
范围
单位
电压
VDD
+3.7~+5.5
V
逻辑输入电压
VI
-0.5~VDD+0.5
V
工作温度
Topt
-40~+85
℃
储存温度
Tstg
-40~+85
℃
ESD耐压(设备模式)
VESD
200
V
ESD耐压(人体模式)
VESD
2K
V
控制方式SK6812 的数据传输方式比起一般的外设来说,有点特别,每个位都是一个码元,然后通过控制码元的高低电平时间来控制该位的高低
时序表名称
min
typic
max
单位
T
1.20
-
-
us
T0H
0.2
0.3
0.4
us
T0L
0.8
-
-
us
T1H
0.6
0.67
1.0
us
T1L
0.2
-
-
us
Trst
$\geq80$
-
-
us
协议中每个码元都必须有低电平,每 ...
Windows配置WSL2+Ubuntu20.04
前言WSL 是一个允许用户在 Windows 上运行 Linux 环境的功能,安装 WSL 之后,可以安装 Linux 发行版,并且直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,也无需承担传统虚拟机或双启动设置的费用
基础配置配置查看进入 PowerShell 中,终端中输入
1winver
查看 windows 的配置信息,如果是 windows11 的话是默认支持 WSL2 的,否则需要查看 OS 内部版本号,WSL2 需要内部版本号不低于 18362,否则只能安装 WSL。另外如果在 Windows Server 2019 (版本 1709+) 上安装 WSL的话,需要手动安装
启用虚拟机平台在 PowerShell 中输入指令
1dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
这条指令用于启用 Windows 的虚拟机平台组件,是 WSL2 和 Hyper-V 虚拟化技术的依赖项。启用之后可以支持更高效的 WSL2 ...









