DQN深度强化学习指南:从Q-learning到经验回放与目标网络

DQN 这东西,搞强化学习的人早晚要正面碰一次。它从 Q-learning 那张简单的表格一路进化成深度神经网络,可以说是整个深度强化学习爆发的起点。很多人上来就对着成熟的强化学习库调参数,结果训练半天 reward 曲线像心电图,根本不知道发生了什么。这篇文章就把 DQN 的来龙去脉、两大核心机制、完整实操流程和训练中那些让人头秃的问题一次性讲透,给打算入门或者已经浅尝辄止想系统梳理一遍的同学当一份真正能落地的参考。

1. 一条进化线:从 Q 表格到深度网络的必然跨越

1.1 先讲清 Q-learning 到底在解什么题

Q-learning 是价值类强化学习里最经典的代表,核心思路特别朴素:给每个“状态-动作”对记一个 Q 值,这个 Q 值表示“我在这个状态下做了这个动作,然后一直按最优策略走下去,能拿到的累计回报期望”。算法通过不断与环境交互,反复更新这张 Q 表,让 Q 值越来越接近真实价值。更新公式长这样:

Q(s, a) ← Q(s, a) + α × [r + γ × max(Q(s', a')) - Q(s, a)]

每个符号都不难理解:s 是当前状态,a 是当前动作,r 是执行动作后得到的奖励,s' 是下一个状态,γ 是折扣因子,α 是学习率。中括号里面那部分就是时间差分误差,它衡量的是“实际拿到的奖励加上未来价值估算”和“原来对这一步的估计”之间的差距,算法每次都在往这个误差的反方向修正。

Q-learning 的迷人之处在于它是一种 off-policy 方法,也就是说行为策略和评估策略可以不一样。行为策略可以随便探索,但在更新 Q 值时用的是“下一个状态下所有动作里最大 Q 值”这个未来最优假设。这一步并不需要真实执行最优动作,只需要算一下、比较一下就行。这种设计让数据收集和策略评估解耦,后续 DQN 的很多实现逻辑也完全继承了这套思想。

1.2 表格法的天花板卡在哪里

Q-learning 理论上能逼近最优策略,前提是状态空间和动作空间有限,而且小到能塞进一张表格。但在现实问题里这几乎不可能。下围棋的状态空间比宇宙原子总数还多,机器人关节有连续状态,自动驾驶的感知输入是高维图像——这些场景用表格根本没法表示,更不用说更新和维护。

就算强行把连续状态离散成格子,也会立刻掉进“维度灾难”的坑。状态维度一高,格子数量呈指数级增长,很多格子实际上永远不会被访问到,Q 表里存了大量永远用不上的零值。另一个被很多人忽略的问题是泛化能力。表格 Q-learning 的每个格子都是独立估计的,学到的经验无法迁移到相似状态。你在相邻格子里学到了一条路走得好,换个新格子又得从头学一遍,这等于每次都在背答案,而不是理解规律。

我在做某个网格世界仿真时体会过这个瓶颈。环境本身只有几百个离散状态,训练几万回合后 Q 表倒是收敛了,但把地形稍微改一下,哪怕只是挪一堵墙的位置,整个表就报废了,必须全部重新训练。这种“换个场景重来一遍”的模式在真实应用里完全无法接受。

1.3 DQN 的进化核心:用神经网络代替表格

既然表格存不下、泛化能力差,那就换一个容量足够大且天生具备泛化能力的结构——神经网络来做价值函数的近似器。这就是 DQN 的核心思路。深度 Q 网络从输入到输出做的事很直接:输入状态(可以是向量、图像,甚至多源传感器数据),输出每个可能动作对应的 Q 值。更新公式还是那个 Q-learning 的公式,只是不再更新表格里的格子,而是通过反向传播调整网络权重。研究者把时序差分误差当作 loss,本质是在用监督学习的方式训练一个回归模型,网络逐步学会预测准确的 Q 值。

这个进化看起来只是“把表格换成网络”,但它带来的变化是根本性的。神经网络天然能处理连续、高维、非结构化的输入;它能泛化,相似状态会输出相近的 Q 值估计;它容量可扩展,加层加深就能提升表达能力。某领域当初用 DQN 啃下街机游戏这个硬骨头,就是因为它能以原始像素为输入,绕过人工特征工程,直接学会玩游戏——这个结果当时震撼了整个机器学习圈子,也让“端到端”这个词开始流行。

