大语言模型基础 - 面经八股

大语言模型基础 - 面经八股
Mr.L大语言模型基础
本篇整理大模型与 NLP 面试高频基础知识,重点记录概念辨析、模型架构、训练目标、长上下文、激活函数与经典预训练模型等内容。
LLM概念
Q0:什么是大语言模型?
大模型 LLM 是一种基于 Transformer 的大规模预训练语言模型。它通过在海量文本语料上学习语言分布,获得文本理解、生成、推理和知识表达能力。当前主流 LLM 通常采用 Decoder-only 架构,通过 next token prediction 进行训练。经过指令微调和人类偏好对齐后,模型可以更好地理解用户指令,并应用在问答、对话、摘要、代码生成、RAG 和 Agent 等场景中。
Q1: 目前主流的开源模型体系有哪些?
目前主流的开源或开放权重大模型体系,我会按模型家族来理解,而不是只按单个模型名称来背。比较典型的有 LLaMA、Qwen、DeepSeek、Mistral、Gemma、Phi 等。
LLaMA 系列 是 Meta 推出的开放权重模型体系,生态非常成熟,社区微调、量化、推理框架支持都很完善,很多模型和工具链都兼容 LLaMA 架构。Meta 在 Llama 4 中也加入了原生多模态、MoE 和长上下文方向。
Qwen 系列 是阿里推出的模型家族,在中文、代码、多模态和 Agent 场景中应用很多。Qwen3 官方开放了 dense 和 MoE 多种尺寸模型,并使用 Apache 2.0 许可,适合企业和研究场景二次开发。
DeepSeek 系列 比较有代表性的是 DeepSeek-V3 和 DeepSeek-R1,特点是 MoE 架构、代码能力、数学推理和强化学习推理能力突出,尤其 R1 让开源推理模型受到很多关注。
Mistral 系列 来自 Mistral AI,特点是模型效率高、开放权重策略积极,适合私有化部署和工程落地。Mistral 也有 Mixtral、Mistral Large、Devstral 等不同方向模型。
Gemma 系列 是 Google 推出的开放模型家族,定位偏轻量、高效、本地和边缘部署。Gemma 4 进一步强调推理、Agent 工作流和端侧运行能力。
Phi 系列 是 Microsoft 的小模型体系,强调“小参数高性能”,适合端侧、低成本部署、轻量级助手等场景。
总结来说,LLaMA 更偏生态和兼容性,Qwen 更适合中文和全模态应用,DeepSeek 代表推理和 MoE 路线,Mistral 代表高效开放权重,Gemma 和 Phi 更偏轻量化和端侧部署。实际选型时,我会结合语言、推理能力、上下文长度、许可证、部署成本和工具链支持来选。
Q2: 经典预训练语言模型体系 / Transformer 预训练范式 / 大模型架构介绍
Transformer 模型一开始是用来做 seq2seq 任务的,所以它包含 Encoder 和 Decoder 两个部分;他们两者的区别主要是,Encoder 在抽取序列中某一个词的特征时能够看到整个序列中所有的信息,即上文和下文同时看到;而 Decoder 中因为有 mask 机制的存在,使得它在编码某一个词的特征时只能看到自身和它之前的文本信息。
目前经典的预训练语言模型体系主要包括 GPT、BERT、XLNet、RoBERTa、T5 等,它们代表了不同的 Transformer 建模范式。
GPT 是 Decoder-only 的自回归语言模型,训练目标是根据前文预测下一个 token,适合文本生成。现在很多主流大模型,比如 LLaMA、Qwen、DeepSeek,本质上都继承了 GPT 式的 Decoder-only 生成范式。
BERT 是 Encoder-only 的双向语言模型,使用 Masked Language Modeling 训练,擅长文本理解、分类、检索、序列标注等任务,但它本身不擅长长文本自回归生成。
RoBERTa 可以理解为 BERT 的增强版本,去掉 NSP、使用更大数据和更强训练策略,提升了理解类任务效果。
XLNet 试图结合自回归和双向建模的优点,通过排列语言建模来建模更丰富的上下文依赖。
T5 是 Encoder-Decoder 架构,把所有 NLP 任务统一成 text-to-text 形式,比如翻译、摘要、问答、分类都转成文本输入到文本输出。
以 UNILM9 为代表的PrefixLM(相比于GPT只改了attention mask,前缀部分是双向,后面要生成的部分是单向的causal mask%)
所以这类代表了 Transformer 预训练的发展脉络:GPT 代表生成式 Decoder-only,BERT/RoBERTa 代表理解式 Encoder-only,T5 代表 Encoder-Decoder 的统一文本到文本框架。
Q3: prefix LM 、 causal LM 、Encoder-Decoder 区别是什么?
Prefix Decoder、Causal Decoder 和 Encoder-Decoder 三者的核心区别,其实在于 Attention Mask 怎么设计,以及输入 token 之间能不能互相看见 。
Causal LM 是因果语言模型,最典型的 GPT / LLaMA 结构,也叫 Decoder-only LM,目前流行地大多数模型都是这种结构。它使用严格的因果 mask,第 t 个 token 只能看到自己和它之前的 token,不能看到未来 token。所以它天然适合自回归生成,本质目标就是根据历史的 token 预测下一个 token,也就是在 Attention Mask 这里做的变化。
Prefix LM兼具一点 Encoder-Decoder 的味道,在标准的Encoder-Decoder模型中,Encoder和Decoder各自使用一个独立的Transformer;而在Prefix LM 通常不是两个独立模块,而是在同一个 Transformer 里通过 mask 实现“前缀双向、后缀单向”
与标准Encoder-Decoder类似,Prefix LM 输入分成两段:前缀部分和生成部分,前缀部分采用Auto Encoding (AE-自编码)模式,即前缀序列中任意两个token都相互可见,而生成部分采用Auto Regressive (AR-自回归)模式,即待生成的token可以看到Encoder侧所有token(包括上下文)和Decoder侧已经生成的token,但不能看未来尚未产生的token。
Encoder-Decoder 则是标准的 seq2seq 结构,比如 T5、BART、原始 Transformer。Encoder 负责理解输入,通常是双向 attention;Decoder 负责生成输出,使用 causal attention,并通过 cross-attention 去看 Encoder 的表示。它和 Prefix LM 最大区别是:Encoder 和 Decoder 是两个相对独立的模块,而 Prefix LM 往往是在一个 Transformer 里用 mask 模拟这种效果。
总的来说,Causal LM 是“从左到右一路生成”;Prefix LM 是“先双向理解前缀,再从左到右生成后续”;Encoder-Decoder 是“Encoder 双向理解输入,Decoder 自回归生成输出,并通过 cross-attention 连接两者”。
Q4:大模型LLM的训练目标
大模型 LLM 的训练目标,本质上是让模型学会 根据上下文预测下一个 token。
在预训练阶段,模型会使用大规模文本语料进行训练。对于现在主流的 Decoder-only 模型,比如 GPT、LLaMA、Qwen、DeepSeek,它们通常采用 自回归语言建模目标。也就是说,模型每次只能看到当前位置之前的 token,然后预测下一个 token 是什么。
从优化角度看,这个目标可以理解为 最大似然估计:希望模型对真实语料中出现的文本序列赋予更高概率。训练时,模型会输出一个词表上的概率分布,然后和真实的下一个 token 进行比较,通过交叉熵损失来更新参数。模型预测得越接近真实 token,损失越小。
如果是 BERT 这类 Encoder-only 模型,训练目标会有所不同,常见的是 Masked Language Modeling,也就是随机遮住输入中的一部分 token,让模型根据双向上下文预测被遮住的内容。
如果是 T5、BART 这类 Encoder-Decoder 模型,则通常是让模型根据输入序列生成目标序列,比如去噪重建、翻译、摘要等,本质上也是最大化目标文本的生成概率。
Q5:涌现能力是什么原因?
大模型的 涌现能力,指的是模型规模、训练数据和计算量增长到一定程度后,某些能力不是线性提升,而是看起来突然出现,比如复杂推理、少样本学习、指令理解、工具使用、多步数学推理等。
我理解涌现能力的原因主要有几类。
第一,模型规模扩大后,表达能力和组合泛化能力增强了。小模型可能只能记住局部模式,而大模型有足够参数和层数去表示更复杂的语言结构、知识关系和推理链条。当模型容量达到某个临界点后,一些复杂能力才会表现出来。
第二,复杂任务往往由多个子能力组成。比如数学应用题可能同时需要语义理解、数字识别、公式转换、多步推理和答案生成。每个子能力可能是随着模型规模平滑提升的,但最终任务要求所有环节都正确,所以整体表现会呈现出“突然变好”的涌现现象。
第三,评价指标可能放大了这种突然性。很多 benchmark 使用的是严格准确率,例如答案完全正确才算对。模型实际能力可能一直在缓慢提升,但在低于某个阈值时都被判错;一旦超过阈值,指标上就会显示为突然跃升。所以一部分涌现现象可能来自评价方式不够平滑。
第四,数据规模和相关样本密度也很重要。当模型变大时,通常训练数据也会变多。某些任务相关的数据在小规模训练中可能很少,模型学不到稳定规律;当数据和模型规模达到一定程度后,相关模式被充分覆盖,模型就可能表现出类似“顿悟”的现象,也就是 grokking。
第五,上下文学习能力增强。大模型在预训练中见过大量任务格式、问答格式、代码格式和推理格式,因此在推理阶段可以根据 prompt 中的少量示例快速适配新任务。这也是 few-shot、CoT 推理等能力看起来突然出现的重要原因。
所以涌现能力不是凭空产生的,而是模型容量、训练数据、计算量、任务复杂度和评价方式共同作用的结果,它并不等于模型真正理解或完全可靠,它只是说明模型在某些复杂任务上的表现发生了质变,实际应用中仍然需要评估、约束和验证。
Q6: 为什么现在的大模型大部分是Decoder only结构
现在主流生成式大模型大多采用 Decoder-only 结构,核心原因是它更适合大规模自监督预训练、开放式生成和高效推理。
第一,训练目标简单统一。Decoder-only 模型采用自回归语言建模,也就是根据前文预测下一个 token。这个目标可以直接利用互联网上的大规模无标注文本,不需要构造复杂的输入输出对。只要有连续文本,就可以训练模型,所以非常适合 scaling law 下的大规模预训练。
第二,生成任务天然匹配。大模型现在最主要的使用方式是对话、续写、代码生成、Agent、工具调用等,本质都是“给定上下文,生成后续内容”。Decoder-only 从结构上就是从左到右生成,因此和这些任务高度一致。
第三,zero-shot / few-shot 能力更容易被激发。Decoder-only 模型可以把 prompt、示例、问题、回答都统一拼成一个序列,然后通过 next token prediction 完成任务。这种形式非常适合上下文学习,也就是 in-context learning,因此在 zero-shot 和 few-shot 场景中表现很好。
第四,推理效率更高,KV Cache 更友好。Decoder-only 在生成时,每个新 token 只依赖之前的 token,可以持续复用历史 token 的 KV Cache。多轮对话时,也可以把历史上下文缓存起来继续生成。相比之下,Encoder-Decoder 需要先编码输入,再通过 cross-attention 解码,工程上更复杂;Prefix LM 因为前缀部分有双向 attention,在缓存和增量生成上也不如纯 causal decoder 简洁。
第五,架构简单,工程生态成熟。Decoder-only 只有一套 Transformer block,没有单独的 Encoder、Decoder 和 cross-attention,训练、微调、量化、并行、部署都更统一。现在很多推理框架、LoRA 微调工具、量化方案和服务化系统也都是围绕 Decoder-only 优化的。
至于 Encoder 或 Encoder-Decoder,并不是没价值。BERT 这类 Encoder-only 仍然适合理解、分类、检索、embedding 等任务;T5、BART 这类 Encoder-Decoder 也适合翻译、摘要等明确输入输出转换任务。但对于当前主流的通用生成式大模型来说,Decoder-only 之所以成为主流,是因为它用最简单统一的 next token prediction 目标,吃掉最大规模的无标注文本数据,同时又天然适合生成、对话和 KV Cache 推理,因此在大模型时代最容易扩展、最容易部署,也最容易形成生态。
Q7:LLMs复读机问题
什么是 LLMs 复读机问题?
LLM 的“复读机问题”指的是模型在生成时 过度重复输入、重复自己已经生成的内容,或者直接照搬训练语料中的高频表达,导致回答缺乏信息增量和多样性。
它主要有几种表现:
第一种是 复制输入。比如用户问了一个很长的问题,模型没有真正回答,而是把问题重新复述一遍。
第二种是 生成内容循环。比如模型反复输出相同句式、相同短语,甚至陷入无限重复。
第三种是 模板化回答。模型总是使用训练数据里高频出现的固定表达,看起来流畅,但内容空泛。
为什么会出现 LLMs 复读机问题?
出现这个问题的原因主要有这几类。
首先是 训练数据影响。预训练语料里本身就有大量重复内容、模板文本、网页噪声、问答套话,模型会学习到这些高频模式。如果数据去重和清洗不足,复读现象会更明显。
其次是 训练目标导致模型偏向高概率 token。大模型通常用 next token prediction 训练,本质上是在学习“最可能出现的下一个 token”。如果某些表达在语料中频率很高,模型生成时就容易选择这些安全、高概率、但信息量不高的内容。
第三是 解码策略的问题。如果生成时使用贪心搜索或 beam search,模型会倾向选择概率最高的路径,这可能导致输出保守、重复、模板化。尤其在长文本生成中,重复会不断累积。
第四是 上下文建模和注意力机制的影响。模型在生成时可能过度关注输入中的某些片段,导致把输入内容复制出来;或者在长序列生成中,对已经生成内容的约束不足,从而重复前文。
第五是 对齐训练也可能加重模板化。RLHF 或指令微调会让模型更安全、更符合人类偏好,但如果偏好数据风格单一,模型可能学到固定回答套路,表现得像“客服话术”。
如何缓解 LLMs 复读机问题?
缓解方法可以从数据、训练和推理三方面考虑。
在 数据层面,要做高质量数据清洗和去重,减少重复网页、模板文本、低质量问答语料,同时提高数据来源和表达风格的多样性。
在 训练层面,可以加入更丰富的指令数据和偏好数据,让模型学会针对问题生成有信息量的回答,而不是简单复述输入。对于特定任务,也可以通过监督微调让模型学习更明确的回答格式。
在 推理层面,可以调整解码策略,比如使用 top-k、top-p 采样、合适的 temperature、repetition penalty、presence penalty 等,降低重复 token 或重复短语继续出现的概率。对于长文本生成,也可以加入重复检测和后处理机制。
实际应用中,还可以通过 prompt 约束 明确告诉模型不要复述问题、避免重复、直接给结论;在 RAG 场景下,也可以要求模型基于检索内容做总结和归纳,而不是大段复制原文。
总的来说,LLM 的复读机问题,本质上是数据重复、高概率建模目标、解码策略和对齐数据风格共同作用的结果。解决思路是训练前减少重复数据,训练中提升回答多样性和信息密度,推理时通过采样策略、重复惩罚和后处理来控制重复输出。
Q8:LLMs输入句子长度理论上可以无限长吗?
LLM 的输入长度 理论上不是无限的,工程上也一定有限制。它能处理多长输入,主要受 位置编码、注意力复杂度、训练时上下文长度和显存/算力 共同限制。
首先,Transformer 需要位置编码来区分 token 的顺序。无论是绝对位置编码、RoPE,还是 ALiBi,本质上都会对模型能稳定处理的上下文长度产生约束。如果输入长度超过模型训练时支持的上下文窗口,模型即使能勉强运行,效果也可能明显下降。
其次,标准 Self-Attention 的计算复杂度和显存开销通常随序列长度平方增长。也就是说,输入越长,attention 计算和 KV Cache 占用越大,推理速度会变慢,显存压力也会增大。所以长上下文不是简单“把输入塞进去”就可以。
第三,模型的上下文长度和训练过程强相关。比如一个模型主要在 8K 或 32K 上下文上训练,那么它对更长上下文的理解、检索和推理能力不一定可靠。很多模型虽然称支持很长上下文,但在超长输入里仍然可能出现“看不全”“找不到关键信息”“中间内容丢失”等问题。
第四,从生成角度看,输入越长不代表效果越好。长上下文会带来噪声干扰,模型可能更难抓住关键内容,也可能出现注意力稀释、信息遗忘、推理链条不稳定等问题。
虽然现在有长上下文模型、稀疏注意力、RoPE scaling、滑动窗口注意力、RAG 等方法可以扩展可处理长度,但模型真正有效利用长上下文的能力仍然有限。实际工程中通常不会盲目塞入超长文本,而是结合检索、摘要、分块和上下文压缩来控制输入长度。
Q9:什么情况用Bert模型,什么情况用LLaMA、ChatGLM类大模型,怎么选?
BERT、LLaMA、ChatGLM 这类模型的选择,核心要看任务是 理解类任务 还是 生成类任务。
如果任务是文本分类、情感分析、命名实体识别、语义匹配、文本相似度、检索排序这类 NLU 理解任务,我会优先考虑 BERT 或 RoBERTa 这类 Encoder-only 模型。因为 BERT 是双向注意力结构,能够同时看左右上下文,适合做句子表示和 token 表示。它的推理成本也比大语言模型低,部署更轻量,适合高并发、低延迟的分类和抽取任务。
如果任务是问答、对话、摘要、代码生成、文案生成、Agent、复杂推理这类 生成任务,我会选择 LLaMA、Qwen、ChatGLM、DeepSeek 这类 Decoder-only 或 Prefix Decoder 大模型。这类模型的优势是自回归生成能力强,可以根据上下文持续生成内容,也更适合 zero-shot、few-shot 和指令跟随场景。
具体到模型:
BERT 更适合做理解和表征,比如分类、NER、相似度计算、向量召回、rerank、信息抽取。它不擅长自由生成。
LLaMA 类模型 更适合通用生成、英文场景、推理、代码和下游微调。它的生态成熟,部署、量化、LoRA 微调工具都比较丰富。
ChatGLM 类模型 更偏中文对话和中英双语场景,适合智能客服、企业知识库问答、中文聊天助手等任务。
不过现在实际选型时,我不会只看模型名字,还会看几个因素:
第一,看 任务类型:理解任务选 BERT 类,生成任务选 LLM。
第二,看 语言和领域:中文场景可以优先考虑 Qwen、ChatGLM、Baichuan 等;英文和通用生态可以考虑 LLaMA、Mistral;代码和推理可以关注 DeepSeek、Qwen-Coder 等。
第三,看 资源成本:BERT 小、快、便宜;LLM 能力强但显存、延迟和推理成本更高。如果只是分类任务,用大模型可能性价比不高。
第四,看 可解释性和稳定性:BERT 做分类、抽取时输出稳定;LLM 生成能力强,但可能幻觉,需要 prompt、RAG、规则或评估体系约束。
第五,看 是否需要指令跟随和多轮上下文:如果需要自然语言交互、复杂指令、上下文推理,就更适合 LLM。
Q10:各个专业领域是否需要各自的大模型来服务?
不一定每个专业领域都需要从头训练一个独立的大模型,更现实的做法是:通用大模型作为底座,再结合领域数据、RAG、微调和工具系统来做领域增强。
专业领域确实有特殊需求。比如医疗、法律、金融、科研、工业等领域都有大量专有术语、业务规则、文档格式和推理逻辑。通用大模型虽然语言能力强,但可能缺少最新、细粒度、强专业性的知识,也容易在高风险场景产生幻觉。因此,领域应用通常需要做专门适配。但这个“专门适配”不一定等于训练一个全新的领域大模型。因为从头训练成本非常高,需要大量高质量领域语料、算力、训练经验和安全评估。大多数情况更适合采用这几种方式:
第一,RAG 检索增强。如果领域知识更新快、文档多,比如企业知识库、法规、药品说明书、论文、产品手册,可以把知识放在向量库或搜索系统里,让模型回答前先检索依据。这样比直接把知识训练进模型更灵活,也更容易更新和追溯来源。
第二,领域指令微调或 LoRA 微调。如果希望模型学会领域内的回答风格、任务格式、术语表达、结构化输出,可以用领域问答、标注样本、专家数据做 SFT 或 LoRA 微调。它主要增强“怎么回答”和“怎么执行任务”。
第三,继续预训练。如果领域语言和通用语料差异很大,比如医学文献、法律条文、代码、蛋白质序列、金融研报,可以在通用底座上做领域继续预训练,让模型更熟悉领域分布。但成本比普通微调更高。
第四,工具调用和规则系统。对于需要精确计算、数据库查询、合规校验、实时数据的场景,不能只依赖模型本身,应该让模型调用搜索、数据库、计算器、业务系统或规则引擎。
所以我的理解是:各个专业领域通常需要领域增强,但不一定需要各自从零训练一个大模型。更常见、更经济的路线是选择一个通用能力强的基座模型,然后通过 RAG 补知识、微调补风格和任务能力、工具调用补精确性,最后结合评测和安全机制做落地。
如果是医疗、金融、法律这类高风险领域,还要特别强调:模型输出不能直接作为最终决策,需要有可追溯来源、置信度评估、人工审核和合规控制。
Q11:如何让大模型处理更长的文本?
首先,让大模型处理更长文本,不能简单理解为“把文本全部塞进上下文”。实际工程里一般从 模型能力、输入组织、检索增强和上下文压缩 几个方面处理。
第一,直接使用长上下文模型。现在很多模型本身支持 32K、128K 甚至更长上下文。如果业务确实需要读取长合同、论文、代码仓库或会议记录,可以优先选择长上下文能力更好的模型。但要注意,支持长上下文不等于模型能稳定利用全部内容,仍然需要做评测。
第二,分块处理。把长文档切成多个 chunk,每个 chunk 控制在模型可处理范围内。切分时通常会保留一定 overlap,避免上下文断裂。对于文档类任务,可以按标题、段落、章节、语义边界切分,而不是机械按 token 数切分。
第三,RAG 检索增强。如果用户的问题只和长文本中的一小部分相关,就没有必要把全文放进 prompt。可以先对文档分块建索引,提问时检索最相关的片段,再把这些片段交给大模型回答。这样既节省上下文,又能降低噪声干扰。
第四,摘要和上下文压缩。对于会议纪要、长对话、长报告,可以先做分段摘要,再对摘要进行合并,形成层次化摘要。多轮对话中也可以把历史对话压缩成 memory,只保留关键事实、用户偏好和未完成事项。
第五,滑动窗口或分段推理。对于需要顺序处理的超长文本,可以用滑动窗口逐段处理,每次带上一部分前文摘要或重叠内容。比如长文档审阅、代码分析、日志分析,都可以逐段提取信息,最后再汇总。
第六,改进模型结构或位置编码。从模型层面,可以使用 RoPE scaling、ALiBi、稀疏注意力、滑动窗口注意力、线性注意力、FlashAttention 等方法,降低长序列计算和显存压力。不过这些更多是模型训练和推理框架层面的优化。
第七,外部工具和结构化存储。对于表格、数据库、代码仓库、知识库,不一定要让模型记住全部内容。可以让模型调用搜索、数据库查询、代码检索、SQL、图数据库等工具,把长文本问题转成检索或查询问题。
总的来说,处理长文本通常有两条路线:一是提升模型本身的长上下文能力,比如长上下文训练、位置编码扩展和高效注意力;二是工程上减少无效上下文,比如分块、RAG、摘要压缩、滑动窗口和工具调用。实际落地时,RAG 加合理分块通常比盲目扩大上下文更稳定、更省成本。
Q12:175B、60B、540B 指什么?大模型有什么优缺点?
1. 175B、60B、540B 指什么?
这些数字指的是大模型的 参数量。比如:175B 表示 175 billion parameters,也就是 1750 亿参数;60B 表示 600 亿参数;540B 表示 5400 亿参数。参数可以理解为模型在训练过程中学到的“权重”。参数量越大,模型容量通常越强,能学习和表达更复杂的语言规律、知识关系和推理模式。
但参数量不是唯一标准。模型效果还和训练数据质量、训练 token 数、模型结构、对齐方式、上下文长度、推理优化等因素有关。不是参数越大就一定越好。
2. 大模型有什么优点?
大模型的主要优点是 通用能力强。它可以完成很多任务,比如问答、摘要、翻译、代码生成、信息抽取、文本分类、对话、推理等,不需要为每个任务单独训练一个模型。
第二是 生成能力强。LLM 可以生成流畅、自然、结构化的文本,也可以根据上下文续写、改写、总结和创作。
第三是 少样本和零样本能力好。通过 prompt 给出任务描述,甚至不给训练样本,模型也能完成很多任务;给几个示例后,效果通常会更好。
第四是 可迁移性强。一个通用基座模型可以通过指令微调、LoRA、RAG、工具调用等方式适配不同业务场景。
第五是 交互能力好。经过指令微调和对齐后,大模型可以理解自然语言指令,适合做聊天机器人、智能客服、知识库问答、Agent 等应用。
3. 大模型有什么缺点?
第一是 成本高。训练和推理都需要大量算力、显存和存储资源,部署成本比传统模型高很多。
第二是 容易产生幻觉。模型可能生成看起来很合理但实际上错误的内容,尤其是在专业知识、实时信息、数字计算和事实问答场景中。
第三是 可解释性差。模型内部参数非常复杂,很难清楚解释它为什么给出某个答案。
第四是 安全和合规风险。模型可能输出偏见、隐私泄露、不当内容,或者被 prompt injection 攻击。
第五是 对长文本和复杂推理仍然有限。虽然模型上下文越来越长,但真正稳定理解长文档、跨段落推理、精确计算,仍然有挑战。
第六是 结果不够稳定。同一个问题在不同 prompt、不同采样参数下可能得到不同答案,需要评估、约束和后处理。
激活函数
激活函数的作用
激活函数最核心的作用是 给神经网络引入非线性表达能力。如果没有激活函数,多层神经网络本质上仍然只是多个线性变换的组合,最后等价于一个线性模型,表达能力非常有限。加入激活函数后,模型才能拟合复杂的非线性关系。
当然,不同激活函数有不同特点:Sigmoid 会把输出压到 0 到 1 之间,适合表示概率或门控值,比如 LSTM、GRU 里的门结构;tanh 会把输出压到 -1 到 1 之间,比 sigmoid 多了负值表达,也常用于循环神经网络中的状态更新;ReLU 的形式更简单,大于 0 的部分梯度恒定,小于 0 的部分为 0,因此计算效率高,也更适合深层网络训练。它能缓解 sigmoid、tanh 在饱和区导致的梯度消失问题。
不过 ReLU 也有问题,比如负半轴梯度为 0,可能出现“神经元死亡”;输出没有上界,可能导致数值过大。所以也有 Leaky ReLU、GELU、Swish 等改进版本。现在 Transformer 里常见的是 GELU、SwiGLU 这类激活函数。
梯度消失和梯度爆炸
梯度消失和梯度爆炸主要发生在深层网络或长序列反向传播中。反向传播时,梯度会按照链式法则一层层往前传。如果连续相乘的梯度因子普遍小于 1,越往前梯度越小,就会出现梯度消失,导致前面层几乎学不到东西。如果连续相乘的梯度因子普遍大于 1,梯度会被不断放大,就会出现梯度爆炸,导致训练不稳定,loss 震荡甚至变成 NaN。
梯度消失的原因主要有两个:
第一是激活函数饱和。比如 sigmoid 和 tanh 在输入很大或很小时,导数会接近 0,反向传播时梯度就容易变小。
第二是深层网络中的矩阵连乘。即使换了激活函数,层数很深时,梯度在不断传播过程中仍然可能变小或变大。
解决方法主要有几类:
对于激活函数导致的梯度消失,可以使用 ReLU、Leaky ReLU、GELU 等非饱和激活函数来缓解。
对于梯度爆炸,可以使用 梯度裁剪,把梯度范数限制在一定范围内,避免参数更新过大。
对于深层网络中的梯度传播问题,可以使用 残差连接。残差连接给梯度提供了更短的传播路径,使深层网络更容易训练。
还可以使用 归一化方法,比如 BatchNorm、LayerNorm、RMSNorm,稳定每层输入分布,减少训练过程中的数值不稳定。此外,合理的参数初始化、学习率设置、优化器选择也很重要。
Sigmoid
Sigmoid函数公式:
导数公式:

优点:
- 平滑,易于求导;
- 取值范围是
(0, 1),可直接用于求概率值的问题或者分类问题;比如 LSTM 中的门,二分类或者多标签分类问题;
缺点:
- 计算量大,包含幂运算,以及除法运算;
- sigmoid 导数的取值范围是
[0, 0.25],最大值都是小于 1 的,反向传播时又是"链式传导",经过几次相乘之后很容易就会出现梯度消失的问题; - sigmoid 的输出的均值不是0(即zero-centered),这会导致当前层接收到上一层的非0均值的信号作为输入,随着网络的加深,会改变数据的原始分布;
Tanh
Tanh的函数公式为:
从上述公式的第二行可以看出,tanh 函数可以由 sigmoid 函数经过平移和拉伸得到。tanh 函数的取值范围是
(-1, 1)。
导数公式

tanh 函数可以理解为是基于 sigmoid 函数的一种改进的激活函数,所以对于 sigmoid 函数的缺点,它能够解决一部分。但是 tanh 函数依然有着不少的缺点。tanh 函数的特点如下:
- 它的输出范围是
(-1, 1),解决了 sigmoid 函数输出的均值不是0(zero-centered)的问题; - tanh 的导数取值范围是
(0, 1),可以看出其在反向传播的"链式传导"过程中的梯度消失问题要比 sigmoid 函数要好一些,但是其依然存在着梯度消失问题; - 幂运算依然存在,计算量比较大;
ReLU系列
ReLU
ReLU 全称是 Rectified Linear Unit,修正线性单元。它的形式很简单:当输入大于 0 时,输出等于输入本身;当输入小于等于 0 时,输出为 0。

相比 sigmoid 和 tanh,ReLU 的优点主要有几个。
第一,可以缓解梯度消失问题。当输入大于 0 时,ReLU 的导数恒为 1,梯度在反向传播时不容易像 sigmoid、tanh 那样因为进入饱和区而变得非常小,所以更适合深层网络训练。
第二,计算效率高。ReLU 不涉及指数运算,只需要做一次阈值判断,计算成本比 sigmoid 和 tanh 更低。
第三,收敛速度通常更快。由于正区间梯度稳定,优化时参数更新更有效,所以实际训练中 ReLU 往往比 sigmoid、tanh 收敛更快。
第四,可以带来一定稀疏性。当输入小于 0 时,ReLU 输出为 0,这会让一部分神经元不激活,从而产生稀疏表示。稀疏表示有助于模型提取关键特征,减少冗余表达。
但 ReLU 也有明显缺点。
第一,存在 Dead ReLU 问题。当某个神经元的输入长期落在负区间时,它的输出一直为 0,梯度也一直为 0,这个神经元的参数就几乎不再更新,相当于“坏死”。这种情况通常和学习率过大、初始化不合理有关。
第二,输出不是零均值。ReLU 的输出非负,因此激活值整体偏正,可能影响优化过程的稳定性。后续像 ELU、SELU 等激活函数在一定程度上改善了这个问题。
第三,正区间没有上界。ReLU 的输出可以无限增大,如果参数更新不稳定,可能带来数值过大甚至梯度爆炸的问题。实际训练中可以通过合理初始化、归一化、学习率控制和梯度裁剪来缓解。
总的来说,ReLU 的优势是形式简单、计算快、正区间梯度稳定,能够缓解 sigmoid 和 tanh 的梯度消失问题,并带来稀疏激活,所以非常适合深层神经网络。它的主要问题是负区间梯度为 0,可能导致 Dead ReLU;同时输出非零均值、正区间无上界,可能带来优化和数值稳定性问题。实际中可以用 Leaky ReLU、PReLU、ELU、GELU 等变体来改进。
Leaky ReLU
为了解决 ReLU 的 Dead ReLU 问题,提出了 渗漏整流线性单元(Leaky ReLU),该方法是 ReLU 的一个变体。Leaky ReLU 的做法是:在正区间保持和 ReLU 一样,输入大于 0 时直接输出输入本身;在负区间不再直接置 0,而是保留一个很小的斜率,比如 0.01。也就是说,即使输入小于 0,神经元仍然有一个很小的输出和梯度。其公式如下:
这样做的好处是:
第一,缓解 Dead ReLU 问题。负区间仍然有梯度,神经元即使处于负激活状态,也还有机会更新参数。
第二,保留了 ReLU 的主要优点。它仍然计算简单,正区间梯度稳定,适合深层网络训练。
第三,减少信息完全丢失。ReLU 会把所有负值直接截断成 0,而 Leaky ReLU 会保留一部分负区间信息。
但 Leaky ReLU 也有缺点:
它的负区间斜率通常是人为设定的,比如 0.01,这个值不一定适合所有任务和数据。如果斜率太小,缓解 Dead ReLU 的效果有限;如果斜率太大,又可能影响非线性表达。因此实际效果有时不够稳定。
后来也有一些改进版本,比如 PReLU,把负区间斜率变成可学习参数;还有 ELU、GELU、Swish 等激活函数,在不同场景下可能表现更好。

PReLU, RReLU
PReLU 全称是 Parametric ReLU。RReLU 全称是 Randomized Leaky ReLU。两者都是 ReLU 的变体,主要目的是缓解 ReLU 的 Dead ReLU 问题。
普通 ReLU 在输入小于 0 时,输出和梯度都为 0,可能导致部分神经元长期无法更新。Leaky ReLU 的改进方式是在负区间保留一个很小的固定斜率,比如 0.01,让负区间也能有梯度传播。
但是 Leaky ReLU 的问题是:这个负区间斜率是人为设定的,不一定适合所有数据和任务。所以后面提出了 PReLU 和 RReLU。
PReLU 的思想是把负区间斜率变成一个 可学习参数。也就是说,当输入大于 0 时,和 ReLU 一样直接输出输入;当输入小于 0 时,不是乘固定的 0.01,而是乘一个可以通过训练学习出来的参数 α。它的优点是更加灵活,模型可以根据数据自动学习负区间应该保留多少信息。但缺点是会增加少量参数,如果数据量较小,也可能带来过拟合风险。
RReLU 的思想是把负区间斜率变成一个 随机值。训练时,α 会从一个给定区间中随机采样,比如在某个较小范围内随机取值;推理时,通常使用这个随机区间的期望值作为固定斜率。它的好处是带有一定正则化效果,类似给模型加噪声,可以减少过拟合。但它的随机性也可能导致训练效果不够稳定,因此实际使用没有 ReLU、Leaky ReLU、GELU 那么普遍。
PReLU 和 RReLU 的图像如下所示:

ELU(指数线性单元)
ELU,全称是 Exponential Linear Unit,也是 ReLU 的一种改进激活函数。它的设计目标主要是缓解 ReLU 的一些问题,比如输出非零均值、Dead ReLU,以及负半轴信息完全丢失。
ELU 在正区间和 ReLU 一样,输入大于 0 时直接输出输入本身,因此正区间不饱和,梯度比较稳定,有利于缓解深层网络中的梯度消失问题。在负区间,ELU 不像 ReLU 那样直接输出 0,而是使用指数形式,让输出变成一个负值,并且逐渐趋近于 -α。这样做有几个好处。
第一,输出均值更接近 0。ReLU 的输出始终非负,激活均值会偏正;ELU 在负区间有负值,可以让整体激活分布更接近零均值,从而让优化过程更稳定,收敛速度通常更快。
第二,缓解 Dead ReLU 问题。ELU 在负区间不是直接截断为 0,而是保留一定的负值输出和梯度,因此神经元不容易完全失活。
第三,对噪声更鲁棒。ELU 的负区间具有软饱和特性,当输入很小时,输出会逐渐趋近于一个稳定的负值,这能减少异常负输入对模型的影响。
不过 ELU 也有缺点。它在负区间需要计算指数函数 exp,计算成本比 ReLU、Leaky ReLU 更高,因此在追求极致推理效率的场景下不一定是首选。

GeLU
出自2016年的论文《Gaussian Error Linear Units (GELUs)》
6.1 介绍
ReLU 激活函数包含两种映射:一个是恒等映射(identity mapping),当输入值大于零时就是恒等映射;一个是置零映射(zero mapping),当输入值小于等于零时就是置零映射。
参考 ReLU 激活函数,设计另外一个包含恒等映射和置零映射的激活函数:
- 在输入
x满足某些条件时,为恒等映射; - 在输入
x满足另外一些条件时,为置零映射; - 在输入
x是一个较大的正值时,更希望为恒等映射;在输入x为一个较小的负值时,更希望是一个置零映射;
下面的图7和图8是标准正态分布的概率密度函数和累积分布函数的图像。接下来根据下图8中的累积分布函数设计一个新的函数。
符号定义:输入值用 表示,表示下图8中的正态分布的累积分布函数,表示新设计的函数。
设计的新函数:给定输入值,函数的输出值以的概率采用恒等映射,以的概率采用置零映射。也就是下述公式:
然后看一下,新设计的这个公式是否满足上述的激活函数性质。前两条是肯定满足的,主要看一下第3条性质:
- 当输入 是一个较大的正值时,从图8中可以看出的函数图像逐渐趋近于1,由于函数的输出值以的概率采用恒等映射,所以有接近于1的概率采用恒等映射;
- 当输入 是一个较小的负值时,趋近于0,由于函数以的概率采用置零映射,所以有接近于1的概率采用置零映射;
可以看出新设计的这个函数是满足上述激活函数的性质的。
为了更直观描述设计该函数时的直觉,上述都是采用图8进行描述的,上述公式如果使用图7中的概率密度函数就是如下形式:
其中表示实际的输入值,表示随机变量。到此就得到了GELU的常见形式,公式如下所示:

这里描述的设计 GELU 函数的直觉思路是非常简化的版本,只是为了易于理解。实际在设计这个函数时还需要考虑更多的因素,比如该函数的那几条性质和 ReLU 很像,已经有了 ReLU 为什么还要设计这个函数,这个函数在理论上是否能够解决 ReLU 的存在的 Dead ReLU 等问题;
6.2 函数及导数
GeLU 公式为:
使用该函数作为激活函数时,需要求解其导数。对其求导可得:
其中是随机变量,是图7中的标准正态分布概率密度函数中,随机变量取值为时的值。
GELU 函数及其导数的图像如下所示。可以看出其函数图像和 ReLU 非常相似,其导数图像也和 ReLU 的导数图像非常相似,不过该图像是连续的。

GELU 激活函数的优缺点:
- 从其函数图像可以看出,在负值区域,不再全为0,这解决了 Dead ReLU 问题;
- GELU 函数是处处连续、光滑可导的;
6.3 精确计算
对于 GeLU 的加速计算有两种方法。
第一种方法是精确求解。有一个函数为 Gauss Error function (gef),由于使用率非常高所以在常见的库(比如TensorFlow、PyTorch)中都有针对该函数的优化,该函数的公式如下。
所以如果能够先求解出,再由该函数求解出,那么可以加快计算。下面省略具体的推导过程,直接给出计算公式:
另一种方法是不精确求解,而是求解其近似值。为了加速计算,还可以使用近似计算的方式。GELU 的近似公式如下所示:
7.Swish
出自2017年的论文《Searching for Activation Functions》
该激活函数的公式为:
Swish导数:
该激活函数的图像为:

Swish可以理解为:输入 x 先经过 sigmoid 得到一个 0 到 1 之间的门控系数,然后再和原始输入相乘。所以 Swish 有一点类似“自门控”的机制。
相比 ReLU,Swish 有几个特点。
第一,正半轴没有上界。当 x 很大时,sigmoid(x) 接近 1,所以 Swish(x) 接近 x,这一点和 ReLU 类似。因此它在正区间不容易出现饱和问题,有利于梯度传播。
第二,负半轴有下界,并且不是直接截断为 0。当 x 很小时,sigmoid(x) 接近 0,所以输出会逐渐接近 0,而不是像 ReLU 一样直接变成 0。这使得 Swish 在负区间仍然保留了一些信息和梯度,可以缓解 Dead ReLU 问题。
第三,Swish 是平滑连续、处处可导的。ReLU 在 0 点不可导,而 Swish 整体是平滑的,这通常让优化过程更稳定。
第四,Swish 是非单调函数。它在负区间会先下降再上升,这种非单调性可能增强模型的表达能力。实验上,Swish 在一些深层网络中表现优于 ReLU。
第五,有一定正则化效果。在负半轴,较大的负输入会被压到接近 0,相当于抑制一部分不重要的负响应,但又不像 ReLU 那样完全硬截断,因此表达更柔和。
不过 Swish 也有缺点:它需要计算 sigmoid,涉及指数运算,计算成本比 ReLU 更高。因此在一些追求极致速度的场景,ReLU 或其简单变体仍然更常用。
8.GLU
PaLM 和 LLaMA 中都使用 SwiGLU 替换了 FFN
出自2017年的论文 Language Modeling with Gated Convolutional Networks
GLU 全称为 Gated Linear Unit,即门控线性单元函数。
参考ReLU激活函数,激活函数GLU的公式为如下公式的形式
这里有一个新符号表示的是向量经过一层MLP或者卷积,表示两个向量逐元素相乘, 表示sigmoid函数。
当趋近于0时表示对进行阻断,当趋近于1时表示允许通过,以此实现门控激活函数的效果。
NLP 面试
BERT
BERT 是 Google 提出的经典预训练语言模型,全称是 Bidirectional Encoder Representations from Transformers。它的核心特点是使用 Transformer Encoder 结构,通过双向注意力同时建模左右上下文,因此非常适合文本理解类任务,比如分类、匹配、阅读理解、检索排序等。
需要注意一点:BERT 不是用来做自回归文本生成的模型,它主要是 Encoder-only 的语言理解模型。和 GPT 这种从左到右预测下一个词的模型不同,BERT 可以在编码每个 token 时同时看到左边和右边的上下文,所以它的语义表征能力很强。
BERT 的预训练主要包含两个任务。
第一个是 Masked Language Model,MLM。训练时会随机选择输入中 15% 的 token 作为预测目标。对于这些 token:80% 替换成 [MASK], 10% 替换成随机 token,10% 保持原样。模型需要根据上下文预测这些位置原本的 token。这样做的好处是,模型可以学习双向上下文信息,也能获得更好的上下文相关词表示,比如解决一词多义问题。
第二个是 Next Sentence Prediction,NSP。模型输入两个句子 A 和 B,判断 B 是否是 A 在原文中的下一句。训练时,50% 是真实连续句子,50% 是随机拼接的句子。这个任务主要是为了增强句子关系建模能力,比如问答、自然语言推理等任务。不过后续 RoBERTa 等工作发现 NSP 不一定必要,并对 BERT 的训练方式做了改进。
BERT 的输入由三部分 embedding 相加得到:
第一是 Token Embedding,也就是 WordPiece 子词嵌入。BERT 不直接以完整单词为单位,而是使用 WordPiece,把词拆成子词,缓解未登录词问题。
第二是 Position Embedding,用于表示 token 在句子中的位置。因为 Transformer 本身没有序列顺序感,所以需要位置编码。
第三是 Segment Embedding,用于区分句子 A 和句子 B。比如句子对任务中,第一个句子的 segment id 是 0,第二个句子的 segment id 是 1。
此外,BERT 还会使用两个特殊符号:[CLS] 放在序列开头,它的最终表示通常用于分类任务;[SEP] 用来分隔两个句子,也表示句子结束。
总结: BERT 是一个基于 Transformer Encoder 的双向预训练语言模型,通过 MLM 学习上下文相关的 token 表示,通过 NSP 学习句子间关系。它的输入由 Token Embedding、Position Embedding 和 Segment Embedding 组成。由于 BERT 能同时利用左右上下文,所以非常适合文本分类、语义匹配、命名实体识别、阅读理解等自然语言理解任务,但不适合直接做开放式文本生成。
文本嵌入是什么?
文本嵌入,也叫 Text Embedding,是把文本从离散符号转换成连续稠密向量的表示方法。
传统 NLP 里经常用 one-hot 表示词,比如词表有 10 万个词,每个词就是一个 10 万维向量,只有对应位置是 1,其他都是 0。这个方法的问题是:向量非常稀疏,而且不同词之间没有语义相似性。比如“苹果”和“水果”在 one-hot 空间里看不出更相似。
词嵌入的核心思想是:一个词的含义可以由它的上下文决定,也就是分布假设:出现在相似上下文中的词,语义往往相似。所以文本嵌入会把词、句子或文档映射到一个低维稠密向量空间中。语义相近的文本,在向量空间中的距离也更近。
经典方法是 Word2Vec,它主要有两种训练方式:CBOW 和 Skip-Gram。
CBOW 是用上下文词预测中心词。比如句子是“我 喜欢 吃 苹果”,如果中心词是“吃”,模型会根据周围的“我、喜欢、苹果”等上下文来预测“吃”。CBOW 的训练速度比较快,适合大规模语料。
Skip-Gram 则相反,是用中心词预测上下文词。比如给定中心词“吃”,模型要预测它周围可能出现“喜欢”“苹果”等词。Skip-Gram 对低频词的表示通常更好一些,但训练成本会更高。
Word2Vec 训练完成后,每个词都会得到一个稠密向量。语义相近或上下文相似的词,它们的向量会更接近。
不过 Word2Vec 也有局限:
第一,它是 静态词向量。同一个词无论出现在什么上下文中,向量都是固定的,无法很好处理一词多义。比如“苹果”既可以是水果,也可以是公司。
第二,它主要基于局部窗口共现信息,建模能力有限,不能充分理解长距离依赖和复杂语义结构。
第三,它通常是词级别表示,不天然适合句子级、段落级语义理解。
后来 BERT、GPT 这类预训练模型解决了很多问题。它们生成的是 上下文相关的动态表示,同一个词在不同句子中可以有不同向量。现在做语义检索、RAG、相似度匹配时,更多会使用 sentence embedding 或 text embedding 模型,把句子、段落、文档编码成向量,再用于召回和匹配。
总结: 文本嵌入就是把词、句子或文档映射成稠密向量,让模型能够在向量空间中计算语义相似度。Word2Vec 是经典词嵌入方法,CBOW 用上下文预测中心词,Skip-Gram 用中心词预测上下文词;它们开启了分布式语义表示,但属于静态词向量,后来被 BERT 等上下文动态表示进一步发展。
对比BERT、OpenAI GPT、ELMo架构之间的差异
BERT、GPT 和 ELMo 都是预训练语言模型,但它们的核心区别在于 模型结构、上下文建模方式和预训练目标。
ELMo 是比较早期的上下文表示模型,底层使用的是 双向 LSTM。它会分别训练一个从左到右的语言模型和一个从右到左的语言模型,然后把两个方向的表示拼接起来,作为下游任务的词向量表示。
ELMo 的优点是相比 Word2Vec 这类静态词向量,它可以根据上下文生成动态词向量,能一定程度解决一词多义问题。但它的双向不是深度融合的双向,而是左右两个方向分别建模后再拼接,因此左右上下文交互不够充分。
OpenAI GPT 使用的是 Transformer Decoder,也就是单向自回归结构。它只能看到当前位置左边的上下文,通过预测下一个 token 进行预训练。GPT 的优势是天然适合文本生成,可以做续写、对话、问答等生成任务,也很适合 zero-shot 和 few-shot。
需要注意,GPT 不是使用 Transformer Encoder,而是使用 Transformer Decoder-only 架构。它的 attention mask 是 causal mask,保证每个 token 只能关注前面的 token,不能看到未来信息。
BERT 使用的是 Transformer Encoder-only 架构,采用双向 self-attention。它在每一层中,每个 token 都可以同时关注左侧和右侧上下文,因此能得到深度双向的语义表示。BERT 的预训练目标主要是 MLM 和 NSP,其中 MLM 通过 mask 掉部分 token,让模型根据双向上下文预测被遮住的词。
所以三者可以这样对比:
| 模型 | 架构 | 上下文方向 | 训练目标 | 更适合任务 |
|---|---|---|---|---|
| ELMo | BiLSTM | 左到右 + 右到左,最后拼接 | 双向语言模型 | 作为上下文词向量特征 |
| GPT | Transformer Decoder | 单向,从左到右 | Next Token Prediction | 生成、对话、续写 |
| BERT | Transformer Encoder | 深度双向 | MLM + NSP | 理解、分类、匹配、抽取 |
**总结:**ELMo 是基于 BiLSTM 的浅层双向拼接表示,GPT 是 Decoder-only 的单向自回归生成模型,BERT 是 Encoder-only 的深度双向理解模型。三者中,只有 BERT 在每一层都能让 token 同时融合左右上下文,因此它更适合自然语言理解任务;GPT 因为是单向 causal attention,所以更适合文本生成任务。

Word2Vec中为什么使用负采样(negtive sample)?
Word2Vec 使用负采样,核心目的是 降低训练计算量,提高训练效率。 在原始的 Skip-Gram 模型中,给定中心词,需要预测上下文词。模型最后一层通常要对整个词表做 softmax,也就是说,如果词表有几十万甚至上百万个词,每训练一个样本,都要计算所有词的概率,并更新大量参数,这个计算成本非常高。
负采样的思路是:不再每次都对整个词表做分类,而是把问题改成一个二分类任务。对于一个真实出现的词对,比如:(center=fox, context=quick),这个词对是正样本,模型希望它的概率接近 1。然后从词表中随机采样几个没有和中心词同时出现在上下文窗口里的词,作为负样本,比如采 5 个或 10 个,模型希望这些负样本的概率接近 0。
这样每次训练时,模型只需要更新:1 个正样本词 + K 个负样本词,而不是更新整个词表的所有词。
它的好处主要有两个:
第一,大幅降低计算复杂度。原来每次训练都要计算全词表 softmax,现在只需要计算少量采样词,训练速度会快很多。
第二,训练目标更符合词向量学习需求。Word2Vec 并不是真的要得到一个完美的全词表分类器,而是希望学到好的词向量表示。负采样通过拉近真实共现词对的向量距离、推远随机负样本的向量距离,就能学到有效的语义表示。
负样本一般不是完全均匀采样,而是会根据词频做调整,比如高频词更容易被采到,但不会完全按原始词频采样,避免 “the、is、of” 这类高频词占比过大。
总结: Word2Vec 使用负采样,是为了避免每次训练都对整个词表做 softmax。它把多分类问题转化为正负样本的二分类问题,每次只更新一个正样本和少量负样本对应的参数,从而显著提升训练效率,同时仍然能通过拉近共现词、推远非共现词来学习高质量词向量。
Word2vec 相比之前的 Word Embedding 方法好在什么地方?
Word2Vec 相比早期 Word Embedding 方法,最大的优势不是模型结构多复杂,而是它 简单、高效,并且能学到质量很好的语义向量。
早期的词向量很多来自神经语言模型,词向量只是语言模型训练过程中的副产品。训练目标通常是最大化语言模型概率,模型结构更复杂,训练速度慢,成本高。
Word2Vec 的思路更直接:它不追求完整语言模型的困惑度,而是专门为学习词向量设计训练任务。无论是 CBOW 还是 Skip-Gram,本质都是利用词和上下文的共现关系来学习表示:出现在相似上下文中的词,向量也应该相似。
它的优势主要有几点。
第一,训练速度非常快。Word2Vec 去掉了复杂的隐藏层结构,并通过负采样、层次 softmax 等方法避免全词表 softmax,所以可以在大规模语料上高效训练。相比早期神经语言模型动辄训练很久,Word2Vec 更容易落地。
第二,语义效果好。Word2Vec 学到的向量不仅能表示词语相似性,还能捕捉一些线性语义关系,比如:
king - man + woman ≈ queen,这说明词向量空间中包含了一定的语义和句法规律。第三,工程使用简单。训练完成后,每个词对应一个固定维度的稠密向量,可以很方便地用于文本分类、聚类、检索、相似度计算,或者作为下游神经网络的初始化 embedding。
第四,很多训练技巧提升了效果。比如高频词降采样、负采样分布设计、窗口大小选择、低频词过滤等。这些 trick 虽然不复杂,但对最终词向量质量影响很大。
不过也要补充一点:Word2Vec 仍然是 静态词向量,同一个词在不同上下文中只有一个向量,所以无法很好处理一词多义。后来 ELMo、BERT 这类上下文动态表示进一步解决了这个问题。
总结: Word2Vec 的优势在于把目标从“训练完整语言模型”转向“高效学习词向量”,通过 CBOW/Skip-Gram、负采样和层次 softmax,大幅提升训练速度,同时能学到有语义结构的词向量空间。它简单、高效、效果好,所以成为经典词嵌入方法。
NLP三大特征抽取器(CNN/RNN/TF)
NLP 里常见的三类特征抽取器是 CNN、RNN 和 Transformer。它们都可以用来从文本序列中抽取语义特征,但建模方式和优势不同。
RNN 是比较早期 NLP 中非常主流的结构。它按照词序从前往后处理序列,每一步都会把前面的隐藏状态传到后面,所以天然适合处理不定长文本和序列信息。后来 LSTM、GRU 通过门控机制缓解了 RNN 的梯度消失问题,在机器翻译、文本分类、序列标注中使用很多。
但 RNN 的缺点也很明显:它必须按时间步顺序计算,后一个 token 依赖前一个 hidden state,所以很难并行;而且长距离依赖虽然可以通过 LSTM/GRU 缓解,但路径仍然比较长,训练效率和建模能力受限。
CNN 在 NLP 中主要用一维卷积来抽取局部 n-gram 特征。比如卷积核大小为 3,就可以捕获连续 3 个词的局部模式。CNN 的优势是计算并行度高,训练速度快,而且对局部特征提取很有效,比如关键词组合、短语模式、局部语义片段。
但原生 CNN 的问题是感受野有限。要捕获长距离依赖,需要堆叠很多层,或者使用 dilated convolution、残差连接等改造。因此 CNN 在局部特征任务中表现不错,但在复杂语义理解和长距离依赖建模上通常不如 Transformer。
Transformer 是现在 NLP 最主流的特征抽取器。它的核心是 self-attention,可以让序列中任意两个 token 直接建立联系,不需要像 RNN 那样一步步传递,也不像 CNN 那样依赖卷积窗口逐层扩大感受野。因此它在长距离依赖建模、全局语义融合和并行计算方面都有很大优势。Transformer 的另一个优势是非常适合大规模预训练。BERT、GPT、T5、LLaMA、Qwen、DeepSeek 这些模型本质上都是 Transformer 架构的不同变体。
三者可以这样对比:
| 特征抽取器 | 优势 | 劣势 | 适合场景 |
|---|---|---|---|
| RNN/LSTM/GRU | 适合序列建模,不定长输入自然 | 难并行,长依赖路径长 | 早期序列标注、语音、时间序列 |
| CNN | 并行快,擅长局部 n-gram 特征 | 长距离依赖弱 | 文本分类、局部模式抽取 |
| Transformer | 全局建模强,并行度高,适合预训练 | attention 复杂度高,长文本成本大 | 当前主流 NLP、大模型、生成、理解 |
总结: RNN 通过时间递归建模序列,适合处理不定长输入,但并行能力差;CNN 通过卷积提取局部 n-gram 特征,并行效率高,但长距离建模能力有限;Transformer 通过 self-attention 直接建模任意 token 间关系,同时具备强语义抽取能力和高并行度,因此成为当前 NLP 和大模型中的主流特征抽取器。
常用参数更新方法
常用的参数更新方法,本质上都是在 利用梯度信息更新模型参数,使损失函数逐步下降。不同方法的区别主要在于:梯度怎么估计、学习率怎么调整、是否引入历史梯度信息。
梯度下降 GD 是最基础的方法。它每次使用整个训练集计算梯度,然后更新一次参数。优点是梯度方向比较稳定,缺点是数据量大时计算成本很高,更新慢,所以深度学习中很少直接使用全量梯度下降。
随机梯度下降 SGD 是每次只用一个样本计算梯度并更新参数。它更新频率高,速度快,但因为单个样本噪声大,梯度方向波动明显,训练过程容易震荡。
小批量梯度下降 Mini-batch GD 是实际中最常用的方式。它每次用一小批样本计算梯度,比如 batch size 是 32、64、128 或 256。这样既比全量梯度下降快,又比单样本 SGD 稳定,同时也方便利用 GPU 做矩阵并行计算。所以现在训练神经网络通常默认使用 mini-batch。
为了解决 SGD 震荡的问题,引入了 Momentum 动量法。它会累积历史梯度方向,相当于给参数更新加入“惯性”。如果多个 batch 的梯度方向一致,更新会被加速;如果某些方向来回震荡,动量会起到平滑作用。因此 Momentum 可以加快收敛,并减少震荡。
Nesterov Momentum 是 Momentum 的改进。普通 Momentum 是先根据当前位置计算梯度,再加动量更新;Nesterov 是先沿着动量方向“预看”一步,再在预看位置计算梯度。这样可以让更新更有前瞻性,避免冲得太过。
AdaGrad 是一种自适应学习率方法。它会根据每个参数历史梯度的平方和来调整学习率。对于频繁更新的参数,学习率会变小;对于稀疏特征对应的参数,学习率相对更大。所以 AdaGrad 很适合稀疏数据,比如早期 NLP 或推荐系统中的稀疏特征。但缺点是学习率会不断衰减,后期可能变得太小,导致训练停滞。
AdaDelta / RMSProp 都是为了解决 AdaGrad 学习率持续衰减的问题。它们不累积所有历史梯度,而是使用指数滑动平均,只关注最近一段时间的梯度变化,从而让学习率调整更稳定。
Adam 是目前非常常用的优化器。它结合了 Momentum 和 RMSProp 的思想:一方面维护梯度的一阶矩估计,也就是类似动量;另一方面维护梯度平方的二阶矩估计,用来为每个参数自适应调整学习率。Adam 收敛快、调参相对简单,因此在 Transformer 和大模型训练中使用非常广泛,常见变体还有 AdamW。
总结: GD 使用全量数据,稳定但慢;SGD 每次用单样本,快但震荡大;Mini-batch 是实际训练最常用的折中方案;Momentum 利用历史梯度减少震荡并加速收敛;AdaGrad 适合稀疏特征,但学习率会持续衰减;RMSProp 和 AdaDelta 用滑动平均缓解这个问题;Adam 结合动量和自适应学习率,是深度学习中最常用的优化器之一。







