LLMs基础学习(八)强化学习专题(6)

LLMs基础学习(八)强化学习专题(6)

文章目录

  • LLMs基础学习(八)强化学习专题(6)
    • 深度强化学习(DQN)
      • DQN 起源:《Playing Atari with Deep Reinforcement Learning》研究
      • DQN 算法:逐步骤拆解流程
      • DQN 关键性质:on - policy vs off - policy
      • DQN 的价值与影响
      • DQN 的两个关键技巧
        • 目标网络(Target Network)
        • 经验回放(Experience Replay)
        • 总结
      • DQN 和 Q-Learning 有什么不同
        • 算法基础与适用场景
        • 函数近似与数据表示
        • 稳定性机制
        • 总结

视频链接:https://www.bilibili.com/video/BV1MQo4YGEmq/?spm_id_from=333.1387.upload.video_card.click&vd_source=57e4865932ea6c6918a09b65d319a99a

深度强化学习(DQN)

DQN 起源:《Playing Atari with Deep Reinforcement Learning》研究

(一)研究背景与突破

  • 行业困境:早期强化学习多依赖 “表格存储 Q 值”,面对高维度输入(如游戏画面像素),表格无法存储海量状态,传统方法失效。
  • DeepMind 的创新:2013 年,DeepMind 团队提出 **DQN ** (Deep Q - Network) ,首次把深度学习(卷积神经网络)和强化学习(Q - Learning)结合,解决 “高维输入 + 决策学习” 难题,让 AI 能从复杂视觉信息里学策略。