不过这也可以反过来说明一个问题:DQN 本质上依然是 Q-learning,价值函数近似、贝尔曼方程、时间差分这些底层逻辑没有变。它只是把函数近似器从一张呆板的表换成了一个灵活的网络,然后用工程手段解决随之而来的稳定性和效率问题。

2. 深度 Q 网络的两大支柱机制详解

2.1 经验回放:打散样本相关性,把记忆当数据库

直接用神经网络做 Q 值函数近似,训练时碰到的第一个麻烦就是数据。强化学习的数据是通过与环境实时交互采集的,样本之间天然存在强相关性:相邻两步观察到的是同一个场景里紧接着发生的状态变化,如果不加处理把这些互相关联的数据连续喂给网络,梯度更新会发生剧烈振荡,网络很可能会在相近的经验上来回摇摆,最后彻底遗忘早期学到的内容。

经验回放是 DQN 用来解决这个问题的关键机制。它的思路说白了就是准备一个固定大小的“记忆数据库”,每次与环境交互得到一条转移样本就存进去,训练时从这个库里随机抽样一个小批次,用这批混合的样本更新网络。因为有随机抽样,打碎了原始轨迹的时间相关性。到了实战阶段,经验回放还能显著提高数据利用率。同一批样本可以被重复采样使用很多遍,相当于用一份交互数据反复学习,这个特性在真实场景里尤其宝贵——真实环境下采集一条数据往往要耗费大量时间和成本。

实现时有个平衡要把握:回放缓冲区(通常叫 replay buffer)不是越大越好。缓冲区大了,存样本多,数据多样性高,但先收集后训练的特性会让网络学习到不少“过期数据”;缓冲区小了,相关性压不下去,容易发生灾难性遗忘。常见的经验池容量在 1 万到 100 万条之间,具体取决于任务状态空间复杂度和样本获取成本,这个参数值得专门去调一次。

经验回放还有一个容易忽略的细节:是否使用优先经验回放。优先经验回放不再等概率抽样,而是给每条样本算一个优先级,时间差分误差绝对值大的样本以更高概率被采到,相当于让网络集中精力搞定自己“最不理解”的地方。这个技巧能把 DQN 的收敛速度和稳定性都推上去一个台阶,在很多复杂任务里实测效果明显。

2.2 目标网络:稳定训练的关键“锚点”

经验回放解决了样本相关性问题,但 DQN 训练还有个更深层的不稳定因素。观察 Q-learning 更新式就会看到,时序差分误差里有个 max(Q(s', a')),这个“未来 Q 值”并不是上帝给出的标准答案,而是同一个网络自己算出来的。也就是说,网络在更新时既当裁判又当运动员,一方面拿着自己当前的预测去算目标值,另一方面又要朝着这个目标值逼近。目标值本身就随着网络权重的变化而变动,这让回归问题变成了“移动目标”问题。

目标网络机制的思路非常直接:准备两个结构完全相同的网络,一个是“在线网络”,负责输出当前 Q 值的预测值并用于选择动作;另一个是“目标网络”,负责计算目标值,也就是更新公式里那个 max(Q(s', a'))。目标网络不参与每一步的参数更新,而是每隔固定步数才把在线网络的权重整体同步过来一次。因为目标网络变化得很慢,目标值在一段时间内是相对稳定的,网络就有一个明确的追赶方向,不会因为目标值剧烈漂移而训练失败。

我第一跑 DQN 时没有特别在意这个机制的取舍,省了目标网络直接训练,reward 曲线全程在低位震荡,损失不降反升,几乎毫无学习迹象。加上目标网络后虽然前期变慢了一点,但曲线立刻稳下来,开始出现持续上升的趋势。这个对比让我印象很深,后面无论调什么变体,目标网络的同步周期都当成一个重点参数来观察。

同步周期本身也需要权衡:同步太频繁,目标值更新太快,稳定优势消失;同步太慢,目标值长期停留在旧策略状态,可能误导在线网络的更新方向。默认值“每 1000 步同步一次”在大多数任务里表现不错,但更严谨的做法是把它也纳入超参数搜索。

2.3 一个完整 DQN 更新步骤的逐步推演

把前面这些概念拼起来,一条完整的 DQN 更新链路长这样。假设此刻从经验池中随机抽出一个批次,其中包含 N 条转移样本 (s, a, r, s', done)。第一步,把批次里的 s 输入在线网络,拿到每个状态在所有动作上的 Q 值预测,然后按样本对应的动作 a 取出来,得到“当前状态当前动作”的 Q 值估计。第二步,把 s' 输入目标网络,对每个下一个状态取所有动作的最大 Q 值,作为未来价值的估计。第三步,计算目标值 y = r + γ × (1 - done) × max_Q(s'),其中 done 标记表示终止状态后面不需要再算未来价值。第四步,取均方误差作为 loss:L = mean((y - Q(s, a))²),对这个 loss 求梯度,更新在线网络权重。第五步,按预定周期整体同步目标网络的参数。

这个流程看起来不长,但每一步都有讲究。比如目标值 y 的计算用的是目标网络而不是在线网络,预测值 Q(s,a) 用的是在线网络。再比如 done 标记的处理,很多人会忽略终止状态上还要乘一个 (1 - done),如果不乘,终止状态也会往一个并不存在的未来价值方向学习,估计会无端向大家念叨一个虚高的 Q 值。我当时在这个细节上踩过坑,reward 曲线在训练后期出现奇怪的抬升,排查一圈才发现是终止状态处理有问题。

3. DQN 实操全流程:从零搭出一个可训练的智能体

3.1 实验环境与项目结构建议

实操阶段我推荐从 CartPole 这类经典控制任务入手。这个任务状态是四维连续向量,动作只有左右两个离散选择,能在 CPU 上几十秒见效果,非常适合把 DQN 的机制跑通后再转向高维场景。环境接口用常见强化学习库的封装,或者直接用支持离散动作的空间框架,一步即可创建环境。

项目结构建议拆得清晰点。我的习惯是把训练主循环、网络定义、经验回放和配置参数分开组织,后续做变体实验时只需要改网络或者替换部分模块,不必动主逻辑。一个适合练手的骨架可以这样组织:

# 目录结构示例 dqn_project/ ├── agent.py # DQN agent:动作选择 + 学习更新 ├── memory.py # 经验回放缓冲区 ├── networks.py # Q 网络定义 ├── config.py # 超参数集中管理 ├── train.py # 训练主循环 └── visualize.py # reward 曲线与评估可视化

这样拆的好处是结构一目了然,等你想从 DQN 切到 Double DQN 或者 Dueling DQN 时,只需要在 networks 和 agent 层面做小改动,不用重构整个项目。另外,实验记录习惯一定要从一开始就养成。每次训练结束后把超参数、reward 曲线、最终得分一起保存下来,过两周回来对比调参效果,就靠这些原始记录。

3.2 网络设计与关键超参数选择

对于 CartPole 这种低维连续状态输入,一个三层全连接网络就绰绰有余。常见配置是 128 或 256 个神经元的隐藏层,激活函数用 ReLU,输出层是动作数目的神经元,不用加激活函数——因为 Q 值本身就是连续数值回归输出。网络不用设计很深,价值函数在 CartPole 这种任务上表达相对简单,堆太深反而容易过拟合,还拖慢训练速度。

超参数里最核心的几个值得单独说明学习率、折扣因子和探索率的组合。学习率理想选择在 1e-4 到 1e-3 之间,DQN 对学习率比较敏感,调大一个数量级就可能让训练直接炸掉;折扣因子 γ 通常设为 0.99,因为它决定智能体多看重远期回报,设置过低会让它变得短视。探索率方面,最常用的是 ε-贪心策略:训练前期随机探索多一些,让智能体看到尽可能多的情况,然后随时间推移逐步降低随机动作的比例。我自己常用的衰减策略是从 1.0 线性衰减到 0.05,大概在训练前 30% 的回合里完成主要衰减,后期让小概率随机探索保持状态空间覆盖。

经验池容量的选择更要结合具体问题。CartPole 用 5 万条左右就比较宽裕了,复杂任务环境可能需要更大的缓冲区。批量大小我一般取 32 或 64,这个参数不算特别敏感,但太小会增大单次更新的方差。最重要的原则是:先保证训练能收敛,再谈提升效率,很多调参新手一上来就追求速度,结果超参数组合失衡,反而连收敛都做不到。

3.3 训练主循环与稳定性调优

训练主循环的整体逻辑不复杂,但细节很多。每个回合与环境交互,每一步根据当前 ε 决定随机探索还是按照在线网络选择最优动作,然后执行动作、观测奖励和下一个状态、存储一条转移样本到经验池。当经验池样本量达到预热阈值(比如 1000 条)后,每步或者每几步从池中随机采样一个批次,执行一次前文说过的更新流程。

代码骨架大概长这样:

for episode in range(config.max_episodes): state = env.reset() episode_reward = 0 while True: action = agent.choose_action(state, epsilon) next_state, reward, done, info = env.step(action) agent.store_transition(state, action, reward, next_state, done) if agent.memory.size() >= config.pretrain_steps: agent.learn() state = next_state episode_reward += reward if done: break

训练稳定性是 DQN 最磨人的部分,有几个细节能显著改善体验。第一,保存模型时不要只保存最后一版,因为训练过程中后期模型可能反而退化,应该定期评估并记录历史最佳模型。第二,观察训练状态不能只看单个回合的 reward,单回合随机性强,波动剧烈,要看滑动平均曲线,比如每隔 50 回合算一次平均分再去画图。第三,要预留评估模式,每隔一段时间关闭探索机制跑几次环境,用“纯贪婪策略”下的成绩来衡量当前真正学到的水平。

4. 训练不收敛怎么办:高频问题排查实录

4.1 常见失败模式速查表

DQN 训练失败的表现五花八门,但根源往往能归到有限的几类。我把高频问题整理成一张速查表,方便对照排查。

症状可能原因排查方向
reward 始终在初始值附近徘徊探索率衰减过快或学习率太小尝试加大探索时间,调大学习率
训练前期正常,后期 reward 暴跌经验池中过期样本比例过高或目标网络同步过慢减小经验池容量,调快同步节奏
刚开始涨了一点就剧烈振荡学习率过大、目标值计算根本步正确(如忽略 done 标记)降低学习率,检查目标值公式
完全能学习但很慢批量大小太小,或者网络宽度不够增大 batch size,加宽隐藏层
不同次训练结果相差巨大随机种子影响、探索策略带来的高方差固定随机种子做对照实验

这个表排查不了所有问题,但足以覆盖大部分入门者会碰到的训练困境。核心思路其实很简单:每次只改一个变量,固定其他条件,看曲线变化来定位问题源。

4.2 离线经验分享:我踩过的五个坑

第一个坑是经验池预热不够就开始学习。刚开始训练时样本都是靠随机策略采集的,池子里都是盲目的经验,这个时候去学习只会让网络快速学到一个“什么动作都差不多”的平庸价值估计,后期要花大量时间去纠正。我现在都会先随机采样一千步左右填充经验池,再开启正式学习。

第二个坑是更新密度太高。经验回放里每次交互都同时做 4 次甚至更多次学习更新,结果经验池中被采样的数据很快重复,网络开始过拟合近期经验。DQN 不是更新次数越多越好,每步一次更新已经是很常见的配置,再高容易适得其反。

第三个坑是忽略目标网络同步周期的重要性。之前一度默认固定值不变,后来换了更复杂的任务,发现模型长期不收敛,把同步周期缩短后立刻就稳了。同步周期这个参数,在简单任务里不是大问题,在复杂任务里很关键。

第四个坑是奖励没有做尺度统一。环境本身给的奖励范围大时,Q 值收敛会很慢;范围很小时,又容易被网络初始化的随机输出淹没。可以尝试做奖励归一化或裁剪,把奖励范围控制在合理区间,帮助网络更快稳定。

第五个坑是固定随机种子的一致性陷阱。固定种子能让实验可复现,但也会让你过分依赖某一次随机过程。换到真实场景后环境分布发生了变化,模型表现可能大幅下降。固定种子用来调试没问题,评估效果最好还是用多个种子跑多次取均值。

4.3 从 DQN 到进阶:几种主流变体的出路

基础 DQN 在简单任务上堪用,但放到更复杂的环境里问题仍然不少。Double DQN 把目标值里的 max 换成使用在线网络先选动作、再用目标网络对选中动作估值,专治 Q 值过高估计。Dueling DQN 则把 Q 值分解成状态价值 V(s) 和动作优势 A(s, a) 的和,让网络在“哪些状态下本身就有价值”和“在这个状态下哪个动作更优”之间分开建模,很多场景下收敛更快。Noisy DQN 则直接不再用 ε-贪心,而是在网络权重上注入噪声,让探索过程可学习,参数化的噪声会在训练中被自动调节。

这些变体不是互相排斥的,它们完全可以叠加起来用。比如把 Double DQN 与 Dueling 结合,再加上优先经验回放,就能组成一个综合强化的 DQN 体系。我在做更复杂的仿真项目时,最后的稳定方案就是在 Dueling 网络结构上叠加 Double 更新和优先采样,整体训练曲线比最原始的 DQN 稳太多,高估偏差明显下降。学习路线建议先把基础 DQN 吃到透彻,再逐一加上这些补丁,每加一个都记录变化,很快就能建立对深度强化学习调参的整体直觉。

相关新闻

基于Web的校园失物招领系统:Spring Boot+Vue全栈设计与实现

基于Web的校园失物招领系统:Spring Boot+Vue全栈设计与实现

不知道你有没有想过,一所万人规模的学校里,每天到底会产生多少件遗失物品。从我接触过的几个高校后勤项目来看,光是学生餐厅、图书馆和操场这三个地方,一天捡到的水杯、校园卡、耳机、钥匙就有几十件。这些物品大部分被送到失物招…

2026/10/21 3:02:05 阅读更多 →
RJ45接口40年进化史:从百兆到万兆,揭秘网络连接底层逻辑

RJ45接口40年进化史:从百兆到万兆,揭秘网络连接底层逻辑

从百兆到万兆!RJ45接口的40年进化史,藏着网络连接的底层逻辑你家里那根网线,大概率插在一个叫RJ45的接口上。这接口四十多年没变过样子,但从它里面跑过的速度,已经从早期的10Mbps涨到了今天的10Gbps,整整一…

2026/10/21 3:02:05 阅读更多 →
ps aux --sort=-%cpu | head 深度拆解:一行命令洞察系统进程性能

ps aux --sort=-%cpu | head 深度拆解:一行命令洞察系统进程性能

1. 一行命令背后的系统体检术在服务端排查问题、写监控脚本、或者纯粹想看看机器上到底什么程序在“偷跑”的时候,ps aux --sort-%cpu | head这串命令几乎是每个运维和开发脑子里第一个蹦出来的东西。它很短,短到一眼就能扫完;但它又很密&…

2026/10/21 3:02:05 阅读更多 →

最新新闻

AI信息挖掘实战:从提问到交叉验证,把碎片信息串成认知

AI信息挖掘实战:从提问到交叉验证,把碎片信息串成认知

元旦的钟声刚敲过,我猜不少人正把“新的一年多学点东西、把手头的事做精”写进计划表。这几天我发现一个很有意思的现象:大家不是不想查资料,而是被资料淹没了。打开浏览器想看某个行业的最新动态,结果十条链接里八条是去年的&…

2026/10/21 5:48:18 阅读更多 →
从SLAM到AMCL:自制差速机器人地图导航模块实战解析

从SLAM到AMCL:自制差速机器人地图导航模块实战解析

lingbot-map 这个名字听起来像某个开源仓库的代号,其实是我给自制的差速移动机器人开发的一套完整地图与导航模块。项目核心就一句话:让一台只会上电转圈的底盘,变成能在办公室和家里自主巡航的机器人。它由三个子功能组成——离线建图、在线…

2026/10/21 5:48:18 阅读更多 →
Python语法基础精讲:变量、缩进与运算符优先级实战避坑指南

Python语法基础精讲:变量、缩进与运算符优先级实战避坑指南

简介:这份PPT课件面向Python零基础学习者与编程入门教学场景,系统梳理第2章Python语法基础的核心知识框架。内容围绕变量与数据类型展开,涵盖整型、浮点型、复数、布尔、字符串、列表、元组、字典、集合等类型,并延伸至标识符命名…

2026/10/21 5:48:18 阅读更多 →
互联网医院管理制度文档编写指南:从制度条款到系统代码的落地实践

互联网医院管理制度文档编写指南:从制度条款到系统代码的落地实践

简介:这份文档面向医院管理者、信息科人员及互联网医疗从业者,系统梳理了互联网医院从组织架构到具体业务规范的完整制度框架,可用于制度建设参考、合规自查或岗位培训。压缩包内为1个doc文件,约176KB,内容以制度条文与…

2026/10/21 5:48:18 阅读更多 →
kubeadm 安装 Kubernetes 集群完整指南:初始化、加入节点与排障

kubeadm 安装 Kubernetes 集群完整指南:初始化、加入节点与排障

经常有人问我:“想自己搭一套 Kubernetes 集群,到底从哪下手?”我一般都会回复一句话:先把 kubeadm 用熟,再谈别的。kubeadm 是 Kubernetes 官方维护的集群引导工具,它的目标就是让你别在节点初始化、证书签…

2026/10/21 5:48:18 阅读更多 →
MediaSoup SDP协商详解:ICE、DTLS与RTP参数三层拆解

MediaSoup SDP协商详解:ICE、DTLS与RTP参数三层拆解

做WebRTC服务端的时间长了,你会发现SDP协商是所有“看起来简单、跑起来折磨”的问题里最典型的一个。文本就那么几行,但每一行都对应着一段连接的生命周期。MediaSoup的SDP协商尤其有意思——它并没有像传统服务器那样去解析和重写SDP文本,而…

2026/10/21 5:47:17 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →