从Q-learning到CQL:离线强化学习原理与实战
1. 为什么值得把强化学习从头再学一遍1.1 从“会调包”到“懂原理”的分水岭我最早接触强化学习和很多人一样是从跑通一个 CartPole 的 DQN 示例开始的。看着奖励曲线慢慢爬上去心里觉得“这东西我算是入门了”。但后来真正做项目才发现能跑通示例和能解决问题之间隔着一整条鸿沟。策略不收敛、奖励震荡、离线数据训出来的模型一上线就崩这些问题靠调包根本解决不了。把 Q-learning 到 CQL 这条线重新走一遍最大的价值在于它是一条从在线、离散、有模型交互逐步过渡到离线、连续、无交互的演进路径。每一步的演进都不是拍脑袋而是被前一步的痛点逼出来的。你只有理解了每个痛点才能理解后面那些看起来复杂的公式到底在解决什么。这篇文章适合三类人一是学过强化学习但只停留在调包层面的开发者二是做推荐、机器人、自动驾驶等方向需要处理离线数据的技术人员三是想系统梳理 value-based 方法脉络的学习者。我会尽量用大白话把每个环节的“为什么”讲清楚而不是堆公式。1.2 这条学习路线的整体地图先给一张心智地图后面所有内容都挂在这条线上Q-learningvalue-based 的起点用一张表记录每个状态下每个动作的价值。DQN用神经网络替代表解决状态空间爆炸的问题。Double DQN / Dueling DQN修 DQN 的高估问题和网络结构问题。Distributional RL不再只预测期望值而是预测价值分布。离线强化学习Offline RL数据固定不能再和环境交互。CQL离线 RL 里最经典的一类保守价值约束方法。这条线不是让你每个都精通到能推导而是让你明白每一次方法升级都是在回答“上一代方法在什么场景下会失效”。带着这个问题去学效率会高很多。2. Q-learning一切 value-based 方法的原点2.1 用一张表理解 Q-learning 到底在做什么Q-learning 的核心思想朴素到有点可爱我维护一张表行是状态列是动作格子里填的是“在这个状态下做这个动作长期来看能拿多少分”。这个分数就是 Q 值。它的更新公式是整条线的地基Q(s, a) - Q(s, a) α * [r γ * max Q(s, a) - Q(s, a)]拆开看四个部分。r是当下拿到的即时奖励γ * max Q(s, a)是对未来的估计γ是折扣因子越接近 1 越看重长远中括号里整体叫TD 误差也就是“现实和预期差了多少”α是学习率控制每次修正多少。我习惯用一个类比Q-learning 就像一个记账的人每走一步就回头核对一下“我原来以为这一步值 10 块实际拿了 3 块下一步看起来还能值 8 块那我修正成 3 0.9×8 10.2 块”。反复核对账目就越来越准。2.2 为什么 Q-learning 是 off-policy 的这是很多人第一次学的时候会卡住的点。Q-learning 更新时用的是max Q(s, a)也就是假设下一步一定选当前认为最好的动作而不管实际下一步走了哪个动作。这意味着它学习的目标策略greedy和行为策略比如 ε-greedy 探索可以不一样。这个性质极其重要因为它直接决定了后面离线 RL 的可行性。离线数据是别人用某个策略采集的你没法控制但 Q-learning 天生就能用“别人的数据”来学“自己的最优策略”。CQL 能成立根子就在这里。注意off-policy 不代表可以随便用任意数据。数据分布和目标任务差太远时Q 值照样会崩这一点后面讲 CQL 时会重点说。2.3 表格法的天花板在哪里Q-learning 用表格前提是状态和动作都离散且数量有限。一旦状态变成连续的图像、传感器读数表格就彻底没戏了。假设状态是 4 维连续变量每维只取 100 个值那就是 100^4 一亿个格子还没算动作维度。这就是 DQN 出场的理由用函数逼近神经网络替代表格输入状态、输出每个动作的 Q 值。表格法还有一个隐性痛点——它假设每个状态都被访问过足够多次。现实中大量状态是长尾的表格里那些格子永远是初始值策略自然好不了。3. DQN 及其家族让神经网络接管 Q 值3.1 DQN 的两个救命设计把 Q 表换成神经网络最直接的做法是让网络拟合Q(s,a)损失函数用 TD 误差的平方。但直接这么干会非常不稳定DQN 靠两个设计把它救回来了。第一个是经验回放Experience Replay。把交互产生的(s, a, r, s)存进一个缓冲区训练时随机采样一批。这么做有两个好处一是打破样本之间的时间相关性否则网络会顺着一条轨迹过拟合二是让稀有样本能被反复利用数据效率大幅提升。第二个是目标网络Target Network。如果计算 TD 目标时用的还是当前正在更新的网络那目标和预测会一起动像追着自己的尾巴跑。DQN 用一个隔一段时间才同步一次的参数副本去算目标让训练目标在一段时间内保持稳定。# 目标网络同步的典型写法 if step % target_update_freq 0: target_net.load_state_dict(policy_net.state_dict())这两个设计看起来简单但缺一个训练就会发散。我实测过去掉目标网络后很多环境下的回报曲线会直接变成一条剧烈震荡的噪声。3.2 Double DQN修掉“过度乐观”的毛病Q-learning 里那个max操作有个副作用它总是挑当前估计里最大的那个值而估计本身是有噪声的。噪声大的值更容易被 max 选中导致 Q 值系统性偏高这叫最大化偏差。Double DQN 的思路很巧妙用两个网络分工。用当前网络选出动作用目标网络评估这个动作的价值而不是让目标网络既选又评。# 普通 DQN target r γ * max_a Q_target(s, a) # Double DQN a_best argmax_a Q_policy(s, a) target r γ * Q_target(s, a_best)改动只有一行但高估问题能明显缓解。这个思路后来被大量方法借鉴是“小改动大收益”的典型。3.3 Dueling DQN把状态价值和动作优势拆开有些状态下选哪个动作其实差别不大比如赛车游戏里直道上微调方向。Dueling 结构把 Q 值拆成两部分Q(s, a) V(s) A(s, a)V(s)是状态本身的价值A(s,a)是每个动作相对平均的优势。网络最后分成两个分支分别输出再合并。好处是当动作影响很小时网络可以专注学V(s)不用为每个动作都单独学一遍状态价值样本效率更高。实操中合并时通常要做归一化否则V和A的分解不唯一Q(s, a) V(s) (A(s, a) - mean_a A(s, a))3.4 从期望值到分布Distributional RL 的视角前面所有方法都在预测 Q 值的期望。但期望会掩盖风险。两个动作期望收益都是 10一个稳定拿 10另一个 90% 拿 0、10% 拿 100对风险敏感的场景比如金融、医疗来说这俩完全不是一回事。Distributional RL 让网络输出价值的分布比如用一组分位数C51、QR-DQN或分布参数来表示。训练目标变成让预测分布逼近真实分布。这个方向对后面理解 CQL 的保守性也有帮助——保守本质上也是在处理“不确定性”。4. 离线强化学习当环境交互成为奢侈品4.1 为什么在线 RL 在很多场景根本用不了在线 RL 要求智能体不断和环境交互、试错、收集数据。但现实中大量场景不允许你试错医疗你不能拿病人试各种用药方案。自动驾驶不能真让车去撞了才知道错。推荐系统线上试错成本高还可能伤害用户体验。工业控制一次错误操作可能损坏设备。这些场景的共同点是你手里只有一批历史数据而且不能再产生新数据。这就是离线强化学习Offline RL要解决的问题。4.2 离线 RL 的核心难点分布偏移离线 RL 最致命的问题是分布偏移Distribution Shift。你的数据是某个行为策略采集的它只覆盖了状态动作空间的一小部分。但 Q-learning 更新时那个max会去查询数据里从没出现过的动作网络对这些动作的估计纯属瞎猜而且往往猜得偏高。一旦某个没见过的动作被高估max就会一直选它Q 值越推越高策略被带偏到数据分布之外上线直接崩。这个现象叫外推误差Extrapolation Error。我踩过的一个坑用 DQN 直接训一批历史日志数据训练时 Q 值一路飙升看着很爽评估时回报惨不忍睹。原因就是网络在数据没覆盖的区域疯狂高估。4.3 离线 RL 的几条主流思路针对分布偏移学界大致有几条路线思路代表方法核心做法策略约束BCQ、BEAR限制学到的策略靠近行为策略价值保守CQL、MCQ压低数据分布外动作的 Q 值模型约束MOPO、MOReL用不确定性惩罚模型预测序列建模Decision Transformer把 RL 当序列预测问题CQL 属于第二条路线也是目前工程落地里最常被拿来当 baseline 的方法之一。5. CQL把“保守”写进损失函数5.1 CQL 的核心直觉CQL 全称 Conservative Q-Learning它的核心思想一句话能说清让数据里出现过的动作的 Q 值尽量高让没出现过的动作的 Q 值尽量低。这样max操作就不会被那些瞎猜的高估值带偏。它通过在标准 TD 损失上加一个正则项来实现。这个正则项干两件事对从当前策略采样出来的动作压低它们的 Q 值对数据里真实出现过的动作抬高它们的 Q 值。用公式表达简化版L_CQL α * (E_{a~π}[Q(s,a)] - E_{a~数据}[Q(s,a)]) 标准TD损失α是权衡系数控制保守程度。α越大越保守学到的策略越贴近数据越小越激进越容易外推。5.2 为什么这个正则项能起作用回到分布偏移的根源问题出在max会去查询数据外的动作。CQL 的正则项相当于给这些动作的 Q 值加了一个“惩罚税”。当网络想给某个没见过的动作打高分时正则项会把它拉下来于是max就不会再被它骗。从另一个角度看CQL 学到的 Q 值实际上是真实 Q 值的下界。保守估计意味着即使估计有偏差也是往低了偏不会让策略盲目乐观。这在安全敏感的场景里非常关键。提示CQL 的保守是有代价的。如果α设得太大Q 值被压得过低策略会变得过于保守学不到数据里其实存在的更优行为。调α是 CQL 实操里最花时间的部分。5.3 CQL 的几种变体原始论文里给了几个版本工程上常见的是 CQL(H)CQL(H)正则项里用 log-sum-exp 近似max计算更稳定是默认推荐。CQL(ρ)用某种分布代替均匀采样灵活性更高。CQL(var)对 Q 值做更精细的约束。大多数情况下直接用 CQL(H) 就够了不用一上来就纠结变体。6. 从零实现一个 CQL完整实操流程6.1 环境与数据准备我用的是一个连续控制的模拟环境动作维度不高方便观察。数据准备是离线 RL 里最容易被忽视但最重要的一步。# 数据缓冲区结构示意 # 每条样本包含状态、动作、奖励、下一状态、是否终止 buffer { obs: np.array(...), # shape: [N, obs_dim] action: np.array(...), # shape: [N, act_dim] reward: np.array(...), # shape: [N] next_obs: np.array(...), # shape: [N, obs_dim] done: np.array(...), # shape: [N] }数据质量直接决定上限。我一般会先做几件事统计动作分布看看数据覆盖了动作空间的哪些区域覆盖越广CQL 越不容易过度保守。检查奖励尺度奖励量级差异太大会让 TD 误差主导训练必要时做归一化。划分验证集离线 RL 没法在线评估必须留一部分数据做离线评估。6.2 网络结构设计CQL 通常基于 SAC 或 DQN 的框架。连续动作场景下用 SAC 骨架比较多因为它本身就是 off-policy 且带熵正则和 CQL 的保守项配合得不错。网络部分需要Q 网络输入状态和动作输出 Q 值。通常用两个 Q 网络取最小值抑制高估。策略网络输出动作分布连续场景下一般是高斯分布。目标 Q 网络延迟同步稳定训练。class QNetwork(nn.Module): def __init__(self, obs_dim, act_dim, hidden256): super().__init__() self.net nn.Sequential( nn.Linear(obs_dim act_dim, hidden), nn.ReLU(), nn.Linear(hidden, hidden), nn.ReLU(), nn.Linear(hidden, 1), ) def forward(self, obs, act): x torch.cat([obs, act], dim-1) return self.net(x)6.3 CQL 损失函数的实现细节这是整个实现的核心。CQL 损失由两部分组成标准 SAC 的 TD 损失加上保守正则项。def cql_loss(q1, q2, obs, act, next_obs, reward, done, policy, target_q1, target_q2, alpha, gamma0.99): # ---- 标准 TD 损失 ---- with torch.no_grad(): next_act, next_logp policy.sample(next_obs) target_q torch.min( target_q1(next_obs, next_act), target_q2(next_obs, next_act) ) - alpha * next_logp td_target reward gamma * (1 - done) * target_q q1_pred q1(obs, act) q2_pred q2(obs, act) td_loss F.mse_loss(q1_pred, td_target) F.mse_loss(q2_pred, td_target) # ---- CQL 保守正则项 ---- # 从当前策略采样一批动作 with torch.no_grad(): random_act, random_logp policy.sample(obs) q1_rand q1(obs, random_act) q2_rand q2(obs, random_act) # 数据里真实动作的 Q 值 q1_data q1(obs, act) q2_data q2(obs, act) # log-sum-exp 近似 max再减去数据动作的均值 cql_q1 torch.logsumexp(q1_rand, dim0) - q1_data.mean() cql_q2 torch.logsumexp(q2_rand, dim0) - q2_data.mean() cql_term cql_q1 cql_q2 return td_loss cql_alpha * cql_term几个关键点值得展开说第一logsumexp的作用。它是对max的光滑近似比直接取 max 数值更稳定梯度也更平滑。这是 CQL(H) 的核心。第二采样动作的来源。正则项里采样的动作可以来自当前策略也可以来自均匀分布。用当前策略采样更贴近实际会查询的区域效果通常更好。第三cql_alpha的取值。这是最需要调的参数。太小没效果太大过度保守。我一般从 1.0 开始试根据离线评估结果上下调。6.4 训练循环与关键参数for step in range(total_steps): batch sample_from_buffer(buffer, batch_size) # 更新 Q 网络 q_loss cql_loss(...) q_optimizer.zero_grad() q_loss.backward() q_optimizer.step() # 更新策略网络SAC 的熵正则目标 if step % policy_update_freq 0: pi_loss (alpha * logp - min_q(obs, policy.sample(obs))).mean() pi_optimizer.zero_grad() pi_loss.backward() pi_optimizer.step() # 软更新目标网络 soft_update(target_q1, q1, tau) soft_update(target_q2, q2, tau)关键参数我整理成一张表方便对照参数典型取值作用与调整建议cql_alpha0.5 ~ 5.0保守程度最需要调gamma0.99折扣因子长任务可到 0.995tau0.005目标网络软更新系数lr3e-4学习率太大易发散batch_size256太小梯度噪声大hidden256网络宽度任务复杂可加大注意离线 RL 没有在线评估训练过程中不能靠“跑几局看看”来判断好坏。必须用离线评估指标比如用学到的策略在数据分布内估计回报或者用 FQEFitted Q Evaluation这类方法。7. 常见问题与排查技巧实录7.1 Q 值爆炸或持续下降这是 CQL 实操里最常见的问题。表现是训练时 Q 值越来越大或越来越小完全失控。排查顺序我一般这样走先看cql_alpha。如果 Q 值爆炸多半是保守项太弱alpha调大试试如果 Q 值被压到很低且策略不动是alpha太大。检查奖励尺度。奖励如果没归一化TD 目标量级会很大Q 值自然跟着大。看目标网络同步。目标网络如果更新太快训练目标不稳定也会导致 Q 值震荡。检查数据里的终止标志。done处理错了(1-done)那项会让 bootstrap 出错Q 值会系统性偏移。7.2 策略过于保守学不到东西CQL 的保守是双刃剑。如果发现策略几乎不动或者一直输出数据里最常见的那个动作说明保守过头了。我的处理办法把cql_alpha往下调先降到 0.5 甚至 0.1 观察。检查数据覆盖度。如果数据本身动作就很单一CQL 再怎么调也学不出多样性这时候要考虑补数据。试试用当前策略采样代替均匀采样让正则项更聚焦。7.3 离线评估和上线表现差距大离线评估看着不错一上线就拉胯这通常意味着评估方法和真实场景不匹配。几个可能原因评估数据分布和上线分布不一致。离线评估用的是历史数据上线环境可能已经变了。评估指标选错了。用简单的平均回报评估可能掩盖了策略在某些关键状态下的糟糕表现。过拟合验证集。反复用同一批数据调参本质上是在过拟合需要留出真正独立的测试集。7.4 常见问题速查表现象可能原因处理方向Q 值爆炸保守项太弱、奖励未归一化调大 alpha、归一化奖励Q 值过低策略不动保守项太强调小 alpha训练损失震荡学习率大、目标网络更新快降 lr、降 tau离线评估好上线差分布不一致、过拟合换评估集、减少调参策略动作单一数据覆盖不足补数据或降保守训练不收敛网络结构或初始化问题检查网络、换初始化7.5 几条踩坑换来的经验经验一先跑通再调优。我见过太多人一上来就纠结alpha的最优值结果连基础流程都没跑通。先用默认参数跑一遍确认 Q 值量级正常、损失能下降再谈调参。经验二数据质量比算法重要。离线 RL 里一批覆盖广、质量高的数据比换十个算法都管用。花时间在数据清洗和覆盖度分析上回报率极高。经验三保守程度要跟着数据走。数据覆盖广的时候可以激进一点覆盖窄的时候必须保守。不要指望一个固定的alpha打天下。经验四离线评估要多种指标交叉验证。单看一个指标容易被误导我一般会同时看估计回报、策略和数据动作的偏离度、Q 值的分布三个一起看才靠谱。8. 这条路线后续还能怎么走把 Q-learning 到 CQL 走通之后往下的路其实很宽。如果偏工程落地可以深入研究 CQL 和 IQL 的对比IQL 通过 expectile 回归避开了对数据外动作的查询实现更简单很多场景下效果不输 CQL。如果偏研究Decision Transformer 那条序列建模的路线值得看它把 RL 问题重新定义成条件序列预测思路完全不同。我个人在实际操作中的体会是离线 RL 的难点从来不在算法本身而在数据和评估。算法论文里那些漂亮的曲线背后都是精心构造的数据集。真实项目里你花在理解数据、设计评估、处理分布偏移上的时间会远远超过调模型的时间。所以别急着追新算法先把 Q-learning 到 CQL 这条线的每个“为什么”吃透遇到新方法时你会发现它们大多只是在回答你已经熟悉的那几个老问题。

