# DL_study **Repository Path**: ttreeNew/dl_study ## Basic Information - **Project Name**: DL_study - **Description**: 学习机器学习和PPO的记录 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-17 - **Last Updated**: 2026-03-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 使用说明 - pytroch版本:2.5.1+cu121 - 练习来自[b站视频](https://www.bilibili.com/video/BV1ic411v7c1) - 使用方法 分别执行lesson3~7的`sgd.py`,`sgd_w_b.py`,`sgd_activation.py`,`one_hidden_layer_net.py`,`two_import_model.py`观察效果。运行之后弹出matplotlib窗口,关闭之后再次弹出展现梯度下降过程的窗口,按`ctrl c`提前退出。 - 命令行 直接在DL_study目录下运行对应路径的脚本,例如 ```bash python3 lesson3/sgd.py ``` - sgd.py 无激活函数无偏置项的1x1神经网络 - sgd_w_b.py 有偏置项无激活函数的1x1神经网络 - sgd_activation.py 有激活函数和偏置项的1x1神经网络 - one_hidden_layer_net.py 输入1维,两层全连接层(2,1)的神经网络 - two_import_model.py 2输入的2x1神经网络 ## 强化学习理解 - 优化算法(优化器):找到 “优化函数最小值” 的方法 使用样本的方式: - SGD随机梯度下降:用单个样本算梯度,1个样本更新一次参数,高效但有噪声 - BGD批量梯度下降:用全部样本算梯度,一轮训练只更新一次参数,精准但慢 - MBGD小批量梯度下降:次选一小批样本计算梯度,每批次训练完更新一次参数,折中方案 三种方式本质区别在于每次更新参数时用的样本数量,如果没有提前终止,三种方法最终都会遍历全部样本。 - 参数更新策略:Adam等。 - 隐藏层 神经网络中介于输入层和输出层之间的层都叫隐藏层,例如:输入层和输出层之间有3层神经网络层,就可以称为有3层隐藏层。 - 前馈神经网络(FNN): 信息从输入到输出“单方向前进”,不存在反馈或循环的神经网络,无记忆,如:CNN(卷积神经网络),MLP。 - 循环神经网络(RNN):神经网络中把某一层的输出再次反馈到自身或前面的层。为了引入记忆能力,让网络能够记住过去的信息,从而处理时间相关或序列相关的问题。比如:理解上下文。 - 全连接层: 当前层的每一个神经元,都和「上一层的所有神经元」有连接。 - MLP(Multilayer Perceptron,多层感知机) 是一个神经网络的类型,至少有两层以上的全连接层(输出层也是全连接层)。一般包括: - 输入层 - 一个或多个隐藏层(全连接) - 输出层 每个隐藏层都是全连接层,通常每个神经元都有激活函数(非线性变换),没有卷积结构。 MLP 本身不是“全连接层”,而是“由全连接层组成的网络结构”。 - 卷积神经网络(CNN): 有卷积核和局部连接,通过卷积核提取空间结构特征,对输入的空间结构敏感。 - 反向传播&前向传播 从输入一层层计算得到输出&从损失函数往回一层层计算梯度 - 损失函数&代价函数: 日常混用。严格来讲 损失函数(Loss/Error):针对单个样本的误差。代价函数(Cost):针对所有/一批样本的平均损失,是梯度下降中要最小化的目标函数。 - 海森矩阵、雅可比矩阵: - 海森矩阵:标量方程求二阶导。 - 雅可比矩阵:向量方程求一阶导。 - ### actor-critic框架,PPO算法 基础样本表示为$(s_t, a_t, r_{t+1}, s_{t+1},\text{done})$ 其中: $s_t$ :时刻 t 的状态(State)(观测状态,可能来自智能体状态或环境状态) $a_t$ :在状态 \(s_t\) 下采取的动作(Action) $r_{t+1}$ :采取动作后的即时奖励(Reward) $s_{t+1}$ :动作后到达的新状态(Next State) $done$ : t+1 时刻是否为回合终止状态 例如:t时刻为回合的最后一步,$s_t$状态):BOSS 残血。$a_t$(动作):最后一击。$r_{t+1}$(奖励):100(通关)。$s_{t+1}$(新状态):结束标识。$done$=1 实际使用时还有额外字段,例如 ```python sample = { 'state': s_t, 'action': a_t, 'reward': r_t1, 'next_state': s_t1, 'done': done, 'return': G_t, # 累计回报 'advantage': A_t, # 优势函数 'log_prob_old': logp_old, # PPO使用,策略旧值 'time_step': t, # 可选,时间步 t 'episode_id': e # 可选,回合编号 } ``` - actor网络:输入状态 s,输出动作的高斯分布参数(均值 + 方差),对优势函数做反向传播更新权重。用来学习并执行策略,目的是最大化从0时刻到结束时刻智能体和环境交互的累积奖励(累积奖励即回报)。 - critic网络:输入状态 s,输出状态值函数 V(s),对价值损失做反向传播更新权重,形式上就是对优势函数的平方求梯度。用于更准确地估计一个状态的价值 V(s)(即从当前状态开始直到结束能获得多少奖励),目的是最小化优势函数(未来回报的真实值和未来回报的估值之间的差),从而指导 Actor 的更新。 - 理论上可以不用actor网络,直接对回报进行反向传播,通过梯度上升更新 Actor 网络,但直接使用采样回报的梯度方差太大,因此需要 Critic 网络估计值函数,用优势函数来更新网络,降低梯度的方差。梯度方差过大会导致参数更新步长失控,损失函数无法收敛。 - PPO算法(Proximal Policy Optimization,近端策略优化) - PPO-CLIP表达式 $$ L^{\text{CLIP}}(\theta) = \mathbb{E}_t \left[ \min\Big( r_t(\theta) A_t,\; \text{clip}(r_t(\theta),\; 1-\epsilon,\; 1+\epsilon)\, A_t \Big) \right] $$ 其中重要性采样就是概率比$r_t(\theta)$: $$ r_t(\theta) = \frac{\pi_{\theta}(a_t \mid s_t)}{\pi_{\theta_{\text{old}}}(a_t \mid s_t)} $$ 重要性采样的意义在于一次rollout进行多轮actor网络更新的背景下,策略会不断更新,而使用的数据依然是旧策略视角下的动作 / 概率,不能直接用来更新新策略。重要性采样的目的是 给旧数据 “修正权重”,使其能够训练新的策略。重要性采样的 “修正效果” 会随着策略更新次数增加而衰减,因此一般使用5~10次就要重新rollout。 - 近端含义:小幅度更新策略,clip 把$r_t(\theta)$限制在$(1-\epsilon,\; 1+\epsilon)$之间,$r_t(\theta)$离1近即近端即小幅度更新。 - 优势函数 $$ A_t = G_t - V(s_t) $$ - 其中$V(s_t)$:值函数(Value Function),critic网络输出的从状态$s_t$开始直到回合结束的回报估值。 - $G_t$:从时刻t开始直到回合结束的真实回报(Return) $$ G_t = r_{t+1} + \gamma r_{t+2} + \gamma^2 r_{t+3} + \dots = \sum_{k=0}^{T-t-1} \gamma^k r_{t+k+1} $$ - $γ$:折扣因子(Discount Factor),($0≤γ≤1$),意义是离当前时刻越远的未来奖励,对当前时刻回报$G_t$的影响权重越小。 - $r_{t+k+1}$: t+k时刻的动作对应的单步奖励(Reward)。 - T:回合结束的时间步。 - 重要性采样 - 训练流程: - 收集数据:智能体先根据旧策略训练n回合,生成n段轨迹,每回合是一段完整的轨迹,记录每一个离散轨迹点对应的$(s_t, a_t, r_{t+1}, s_{t+1},\text{done})$ - 预处理并打包样本:按时间步从后往前(从回合结束的点开始计算)计算每一个点从当前时刻直到回合结束的总回报$G_t$,优势函数$A_t$等参数,组合起来作为该点对应的一个独立的样本。 - 样本打乱顺序,切分为若干批次,将critic网络的预测值记为$V_t$,根据$(G_t-V_t)^2$最小化来更新critic网络的权重,用$clip(r_t)*A_t$作为系数来更新actor网络的权重。其顺序可以是先更新critic网络再更新actor网络或合并两个网络的损失同时更新。 - 常用名词 - 1 个 rollout:智能体用当前策略和环境交互生成完整轨迹数据的过程。 - 1 个 epoch:一轮训练,对象是整个样本集。 - 1 个 Batch:一批次,,对象是一轮训练的总样本中的一部分。一轮划分为多个批次。 举例:一次rollout有64个并行环境,收集 10 回合,共2560个样本,切成10个batch,batch size=256 。此时 1 个 epoch会遍历一次这2560个样本,更新10次。用这些样本先单独训练critic网络5~10次,在单独训练actor网络5~10次(每次)。接着再用新策略和环境交互,重复以上步骤。 - 通道:数据的特征维度,每一个数据的特征维度对应一个通道,比如84x84的rgb图像数据,有:红、绿、蓝三个特征,通道数是3,记作(3,84, 84) 。CNN 卷积层提取特征会产生多个通道。 - `conv = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3)`解释: - 用3通道,3x3的二维卷积核对输入数据卷积。卷积层的输入3通道,输出16通道。 - 卷积层不是一层神经元,而是多通道的神经元矩阵。以3,84,84的输入数据为例,卷积层是16个84x84的神经元矩阵。 - 这里的维度不包括通道,这里的卷积核实际上是 “3 通道 ×3×3” 的立方体,在H、W两个方向滑动,3 个通道的输入和卷积核的3个通道的权重加权求和合并成一个通道,输出16通道即用16个卷积核卷输入数据。 - 正则:Regularization,按照一定的规则和规范对对象加以约束。正则是为了防止过拟合。 - ### 注意力机制: 形式上是并行的三个全连接层,分别叫Q(Query):查询向量,K(Key):键向量,V(Value):值向量。赋予其意义: - Q:查询的内容。 - K:被查询的标签。 - $\text{softmax}(\frac{QK^\top}{\sqrt{d_k}})$:有效信息的权重。 - V:有效信息。 以激光雷达避障为例,输入是10帧数据,每帧长度128( d_model = 128)。 - ①输入数据通过三个并行的全连接层QKV,得到三个矩阵,分别称为QKV。 - ②让Q和K.T相乘,写作Q@K.T。这里的物理意义是查询目标和键信息的匹配程度,并不是单纯的帧之间的相似程度,所以Q@K.T不关于主对角线对称。 - ③缩放: $$ \text{scores}_{\text{scaled}} = \frac{QK^\top}{\sqrt{d_k}} $$ - ④softmax归一化:指数形式放大差异的归一化 $$ A = \text{softmax}(\text{scores}_{\text{scaled}}) $$ 或 $$ A_{ij} = \frac{\exp\left(\frac{Q_i K_j^\top}{\sqrt{d_k}}\right)} {\sum_{j'=1}^{L} \exp\left(\frac{Q_i K_{j'}^\top}{\sqrt{d_k}}\right)} $$ - ⑤A@V,得到最终注意力输出,其第i行表示第i帧融合所有帧核心特征后的最终特征。 - 多头注意力 - 让输入通过多组并行的 QKV,得到的矩阵拼接再通过一层全连接层。 - 多头输出拼接后的维度,必须等于原始输入的维度。 - 仍以输入10帧数据,每帧长度128的激光雷达避障场景为例。每个头输出[10, 16]的矩阵,共8个头,拼接成[10, 16x8=128]的矩阵。经过`nn.Linear(in_features=d_model, out_features=d_model)`,得到多头注意力的最终输出。 - 注:输入多帧激光雷达数据一般是动态障碍物的场景,也能强化静态避障。输入单帧激光雷达数据般是静态障碍物的场景。 - 残差连接 输出+输入 - transformer 位置编码+多头注意力+残差连接+层归一化+前馈网络 - 马尔科夫决策过程(MDP):对序贯决策问题的建模框架。 其中序贯决策:不是只做一次决定,而是按时间顺序,连续不断地做决策。 强化学习 = 专门用来解决 MDP 问题的算法。