(二)模型与核心逻辑

  • 模型结构:用 卷积神经网络(CNN) 做基础,输入是游戏原始像素(高维视觉数据),输出是 “估计未来奖励的值函数 Q ( s , a ) Q(s,a) Q(s,a)” 。简单说,AI 看游戏画面(输入),算每个动作能拿到的 “未来收益”(输出)。
  • 算法融合:基于 Q - Learning 框架,但用神经网络替代传统 “Q 表格”。Q - Learning 靠 Bellman 方程更新 Q 值( Q ( s , a ) ← r + γ max ⁡ a ′ Q ( s ′ , a ′ ) Q(s,a) \leftarrow r + \gamma \max_{a'} Q(s',a') Q(s,a)r+γmaxaQ(s,a) ),DQN 用 CNN 拟合这个 Q 函数,让 AI 不用手动设计状态特征,直接 “看画面学策略”。

(三)实验验证:Atari 游戏测试

  • 测试对象:选 7 款雅达利(Atari 2600)游戏,涵盖 Pong(乒乓球)、Breakout(打砖块)、Space Invaders(太空侵略者)等,这些游戏需处理动态画面、判断动作收益,很考验算法。

  • 结果震撼

    • 6 款游戏里,DQN 表现碾压此前所有 AI 方法;
    • 3 款游戏(如 Breakout )中,AI 得分超过人类专家 。 这证明:DQN 能从高维视觉输入里,自主学到有效控制策略,强化学习 “智能化水平” 大幅提升。

DQN 算法:逐步骤拆解流程

(一)核心组件与初始化

  • 双网络设计

    • 初始化两个网络:
      • Q 网络(“行动网络”):实时输出当前状态 s 下,各动作 a 的 Q 值(估计收益),指导 AI 选动作;
      • Q ^ \hat{Q} Q^ 网络(“目标网络”):初始时和 Q 网络参数完全一样,作用是 “稳定训练过程”(避免 Q 网络更新太频繁,导致学习震荡)。
    • 公式化: Q ^ ← Q \hat{Q} \leftarrow Q Q^Q(初始化时,让目标网络复制行动网络 )。

(二)“交互 - 存储 - 采样” 循环(核心训练逻辑)

  • 1. 智能体与环境交互(采集经验)

    • 回合与时间步:强化学习以 “回合(Episode)” 为周期,每个回合包含多个 “时间步(Time - step)”。比如玩一局 Atari 游戏是 1 个回合,每帧画面的决策是 1 个时间步。
    • 动作选择( ϵ \epsilon ϵ - 贪婪探索)
      • 每个时间步 t ,AI 处于状态 s t s_t st ,要选动作 a t a_t at 。怎么选?
      • ϵ \epsilon ϵ - 贪婪策略 平衡 “探索” 和 “利用”:
        • 1 − ϵ 1 - \epsilon 1ϵ 概率,选当前 Q 网络算出来的 “Q 值最高的动作”(利用已有经验,追求高收益);
        • ϵ \epsilon ϵ 概率,随机选动作(探索新策略,避免 AI 陷入局部最优)。
    • 结果反馈:选动作 a t a_t at 后,环境反馈奖励 r t r_t rt ,并进入新状态 s t + 1 s_{t + 1} st+1 。此时,把 “经验四元组” ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t + 1}) (st,at,rt,st+1) 存到 回放缓冲区(Replay Buffer) 里 —— 这步是 DQN 能高效学习的关键!
  • 2. 回放缓冲区(经验池)的作用

    • 存历史经验:把每个时间步的 ( s t , a t , r t , s t + 1 ) (s_t, a_t, r_t, s_{t + 1}) (st,at,rt,st+1) 存起来,形成一个 “经验池”,里面是 AI 和环境交互的历史数据。
    • 解决相关性问题:传统强化学习 “在线学习” 时,数据是连续时间步生成的,状态、动作高度相关,直接用来训练容易让网络学歪(比如连续选同一个动作,网络只记住局部模式)。回放缓冲区让 AI 随机采样历史经验 ,打乱数据相关性,训练更稳定、高效。
  • 3. 批量采样与目标计算

    • 采样:从回放缓冲区里,随机批量抽取 一组经验 ( s i , a i , r i , s i + 1 ) (s_i, a_i, r_i, s_{i + 1}) (si,ai,ri,si+1)(比如一次抽 32 条、64 条 )。注意:采样的是 “历史数据”,不是当前实时交互的,这是 DQN 属于 off - policy**(离策略)** 的关键(后面讲性质时会细拆)。
    • 计算目标 Q 值(y ): 用目标网络 Q ^ \hat{Q} Q^ 算 “未来收益”,公式: y = r i + γ max ⁡ a Q ^ ( s i + 1 , a ) y = r_i + \gamma \max_{a} \hat{Q}(s_{i + 1}, a) y=ri+γmaxaQ^(si+1,a) 解释:
      • r i r_i ri 是当前动作拿到的 “即时奖励”;
      • γ \gamma γ 是 “折扣因子”(0 < γ \gamma γ ≤ 1 ),控制 “未来奖励的权重”(比如 γ = 0.9 \gamma = 0.9 γ=0.9 ,表示未来 1 步的奖励,只值当前 0.9 倍的重要性,鼓励 AI 平衡短期、长期收益 );
      • max ⁡ a Q ^ ( s i + 1 , a ) \max_{a} \hat{Q}(s_{i + 1}, a) maxaQ^(si+1,a) 是目标网络预测的 “下一状态 s i + 1 s_{i + 1} si+1 下,所有动作里最大的 Q 值”,代表 “未来能拿到的最大收益”。 所以,y 是 “当前动作的实际价值”(即时奖励 + 未来最大预期收益),用来指导 Q 网络更新。
  • 4. 更新 Q 网络(拟合目标): 训练 Q 网络,让它预测的 Q ( s i , a i ) Q(s_i, a_i) Q(si,ai) 尽可能接近目标值 y 。具体说,用 均方误差(MSE) 当损失函数: Loss = 1 N ∑ i = 1 N ( y i − Q ( s i , a i ) ) 2 \text{Loss} = \frac{1}{N} \sum_{i = 1}^{N} \left( y_i - Q(s_i, a_i) \right)^2 Loss=N1i=1N(yiQ(si,ai))2 (N 是批量采样的经验数量 ),然后用梯度下降更新 Q 网络的参数。

  • 5. 同步目标网络(稳定训练): 每隔一定步数(比如 C 次更新),把当前 Q 网络的参数,硬拷贝 Q ^ \hat{Q} Q^ 网络(即 Q ^ ← Q \hat{Q} \leftarrow Q Q^Q )。这么做是为了让 “目标 Q 值 y ” 更新频率低一些,避免 Q 网络刚学一点,目标就跟着变,导致训练震荡、不稳定。

DQN 关键性质:on - policy vs off - policy

  • 核心区别

    • on - policy(同策略):训练用的数据,必须是 “当前策略实时和环境交互产生的”。比如 SARSA 算法,每一步用当前策略选动作、存数据、训练,数据和策略强绑定。
    • off - policy(离策略):训练数据可以是 “历史上任意策略产生的”。
  • DQN 为什么是 off - policy? 因为 DQN 用 回放缓冲区存历史经验 ,采样时不管这些经验是哪个策略(甚至随机策略)产生的,都能用来训练当前 Q 网络。换句话说,“生成数据的策略” 和 “当前训练的策略” 可以不一样,所以是 off - policy 。 这带来两大好处:

    • 数据高效利用:历史经验能反复采样、训练,不用每次都和环境实时交互,节省算力;
    • 稳定学习:打乱数据相关性,避免策略更新太激进,训练更平滑。

DQN 的价值与影响

(一)技术突破

  • 突破传统 Q - Learning 依赖 “表格存储 Q 值” 的局限,让强化学习能处理 高维、连续状态空间(比如图像、传感器数据 )。以前表格存不下的复杂状态,现在用神经网络拟合 Q 函数,直接 “端到端” 学习。

(二)行业影响

  • 打开 “深度强化学习” 大门,后续 AlphaGo、自动驾驶、机器人控制等前沿应用,都受 DQN 启发。可以说,DQN 是现代强化学习从理论到实用的 “里程碑”。

(三)落地潜力

  • 只要涉及 “高维输入 + 决策优化” 的场景,比如:

    • 游戏 AI(不止 Atari ,复杂 3A 游戏、围棋等 );
    • 机器人视觉控制(从摄像头画面学抓取、行走 );
    • 自动驾驶(处理路况图像,决策加减速、转向 ); DQN 及衍生算法(如 DDQN、DQN 扩展结构 )都能发挥作用,是强化学习落地的重要基石。

总结一下: DQN 是 DeepMind 用 “卷积神经网络 + Q - Learning + 回放缓冲区 + 双网络”,解决高维视觉输入决策问题的开创性算法。它让 AI 能像人类一样 “看画面学策略”,在 Atari 游戏中击败人类,更开启了深度强化学习的浪潮。算法流程里,“交互存经验 → 采样算目标 → 更新双网络” 的循环,既保证学习效率,又稳定训练过程;off - policy 性质让数据利用更灵活,这些设计直到今天,仍是深度强化学习的核心思路~

DQN 的两个关键技巧

目标网络(Target Network)

在这里插入图片描述

  • 作用:通过固定目标 Q 值的计算网络参数,减少训练过程中的目标波动,缓解因 Q 值高估导致的策略震荡问题。

  • 实现方式

    • 构建与主网络结构相同的目标网络,其参数定期从主网络同步(如每 N 步更新一次)。
    • 计算目标 Q 值时使用目标网络,而非实时更新的主网络,从而稳定贝尔曼方程中的目标值。

在学习 Q 函数的时候,也会用到时序差分方法的概念。我们现在收集到一个数据,比如在状态 s t s_t st 采取动作 a t a_t at 以后,得到奖励 r t r_t rt,进入状态 s t + 1 s_{t+1} st+1 。根据 Q 函数,我们可知 Q π ( s t , a t ) = r t + Q π ( s t + 1 , π ( s t + 1 ) ) Q_\pi(s_t, a_t) = r_t + Q_\pi\bigl(s_{t+1}, \pi(s_{t+1})\bigr) Qπ(st,at)=rt+Qπ(st+1,π(st+1))

所以我们在学习的时候,Q 函数输入 s t s_t st a t a_t at 得到的值,与输入 s t + 1 s_{t+1} st+1 π ( s t + 1 ) \pi(s_{t+1}) π(st+1) 得到的值之间,我们希望它们相差 r t r_t rt ,这与时序差分方法的概念是一样的。

但实际中这样的输入并不好学习,假设这是一个回归问题,如目标网络图所示, Q π ( s t , a t ) Q_\pi(s_t, a_t) Qπ(st,at) 是网络的输出, r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_t + Q_\pi\bigl(s_{t+1}, \pi(s_{t+1})\bigr) rt+Qπ(st+1,π(st+1)) 是目标,目标是会变动的

当我们要实现这样的训练,其实会有问题,就是在做反向传播的时候, Q π Q_\pi Qπ 的参数也被更新,我们会把两个更新的结果加在一起(因为它是同一个模型 Q π Q_\pi Qπ ,所以两个更新的结果会加在一起)。但这样会导致训练变得不太稳定,因为假设我们把 Q π ( s t , a t ) Q_\pi(s_t, a_t) Qπ(st,at) 当作模型的输出,把 r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_t + Q_\pi\bigl(s_{t+1}, \pi(s_{t+1})\bigr) rt+Qπ(st+1,π(st+1)) 当作目标,我们要去拟合的目标是一直在变动的,这是不太好训练的。

所以,我们会把其中一个 Q 网络,通常是把图右边的目标 Q 网络固定住。在训练的时候,我们只更新左边的 Q 网络的参数,而右边的 Q 网络的参数会被固定。因为右边的 Q 网络负责产生目标,所以被称为目标网络

因为目标网络是固定的,所以现在得到的目标 r t + Q π ( s t + 1 , π ( s t + 1 ) ) r_t + Q_\pi\bigl(s_{t+1}, \pi(s_{t+1})\bigr) rt+Qπ(st+1,π(st+1)) 的值也是固定的。我们只调整左边 Q 网络的参数,它就变成一个回归问题。我们希望模型输出的值与目标越接近越好,这样会最小化它的均方误差(mean square error)。

在实现的时候,我们会把左边的 Q 网络更新多次,再用更新过的 Q 网络替换目标网络。但这两个网络不要一起更新,一起更新,结果会很容易不好。

一开始这两个网络是一样的,在训练的时候,我们会把右边的 Q 网络固定住,在做梯度下降的时候,只调整左边 Q 网络的参数。我们可能更新 100 次以后才把参数复制到右边的网络中,把右边网络的参数覆盖,目标值就变了。就好像我们本来在做一个回归问题,训练后把这个回归问题的损失降下去以后,接下来我们把左边网络的参数复制到右边网络,目标值就变了,接下来就要重新训练。

经验回放(Experience Replay)

在这里插入图片描述

  • 作用:通过存储智能体与环境交互的历史经验(状态、动作、奖励、下一状态),并随机采样小批量数据进行训练,打破数据间的时间相关性,提升训练效率和稳定性。

  • 实现方式

    • 使用经验回放池(Replay Buffer)存储经验元组,覆盖旧数据以避免内存溢出。
    • 随机抽样减少训练中的方差,同时重复利用数据,解决样本利用率低的问题。

经验回放会构建一个回放缓冲区(replay buffer),缓冲区又被称为回放内存(replay memory)。

回放缓冲区是指现在有某一个策略 π \pi π 与环境交互,它会去收集数据,我们把所有的数据放到一个数据缓冲区(buffer)里面,数据缓冲区里面存储了很多数据。比如数据缓冲区可以存储 5 万笔数据,每一笔数据就是记得说,我们之前在某一个状态 s t s_t st ,采取某一个动作 a t a_t at ,得到了奖励 r t r_t rt ,进入状态 s t + 1 s_{t+1} st+1

我们用 π \pi π 去与环境交互多次,把收集到的数据放到回放缓冲区里面。

回放缓冲区里面的经验可能来自不同的策略,我们每次用 π \pi π 与环境交互的时候,可能只交互 10000 次,接下来我们就更新 π \pi π 了。但是回放缓冲区里面可以放 5 万笔数据,所以 5 万笔数据可能来自不同的策略。

回放缓冲区只有在它装满的时候,才会把旧的数据丢掉。所以回放缓冲区里面其实装了很多不同的策略的经验。

如上图所示,有了回放缓冲区以后,我们怎么训练 Q 模型、怎么估计 Q 函数呢?

我们会迭代地训练 Q 函数,在每次迭代里面,从回放缓冲区中随机挑一个批量(batch)出来,即与一般的网络训练一样,从训练集里面挑一个批量出来。我们采样该批量出来,里面有一些经验,我们根据这些经验去更新 Q 函数。这与时序差分学习要有一个目标网络是一样的。我们采样一个批量的数据,得到一些经验,再去更新 Q 函数。

补充:经验回放的额外说明

如果某个算法使用了经验回放这个技巧,该算法就变成了一个异策略(off - policy) 的算法。

因为本来 Q 是要观察 π \pi π 的经验的,但实际上存储在回放缓冲区里面的这些经验不是通通来自于 π \pi π ,有些是过去其他的策略所留下来的经验。因为我们不会用某一个 π \pi π 就把整个回放缓冲区装满,拿去测 Q 函数,只是采样一些数据放到回放缓冲区里面,接下来就让 Q 去训练。所以 Q 在采样的时候,它会采样到过去的一些数据。

这么做有两个好处:

  • 好处一:在进行强化学习的时候,往往最花时间的步骤是与环境交互,训练网络反而是比较快的。因为我们用 GPU 训练其实很快,真正花时间的往往是与环境交互。

用回放缓冲区可以减少与环境交互的次数,因为在做训练的时候,经验不需要通通来自于某一个策略。一些过去的策略所得到的经验可以放在回放缓冲区里面被使用很多次,被反复的再利用,这样可以比较高效地采样经验。

  • 好处二:在训练网络的时候,其实我们希望一个批量里面的数据越多样(diverse)越好。如果批量里面的数据都是同样性质的,我们训练下去,训练结果是容易不好的。如果批量里面都是一样的数据,训练的时候,性能会比较差。

我们希望批量里的数据越多样越好。如果回放缓冲区里面的经验通通来自于不同的策略,我们采样到的一个批量里面的数据会是比较多样的。

总结

DQN 的两个关键技巧

  1. 目标网络(Target Network)

    • 作用:通过固定目标 Q 值的计算网络参数,减少训练过程中的目标波动,缓解因 Q 值高估导致的策略震荡问题。
    • 实现方式
      • 构建与主网络结构相同的目标网络,其参数定期从主网络同步(如每 N 步更新一次)。
      • 计算目标 Q 值时使用目标网络,而非实时更新的主网络,从而稳定贝尔曼方程中的目标值。
  2. 经验回放(Experience Replay)

    • 作用:通过存储智能体与环境交互的历史经验(状态、动作、奖励、下一状态),并随机采样小批量数据进行训练,打破数据间的时间相关性,提升训练效率和稳定性。
    • 实现方式
      • 使用经验回放池(Replay Buffer)存储经验元组,覆盖旧数据以避免内存溢出。
      • 随机抽样减少训练中的方差,同时重复利用数据,解决样本利用率低的问题。

DQN 和 Q-Learning 有什么不同

整体来说,DQN 与 Q-Learning 的目标价值以及价值的更新方式都非常相似。

主要的不同点在于:

  • DQN 将 Q-Learning 与深度学习结合,用深度网络来近似动作价值函数,而 Q-Learning 则是采用表格存储
  • DQN 采用了经验回放的训练方法,从历史数据中随机采样,而 Q-Learning 直接采用下一个状态的数据进行学习
算法基础与适用场景

Q-Learning

  • 是一种基于表格的无模型强化学习算法,通过维护一个 Q 值表格(状态 - 动作对的预期奖励)进行学习。
  • 适用场景:仅适合离散且低维度的状态和动作空间

DQN

  • 是 Q-Learning 的深度学习扩展,用神经网络替代 Q 值表格来近似 Q 函数,属于深度强化学习范畴。
  • 适用场景:可处理高维或连续状态空间(如图像输入),但动作空间仍需离散(如 Atari 游戏)。
函数近似与数据表示