相关新闻

基于STM32的智能家居安防系统设计:从选型到排障实战

基于STM32的智能家居安防系统设计:从选型到排障实战

最近一直在被问同一个题目:基于STM32的智能家居安防系统设计。这名字听起来很像老掉牙的毕业设计,但真的一步步去落地,会发现里面能讲的东西其实非常多。从芯片选型、传感器信号处理,到报警逻辑怎么写、误报怎么压下去&#xff0c…

2026/10/10 10:29:20 阅读更多 →
ESP8285+MQTT:老电机远程启停与状态监控实战方案

ESP8285+MQTT:老电机远程启停与状态监控实战方案

一台电机,放在没有网线的车间角落,想远程启停、看运行状态,还要和工厂里的其他设备联动,怎么搞?这是我最近在做一个电机控制器改造项目时遇上的真实场景。最后落地方案很简单:一块 ESP8285 做主控&#xff…

2026/10/10 10:29:20 阅读更多 →
LLM应用实验管理实战:跟踪、评估与比较的完整方法论

LLM应用实验管理实战:跟踪、评估与比较的完整方法论

做实验跟踪这件事,说句实话,很多做机器学习的朋友早期都是硬着头皮上的。最早我用 Excel 记参数、在文件名里塞日期,遇到一次模型效果回退,折腾两天才发现是训练数据和前一轮不一致。后来我把这套东西换成结构化工具,才…

