attention、transform、bert 复习总结 1

详细内容见:

1 注意力机制:

  • 简单通俗描述计算过程:Q,K,V(query,key,value); 我们首先需要计算一下 Q 和 K的距离(相似度),可以使用向量点积,余弦相似性,或者 MLP,计算结果进行softmax处理,一是归一化处理,二是突出高权重K,然后根据最新处理的K 值与对应 V 值,加权求和即是 attention 值
  • 举例:
    • 1 我喜欢吃苹果,也喜欢吃香蕉,不喜欢吃榴莲"(3 个短语,对应 3 个信息单元)
    • 2 我最喜欢吃什么水果?" 这个问题(Q):
    • 3 生成 K 和 V:K1="苹果",V1="喜欢吃";K2="香蕉",V2="喜欢吃";K3="榴莲",V3="不喜欢吃";
    • 4 Q="最喜欢的水果",和 K 匹配:Q vs K1(苹果):相关(喜欢),权重 3;Q vs K2(香蕉):相关(喜欢),权重 3;Q vs K3(榴莲):无关(不喜欢),权重 0;
    • 5 加权合并 V:重点提取 "喜欢吃苹果" 和 "喜欢吃香蕉",最终输出 "你最喜欢吃苹果和香蕉"。

2 自注意力机制:

  • 没有外来的 Q,自己这段信息分成多个部分,不同部分和其他部分充当 Q,K,V
    • 举例:
      • 1 "小明去超市买了牛奶,他喝完后觉得很好喝"(输入文本的 6 个词:小明、去、超市、买了、牛奶、他、喝完、觉得、很好喝)。
      • 2 写 "他" 这个词时,你得知道 "他" 指的是谁 ------ 这就是自注意力机制在工作
      • 3 每个词都当 "提问者(Q)":"他" 这个词会生成一个 Q(查询):"他指的是谁?"同时,每个词也都当 "被查者(K/V)":所有词都会生成自己的 K(标签)和 V(内容):
        • 小明:K="人名 - 小明",V="句子主语,去超市的人";
        • 去:K="动作 - 去",V="前往某地";
        • 超市:K="地点 - 超市",V="购物的地方";
        • 他:K="代词 - 他",V="指代前文的人";
      • 4 Q "他"去匹配所有词的 K:Q("我指的是谁?") vs K(小明);Q vs K(去 / 超市 / 牛奶);Q vs K(他自己);
      • 5 加权提取 V 的信息:重点提取 "小明" 的 V,其他词的 V 几乎忽略;最终 "他" 就明确了:这就是自注意力通过 "内部查询" 找到的关联。

3 多头注意力机制:

  • 把自注意力机制复制多份("多个头"),每个头专注于找文本中不同维度的关联(比如一个头找指代关系、一个头找动作和对象、一个头找因果关系),最后把所有头的结果合并,让理解更全面。
    • 举例:
      • 1 "小明在超市买了牛奶,他喝完后觉得很甜,于是又买了一箱"(核心关联有 3 个:"他" 指代 "小明"、"喝" 的对象是 "牛奶"、"又买" 的原因是 "很甜")。
      • 2 所有头共享输入文本的 Q、K、V(但会各自做微小的 "参数调整",让每个头的关注点不同)------ 相当于 3 个小组都拿到同一份报告, but 各自的分析侧重点预设不同。
      • 3 头 1(负责 "指代关系"):重点找 "谁指谁":以 "他" 为 Q("我指谁?"),匹配所有 K,最终锁定 "小明" 的 V,得出结论:"他 = 小明";
        • 头 2(负责 "动作 - 对象关系"):重点找 "动作对应什么东西"以 "喝" 为 Q("我针对的对象是什么?"),匹配所有 K,锁定 "牛奶" 的 V,得出结论:"喝的是牛奶";
        • 头 3(负责 "因果关系"):重点找 "为什么做这个动作"以 "又买" 为 Q("我发生的原因是什么?"),匹配所有 K,锁定 "很甜" 的 V,得出结论:"又买是因为牛奶甜"。
      • 4 把 3 个小组的结论合并:"小明在超市买了牛奶,小明喝完牛奶后觉得很甜,因为牛奶甜所以小明又买了一箱"------ 比单个头只找一种关联,理解更完整、更精准。
      • 5 注意:头的数量要能被维度整除
      • 6 分头是对每一个 Q,K,V 的向量化结果进行分头,也就是一段话分成几段儿

