避坑指南:为什么你的PyTorch模型总在中期训练崩掉?可能是学习率调度器没选对!
避坑指南为什么你的PyTorch模型总在中期训练崩掉可能是学习率调度器没选对你是否经历过这样的场景模型训练初期一切顺利损失曲线稳步下降你满怀期待地泡了杯咖啡准备迎接一个漂亮的收敛结果。然而在训练进行到几百个epoch甚至几千个batch之后情况急转直下——损失值突然开始剧烈震荡或者干脆停滞不前甚至直接变成NaN。你检查了数据、模型结构、损失函数甚至怀疑是硬件问题但最终发现那个看似不起眼的“学习率调度器”可能就是罪魁祸首。对于已经掌握了基础训练流程的中级开发者来说这种中期“崩盘”尤为恼人因为它往往不是代码错误而是策略选择的失误。今天我们就深入几个真实的“翻车”案例从现象倒推原因帮你理清不同学习率调度器的适用场景与核心参数设置逻辑让你的训练过程更加稳健。1. 从现象到根源五种典型中期训练故障剖析模型训练中期出现问题往往比初期更难诊断。初期问题如梯度爆炸通常立刻显现而中期问题则像慢性病在某个临界点突然爆发。理解这些现象背后的学习率动态是解决问题的第一步。1.1 案例一梯度“温和”的爆炸与消失很多人认为梯度爆炸是训练初期的问题表现为损失值瞬间变为NaN。但实际上有一种更隐蔽的“温和爆炸”或“梯度消失”会发生在中期。现象描述模型训练了数百个epoch后损失值下降变得极其缓慢几乎呈水平线。检查梯度范数torch.nn.utils.clip_grad_norm_或手动计算发现其值要么趋近于零消失要么虽然没到NaN但数值异常巨大且不稳定温和爆炸。模型权重更新微乎其微或剧烈抖动。反向推导这通常指向学习率在中期变得不匹配。例如你使用了StepLR在预设的step_size点将学习率乘以gamma0.1。如果这个下降点设置得过早或gamma过小学习率可能在模型还未充分探索损失曲面“平坦区域”时就降得太低导致梯度更新步长不足消失。反之如果使用CyclicLR或CosineAnnealingLR在周期性的学习率上升阶段max_lr若max_lr设置过高配合此时可能已经较大的模型权重就会引发梯度更新过大爆炸。可视化分析绘制学习率随迭代次数的变化曲线并与损失曲线、梯度范数曲线对齐观察。你会发现在损失停滞或震荡的拐点往往对应着学习率调度策略的一个关键切换点。import torch import matplotlib.pyplot as plt # 模拟一个简单的训练循环记录数据 optimizer torch.optim.SGD(model.parameters(), lr0.1) # 假设使用StepLR在第30个epoch后学习率骤降 scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size30, gamma0.1) learning_rates [] losses [] # 假设从训练中记录 grad_norms [] # 假设从训练中记录 for epoch in range(100): # ... 训练步骤 ... current_lr scheduler.get_last_lr()[0] learning_rates.append(current_lr) # 计算并记录梯度范数示例 # total_norm torch.norm(torch.stack([torch.norm(p.grad.detach()) for p in model.parameters()])) # grad_norms.append(total_norm.item()) scheduler.step() # 绘制对齐图表 fig, (ax1, ax2) plt.subplots(2, 1, figsize(10, 6)) ax1.plot(learning_rates, labelLearning Rate, colortab:blue) ax1.set_ylabel(Learning Rate) ax1.legend() ax1.grid(True) ax2.plot(losses, labelTraining Loss, colortab:orange) # ax2.plot(grad_norms, labelGrad Norm, colortab:green) ax2.set_xlabel(Epoch) ax2.set_ylabel(Loss / Grad Norm) ax2.legend() ax2.grid(True) plt.show()注意在实际诊断时务必同时监控训练损失、验证损失和学习率曲线。单一指标的异常可能由多种原因导致三者结合能更准确定位问题。1.2 案例二Loss的周期性剧烈震荡这种震荡不同于优化陷入局部最小值的微小波动而是幅度大、周期相对规律的“过山车”式震荡。现象描述损失值在下降过程中每隔固定轮数如几十或几百个batch就会出现一次大幅度的上升然后再次下降形成明显的锯齿波。模型性能如准确率也随之同步震荡。反向推导这几乎是CyclicLR或CosineAnnealingWarmRestarts等周期性调度器的“特色”现象但并非设计缺陷而是参数设置不当的后果。核心在于max_lr峰值学习率设置过高。当学习率周期性上升到峰值时过大的更新步长导致优化过程“冲过头”越过了当前损失盆地的谷底跑到了对面的山坡上造成损失反弹。关键参数解析CyclicLR:base_lr谷值和max_lr峰值的差距决定了震荡幅度。step_size_up上升步数和step_size_down下降步数的比例决定了震荡的对称性。一个陡峭的上升step_size_up小配合高max_lr极易引发震荡。CosineAnnealingLR:T_max是半个周期的长度。如果T_max设置过小意味着学习率从初始值下降到eta_min的过程太快模型来不及在一个“低温”低学习率状态下充分收敛就开始了新的周期如果配合CosineAnnealingWarmRestarts也可能引发震荡。调度器类型易导致震荡的关键参数调整建议CyclicLRmax_lr(过高),step_size_up(过短)max_lr建议从base_lr的 2-10 倍开始尝试step_size_up应足够长让模型在峰值附近能稳定几步。CosineAnnealingWarmRestartsT_0(首个周期过短),eta_min(相对初始lr过低)T_0应至少覆盖模型在初始学习率下能显著下降的轮数eta_min不宜设为0保留一个很小的学习率有助于最终微调。OneCycleLRmax_lr(过高),pct_start(上升阶段比例过小)max_lr可通过LR Finder等工具估算pct_start通常设在 0.3-0.5给模型足够的“热身”时间。1.3 案例三过早收敛与性能平台期模型很快达到了一个看似不错的损失值但之后就再也无法提升验证集指标也早早停滞。现象描述训练损失在早期快速下降后很快进入一个漫长的、几乎不变的平台期。尝试增加训练轮数也无济于事。这不同于过拟合训练损失降验证损失升而是训练本身就无法继续优化。反向推导这常常是使用了单调递减且衰减过快的学习率策略所致如ExponentialLR或MultiStepLR配合较大的gamma如0.5和较早的milestones。学习率在模型还未找到更优的、更平坦的极小值区域时就已经降得太低失去了“跳出”当前狭窄区域的能力。模型被困在了一个“陡峭”的局部最小值或鞍点附近。解决方案对比传统衰减策略的局限StepLR,MultiStepLR,ExponentialLR都是“只降不升”的。一旦学习率降下去模型就失去了探索能力。周期性/自适应策略的优势CyclicLR、CosineAnnealingWarmRestarts或ReduceLROnPlateau提供了“二次机会”。周期性策略通过重新提高学习率帮助模型逃离当前的平坦区域而ReduceLROnPlateau则在检测到性能停滞时再降低学习率避免了过早衰减。# 使用ReduceLROnPlateau的典型模式 optimizer torch.optim.Adam(model.parameters(), lr0.001) scheduler torch.optim.lr_scheduler.ReduceLROnPlateau( optimizer, modemin, # 监控指标越小越好如损失 factor0.5, # 学习率衰减因子 patience10, # 容忍10个epoch指标没有改善 verboseTrue, # 打印调整信息 min_lr1e-6 # 学习率下限 ) for epoch in range(num_epochs): train_loss train_one_epoch(...) val_loss validate(...) # 注意scheduler.step() 的参数是监控的指标 scheduler.step(val_loss) print(fEpoch {epoch}: LR {scheduler.get_last_lr()[0]:.2e}, Val Loss {val_loss:.4f})提示ReduceLROnPlateau的patience参数需要根据你的任务和数据集大小精心调整。对于小数据集或快速收敛的任务patience可以小一些如5对于大数据集或复杂任务需要更大的patience如15-20给模型更多时间在现有学习率下优化。2. 进阶调度器核心参数实战CyclicLR与CosineAnnealing理解了常见问题我们深入两个功能强大但也更容易“翻车”的调度器看看如何通过调整关键参数来驾驭它们。2.1 CyclicLR不仅仅是三角波CyclicLR的思想源于论文《Cyclical Learning Rates for Training Neural Networks》其核心是认为最佳学习率可能在一个边界内周期性变化有助于逃离鞍点。base_lr与max_lr的黄金比例这是最重要的两个参数。一个常见的启发式起点是使用“LR范围测试”LR Range Test来确定。简单来说从一个很小的学习率开始训练几个epoch逐步线性增加学习率观察损失变化。base_lr通常选择损失开始明显下降时的学习率max_lr选择损失开始上升或变得不稳定之前的学习率。两者的比值通常在2到10之间。例如测试发现损失在1e-5开始下降在1e-2开始震荡那么可以设base_lr3e-5,max_lr3e-3比值100可能偏大需谨慎。step_size_up与step_size_down的节奏它们定义了周期的形状。step_size_up是“探索”阶段应相对较长让模型有时间在较高学习率下寻找新方向。step_size_down是“利用”阶段让模型收敛到当前找到的谷底。常见的模式是step_size_up 2 * step_size_down或两者相等对称三角波。总步数step_size_up step_size_down决定了周期的长度。mode参数的选择triangular默认三角波、triangular2每个周期峰值减半、exp_range每个周期按gamma衰减。对于中期训练triangular2或exp_range更为稳健因为它们会逐渐缩小学习率的波动范围后期更倾向于微调避免持续的大幅震荡。# 一个更稳健的CyclicLR配置示例 optimizer torch.optim.SGD(model.parameters(), lr0.001) # 这里的lr会被base_lr覆盖 scheduler torch.optim.lr_scheduler.CyclicLR( optimizer, base_lr0.0001, # 谷底学习率 max_lr0.001, # 峰值学习率 (10倍关系) step_size_up2000, # 从谷底到顶峰需要的迭代次数假设batch size固定 step_size_down1000, # 从顶峰到谷底需要的迭代次数 modetriangular2, # 峰值逐周期减半 cycle_momentumTrue, # 如果优化器是SGD with momentum建议设为True gamma0.999, # 仅在modeexp_range时有效 ) # 在训练循环中每个batch后调用 scheduler.step() # for batch in dataloader: # ... # scheduler.step()2.2 CosineAnnealingLR及其变体平滑的下降与重启余弦退火提供了非常平滑的学习率下降曲线理论上能让模型在周期结束时收敛到一个小范围内相对较优的点。T_max不是总epoch数这是最常见的误解。T_max是余弦周期的一半。在标准的CosineAnnealingLR中学习率从初始值由optimizer设置平滑下降到eta_min这正好是半个余弦周期。所以如果你设置T_max50那么在第50个epoch学习率会第一次降到eta_min。之后如果你继续训练学习率会保持在eta_min不再变化除非你手动重置优化器。它不是一个循环。CosineAnnealingWarmRestarts给退火加上重启这正是为了解决上述“一次退火后停滞”的问题。T_0是第一个完整周期的长度注意与CosineAnnealingLR的T_max区别。在T_0个epoch后学习率会从eta_min突然跳回初始值开始一个新的余弦下降周期。T_mult参数控制后续周期的长度增长默认为1即等长。例如T_010, T_mult2则周期长度为 10, 20, 40, 80... 这种“重启”机制模拟了随机重启的SGD思想能帮助模型跳出局部最优。eta_min的设置哲学不要轻易设为0。一个非零的eta_min如初始学习率的1/100或1/1000能让模型在周期末尾进行极其细微的调整有时能带来最后的性能提升。设为0相当于在周期末完全停止参数更新。# 对比 CosineAnnealingLR 和 CosineAnnealingWarmRestarts import numpy as np def cosine_annealing(epoch, T_max, eta_min0, lr_init0.1): return eta_min 0.5 * (lr_init - eta_min) * (1 np.cos(np.pi * epoch / T_max)) def cosine_annealing_warm_restarts(epoch, T_0, T_mult1, eta_min0, lr_init0.1): # 简化计算演示重启逻辑 T_i T_0 T_cur epoch while T_cur T_i: T_cur - T_i T_i * T_mult return eta_min 0.5 * (lr_init - eta_min) * (1 np.cos(np.pi * T_cur / T_i)) # 假设 lr_init0.1, eta_min0.01 epochs list(range(100)) lr_list_anneal [cosine_annealing(e, T_max50, eta_min0.01, lr_init0.1) for e in epochs] lr_list_restart [cosine_annealing_warm_restarts(e, T_020, T_mult2, eta_min0.01, lr_init0.1) for e in epochs] # 绘图代码略。可以看到Annealing在50epoch后学习率恒为0.01而Restart在20, 60(2040) epoch后重启。3. 组合策略与自定义调度应对复杂训练场景单一调度器有时难以应对整个训练过程的需求。PyTorch提供了将调度器组合的工具你也可以完全自定义逻辑。3.1 使用SequentialLR进行阶段式训练这是一种非常实用的策略模仿了人类学习的过程先快速入门高学习率再精雕细琢低学习率最后微调极低学习率。场景训练一个大型视觉模型。前10个epoch使用LinearLR从0缓慢“热身”到初始学习率避免初期震荡。接着用CosineAnnealingWarmRestarts进行主体训练利用重启探索多个解。最后50个epoch切换到固定的ConstantLR进行漫长的微调。实现from torch.optim.lr_scheduler import SequentialLR, LinearLR, CosineAnnealingWarmRestarts, ConstantLR optimizer torch.optim.AdamW(model.parameters(), lr0.001) # 阶段1: 热身 (10 epochs) scheduler1 LinearLR(optimizer, start_factor0.01, end_factor1.0, total_iters10) # 阶段2: 余弦退火重启训练 (100 epochs, 第一个周期30epoch后续周期翻倍) scheduler2 CosineAnnealingWarmRestarts(optimizer, T_030, T_mult2, eta_min1e-5) # 阶段3: 恒定低学习率微调 (50 epochs) scheduler3 ConstantLR(optimizer, factor1.0, total_iters50) # factor1.0表示学习率不变但这里我们想用更低的学习率 # 注意实际使用时scheduler3应在optimizer的lr已被scheduler2降低后生效。更常见的做法是直接定义一个新的优化器或用LambdaLR。 # 使用SequentialLR串联在epoch 10和epoch 110切换 scheduler SequentialLR(optimizer, schedulers[scheduler1, scheduler2, scheduler3], milestones[10, 110]) # 在第10和第110个epoch后切换到下一个调度器 for epoch in range(160): # 总epoch 10 100 50 train(...) validate(...) scheduler.step()注意SequentialLR中的milestones指的是切换点而不是每个调度器运行的epoch数。调度器在其生效期间会持续调用step()。上例中scheduler2将从第10个epoch后开始生效并持续运行100个epoch直到第110个epoch切换点。3.2 使用LambdaLR实现完全自定义策略当内置调度器无法满足你的奇思妙想时LambdaLR是你的终极武器。它允许你用一个函数来定义每个epoch的学习率。场景你根据验证集准确率动态调整学习率变化幅度。当准确率提升快时使用更激进的变化当提升慢时使用更保守的变化。实现def custom_lr_lambda(epoch): 一个自定义的学习率函数示例。 假设我们有一个全局变量 best_val_acc 记录历史最佳验证准确率 以及 current_val_acc 当前epoch的准确率。 这里仅为演示逻辑。 # 假设这些变量在外部更新 # global best_val_acc, current_val_acc # improvement current_val_acc - best_val_acc # 模拟逻辑如果提升大于1%则使用标准余弦退火如果提升在0.5%-1%之间使用更平缓的退火否则使用固定小学习率。 improvement 0.02 # 示例值 base_lr 0.01 min_lr 0.0001 if improvement 0.01: # 激进模式余弦退火周期为20 return min_lr 0.5 * (base_lr - min_lr) * (1 np.cos(np.pi * epoch / 20)) elif improvement 0.005: # 保守模式线性衰减到min_lr周期为40 return max(min_lr, base_lr - (base_lr - min_lr) * (epoch / 40)) else: # 平台期固定为min_lr return min_lr / base_lr # LambdaLR返回的是因子需要乘以optimizer的初始lr optimizer torch.optim.SGD(model.parameters(), lr0.01) scheduler torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambdacustom_lr_lambda)4. 调试与监控构建你的学习率诊断工作流选择并配置了调度器之后如何验证其效果并监控训练过程以下是一套可操作的工作流。前期LR Range Test在正式训练前用一小部分数据1-2个epoch进行学习率范围测试。这是确定base_lr和max_lr最有效的方法。许多库如torch-lr-finder可以自动化这个过程。中期可视化与关键指标监控必绘图将学习率曲线与训练损失曲线、验证损失曲线绘制在同一时间轴epoch或iteration上。这是诊断问题的核心。辅助指标定期记录并绘制梯度范数、权重更新量范数。它们能直接反映优化过程的稳定性。工具利用TensorBoard、WandB等实验管理工具它们能自动记录这些指标并生成联动图表。后期分析日志与调整策略如果训练出现中期崩溃回看日志崩溃点对应学习率阶段是在学习率下降时、上升时还是重启时对比实验尝试固定学习率、换用更简单的调度器如StepLR进行对照实验看问题是否消失。如果消失则问题很可能出在复杂调度器的参数上。参数敏感性分析对怀疑的参数如CyclicLR的max_lr进行小幅调整例如乘以0.8或1.2重新训练观察模型稳定性是否改善。实用代码片段实时获取与记录学习率# 在训练循环中方便地记录当前学习率 def get_current_lr(optimizer): return optimizer.param_groups[0][lr] for epoch in range(num_epochs): for batch_idx, (data, target) in enumerate(train_loader): # ... 前向传播计算损失反向传播 ... optimizer.step() scheduler.step() # 如果是按iteration调整 current_lr get_current_lr(optimizer) # 记录到tensorboard或其他日志系统 # writer.add_scalar(LR/learning_rate, current_lr, global_step) # 如果是按epoch调整则在epoch循环内调用 scheduler.step() # scheduler.step() # current_lr get_current_lr(optimizer) # 记录epoch级别的学习率学习率调度不是玄学而是一种需要结合任务特性、模型结构和数据分布进行精心设计的工程实践。它没有放之四海而皆准的最优解但通过理解其工作原理掌握关键参数的调节逻辑并建立系统的调试方法你完全可以将它从“训练崩盘”的潜在元凶转变为提升模型性能的得力助手。下次训练再遇到中期瓶颈时不妨先别急着调整模型结构静下心来画一画学习率曲线或许就能发现问题的钥匙。

相关新闻

Windows下用Conda一键搞定mayavi三维可视化环境(附PyQt5避坑指南)

Windows下用Conda一键搞定mayavi三维可视化环境(附PyQt5避坑指南)

Windows下用Conda一键搞定mayavi三维可视化环境(附PyQt5避坑指南) 三维数据可视化是数据科学和工程仿真中不可或缺的一环,它能将抽象的数字矩阵转化为直观的立体图像,帮助我们洞察数据背后的复杂模式与关系。对于在Windows平台上工…

2026/7/6 10:50:30 阅读更多 →
向量量化(VQ)在语音处理中的应用:如何用Codebook提升语音识别准确率

向量量化(VQ)在语音处理中的应用:如何用Codebook提升语音识别准确率

向量量化:重塑语音识别精度的底层密码 如果你最近在调试一个语音识别模型,发现它在嘈杂环境下表现不佳,或者模型体积过大难以部署,那么你可能需要重新审视一下特征提取这个环节。我们习惯了将语音信号转换为MFCC或FBank特征后直接…

2026/5/17 6:04:57 阅读更多 →
域名系统 (DNS) 深度解析

域名系统 (DNS) 深度解析

DNS (Domain Name System,域名系统) 是互联网的“电话簿”和“导航仪”。它将人类易于记忆的域名(如 www.example.com)转换为机器用于定位计算机的 IP 地址(如 93.184.216.34)。如果没有 DNS,我们就必须记住…

2026/7/3 11:35:08 阅读更多 →

最新新闻

Excel ROUND函数底层原理与财务工程级避坑指南

Excel ROUND函数底层原理与财务工程级避坑指南

1. 项目概述:为什么一个“四舍五入”函数值得写上万字?Excel里敲下ROUND(A1,2),结果立刻出来——看起来简单得不能再简单。但如果你在财务报表里用它算过增值税、在工程预算中处理过材料损耗率、在科研数据里校验过有效数字,你大概…

2026/7/6 10:46:37 阅读更多 →
Plone电商基建加固:GetPaid Recipe Release 1.4.1深度解析

Plone电商基建加固:GetPaid Recipe Release 1.4.1深度解析

1. 项目概述:一个被低估的 Plone 电商基建工具包更新 Plone 是个老派但极其扎实的内容管理系统,尤其在政府、教育、科研类机构里扎根很深。它不像 WordPress 那样靠主题和插件堆出花哨界面,而是靠严格的权限模型、内容生命周期管理和可审计性…

2026/7/6 10:46:37 阅读更多 →
ZODB对象数据库原理与Zope内容管理实战

ZODB对象数据库原理与Zope内容管理实战

1. 项目概述:当应用服务器与数据库在对象层面“无缝焊接”我第一次接触 Zope 是在 1998 年,那会儿连“Web 应用框架”这个词都还没被广泛使用。打开文档,第一反应不是兴奋,而是皱眉——“这玩意儿默认不让我连 MySQL?”…

2026/7/6 10:46:37 阅读更多 →
Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南

Linux防火墙端口管理:firewalld、iptables、ufw 3种方案深度对比与选择指南在Linux服务器管理中,防火墙配置是确保系统安全的关键环节。面对不同的发行版和业务需求,系统管理员常常需要在firewalld、iptables和ufw这三种主流防火墙工具之间做…

2026/7/6 10:44:32 阅读更多 →
可视化指挥闭环:城市安防视频孪生时空感知技术详解

可视化指挥闭环:城市安防视频孪生时空感知技术详解

可视化指挥闭环:城市安防视频孪生时空感知技术详解摘要传统城市安防指挥体系存在视频孤岛、时空基准割裂、预警处置脱节、调度无空间量化支撑、事后复盘证据碎片化五大核心痛点,指挥链路停留在“看画面、接警情、人工派单”的线性被动模式,无…

2026/7/6 10:44:32 阅读更多 →
如何快速上手eulerfs-test:从配置到执行的完整教程

如何快速上手eulerfs-test:从配置到执行的完整教程

如何快速上手eulerfs-test:从配置到执行的完整教程 【免费下载链接】eulerfs-test test scripts for eulerfs 项目地址: https://gitcode.com/openeuler/eulerfs-test 前往项目官网免费下载:https://ar.openeuler.org/ar/ eulerfs-test是openEul…

2026/7/6 10:42:30 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