6自然语言处理-NLP

张开发
2026/5/3 9:11:51 15 分钟阅读

分享文章

6自然语言处理-NLP
NLP是用深度神经网络让机器理解、生成、处理人类语言的技术核心是词嵌入 注意力机制其成熟实现就是 Transformer 预训练大模型。在 Transformer 出现之前NLP 很笨有了 TransformerNLP 直接起飞。Transformer 是现在所有顶尖 NLP 模型的 “底层骨架”。以前的 NLPRNN、LSTM 这类模型只能按顺序读句子长文本容易忘前面的内容并行计算差训练慢现在的 NLP几乎全都基于 TransformerBERT理解类GPT生成类T5、LLaMA、文心一言、豆包……全都是 Transformer 变种。什么是 TransformerTransformer 是一种基于「自注意力机制Self-Attention」的深度学习模型结构。它的核心特点不靠循环RNN/LSTM也不靠卷积能同时看到一整段文本而不是一个词一个词往后看擅长计算每个词和其他所有词的关系强弱并行计算能力极强训练速度远快于传统模型一、怎么用数据表示文字以上为常见的输入1. 最原始one-hot 编码字典法将文字编码为向量假设有词典[我爱学深度学习]每个词对应一个只有一个 1其余全 0的向量。缺点1如果要想表示每一个字则维度太长了2每个字之间体现体现不出关系。2. 现代方法词嵌入Word Embedding把每个词变成一个短的、有意义的小数数组向量让机器能看懂、能计算语言。机器看文字只能看懂 0 和 1完全不懂文字。所以我们需要把每个词映射成一个固定长度的数字向量这就叫词嵌入。例子5 维向量我 →[0.12, 0.45, -0.23, 0.66, 0.02]学习 →[0.88, 0.11, -0.73, 0.21, 0.55]关键特点意思相近的词向量挨得近国王 - 男人 女人 ≈ 女王这就是Word2Vec、GloVe做的事3. 现在最强上下文词向量BERT/GPT 用根据语境动态变化。同一个词不同语境向量不一样。例我今天学深度学习这本书很有深度两个 “深度” 向量不同因为语境不同。这叫动态词嵌入。二、常见的输入每个词对应一个编码。三、常见的输出1、每个词都有输出一个值假如有个词性识别任务但问题是无法判断“爱”是动词还是名词所以要考虑序列的前后关系。这就引出了RNN循环神经网络RNNRecurrent Neural Network就是一种专门处理序列数据的神经网络它的核心设计是通过 “记忆” 前一步的信息来处理当前步的输入从而自然地捕捉序列的前后关系。RNN 的核心原理循环 状态记忆。RNN 有一个记忆单元可以理解成模型的 “短期记忆”或者“传家宝”每处理一个字序列中的一个元素都会用「当前字的输入 上一步的记忆」更新「新的记忆」这个 “记忆” 会沿着序列一步步传递自然捕捉前后关系RNN 的问题长序列记不住梯度消失或爆炸。如果序列很长比如 100 个字的句子前面的信息会慢慢 “丢失”比如处理第 100 个字时几乎记不住第 1 个字的内容。为了解决这个问题衍生出了升级版 RNNLSTM长短期记忆网络新增 “门控机制”输入门、遗忘门、输出门可以主动 “记住重要信息”“忘记无关信息”比如处理 “我昨天买了苹果今天吃了它”LSTM 能记住 “它” 指代的是 “苹果”但是 RNN 和 LSTM 太慢了只可串行“串行”指的是必须等前一个字处理完才能处理下一个字一步接一步算没法同时算多个字而 Transformer 能 “并行”把一整句话的所有字同时算完速度差几十上百倍。这就引出了自注意力机制Self-attentionRNN一个字一个字看只能记住前面的而且必须串行。自注意力一句话所有字同时看每个字都能直接和任何一个字产生关系。自注意力一句话里每个字都看一遍所有字包括自己自动决定重点看谁。是 Transformer、BERT、GPT 的灵魂。即一句话里每个字都给其他所有字打个“相关性分数”分数高 关系近重点看分数低 关系远少看。例句子“我 昨天 买了 苹果今天 吃了 它”模型要知道“它” 指的是谁。自注意力怎么做让“它”这个字去看句子里所有字它 ↔ 我 → 分数低它 ↔ 昨天 → 分数低它 ↔ 买了 → 分数低它 ↔苹果→分数极高它 ↔ 今天 → 分数低它 ↔ 吃了 → 分数低结果它 苹果如何计算注意力计算公式简单来说注意力 先算相似度 → 再算权重 → 再加权求和step0. 先准备三个向量每个词都有这3个矩阵是随机初始化、会被训练的矩阵全连接层的本质就是矩阵相乘所以也可以说是全连接每个词 embedding 后会通过矩阵得到 3 个向量Q (Query)我要找什么K (Key)我这里有什么V (Value)我真正的信息内容step1. 第一步算相似度Q・K相似度 这个词和句子里所有词的关系有多近计算方式当前词的 Q・所有词的 K。点积越大→ 向量方向越接近 →语义越相关点积本质就是相似度例子句子我 吃 苹果。我们算 “苹果” 的注意力苹果.Q・我.K → 分数 1苹果.Q・吃.K → 分数 2苹果.Q・苹果.K → 分数 3得到一组原始分数。step2. 第二步除以根号 d_k防数值太大让Softmax 失效就是把分数缩小一点防止 Q・K 点积太大导致 Softmax 变成 “硬打分”梯度消失。不用理解为什么知道是缩放就行。step3. 第三步softmax 变成权重0~1 之和 1把分数变成概率一样的权重权重越高 越关注权重越低 越不关注比如我0.1吃0.2苹果0.7这就是注意力权重。注意力权重 每个词该信多少、看多少step4. 第四步权重 × V 加权求和最终结果用权重去乘每个词的 V再加起来最终向量 0.1 × 我.V 0.2 × 吃.V 0.7 × 苹果.V这个结果就是带上下文信息的词向量。综上总结一般一个self - attention 模型 一个字的编码维度是768 字的个数可以按照128或者512计算。这里的数字的含义是什么768 维指每个字的向量长度特征维度是模型对一个字的 “描述维度”128/512指序列长度token 数量是模型能处理的 “最多字数”本质是序列维度。对应到模型里描述一个字比如 “苹果”用的是[0.12, -0.45, 0.67, ..., 0.89]→ 768 维特征768 个小数1、如何得到Q、K、V2、算相似度 softmax类似的3、权重 × V 加权求和最终结果我们可以简化为可以看到维度并未改变仍为128x7682、所有词输出一个值3、输入输出长度不对应四、多头、多层、分层自注意力机制在单个自注意力层内部把 Q、K、V 分成多个 “头”head每个头独立计算注意力最后再把结果拼接起来。让模型在同一层里同时从多个不同角度比如语法、语义、指代关系去关注句子里的信息而不是只看一个角度。拓宽模型视野BERT-base 模型正是由 12 层 Transformer 编码器堆叠而成每一层都包含一个 12 头的自注意力机制也可以实现多层自注意力结构它是 Transformer / BERT 等模型的核心堆叠方式指把自注意力层 全连接层重复堆叠多次形成一个深层网络。让模型一层一层地从词级、句级再到篇章级逐步理解更深层的语义。加深模型深度在 BERT-base 中就堆叠了12 层这样的自注意力 全连接结构分层注意力机制Hierarchical Attention是针对任务定制的注意力—— 核心是 “按信息类型分层加权”比如先给 “词”情感词 / 中性词分层再给 “句子片段”核心情感段 / 铺垫段分层是 “按信息维度拆分” 的注意力目的是让模型精准聚焦核心情感信息。五、位置信息编码Transformer 的自注意力机制有一个天生的 “缺陷”它是无序的对输入序列的顺序不敏感。不管你把 “我爱你” 排成 “我爱你” 还是 “你爱我”自注意力计算出来的结果是一样的。但语言是有序的语序变了意思就完全变了。它的核心作用有三点恢复语序信息让模型知道词与词之间的先后顺序比如 “我” 在 “爱” 前面“你” 在 “爱” 后面。帮助理解依赖关系很多语言现象比如指代、时态、逻辑关系都和位置有关。例如“我昨天看到了它”模型需要知道 “昨天” 在 “看到” 之前“它” 指代的是前面提到的事物。让自注意力 “有序化”位置编码和词嵌入相加后作为模型的输入这样自注意力在计算时就会把位置信息也考虑进去从而理解有序的语言结构。因此可以加上位置信息编码输入词嵌入位置编码二者直接相加让 Transformer 从 “无序的注意力机器” 变成 “能理解语序的语言模型”。这就是self-attentionToken 是什么Token 就是 “最小处理单元”可以理解成模型眼里的 “字 / 词 / 子词”是它能直接处理的最小单位。Token 模型能直接 “读” 的最小语言单位。词嵌入 → 给每个 Token 一个向量位置编码 → 给每个 Token 一个位置标签自注意力 → 让每个 Token 关注其他 Token不同语言、不同分词方式Token 会不一样英文常切成子词subword比如unhappiness→un,happiness中文可以是单字、词或子词比如 BERT 中文模型常把每个汉字当作一个 Token1、为什么要切 Token控制词汇表大小如果把每个词都当一个独立 Token词汇表会爆炸上百万词模型太大。用子词subword可以把词汇表控制在几万以内同时又能覆盖所有词。处理未登录词OOV遇到训练时没见过的词也能拆成已知子词比如ChatGPT→Chat,G,PT模型照样能处理。统一输入长度模型需要固定长度的输入所以句子会被切成固定数量的 Token不足就补[PAD]太长就截断。2、常见特殊 Token在 BERT 里你会经常看到这些特殊 Token[CLS]放在句首用来做分类任务的输出[SEP]分隔两个句子[MASK]做预训练时用来 “盖住” 词让模型预测[UNK]未知词没见过的词[PAD]填充用来对齐长度六、预训练模型BertBert就是用Transformer 的 Encoder 部分做出来的预训练模型专门做理解类任务分类、匹配、抽取、问答等。它是一个“超级会理解中文 / 英文” 的预训练模型它的核心一句话里每个字都能看懂左右两边的上下文。1、BERT 能干嘛全是理解类任务文本分类情感分析、垃圾邮件识别命名实体识别 NER找人名、地名、机构语义相似度问答系统阅读理解文本匹配BERT 是 “理解型” 模型不擅长生成写诗、写文章靠GPT。#补充什么是「上游任务」、「下游任务」1上游预训练BERT 先在超大文本数据上学语言 → 变成一个语言大神2下游微调 Fine-tune用预训练好的 BERT去做你真正想干的具体任务。你把 BERT 拿来在你的小数据集上再训练一点点让它变成情感分析机器人客服意图识别试卷批改模型信息抽取工具2、三个关键点BERT 基于 Transformer 编码器Encoder的预训练模型双向 Transformer 编码器它是 “双向” 理解看一个字时左边 右边一起看先预训练再微调学会通用语言能力再拿去做具体任务下游任务。BERT 采用自监督预训练通过两个任务同时学习语言表示数据是普通文本没人给标注MLMMasked Language Model掩码语言模型随机将句子中 15% 的 token 替换为[MASK]让模型根据上下文预测被遮住的词。目的学习双向上下文语义使每个词都能同时利用左右语境信息。NSPNext Sentence Prediction下一句预测输入一对句子 A、B让模型预测 B 是否是 A 的真实下一句。目的学习句子间的逻辑关系与篇章连贯性。通过 MLM NSP 联合训练BERT 获得了强大的通用语言理解能力可直接在下游任务文本分类、NER、语义匹配、问答等上微调使用。它用文本本身当监督信号所以叫自监督学习3、Bert 结构BERT 的结构可以理解为多层堆叠的 Transformer Encoder的双向预训练语言模型核心是 “自注意力 全连接” 的重复。1整体结构1、输入层Input Embedding把句子切成Token如 “我”“爱”“你”。每个 Token 得到 3 种嵌入Token Embedding词的语义信息。Segment Embedding区分两个句子用于句子对任务。Position Embedding位置信息解决 Transformer 无序的问题。三者相加得到最终输入向量。最终输入Token Segment Position 三者相加2、Transformer Encoder 层核心堆叠BERT-base12 层 EncoderBERT-large24 层。每一层 Encoder 都包含a. 多头自注意力Multi-head Self-Attention让每个 Token 关注句子中其他 Token 的信息。Attention 是线性、全局的b. 残差连接 层归一化Residual Connection LayerNorm防止梯度消失稳定训练。c.全连接前馈网络Feed Forward Network, FFN对注意力结果做非线性变换提取更复杂的特征。FFN 是非线性、每个 token 独立的。d.再次残差连接 层归一化。3、输出层PoolerBERT 最后要输出一整个句子的向量用来做分类任务情感分析、语义匹配等。它规定用句子第一个 token [CLS] 的输出代表整个句子。但 [CLS] 输出是 768 维内容全但杂乱有重复、有冗余、重点不突出作者想再做一次变换 激活让句子表示更规整核心目的是突出句子核心语义、消除冗余干扰、规整数值范围最终效果是让这个向量能更精准、稳定地支撑所有句子级任务分类、匹配、推理等。从模型层面还能加速训练收敛、提升泛化能力让 BERT 在下游任务中表现更好。所以加了一层Pooler 全连接层 Tanh。Pooler层的核心是「整理信息而非改变维度」输入输出都是 768 维只优化向量内的信息分布它的输入输出维度输入[CLS] 的向量 768 维输出还是 768 维保持维度统一。​​​​​​​取句首特殊 Token[CLS]的输出经过一个全连接层和Tanh 把任意数字压缩到 [-1, 1] 之间。激活用于句子级任务如分类、匹配。对于 Token 级任务如命名实体识别、问答则直接使用每个 Token 的输出向量。BERT 是由 12 层 Transformer 编码器堆叠而成的双向语言模型输入由字向量、句子向量、位置向量三者相加通过 MLM 与 NSP 自监督预训练得到强大的语言理解能力。BERT 预训练 用「填空题MLM 上下文题NSP」当作业让模型在海量文本里反复刷题学会语言的双向上下文和篇章逻辑。我用一个生活化的比喻 一步一步的流程帮你把 BERT 预训练的完整流程讲清楚 先打个比方BERT 预训练就像「语文老师教学生」输入层 老师给学生出「填空题 上下文判断题」Encoder 层 学生读题、理解整段话的意思输出层 学生写出答案老师批改打分算损失、教学生改 完整流程拆解按顺序走一遍1. 【准备阶段出题】—— 对应图里的输入层老师数据处理先准备两道题题目 1MLM填空题原句我 爱 吃 苹果随机遮掉 15% 的词 → 我 [MASK] 吃 苹果目标让模型根据「我、吃、苹果」猜出被遮住的「爱」题目 2NSP上下文题句子 A我爱吃苹果句子 B它很脆甜真实下一句/ 今天下雨了随机句子目标让模型判断句子 B 是不是句子 A 的真实下文然后把题目变成模型能懂的向量每个字 → Token Embedding字的意思句子 A/B → Segment Embedding区分哪句是 A、哪句是 B字的顺序 → Position Embedding告诉模型「我」在第 1 位、「爱」在第 2 位三者相加 → 最终输入向量喂给模型2. 【思考阶段读题理解】—— 对应图里的Transformer Encoder 层模型学生开始读题用 12/24 层 Encoder 反复理解上下文多头自注意力让每个字都看看左右邻居比如[MASK]会去看「我、吃、苹果」知道这里应该填一个表达喜好的字[CLS]会看整段话总结句子 A 和 B 的关系残差连接 层归一化保证模型不会越学越乱稳定理解FFN 前馈网络对每个字做更复杂的语义加工重复上面步骤 12/24 次 → 每个字都得到一个「懂了整段话」的向量3. 【答题阶段写答案 批改】—— 对应图里的输出层模型读完题开始分别做两道题✅ 做 NSP 题上下文判断用[CLS]的向量代表整段话的意思经过 Pooler全连接 Tanh→ 把向量整理得更规整再经过一个小分类层 → 输出两个概率「是真实下文」/「不是真实下文」老师批改和真实标签对比算损失告诉模型哪里错了✅ 做 MLM 题填空只看被[MASK]遮住的字的向量经过一个线性层 → 把向量映射到词表大小比如 3 万个词经过 Softmax → 输出每个词的概率挑概率最高的作为答案老师批改和真实被遮住的字对比算损失告诉模型哪里错了4. 【学习阶段改错题】模型根据两道题的损失总和调整自己的参数Encoder、输出层的权重下次再做类似题就会更准反复做几百万、几千万道题 → 模型就学会了「语言的规律」2计算Bert参数忽略偏置值bBERT-base12 层hidden size768feed forward3072先记这 4 个关键数词表大小30522BERT 官方词表隐层维度d 768层数L 12FFN 中间层负责 “把信息加工得更复杂”4*d 3072没有公式规定必须 4d只是 Transformer、BERT 作者们实验出来的最优配置。太窄学不动太宽参数爆炸、变慢4d刚好又强又快1. 嵌入层参数BERT 有30522 个不同的 token字、词、符号给每一个 token分配一个768 维的向量。Segment 是用来区分第一句、第二句的。只有两种0 第一句1 第二句。所以只有2 个向量每个也是 768 维。而BERT 最多支持512 个 token 长度。它给第 1 个位置 → 一个向量第 2 个位置 → 一个向量…第 512 个位置 → 一个向量一共512 个位置向量每个 768 维。Token Embedding Segment Embedding Position Embedding都是d768维所以Token Embedding30522 × 768≈2344 万Segment Embedding2 × 768≈1536Position Embedding512 × 768≈39 万嵌入层总参数量 ≈ 2383 万这三本 “小字典”都是独立学习的所以参数要加在一起。图示Bert输入embedding2. 一层 Transformer Encoder 有多少参数每层 Multi-Head Attention FFN1Multi-Head Attention 内部Q、K、V 三个线性层 输出投影Q:768×768K:768×768V:768×768Out:768×768共4 × 768×768 4×589,824 2,359,2962FFN 是两层全连接第一层768 → 3072→768×3072第二层3072 → 768→3072×768合计768×3072 × 2 4,718,5923LayerNorm 很小忽略不计。⇒ 一层 Encoder 总参数2,359,296 4,718,5927,077,8883. 有12 层 Encoder12 × 7,077,88884,934,6564. 最后 还有一个Pooler 层768×768≈589,824​​​​​​​图示Bert输出pooler5. BERT-base 总参数量嵌入23,834,68812 层84,934,656Pooler589,824合计≈ 109,359,168​​​​​​​七、BERT vs GPT 核心区别BERT结构Transformer Encoder模式双向同时看左右任务MLM NSP擅长理解类任务分类、匹配、NER、QA定位语言理解模型GPT结构Transformer Decoder模式单向自回归从左到右只能看左边任务Next Token Prediction预测下一个词擅长生成类任务写作、对话、续写、代码定位语言生成模型一句话区分BERT读懂上下文 → 做理解GPT顺着往下写 → 做生成

更多文章