4 transform:

  • 左侧 Encode:理解输入内容(能看到全文),只执行一次,可以看成是专属"词典"
    • 1 输入数据(编码:见基础知识)+位置信息(PE编码用的正弦余弦距离),Sin| Cos(pos / 10000 * (2 i * d))
      • 奇数用Cos,偶数用 Sin,pos 是分词位置顺序,i 是分词向量的向量值顺序,d 是向量长度
      • 好处就是:可以应对未出现过更长的句子; 每个分词都有独一无二的位置信息
    • 2 多头注意力机制(多头就是自注意力并行):输入信息和位置信息输入后,通过 attention 机制进一步提取更多的信息
    • 3 Add 和 Norm:
      • Add:此时的 Add 是一个残差连接,即 输出 = 原始输入 + 多头(原始输入)
        • 1 防止过度加工,保留初始信息,防止多头处理效果差导致预训练越差;
        • 2 训练随着层数增加,调整参数的信息会越传递越弱,残差连接可以保持"信号"强度
        • Norm: 标准化处理(归一化属于标准化的一种),防止数值过大或者过小导致的梯度爆炸/消失; 标准化后数值小,可以加速收敛
        • 爆炸就是"信号"越来越大,防止消息就是越来越弱
    • 4 Feed Forword: 两层全连接层,一层有激活函数,一层没有,公式max(0,XW1+b1)W2+b2
      • 第一层:使用全连接层提高维度放大输入数据中的有效部分,然后使用Relu 函数 max() 进一步扩大有效和无效数据的差异
      • 第二层:再通过全连接层把维度降低,留下有效部分
  • 右侧 Dncode:生成输出(不能看到全文),以翻译任务为例
    • 1 输入数据的形式: 翻译的正确"答案"和同等大小的"答案贴纸"(Mask 矩阵)乘积作为输入,这是为了确保不能提前看到答案,一开始预测的时候只能看到初始信息,其他的都被掩盖了,然后预测出第一个信息后,预测第二个信息时候,就已经能获取到初始信息+预测信息 1 了,来预测信息 2,以此类推预测得到全部结果,注意,这个过程是在一个矩阵内一次生成的!
    • 2 谁来预测?不是预训练模型,预训练模型属于成品模型,此处是搭建好 Decode 框架(比如前馈,Add 和归一化等层)后,随机或者自定义参数,输入数据直接预测,根据不断训练得到最优参数
    • 3 第一个多头输入数据: 翻译答案的 Embedding 结果+位置信息Embedding 结果生成Q,K,V 矩阵
    • 4 第一个多头: QK 矩阵乘以"答案贴纸"(Mask 矩阵),再乘以 V,加权求和,再进行 software,多头结果拼接到一起就是最终的多头结果, 此时多头的作用,仅仅是获取了初步翻译结果词语之间的顺序,和中文答案没有任何对应关系,因为还没查"词典"
    • 5 第一个 Add 和 Norm: 与 encoder 那个一毛一样
    • 6 第二个多头输入数据:此时上面5 中的输入作为 Q(类似于"我要查字典"),encode输出作为 K,V(字典内索性和详细信息)
    • 7 第二个多头:同样的方法计算多头结果,此时已经获取到了词典信息,正确率会提升不少
    • 8 第二个Add 和 Norm: 与第一个处理方法一样
    • 9 Feed Forword处理是一致的
    • 10 第三个Add 和 Norm:同上
    • 线性函数:把docode生成的矩阵转化成每个词表中对应的"分数",搭建 "语义特征" 到 "具体词汇" 的桥梁 ------ 把抽象的语义,映射到每个具体词的 "匹配度打分"
    • softmax: 做一个 "归一化转换",让所有分数变成 0~1 之间的概率,且所有词的概率加起来等于 1;

5 bert:双向编码的预训练语言模型


  • 1 预训练阶段:用大量的无监督文本通过自监督(无需人工标注)训练的方式( MLP 和 NSP)训练

    • 输入:与 transform 类似,也是词Embedding+位置 Embedding 向量对应相加作为输入A,如果是句子对的情况还需要加上归属标记向量
    • 但是句子开头有标识符Embeding [CLS]和句子末尾的[SEP]作为输入 B,A 和 B 构成了输入,注意,是拼接不是对应相加, 其中位置向量不是正余弦位置了,和 CLS 和 SEP 一样,都是从初始随机变量随机训练"可学习"的
    • transform 因为是单向的所以在输入的时候使用了 mask 矩阵,而bert 是不需要的,但是两个模型都是有"答案"对比的,不然无法反向传播进行训练
  • MLM:先从输入中随机抽取 15%,准备进行处理,在这 15% 中,80% 概率直接 mask,10% 替换其他单词,10% 不动

    • 10% 概率直接替换成其他单词,这有助于模型学习理解上下文的重要性,而不仅仅是依赖于[MASK]标记
    • 10% 概率原封不动; 这有助于模型在微调阶段更好地处理未遮蔽的单词
  • NSP:语料库中随机抽取两个句子,判断是不是上下文;

    • 在BERT的后续版本中,Next Sentence Prediction(NSP)任务被废弃了。因为研究人员发现这个任务对下游任务的性能提升有限
    • 举例:
    python 复制代码
    每个token的输入 = 自身向量(可学习) + 位置向量(可学习) + 句子归属向量(固定0/1)
    	[CLS]  →  自身向量(初始随机:[0.2, -0.1, 0.3]) 
    			+ 位置向量(第1位:[0.5, 0.02, -0.1]) 
    			+ 句子归属向量(句1:[0, 0, 0]) 
    			= 最终输入向量:[0.7, -0.08, 0.2]  👉  不是固定值,训练中会变
    	
    	"我"   →  自身向量(初始随机:[0.8, 0.4, -0.2]) 
    			+ 位置向量(第2位:[0.4, 0.05, -0.05]) 
    			+ 句子归属向量(句1:[0, 0, 0]) 
    			= 最终输入向量:[1.2, 0.45, -0.25]
    	
    	...(中间"爱""吃""苹果"同理,都是各自向量相加,归属向量全为0)...
    	
    	[SEP]  →  自身向量(初始随机:[-0.3, 0.6, 0.2]) 
    			+ 位置向量(第6位:[0.1, 0.01, -0.15]) 
    			+ 句子归属向量(句1:[0, 0, 0]) 
    			= 最终输入向量:[-0.2, 0.61, 0.05]
    	
    	"它"   →  自身向量(初始随机:[0.1, -0.3, 0.7]) 
    			+ 位置向量(第7位:[0.08, 0.005, -0.18]) 
    			+ 句子归属向量(句2:[1, 1, 1])  👉  句2专属标记,和句1区分
    			= 最终输入向量:[1.18, -0.295, 0.52]
    	
    	...(中间"很""甜"同理,归属向量全为1)...
    	
    	[SEP]  →  自身向量(初始随机:[-0.3, 0.6, 0.2]) 
    			+ 位置向量(第10位:[0.02, 0, -0.2]) 
    			+ 句子归属向量(句2:[1, 1, 1]) 
    			= 最终输入向量:[0.72, 1.6, 1.0]
  • 2 微调阶段:BERT首先使用预训练的参数初始化模型,所有参数都使用下游任务的标签数据进行微调,每个不同的下游任务都有单独的微调模型

    • bert 的主干就是多个 transform 的 encode 叠加,为了深入理解语义,但是具体任务使用还是需要在输出层(主干部分微调)进行微调处理
    • 微调任务包含:
      • 基于句子对的分类任务:核心共性:输入是 "句 1 + 句 2",用 [CLS] 汇总全局语义,输出层做分类 / 回归,复用句对归属标记(0/1)
        • MNLI:自然语言推理) 输出层:线性层 + Softmax(三分类:蕴含 / 矛盾 / 中立);目的:判断句 2 是否能从句 1 推出。
        • QQP(Quora 问答匹配):输出层:线性层 + Softmax(二分类:两问题是否语义相同);目的:判断两个问题是否是同一问题的不同表述。
        • QNLI(问答自然语言推理)输出层:线性层 + Softmax(二分类:段落句子是否能回答问题);目的:筛选能回答问题的句子。
        • STS-B(语义文本相似度):输出层:线性层(回归任务,输出 0~5 的相似度分数);目的:量化两句话的语义相似程度。
        • MRPC(微软同义句匹配):输出层:线性层 + Softmax(二分类:是否同义);目的:判断两句话是否语义等价。
        • RTE(文本蕴含识别):输出层:线性层 + Softmax(二分类:蕴含 / 不蕴含);目的:简化版 MNLI,只判断是否蕴含。
        • SWAG(情境推理)输出层:线性层 + Softmax(四分类:从 4 个候选后半句选最连贯的);目的:判断哪个候选句能承接前半句的情境。
      • 基于单个句子的分类任务:核心共性:输入是单句,不用句对标记(全标 0),[CLS] 汇总语义,输出层分类。
        • SST-2(情感分类):输出层:线性层 + Softmax(二分类:正面 / 负面);目的:判断句子情感倾向。
        • ColA(语言可接受性判断):输出层:线性层 + Softmax(二分类:句子是否语法 / 语义通顺);目的:判断句子是否是自然语言(比如 "我吃饭" 可接受,"饭吃我" 不可接受)。
      • 问答任务:核心:输入是 "问题 + 原文段落",输出层预测答案的 "起始 / 结束位置",不做分类做定位。
        • SQuAD:输出层:两个独立线性层(一个预测答案起始位置,一个预测结束位置);
          • 目的:从原文中找到问题的答案片段(比如问题 "李白生于哪年?",原文 "李白生于 701 年",预测起始 = 3,结束 = 5)。
      • 命名实体识别NER:核心:输入是单句,输出层对 "每个词" 做分类(不是 [CLS] 汇总),识别实体类型。
        • CoNLL-2003 NER:输出层:给每个 token 配一个线性层 + Softmax(多分类:PER 人 / ORG 机构 / LOC 地点 / O 非实体);
          • 目的:给每个词打实体标签(比如 "李白(PER)生于 701 年,是唐代(ORG)诗人")。
相关推荐
极客BIM工作室2 天前
BERT模型中词汇表向量与网络权重:从属关系与不可替代的功能分工
人工智能·自然语言处理·bert
极客BIM工作室3 天前
理清 BERT 中 [CLS] 向量的核心逻辑:训练双向更新与推理作用不矛盾
人工智能·机器学习·bert
极客BIM工作室4 天前
从Transformer的Encoder与Decoder,到BERT和GPT的独立王国
gpt·bert·transformer
大明者省5 天前
BERT/ViT 模型核心参数 + 实际编码案例表
人工智能·深度学习·bert
Paraverse_徐志斌5 天前
基于 PyTorch + BERT 意图识别与模型微调
人工智能·pytorch·python·bert·transformer
HaiLang_IT7 天前
【信息安全毕业设计】基于Bert和BiLSTM的Web应用安全防护系统研究
网络安全·bert·恶意请求检测
盼小辉丶8 天前
Transformer实战(26)——通过领域适应提升Transformer模型性能
深度学习·语言模型·bert·transformer
bst@微胖子10 天前
ModelScope微调模型
人工智能·深度学习·bert
宇若-凉凉11 天前
BERT 完整教程指南
人工智能·深度学习·bert