2026/10/10 10:28:19 阅读更多 →

最新新闻

配电主站日志异常检测数据集:构建、标注与建模实践

配电主站日志异常检测数据集:构建、标注与建模实践

1. 数据集定位:配电网数字化的关键一环配电主站系统,这个词在电力行业里算不上冷门,但真正做过配电自动化运维的人都知道,主站系统就像整个配电网的“大脑”,承担着数据采集、状态监控、故障处理、设备控制这些核心职责…

2026/10/10 13:07:00 阅读更多 →
从《易经》到AI治理:如何守护技术尊严

从《易经》到AI治理:如何守护技术尊严

1. 半夜路边摊,老秦一句话把我问住了我到现在都记得那个晚上。不是因为面条多好吃,而是老秦放下筷子,忽然说了句:“你们搞技术的人天天讲AI治理、讲对齐、讲可解释性,讲得头头是道。可对我这种带过队伍的人来说&#x…

2026/10/10 13:07:00 阅读更多 →
Java入门实战指南:从环境搭建到面向对象与避坑技巧

Java入门实战指南:从环境搭建到面向对象与避坑技巧

Java入门这件事,我在不同阶段被问过很多次。有人把课程视频存在网盘里吃灰,有人在笔记软件里收藏了二十篇“新手必看”然后就没有然后了。我理解这种状态:Java不是一门看几眼就能上手的语言,它有一整套名词、概念、工具链&#xf…

2026/10/10 13:07:00 阅读更多 →
Windows临时文件清理实战指南:精准删除不伤系统

Windows临时文件清理实战指南:精准删除不伤系统

1. 为什么“清临时文件”这件事,90%的人永远在做无用功?“磁盘空间不足”弹窗刚消失三小时,又跳出来;某软件启动慢得像在加载一部4K电影;重装系统后第三天,C盘又开始发红——这些不是玄学,是临时…

2026/10/10 13:07:00 阅读更多 →
C++装饰器模式实战:组合优于继承的代码增强艺术

C++装饰器模式实战:组合优于继承的代码增强艺术

接手过数据上报模块的同学,大概率都遇到过类似的场景:最初只是把字符串落到本地文件,后来产品要求在写之前先做加密,再后来又要加签名、压缩,还要统计每次写入耗时。如果每次新需求都在原来的 FileWriter 类里加一个if…

2026/10/10 13:06:59 阅读更多 →
神经网络图绘制方法论:面向工程实践的信息流可视化

神经网络图绘制方法论:面向工程实践的信息流可视化

1. 为什么一张神经网络图能决定你的技术表达力?“这张图放PPT里,老板当场拍板立项”——这不是夸张,是某次跨部门评审会上我亲耳听到的评价。当时隔壁组一位算法工程师用一张结构清晰、配色克制、标注精准的ResNet-50可视化图,3分…

2026/10/10 13:05:57 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →