李沐-《动手学深度学习》--03-注意力机制

一、注意力机制

1 . 注意力提示

1)框架

在这里插入图片描述

**随意:**跟随自己的想法的,自主的想法,例如query

**不随意:**没有任何偏向的选择,例如 Keys

如何得到 k v q
在这里插入图片描述

2)Nadaraya-Watson核回归

在这里插入图片描述

就是一个softmax,但是不可以学习,输入一个x_pred以后,将离x_pred由近到远的x_train所对应的y_train给定从大到小的权值,然后最后将所有的y_train和自己对应的权重相乘再相加起来得到最后的y_pred

3) 参数化的注意力机制

在这里插入图片描述
参数w可以指控预测函数的平滑程度

4)总结

2 . 注意力分数

1)框架

在这里插入图片描述

**注意力权重:**大于0小于1加起来等于1的权重

**注意力分数:**就是注意力权重没有normalize的情况

2)拓展到高维度

a . Notion

b . Additive Attention(任意长度k,q,v)

在这里插入图片描述

q , k , v都可以任意长度,然后最后都会并起来放到一个单隐藏层

c . Scaled Dot-Product Attention

在这里插入图片描述

当q,k,v的长度都一样的时候,第一个是简单的点积版本,第二个是向量化的版本

3)总结

在这里插入图片描述

4)mask_softmax

mask_softmax作用:将输入的向量或者矩阵,在计算softmax的时候,忽略掉一部分,只对我们想要的一部分做softmax,不想要的部分直接赋值为-1e6 使得做指数运算的时候为0

3 . 使用注意力机制的Seq2Seq

1)框架

在这里插入图片描述

**key-value:**指的是Encoder的每一个词的RNN的输出

**query:**解码器的对上一个词的预测输出,和key-value放入attention里面去找原文附近

2)总结

在这里插入图片描述

4 . 自注意力

1)框架

2)输入到输出的操作

在这里插入图片描述

3)Multi-head Self-attention

一个数据可以是有多个不同的相关性,所以可以设置多个不同的q,将单层的q k v 拆分成多层的q k v

4)Position Encoding

在这里插入图片描述

5 . Transformer

1)架构

在这里插入图片描述

2)Multi-head Self-attention

在这里插入图片描述

多头注意力机制是将

3)掩码的multi-head self-attention

在这里插入图片描述

正常做自注意力的时候,是会看到所有的输入的元素,而进行解码预测的时候只能看到已经预测的,需要对其他的进行遮盖

4)基于位置的前馈网络

实质就是全连接层

pytorch的dense中,高于二维的向量做linear,高于二维的都当作样本维

5)layer - normalization

有b句话,每句话有len个词,每个词由d个特征表示,BN是对所有句子所有词的某一特征做归一化,LN是对某一句话的所有词所有特征单独做归一化

LayerNorm中没有batch的概念,所以不会像BatchNorm那样跟踪统计全局的均值方差,因此train()和eval()对LayerNorm没有影响

layerNorm是将每个样本进行归一化,batchNorm是所有样本的同一个特征进行归一化、
在这里插入图片描述

6)embeddings and softmax & position encoding

encoder ,decoder,pre-softmax 都是共享一个权重矩阵,然后乘d position是将位置信息直接加入到输入里面

7)预测

8)总结

在这里插入图片描述

和RNN的区别: 两个都是会使用序列的信息,不同的是RNN是通过将上一个的输出也加入到当前的输入用作序列信息,而Attention机制是在提取的时候就将序列信息就提取出来了

6 . Bert

NLP 里的迁移学习

  • 在计算机视觉中比较流行,将 ImageNet 或者更大的数据集上预训练好的模型应用到其他任务中,比如小数据的预测图片分类或者是目标检测

1、使用预训练好的模型(例如 word2vec 或语言模型)来抽取词、句子的特征

2、做迁移学习的时候,一般不更新预训练好的模型

3、在更换任务之后,还是需要构建新的网络来抓取新任务需要的信息

  • 使用预训练好的模型来抽取特征的时候,一般得到的是一些比较底层的特征,很多时候只是当成一个 embedding 层来使用,还是需要设计一个比较复杂的模型
  • word2vec 忽略了时序信息
  • 语言模型只看一个方向,而且训练的模型不是很大(RNN 处理不了很长的序列,因为它只能看到很短的一部分)

BERT

1、BERT 是芝麻街中一个人物的名字,芝麻街是美国一个针对小朋友启蒙的节目

2、BERT 结合了 ELMo 对上下文进行双向编码以及 GPT 任务无关这两方面的优点,对上下文进行双向编码,并且对于大多数的自然语言处理任务只需要最少的架构改变

  • 通过将整个序列作为输入,ELMo 是为输入序列中的每一个单词分配一个表示的函数(ELMo 将来自预训练的双向长短期记忆网络的所有中间层表示组合为输出表示,ELMo 的表示将作为附加特征添加到下游任务的现有监督模型中)
  • 在加入 ELMo 表示之后,冻结了预训练的双向 LSTM 模型中的所有权重;现有的监督模型是专门为给定的任务定制的(为每一个自然语言处理任务设计一个特定的架构实际上并不是一件容易的事情),利用不同任务的不同最佳模型,添加 ELMo 改进了六种自然语言处理任务的技术水平:情感分析自然语言推断语义角色标注共指消解命名实体识别回答
  • GPT (Generative Pre Training ,生成式预训练)模型为上下文的敏感表示设计了通用的任务无关模型,它在 Transformer 解码器的基础上,预训练了一个用于表示文本序列的语言模型,当将 GPT 应用于下游任务时,语言模型的输出被送到一个附加的线性输出层,以预测任务的标签
  • 与 ELMo 冻结预训练模型的参数不同,GPT 在下游任务的监督学习过程中对预训练 Transformer 解码器中的所有参数进行微调,GPT 在自然语言推断问答句子相似性分类等12项任务上进行了评估,并在对模型架构进行最小更改的情况下改善了其中9项任务的最新水平
  • ELMo 对上下文进行双向编码,但使用特定于任务的架构;GPT 是任务无关的,但是从左到右编码上下文(由于语言模型的自回归特性,GPT 只能向前看(从左到右))
  • 在下游任务的监督学习过程中,BERT 在两方面与GPT相似:BERT 表示将被输入到一个添加的输出层中,根据任务的性质对模型架构进行最小的更改(例如预测每个词元与预测整个序列);BERT 对预训练 Transformer 编码器的所有参数进行微调,而额外的输出层将从头开始训练
  • BERT 进一步改进了 11 种自然语言处理任务的技术水平,这些任务分为以下几个大类:单一文本分类(如情感分析)、文本对分类(如自然语言推断)、问答文本标记(如命名实体识别)

3、原始的 BERT 有两个版本,其中基本模型有 1.1 亿个参数,大模型有 3.4 亿个参数

4、最初的 BERT 模型是在两个庞大的图书馆语料库英语维基百科的合集上预训练的

5、现成的预训练 BERT 模型可能不适合医学等特定领域的应用

6、在预训练 BERT 之后,可以用它来表示单个文本文本对其中的任何词元

7、BERT 表示是上下文敏感的,同一个词元在不同的上下文中具有不同的 BERT 表示

  • 上下文敏感:同一个词可以根据上下文被赋予不同的表示(词的表征取决于它们的上下文)

1)BERT 的动机

1、基于微调的 NLP 模型

2、预训练的模型抽取了足够多的信息

3、新的任务只需要增加一个简单的输出层

  • 做微调的时候,特征抽取的层是可以复用的(也可以应用到别的任务上面去),只需要修改分类器就可以了
  • 预训练的模型抽取了足够多的信息,使得 feature 已经足够好能够抓住很多的信息,所以在做新的任务的时候,只需要增加一个输出层就可以了

2)BERT 架构

1、只有编码器的 Transformer

2、BERT 在原始的论文中提供了两个原始的版本(原始 BERT 模型中,输入序列最大长度是 512):

  • Base:#blocks=12,hidden size=768,#heads=12,#parameters=110M
  • Large:#blocks=24,hidden size=1024,#heads=16,#parameters=340M

3、在大规模数据上训练 > 3B 词

3)对输入的修改

在这里插入图片描述

a . 每个样本是一个句子对
  • 从源句子到目标句子
  • 翻译的时候,源句子进的是编码器,目标句子进的是解码器,而现在只有一个编码器。因为 NLP 中很多情况下都是两个句子,比如说 Q&A 都是两个句子,一个句子进去,一个句子出来。在 BERT 中,将两个句子拼接起来,然后放进编码器,因此每个样本就是一个句子对
b . 加入额外的片段嵌入

上图中的“this movie is great”和“i like it”两个句子是如何放进去的

  • 首先在句首加了一个特殊的分类标签(class),作为句子对的开头( BERT 输入序列明确地表示单个文本和文本对)
  • 然后在两个句子至今之间使用了一个特殊的分隔符(separate),将两个句子分开(第二个句子末尾也使用了一个分隔符)
  • 也可以做得更长,将更多的句子连接起来,但是一般没有这种情况的使用场景,所以一般使用两个句子就够了

因为有两个句子,而且仅仅使用标签的话,对于 transformer 来讲并不是很好区分两个句子的先后顺序,所以额外地添加了一个 Segment Embedding 来进行区分

  • 对于第一个句子中的所有词元添加 Segment Embedding 为 0 (包括句首的分类标签以及两个句子之间的分隔符)
  • 对于第尔个句子中的所有词元添加 Segment Embedding 为 1(包括句末的分隔符)
c . 位置编码可学习
  • 在 Transformer 编码器中常见的是,位置嵌入被加入到输入序列的每个位置,而 BERT 中使用的是可学习的位置嵌入( BERT 输入序列的嵌入是词元嵌入、片段嵌入和位置嵌入的和
  • 不再使用 sin 和 cos 函数

4)预训练任务

BERT 是做一个通用的任务,因为他是一个预训练模型,做很常见的通用的任务,使得用这个任务训练出来的数据足够好,以至于做别的任务的时候都能做

在文本中,最通用的任务就是语言模型了,给定一个词,然后预测下一个词

  • 但是 BERT 不能直接这么做,因为他里面的编码器是可以看到后面的东西的
  • Transformer 中的编码器是双向的,既看前面又看后面,解码器才是单向的
  • BERT 中的 B 是 bi-directional ,是双向的意思,所以它是看双向的信息,然后抽取比较好的特征,但是如果用来训练语言模型的话就会有问题

因此在 BERT 中做了一个修改,叫做带掩码的语言模型

  • 给定一个句子,把中间的一些词遮起来,然后预测这些词,有点类似于完型填空

预训练任务 1:掩蔽语言模型(Masked Language Modeling)

1、Transformer 的编码器是双向的,标准语言模型要求单向

  • 语言模型使用左侧的上下文预测词元
  • 为了双向编码上下文以表示每个词元,BERT 随机掩蔽词元并使用来自双向上下文的词元以自监督的方式预测掩蔽词元

2、带掩码的语言模型每次随机(15%概率)将一些词元(作为预测的掩蔽词元)替换成

  • 任务就变成了预测被遮起来的那些词,模型就不是预测未来,而是变成了完型填空,因此看双向的信息是没有任何问题的
  • 在每个预测位置,输入可以由特殊的“掩码”词元或随机词元替代,或者保持不变

3、虽然 BERT 在训练的时候加了很多的 ,但是在微调任务中不出现 这种人造特殊词元,为了避免预训练和微调之间的这种不匹配,解决的办法是模型不要总是对 遮掉的部分进行预测输出

  • 80% 概率下,将选中的词元变成
  • 10% 概率下换成一个随机词元(这种偶然的噪声鼓励 BERT 在其双向上下文编码中不那么偏向于掩蔽词元,尤其是当标签词元保持不变时)
  • 10% 概率下保持原有的词元

4、带掩码的语言虽然能够编码双向上下文来表示单词,但是它并不能显式地建模文本对之间的逻辑关系

预训练任务 2:下一句子预测(Next Sentence Prediction)

1、给定一个句子对,预测这个句子对中两个句子在原始的句子中是不是相邻,从而帮助理解两个文本序列之间的关系

2、在构造样本的时候,训练样本中:

  • 50% 概率选择相邻句子对(在采样一个句子的时候,将该句子后面的一个句子也采样进去): this movie is great i like it
  • 50% 概率选择随机句子对(在采样一个句子的时候,在其他地方再随机挑选一个句子采样进去): this movie is great hello world

3、将 对应的输出放到一个全连接层来预测,判断两个句子是不是相邻的

5)总结

1、BERT 是针对 NLP 的微调设计,在大的文本上训练一个比较大的模型,在做别的任务的时候将输出层进行修改,最后的效果会比直接训练好一点( BERT 让微调在 NLP 中变成了主流)

2、BERT 其实就是一个基于 Transformer 的编码器,但是做了一点修改

  • 模型更大,训练数据更多(一般是至少十亿个词,文本不像图片,文本不需要进行标记,所以文本可以无限大)
  • 输入句子对,片段嵌入,可学习的位置编码
  • 训练时使用两个任务:带掩码的语言模型下一个句子预测

3、word2vec 和 GloVe 等词嵌入模型与上下文无关,它们将相同的预训练向量赋给同一个词,而不考虑词的上下文(如果有的话),因此很难处理好自然语言中的一词多义或复杂语义

4、对于上下文敏感的词表示,如 ELMo 和 GPT ,词的表示依赖于它们的上下文

  • ELMo 对上下文进行双向编码,但使用特定于任务的架构(为每个自然语言处理任务设计一个特定的体系架构实际上并不容易)
  • GPT 是任务无关的,但是从左到右编码上下文

5、BERT 结合了这两个方面的优点:对上下文进行双向编码,并且需要对大量自然语言处理任务进行最小的架构更改

6、BERT输入序列的嵌入是词元嵌入、片段嵌入和位置嵌入的和

7、BERT 预训练包括两个任务:掩蔽语言模型和下一句预测

  • 掩蔽语言模型能够编码双向上下文来表示单词
  • 下一句预测能够显式地建模文本对之间的逻辑关系

二 、大纲回顾

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《2024 AIGC 应用层十大趋势白皮书》:近屿智能OJAC带您一起探索AI未来

Look!👀我们的大模型商业化落地产品📖更多AI资讯请👉🏾关注Free三天集训营助教在线为您火热答疑👩🏼‍🏫 近日国际知名咨询机构IDC发布《2024 AIGC 应用层十大趋势白皮书》的发布&am…

Spring 动态数据源事务处理

在一般的 Spring 应用中,如果底层数据库访问采用的是 MyBatis,那么在大多数情况下,只使用一个单独的数据源,Spring 的事务管理在大多数情况下都是有效的。然而,在一些复杂的业务场景下,如需要在某一时刻访问不同的数据库,由于 Spring 对于事务管理实现的方式,可能不能达…

二叉树OJ练习(二)

1. 二叉树的最近公共祖先 题目描述: ​ 题解: 1.p或者q其中一个等于root,那么root就是最进公共祖先 2.p和q分布在root的左右两侧,那么root就是最进公共祖先 3.p和q在root的同一侧,就是要遍历这棵树,遇到p或者q返回 ​…

一款好的葡萄酒关键在哪里?

除了易于种植,赤霞珠还因其独特的口感、难以置信的味道和质量而闻名。这种葡萄主要用于中高端干红葡萄酒,通常表现出成熟的黑色水果味道,带有辛辣和泥土气息。 在橡木桶中陈酿后,赤霞珠表现极佳。随着葡萄酒的陈年,橡木…

【金猿人物展】数元灵科技CEO朱亚东:何以数智化

‍ 朱亚东 本文由数元灵科技CEO朱亚东撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度趋势人物榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 在大数据经济的高速发展下,数据已经成为第5生产要素。打造以数据驱动为中心的标准化…

腾讯云免费服务器申请1个月攻略,亲测可行教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

NUXT3学习笔记

1.邂逅SPA、SSR 1.1 单页面应用程序 单页应用程序 (SPA) 全称是:Single-page application,SPA应用是在客户端呈现的(术语称:CSR(Client Side Render)) SPA的优点 只需加载一次 SPA应用程序只需…

(二)Explain使用与详解

explain中的列 sql语句: EXPLAIN SELECT * from user WHERE userId=1340; 执行结果: 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。 id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行…

Chrome您的连接不是私密连接或专用连接

方法一: 在当前页面用键盘输入 thisisunsafe ,不是在地址栏输入,就直接敲键盘就行了因为Chrome不信任这些自签名ssl证书,为了安全起见,直接禁止访问了,thisisunsafe 这个命令,说明你已经了解并…

富文本编辑器

富文本:带样式,多格式的文本,在前端一般使用标签配合内联样式实现 富文本编辑器(Rich Text Editor,简称 RTE)是一种用户可以使用来创建格式化的文本内容的界面组件。它通常可以嵌入到网页或应用程序中&…

Stm32cube keil5配置串口printf 蓝牙打印不出来

1.检查cube里面波特率是否与AT蓝牙设置一致 2.keil里面设置是否打开Use MicroLIB 3、stm32cube是否开启串口中断 4.检测线路是否接触不良,读写线插反等。

IO流-文件复制

IO流 概述:IO流,输入输出流(Input Output)流:一种抽象的概念,对数据传输的总称。(数据在设备之间的传输称为流)常见的功能 文件复制文件上传文件下载 学习流,我们要搞懂…

拓数派加入 OpenCloudOS 操作系统开源社区,作为成员单位参与社区共建

近日,拓数派签署 CLA(Contributor License Agreement 贡献者许可协议),正式加入 OpenCloudOS 操作系统开源社区。 拓数派(英文名称“OpenPie”)是国内基础数据计算领域的高科技创新企业。作为国内云上数据库和数据计算领域的引领者…

云渲染适合什么场景下使用?

云渲染作为影视动画主流的渲染方案,通常云渲染服务商拥有专属的渲染农场,通过渲染农场庞大的高新能数量机器,可协助你在短时间内完成渲染任务。 云渲染使用场景有哪些? 1、硬件限制: 如果你的个人或公司电脑硬件不足…

大模型第三节课程笔记

大模型开发范式 优点:具有强大语言理解,指令跟随,和语言生成的能力,具有强大的知识储备和一定的逻辑推理能力,进而能作为基座模型,支持多元应用。 不足:大模型的知识时效性受限,大模…

【系统高级-环境变量】path配置一整行,而不是列表

这是列表编辑方便。但是不知道为什么变成一行,非常的令人抓狂,经过研究发现,第一个环境变量必须为C:\Windows\system32 开头才可以 文章如下 修改环境变量中的一行变成列表形式_环境变量编辑不是列表-CSDN博客

DDIM学习笔记

写在前面: (1)建议看这篇论文之前,可先看我写的前一篇论文: DDPM推导笔记-大白话推导 主要学习和参考了以下文章: (1)一文带你看懂DDPM和DDIM (2)关于 DDIM …

音频文件元数据:批量修改技巧,视频剪辑高效修改元数据的方法

随着数字媒体技术的快速发展,音频文件已成为日常生活中的重要组成部分。无论是音乐、语音还是其他音频内容,元数据都是描述这些文件的重要信息。下面来看下云炫AI智剪如何批量修改音频文件元数据,在视频剪辑中高效修改元数据的方法。 下面来看…

Java常用类---包装类

包装类 包装类简介 Java语言是典型的面向对象编程语言,但是其中的8种基本数据类型并不支持面向对象编程,基本类型数据不具备"对象"的特性,即:没有携带属性以及没有方法可以调用。 为了解决上述问题,java为…

strtok函数的介绍

_str指被分解的字符串 delim指分隔符字符串 返回类型是指针 strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符…