Q-learning

  • 无函数近似:直接通过表格存储和更新 Q 值,状态和动作的维度受限。
  • 数据效率低:每次更新后丢弃经验,样本间强相关性可能导致训练不稳定。

DQN

  • 神经网络近似:通过深度网络提取高维状态特征,解决维度灾难问题。
  • 经验回放(Experience Replay):存储历史经验并随机采样训练,打破数据相关性,提高数据利用效率和训练稳定性。
稳定性机制

Q-learning

  • 直接更新 Q 值,可能导致 Q 值震荡或发散,尤其在复杂环境中。

DQN

  • 目标网络(Target Network):引入与主网络结构相同但参数延迟更新的目标网络,用于计算目标 Q 值,减少训练过程中的波动。
  • 通过经验回放和目标网络的结合,显著提升训练的稳定性和收敛性。
总结
  • DQN 将 Q-Learning 与深度学习结合,用深度网络来近似动作价值函数,而 Q-Learning 则是采用表格存储;
  • DQN 采用了经验回放的训练方法,从历史数据中随机采样,而 Q-Learning 直接采用下一个状态的数据进行学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87989.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM(10)——详解Parallel垃圾回收器

Parallel 垃圾回收器&#xff08;也称为 吞吐量优先收集器&#xff09;。它是 Java 早期&#xff08;特别是 JDK 8 及之前&#xff09;在多核处理器上的默认垃圾回收器&#xff0c;其核心设计目标是最大化应用程序的吞吐量。 一、Parallel 回收器的定位与设计目标 核心目标&am…

MySQL(91)什么是分布式数据库?

分布式数据库是一种将数据存储在多个物理位置的数据库系统。这些位置可能分布在不同的服务器、数据中心甚至地理位置。分布式数据库系统允许数据的存储、处理和访问分布在多个节点上&#xff0c;以提高数据的可用性、可靠性、可扩展性和性能。 1. 分布式数据库的特点 1.1 数据…

Java事务失效(面试题)的常见场景

1. 方法非public修饰 原理&#xff1a; Spring AOP代理&#xff08;CGLIB或JDK动态代理&#xff09;默认无法拦截非public方法。 示例&#xff1a; Service public class UserService {Transactionalvoid updateUser() { // 非public方法// 事务不会生效&#xff01;} } 修…

GitHub 趋势日报 (2025年06月20日)

&#x1f4ca; 由 TrendForge 系统生成* | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 1810 data-engineer-handbook 373 n8n 295 anthropic-cookbook 291 automatisch…

qt常用控件--01

文章目录 qt常用控件--01上一篇文章的补充windowTitle属性windowIcon属性windowOpaCity属性cursor属性font属性结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c11中常见的新增表达 作…

C++ 中 string 类的解析及简易自我实现

目录 引言 标准库中的 string 类 功能概述 常见操作示例 自我实现简易 string 类 代码结构概述 1. String11.h 头文件 类的成员变量 迭代器相关 构造函数和析构函数 基本访问和修改方法 赋值运算符重载 内存管理和扩容 以下代码在.cpp文件中解析: 2. String11.…

计算机的性能指标(选择题0~1题无大题)

存储器的性能指标 总容量存储单元个数*存储字长 bit 例&#xff1a;MAR16位&#xff0c;MDR16位 总容量2的16次方*16bit 补充&#xff1a; n个二进制位就有2的n次方不同的状态 一般描述文件大小容量单位 2的10次方&#xff1a;K 2的20次方&#xff1a;M 2的…

React 核心原理与Fiber架构

目录 一、虚拟 DOM 二、Diffing 算法 三、Fiber 架构 四、渲染流程 1. Render 阶段&#xff08;可中断异步过程&#xff09; 2. Commit 阶段&#xff08;同步不可中断&#xff09; 五、时间切片&#xff08;Time Slicing&#xff09; 六、核心流程步骤总结 1. 状态更新…

【破局痛点,赋能未来】领码 SPARK:铸就企业业务永续进化的智慧引擎—— 深度剖析持续演进之道,引领数字化新范式

摘要 在瞬息万变的数字时代&#xff0c;企业对业务连续性、敏捷创新及高效运营的需求日益迫切。领码 SPARK 融合平台&#xff0c;秉持“持续演进”这一核心理念&#xff0c;以 iPaaS 与 aPaaS 为双擎驱动&#xff0c;深度融合元数据驱动、智能端口调度、自动化灰度切换、AI 智…

掌握C++核心特性

目标&#xff1a; 掌握C核心特性&#xff0c;为嵌入式开发打基础 好的&#xff0c;我来为你详细梳理一下 继承与多态、虚函数 相关的知识点&#xff0c;包括单继承、多继承、虚函数表机制、纯虚函数与抽象类、动态绑定。以下内容适合中等难度层次的理解&#xff0c;便于考试复…

python的高校教师资源管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

Java Collections工具类:高效集合操作

Collections工具类概述 Collections是Java提供的集合操作工具类&#xff0c;位于java.util包中&#xff0c;包含大量静态方法&#xff0c;用于对List、Set、Map等集合进行排序、查找、替换、同步化等操作。 常用方法及代码示例 排序操作 sort(List<T> list)&#xff1a…

vue指令总结

vue指令总结 一、总述 二、代码实现&#xff08;内含大量注释&#xff09; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>vue入门</title><!-- 使用Vue 3官方CDN --><script src"https://unpkg.c…

RUP——统一软件开发过程

RUP概述 RUP&#xff08;Rational Unified Process&#xff09;&#xff0c;统一软件开发过程&#xff0c;统一软件过程是一个面向对象且基于网络的程序开发方法论。 在RUP中采用“41”视图模型来描述软件系统的体系结构。“41”视图包括逻辑视图、实现视图、进程视图、部署视…

SpringBoot电脑商城项目--增加减少购物车商品数量

1. 持久层 1.1 规划sql语句 执行更新t_cart表记录的num值根据cid查询购物车的数据是否存在 select * from t_cart where cid#{cid} 1.2 接口和抽象方法 /*** 获取购物车中商品的数据总数* return 购物车中商品的数据总数*/Cart findByCid(Integer cid); 1.3 xml文件中sql映射…

零基础学习Redis(13) -- Java使用Redis命令

上期我们学习了如何使用Java连接到redis&#xff0c;这期我们来学习如何在java中使用redis中的一些命令 1. set/get 可以看到jedis类中提供了很多set方法 public static void test1(Jedis jedis) {jedis.flushAll();jedis.set("key1", "v1");jedis.set(&q…

解决OSS存储桶未创建导致的XML错误

前言 在Java开发中&#xff0c;集成对象存储服务&#xff08;OSS&#xff09;时&#xff0c;开发者常会遇到一个令人困惑的错误提示&#xff1a; “This XML file does not appear to have any style information associated with it. The document tree is shown below.” 此…

Spring 表达式语言(SpEL)深度解析:从基础到高级实战指南

目录 一、SpEL是什么&#xff1f;为什么需要它&#xff1f; 核心价值&#xff1a; 典型应用场景&#xff1a; 二、基础语法快速入门 1. 表达式解析基础 2. 字面量表示 3. 属性访问 三、SpEL核心特性详解 1. 集合操作 2. 方法调用 3. 运算符大全 4. 类型操作 四、Sp…

算法导论第二十四章 深度学习前沿:从序列建模到创造式AI

第二十四章 深度学习前沿&#xff1a;从序列建模到创造式AI 算法的进化正在重新定义人工智能的边界 深度学习作为机器学习领域最活跃的分支&#xff0c;正以惊人的速度推动着人工智能的发展。本章将深入探讨五大前沿方向&#xff0c;通过原理分析、代码实现和应用场景展示&…

抽象工厂设计模式

1.问题背景&#xff1a; 现在有两个产品(Product)分别是手机壳(PhoneCase)和耳机(EarPhone)&#xff0c;但是他们会来自于各个生产厂商&#xff0c;比如说Apple和Android等等 那么至少会有四个产品&#xff0c;分别是安卓手机壳&#xff0c;安卓耳机&#xff0c;苹果手机壳&a…