AI幻觉问题深度解析:成因、缓解与检测技术

幻觉:大模型的阿喀琉斯之踵 大模型生成流畅、自信但不正确的文本——这就是幻觉。它不是简单的"错误",而是模型对不存在事实的"确信"。理解幻觉的成因是构建可靠AI系统的前提。 幻觉的分类 事实性幻觉 vs 忠实性幻觉 HALLUCINATION_TYPES = { "事实性幻觉": { "description": "生成与客观事实不符的内容", "subtypes": { "实体幻觉": "编造不存在的人名、地名、机构", "关系幻觉": "错误描述实体间的关系", "数字幻觉": "编造不准确的统计数据", "时间幻觉": "错误的时间线", "来源幻觉": "编造不存在的引用来源" }, "example": "爱因斯坦于1923年获得诺贝尔物理学奖" # 实际是1921年 }, "忠实性幻觉": { "description": "生成与输入/上下文矛盾的内容", "subtypes": { "指令违背": "没有遵循用户指令", "上下文矛盾": "与给定上下文矛盾", "逻辑矛盾": "自身前后矛盾", "计算错误": "推理过程中计算错误" }, "example": "用户说'不要用Python',模型回复用Python实现" } } 幻觉的成因 1. 训练数据问题 class DataInducedHallucination: def __init__(self): self.causes = { "数据噪声": { "description": "训练数据本身包含错误信息", "example": "维基百科中的错误事实被学习", "mitigation": "数据清洗和事实核查" }, "知识冲突": { "description": "不同数据源对同一事实有不同表述", "example": "不同网站给出不同的历史日期", "mitigation": "可信度排序和数据源标注" }, "长尾知识不足": { "description": "小众领域数据不足,模型靠猜", "example": "冷门历史事件的细节", "mitigation": "RAG增强" }, "知识过时": { "description": "训练数据有时效性", "example": "模型不知道最新的公司财务数据", "mitigation": "实时检索" } } 2. 解码策略影响 class DecodingInducedHallucination: def analyze(self, model, prompt, strategies): """分析不同解码策略的幻觉率""" results = {} for strategy_name, params in strategies.items(): hallucination_count = 0 for _ in range(100): # 100次采样 response = model.generate(prompt, **params) if self._is_hallucination(response, prompt): hallucination_count += 1 results[strategy_name] = { "hallucination_rate": hallucination_count / 100, "params": params } return results # 典型结果: # greedy (temperature=0): 15% 幻觉率 # temperature=0.3: 18% 幻觉率 # temperature=0.7: 25% 幻觉率 # temperature=1.0: 35% 幻觉率 # top_p=0.9: 22% 幻觉率 # top_k=50: 28% 幻觉率 3. 模型知识表示问题 class KnowledgeRepresentationIssue: """ 模型的知识存储在参数中,不是数据库查询。 这意味着: 1. 知识边界模糊(不知道自己不知道什么) 2. 知识提取不可靠(同样的知识不同问法结果不同) 3. 知识干扰(相关知识互相干扰) """ def measure_knowledge_boundary(self, model, questions): """测量模型的知识边界感知""" results = [] for q in questions: # 让模型评估自己的确定性 response = model.generate(f"{q}\n\n你对答案的确定程度?(1-10)") # 验证答案正确性 is_correct = verify_answer(q, response) confidence = extract_confidence(response) results.append({ "question": q, "correct": is_correct, "confidence": confidence, "calibrated": (is_correct and confidence > 7) or (not is_correct and confidence < 4) }) calibration_rate = sum(r["calibrated"] for r in results) / len(results) return { "calibration_rate": calibration_rate, "over_confident": sum(1 for r in results if not r["correct"] and r["confidence"] > 7), "under_confident": sum(1 for r in results if r["correct"] and r["confidence"] < 4) } 幻觉缓解技术 训练阶段缓解 RLHF中的真实性奖励: ...

2026-07-16 · 4 min · 738 words · 硅基 AGI 探索者

大模型预训练数据配比:如何科学地“喂”模型

数据配比:被低估的超参数 在预训练大模型时,数据配比(各类型数据的比例)可能是最被低估的决策之一。相同的模型架构、相同的训练量,不同的数据配比可以导致10个点以上的性能差异。本文系统梳理数据配比的科学方法。 数据类型的维度划分 按内容类型 DATA_CATEGORIES = { "web_text": { "description": "网页文本(新闻、博客、论坛等)", "examples": ["Common Crawl", "Reddit"], "role": "通用语言能力和世界知识", "typical_ratio": "40-60%" }, "code": { "description": "编程代码", "examples": ["GitHub", "Stack Overflow"], "role": "逻辑推理和结构化思维", "typical_ratio": "10-30%" }, "academic": { "description": "学术论文", "examples": ["arXiv", "PubMed"], "role": "专业知识和严谨表达", "typical_ratio": "5-15%" }, "books": { "description": "书籍", "examples": ["Project Gutenberg", "授权书籍"], "role": "长文本理解和叙事能力", "typical_ratio": "5-15%" }, "math": { "description": "数学相关文本", "examples": ["数学论文", "数学教材"], "role": "数学推理能力", "typical_ratio": "3-10%" }, "dialogue": { "description": "对话数据", "examples": ["论坛讨论", "问答对"], "role": "对话和指令跟随", "typical_ratio": "5-15%" }, "multilingual": { "description": "多语言数据", "examples": ["各语言网页"], "role": "多语言能力", "typical_ratio": "按目标调整" } } 按语言 LANGUAGE_DISTRIBUTION = { "英语为主": {"en": 0.90, "zh": 0.05, "other": 0.05}, "中文为主": {"zh": 0.80, "en": 0.15, "other": 0.05}, "中英双语": {"zh": 0.45, "en": 0.45, "other": 0.10}, "多语言": {"en": 0.40, "zh": 0.25, "other": 0.35}, } 配比对模型能力的影响 实验数据 基于Llama-3-8B架构的对照实验: experiments = [ { "name": "高Web比例", "config": {"web": 0.70, "code": 0.10, "academic": 0.05, "books": 0.10, "math": 0.05}, "results": {"MMLU": 62, "HumanEval": 55, "GSM8K": 45, "MT-Bench": 7.5} }, { "name": "高代码比例", "config": {"web": 0.45, "code": 0.30, "academic": 0.10, "books": 0.10, "math": 0.05}, "results": {"MMLU": 63, "HumanEval": 72, "GSM8K": 52, "MT-Bench": 7.3} }, { "name": "均衡配比", "config": {"web": 0.40, "code": 0.20, "academic": 0.15, "books": 0.10, "math": 0.10, "dialogue": 0.05}, "results": {"MMLU": 66, "HumanEval": 68, "GSM8K": 58, "MT-Bench": 7.8} }, { "name": "高学术比例", "config": {"web": 0.35, "code": 0.15, "academic": 0.25, "books": 0.15, "math": 0.10}, "results": {"MMLU": 68, "HumanEval": 60, "GSM8K": 55, "MT-Bench": 7.6} }, ] # 结论: # 1. 代码数据显著提升推理能力(HumanEval +17%) # 2. 数学数据提升数学推理(GSM8K +13%) # 3. 学术数据提升知识广度(MMLU +6%) # 4. 均衡配比综合表现最佳 代码数据的多重收益 代码数据不仅提升编程能力,还能提升通用推理: ...

2026-07-16 · 4 min · 733 words · 硅基 AGI 探索者

长上下文模型的技术挑战:从注意力衰减到有效利用

长上下文:能力与挑战并存 当模型支持百万token的上下文时,新的问题随之而来:模型真的能有效利用这么长的上下文吗?研究表明,上下文长度和上下文利用效率是两个截然不同的问题。 长上下文的技术难点 注意力衰减 模型对上下文中不同位置信息的关注程度不均匀: def measure_attention_decay(model, context_length, key_position): """测量模型对不同位置信息的关注度""" # 在上下文的不同位置放置关键信息 results = [] for pos in [0, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0]: # pos=0表示开头,pos=1表示结尾 context = build_context_with_key_at(pos, context_length) question = "根据上下文中的关键信息回答..." accuracy = test_answer_accuracy(model, context, question) results.append({"position": pos, "accuracy": accuracy}) return results # 典型结果: # position=0.0: accuracy=85% # position=0.25: accuracy=52% ← 中间区域下降 # position=0.5: accuracy=48% ← 最低点 # position=0.75: accuracy=55% # position=1.0: accuracy=82% Needle-in-a-Haystack测试 这是评估长上下文能力的标准测试:在大量无关文本中隐藏一句关键信息,测试模型能否找到: def needle_in_haystack(model, context_length, needle_position): """大海捞针测试""" # 生成填充文本 filler = generate_filler_text(context_length - 200) # 关键信息(针) needle = "密码是:Sk7-9mPq" # 在指定位置插入针 insert_pos = int(len(filler) * needle_position) context = filler[:insert_pos] + needle + filler[insert_pos:] # 测试模型能否找到 question = "文档中提到的密码是什么?" response = model.generate(context + "\n\n" + question) return { "found": "Sk7-9mPq" in response, "context_length": context_length, "needle_position": needle_position } def full_evaluation(model): """全面评估""" results = [] for length in [1000, 5000, 10000, 50000, 100000, 500000]: for pos in [0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]: result = needle_in_haystack(model, length, pos) results.append(result) # 生成热力图 return plot_heatmap(results, x="position", y="length", color="found") 多针测试 更复杂的测试在上下文中放置多个关键信息: ...

2026-07-16 · 4 min · 667 words · 硅基 AGI 探索者

大模型上下文窗口的工程优化:从朴素截断到结构化压缩

上下文窗口:模型的"工作台" 上下文窗口是模型的工作台——它能在一次推理中处理的所有信息。窗口越大,模型能"看到"的信息越多,但也意味着更高的计算成本和更慢的推理速度。如何在有限的窗口中放入最有价值的信息,是一个核心工程问题。 窗口大小的演进 GPT-3 (2020): 2K tokens GPT-3.5 (2022): 4K-16K tokens GPT-4 (2023): 8K-128K tokens Gemini 1.5 (2024): 1M-2M tokens Llama 4 (2026): 256K-10M tokens 窗口在持续增长,但"能用"和"用好"是两回事。研究表明,即使支持百万token的窗口,模型在长上下文中的表现也远不如短上下文——这就是"Lost in the Middle"问题。 Lost in the Middle问题 现象 模型对上下文开头和结尾的信息处理得好,中间的信息容易被忽略: 准确率分布: 位置1-10%: ████████████████████ 85% 位置10-90%: ████████████ 55% ← 中间区域 位置90-100%: ████████████████████ 82% 缓解策略 def reorder_context(query, documents): """重排上下文,将最相关的放在开头和结尾""" # 计算每个文档与query的相关性 scored = [(doc, relevance(query, doc)) for doc in documents] scored.sort(key=lambda x: x[1], reverse=True) # 最相关的放在开头和结尾 n = len(scored) top = scored[:n//2] bottom = scored[n//2:] # 开头放最相关,结尾放次相关 reordered = [d for d, _ in top] + [d for d, _ in reversed(bottom)] return reordered 上下文管理策略 1. 滑动窗口 最简单的策略:保留最近的N条消息,丢弃更早的: class SlidingWindow: def __init__(self, max_tokens=8000): self.max_tokens = max_tokens self.messages = [] def add(self, message): self.messages.append(message) self._truncate() def _truncate(self): while self._total_tokens() > self.max_tokens: self.messages.pop(0) # 移除最早的消息 问题:完全丢失早期上下文,可能遗忘关键信息。 ...

2026-07-16 · 3 min · 629 words · 硅基 AGI 探索者

推理时计算扩展:o1范式背后的技术原理与工程实现

推理时计算:大模型能力提升的新维度 传统提升模型能力的方式是"训练时计算扩展"——更多参数、更多数据、更多训练算力。OpenAI o1开创了"推理时计算扩展"——在推理阶段投入更多计算来获得更好的输出。这就像人类的System 2思维:花更多时间思考,得到更准确的答案。 核心技术原理 隐式思维链 o1的标志性特征是"隐式思维链"——模型在生成最终回答前,先在内部进行长链推理: 传统模型: 用户问题 → 模型直接回答(快速但可能出错) o1模型: 用户问题 → 内部推理(可能数百步)→ 最终回答(慢但准确) 关键区别:o1的推理过程不是通过prompt引导的(如"让我们一步步思考"),而是通过训练内化的。模型学会了在生成答案前先"思考"。 过程奖励模型(PRM) o1的核心技术之一是过程奖励模型,它评估推理过程中每一步的质量: class ProcessRewardModel: def __init__(self, base_model): self.model = base_model # 基于强模型的PRM def score_step(self, problem, current_reasoning, new_step): """评估推理步骤的质量""" prompt = f""" 问题:{problem} 已有推理: {current_reasoning} 新步骤:{new_step} 评估这个推理步骤: 1. 正确性(1-10):这一步的推理是否正确 2. 相关性(1-10):这一步是否与解决问题相关 3. 进展性(1-10):这一步是否推进了解题 输出JSON。 """ result = self.model.generate(prompt) return parse_json(result) def score_trajectory(self, problem, full_reasoning): """评估完整推理路径""" steps = split_into_steps(full_reasoning) scores = [] for i, step in enumerate(steps): context = "\n".join(steps[:i]) score = self.score_step(problem, context, step) scores.append(score) return scores PRM与结果奖励模型(ORM)的区别: ORM只评估最终答案对不对 PRM评估每一步对不对,可以在错误发生时及时发现 PRM允许在推理过程中做搜索 推理时搜索 class InferenceTimeSearch: def __init__(self, model, prm, search_config): self.model = model self.prm = prm self.config = search_config def search(self, problem, max_depth=50, branching=4): """推理时的树搜索""" # 束搜索变体:在每个步骤保留最优的K个候选 beam = [{ "reasoning": "", "score": 0.0, "depth": 0 }] for depth in range(max_depth): candidates = [] for node in beam: if node["depth"] >= max_depth: candidates.append(node) continue # 生成多个候选步骤 steps = self.model.generate_multiple( problem, node["reasoning"], n=branching ) for step in steps: new_reasoning = node["reasoning"] + "\n" + step # PRM评估 step_score = self.prm.score_step( problem, node["reasoning"], step ) cumulative_score = ( node["score"] + step_score["correctness"] ) / (depth + 1) candidates.append({ "reasoning": new_reasoning, "score": cumulative_score, "depth": node["depth"] + 1 }) # 保留Top-K beam = sorted(candidates, key=lambda x: x["score"], reverse=True) beam = beam[:self.config["beam_width"]] # 检查是否找到答案 best = beam[0] if self._has_answer(best["reasoning"]): return self._extract_answer(best["reasoning"]) return self._extract_answer(beam[0]["reasoning"]) 训练方法推测 推理数据生成 o1需要大量高质量的推理数据来训练。这些数据可能来自: ...

2026-07-16 · 3 min · 597 words · 硅基 AGI 探索者

大模型训练数据治理:从数据采集到质量评估的全链路

数据:大模型能力的源头 “Garbage in, garbage out"在LLM时代被放大了1000倍。一个7B模型用高质量数据训练可以超越用低质量数据训练的70B模型。数据治理是决定模型能力上限的第一道关卡。 数据采集 数据源分类 class DataSourceTaxonomy: sources = { "web_crawl": { "Common Crawl": "最大的网页爬虫数据集", "Reddit": "高质量讨论内容", "Wikipedia": "结构化知识" }, "code": { "GitHub": "开源代码", "Stack Overflow": "编程问答" }, "academic": { "arXiv": "学术论文", "PubMed": "生物医学" }, "books": { "Project Gutenberg": "公版书籍", "Licensed books": "授权书籍" }, "dialogue": { "Reddit threads": "对话数据", "Forum discussions": "论坛讨论" } } 采集策略 class WebCrawler: def __init__(self, quality_filter): self.filter = quality_filter def crawl(self, url): # 1. 抓取页面 html = self._fetch(url) # 2. 正文提取(去除导航、广告等) content = self._extract_main_content(html) # 3. 质量初筛 quality_score = self.filter.assess(content) if quality_score < 0.3: return None # 质量太低,跳过 # 4. 语言检测 lang = detect_language(content) # 5. 元数据标注 return { "content": content, "url": url, "lang": lang, "quality_score": quality_score, "crawl_time": datetime.now(), "content_type": classify_content(content) # article/forum/wiki等 } 数据清洗 规则过滤 class RuleBasedFilter: def filter(self, text): # 长度过滤 if len(text) < 50 or len(text) > 100000: return False # 重复行过滤 lines = text.split('\n') unique_ratio = len(set(lines)) / len(lines) if unique_ratio < 0.5: return False # 特殊字符比例 special_ratio = sum(1 for c in text if not c.isalnum() and c not in ' \n.,!?;:\'"-()') / len(text) if special_ratio > 0.1: return False # 语言模型困惑度(过滤乱码) ppl = compute_perplexity(text) if ppl > 1000: # 困惑度过高=不像自然语言 return False return True 去重 数据去重是提升数据质量最有效的手段。研究表明,去重可以将模型性能提升3-5个点。 ...

2026-07-16 · 4 min · 644 words · 硅基 AGI 探索者

AI音乐生成技术解析:从符号生成到端到端音频合成

AI音乐:从MIDI到端到端生成的飞跃 AI音乐生成经历了三个阶段:符号生成(MIDI)、波形生成(WaveNet)、端到端歌曲生成(Suno/Udio)。2026年的AI音乐已经可以生成包含人声、伴奏、混音的完整歌曲,质量接近专业制作水准。 技术路线对比 符号生成:MIDI时代 早期的AI音乐生成在符号空间操作——生成MIDI音符序列: class MIDIGenerator: def __init__(self, model): self.model = model # Transformer模型 def generate(self, prompt, length=500, temperature=1.0): # MIDI表示为事件序列 # Note On, Note Off, Velocity, Time Shift events = [SOS_TOKEN] for _ in range(length): logits = self.model(events) next_event = sample(logits, temperature) events.append(next_event) if next_event == EOS_TOKEN: break # 转换为MIDI return events_to_midi(events) 符号生成的优势:完全可控(可以精确编辑每个音符),文件小,生成快。 劣势:不包含音色、混音、人声等音频层面的信息,听起来像电子琴。 音频生成:扩散模型 直接在波形或频谱空间生成音频: class AudioDiffusionModel: def __init__(self, unet, scheduler): self.unet = unet # U-Net去噪网络 self.scheduler = scheduler # 噪声调度器 def generate(self, conditioning, duration=10.0, sr=44100): # 计算潜在空间形状 latent_length = int(duration * sr / self.vae_hop_length) # 从纯噪声开始 latent = torch.randn(1, self.latent_dim, latent_length) # 迭代去噪 for t in reversed(range(self.scheduler.num_steps)): # 预测噪声 noise_pred = self.unet(latent, t, conditioning) # 去噪一步 latent = self.scheduler.step(latent, noise_pred, t) # 解码为音频 audio = self.vae.decode(latent) return audio 端到端歌曲生成 Suno和Udio代表了端到端歌曲生成的最高水平。它们的架构大致如下: ...

2026-07-16 · 3 min · 485 words · 硅基 AGI 探索者

AI生成内容的检测与水印:技术方案与局限性分析

AIGC检测的现实困境 随着AI生成内容质量逼近人类写作,区分AI和人类内容变得越来越难。检测技术与生成技术的军备竞赛正在加速——而检测方天然处于劣势。 统计检测方法 困惑度检测 AI生成文本的困惑度(perplexity)通常低于人类文本: class PerplexityDetector: def __init__(self, reference_model): self.model = reference_model def detect(self, text): # 计算困惑度 ppl = self._compute_perplexity(text) # 困惑度低 → 更可能是AI生成 # 困惑度高 → 更可能是人类写作 threshold = 30 # 需要根据具体场景校准 return { "ai_probability": max(0, 1 - ppl / threshold), "perplexity": ppl, "classification": "AI" if ppl < threshold else "Human" } def _compute_perplexity(self, text): tokens = self.model.tokenize(text) log_prob = self.model.compute_log_prob(tokens) return math.exp(-log_prob / len(tokens)) 局限:经过轻微改写(同义词替换、句式调整)就可以大幅提高困惑度,绕过检测。 Burstiness检测 人类写作的句子长短变化大(高burstiness),AI写作更均匀(低burstiness): def burstiness_score(text): sentences = split_sentences(text) lengths = [len(s.split()) for s in sentences] mean_len = np.mean(lengths) std_len = np.std(lengths) # 变异系数 cv = std_len / mean_len # 人类通常CV > 0.5,AI通常 < 0.3 return cv 词汇多样性分析 AI倾向于使用更有限的词汇集: def lexical_diversity(text): tokens = text.lower().split() unique = set(tokens) # Type-Token Ratio ttr = len(unique) / len(tokens) # Yule's K(更鲁棒的多样性指标) k = compute_yules_k(tokens) return {"ttr": ttr, "yules_k": k} 水印技术 文本水印:绿色token法 在生成过程中对token选择施加统计偏移,留下不可见水印: ...

2026-07-16 · 3 min · 558 words · 硅基 AGI 掜索者

Function Calling标准化演进:从OpenAI到MCP统一协议

工具调用:从实验性功能到标准基础设施 2023年OpenAI推出Function Calling时,它被视为一个便捷的实验性功能。到2026年,工具调用已成为大模型应用的标准基础设施——每个Agent都需要调用工具,而调用方式的标准化程度直接决定了开发效率。 各厂商方案对比 OpenAI Function Calling OpenAI的方案是最早的标准化工具调用格式: { "tools": [ { "type": "function", "function": { "name": "get_weather", "description": "获取指定城市的天气", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]} }, "required": ["city"] } } } ] } 模型响应包含工具调用: { "tool_calls": [ { "id": "call_abc123", "function": { "name": "get_weather", "arguments": "{\"city\": \"北京\"}" } } ] } 特点:参数以JSON字符串形式返回,需要二次解析。Parallel function calling支持一次调用多个工具。 Anthropic Tool Use Anthropic的格式与OpenAI类似但在细节上有差异: { "tools": [ { "name": "get_weather", "description": "获取指定城市的天气", "input_schema": { "type": "object", "properties": { "city": {"type": "string"} }, "required": ["city"] } } ] } 差异点: 用input_schema替代parameters 参数直接作为对象返回,不需要二次解析 工具调用结果用tool_result消息类型返回 Google Gemini Function Calling { "function_declarations": [ { "name": "get_weather", "description": "获取指定城市的天气", "parameters": { "type": "object", "properties": { "city": {"type": "string"} } } } ] } 差异点:用function_declarations替代tools,响应格式也略有不同。 ...

2026-07-16 · 3 min · 505 words · 硅基 AGI 探索者

大模型蒸馏技术全景:从 logits蒸馏到特征蒸馏

蒸馏:用小模型继承大模型的能力 知识蒸馏是模型压缩领域最优雅的技术——让小模型(学生)学习大模型(教师)的内部表示,而非简单地学习标签。一个好的蒸馏方案可以让7B模型逼近70B模型的效果。 Logits蒸馏:经典方法 原理 教师模型的logits(softmax前的输出)包含了类别间的相似度信息——“软标签"比"硬标签"信息量更大: class LogitsDistillationLoss(nn.Module): def __init__(self, temperature=2.0, alpha=0.5): self.temperature = temperature self.alpha = alpha # 蒸馏loss与CE loss的权重比 def forward(self, student_logits, teacher_logits, labels): # 蒸馏损失:KL散度 soft_teacher = F.log_softmax( teacher_logits / self.temperature, dim=-1 ) soft_student = F.log_softmax( student_logits / self.temperature, dim=-1 ) distill_loss = F.kl_div( soft_student, soft_teacher.exp(), reduction="batchmean" ) * (self.temperature ** 2) # 标准交叉熵损失 ce_loss = F.cross_entropy(student_logits, labels) return self.alpha * distill_loss + (1 - self.alpha) * ce_loss 温度参数的作用 温度 $T$ 控制软标签的"软度”: $T=1$:标准softmax,概率分布较尖锐 $T=2-5$:分布更平滑,类别间关系更明显 $T \to \infty$:均匀分布 实践中 $T=2-4$ 效果最好。温度的平方项补偿了梯度缩放——高温softmax的梯度会被 $1/T^2$ 缩小。 在线蒸馏vs离线蒸馏 离线蒸馏:先训练好教师模型,再蒸馏学生模型。简单稳定但教师的错误会被继承。 在线蒸馏:教师和学生同时训练,教师不断更新: class OnlineDistillation: def __init__(self, teacher, student, alpha=0.5): self.teacher = teacher self.student = student self.alpha = alpha def train_step(self, batch): # 教师前向(不更新梯度) with torch.no_grad(): teacher_logits = self.teacher(batch) # 学生前向 student_logits = self.student(batch) # 蒸馏损失 distill_loss = self._distill_loss(student_logits, teacher_logits) ce_loss = F.cross_entropy(student_logits, batch["labels"]) loss = self.alpha * distill_loss + (1 - self.alpha) * ce_loss loss.backward() 特征蒸馏:学习中间表示 原理 Logits蒸馏只利用了最终输出,特征蒸馏还利用了中间层的表示: ...

2026-07-16 · 3 min · 481 words · 硅基 AGI 探索者
鲁ICP备2026018361号