Transformer/Bert

news2024/11/18 13:51:08

诸神缄默不语-个人CSDN博文目录

文章目录

  • 1. Transformer
    • 1.1 Transformer整体工作流程
    • 1.2 Transformer的输入
      • 1.2.1 单词 Embedding
      • 1.2.2 位置 Embedding
    • 1.3 Block
      • 1.3.1 Add & Norm层
      • 1.3.2 Self-Attention
      • 1.3.3 Multi-Head Attention
      • 1.3.4 Feed Forward
      • 1.3.5 Masked Multi-Head Attention
    • 1.4 Softmax 预测输出单词
    • 1.5 Transformer优势
  • 2. BERT
  • 3. 其他参考资料

1. Transformer

基于Encoder-Decoder架构,最初用于翻译任务。

在这里插入图片描述
左边是encoder,右边是decoder。

1.1 Transformer整体工作流程

在这里插入图片描述

  1. 获取输入句子的每一个单词的表示向量 X,X由单词的 Embedding 和单词位置的 Embedding 相加得到
    在这里插入图片描述
  2. 将得到的单词表示向量矩阵 (如上图所示,每一行是一个单词的表示 x) 传入 Encoder 中,经过 6 个 Encoder block 后可以得到句子所有单词的编码信息矩阵 C,如下图
    在这里插入图片描述
    每一个block的输入和输出矩阵维度都相同: n × d n\times d n×d(论文中d=512)
  3. 将Encoder输出的编码信息矩阵 C传递到 Decoder 中,Decoder 依次会根据当前翻译过的单词 i 翻译下一个单词 i+1(这种按顺序解码的操作叫autoregressive (AR)),如下图所示。
    decoder训练时的输入就是真实标签(ground truth (GT)),测试时的每次的输入是上一次的解码结果(第一次就以特殊token作为开头),用encoder得到的编码来做attention。测试时以出现<EOS>或达到解码最大token数为结束标志。
    翻译到单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 i+1 之后的单词。
    在这里插入图片描述
    上图 Decoder 接收了 Encoder 的编码矩阵 C,然后首先输入一个翻译开始符 “”,预测第一个单词 “I”;然后输入翻译开始符 “” 和单词 “I”,预测单词 “have”,以此类推。

1.2 Transformer的输入

在这里插入图片描述

1.2.1 单词 Embedding

单词的 Embedding 有很多种方式可以获取,例如可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到。

1.2.2 位置 Embedding

Transformer 中除了单词的 Embedding,还需要使用位置 Embedding 表示单词出现在句子中的位置。因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。
(如果不用位置编码的话,就跟词袋模型差不多了)
位置 Embedding 用 PE表示,PE 的维度与单词 Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:
在这里插入图片描述
其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。使用这种公式计算 PE 有以下的好处:

  • 使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。
  • 可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。

将单词的词 Embedding 和位置 Embedding 相加,就可以得到单词的表示向量 x,x 就是 Transformer 的输入。

1.3 Block

1.3.1 Add & Norm层

Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。

在这里插入图片描述

Add操作出自ResNet:
在这里插入图片描述

Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

1.3.2 Self-Attention

在这里插入图片描述
Q-query
K-key
V-value

self-attention中的QKV都是对输入进行线性转换后得到的(XQKV都是每一行代表一个token):
在这里插入图片描述

decoder中的K和V则是用 Encoder 的编码信息矩阵 C 计算的。

根据 Encoder 的输出 C计算得到 K, V,根据上一个 Decoder block 的输出 Z 计算 Q (如果是第一个 Decoder block 则使用输入矩阵 X 进行计算),后续的计算方法与encoder述的一致。
这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。

得到QKV后计算输出:
在这里插入图片描述

公式中计算矩阵 Q和 K 每一行向量的内积,为了防止内积过大,因此除以 d k d_k dk 的平方根。Q 乘以 K 的转置后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。下图为 Q 乘以 K 的转置,1234 表示的是句子中的单词。
在这里插入图片描述

得到 QK T ^T T 之后,使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1。
在这里插入图片描述

得到 Softmax 矩阵之后可以和 V相乘,得到最终的输出 Z。
在这里插入图片描述

上图中 Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出 Z 1 Z_1 Z1 等于所有单词 i 的值 V i V_i Vi 根据 attention 系数的比例加在一起得到,如下图所示:
在这里插入图片描述

1.3.3 Multi-Head Attention

将多个(8个)attention机制的结果concat在一起,以增加attention机制本身的鲁棒性:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
可以看到 Multi-Head Attention 输出的矩阵 Z与其输入的矩阵 X 的维度是一样的。

1.3.4 Feed Forward

线性转换→ReLU→线性转换:
在这里插入图片描述
Feed Forward 最终得到的输出矩阵的维度与 X 一致。

1.3.5 Masked Multi-Head Attention

Decoder预测时输入的内容和输出的对象(使用teacher forcing1思想):
在这里插入图片描述

事实上每次的输入都是完整的输出标签,通过mask实现每次模型只看到当前timestep之前的输出:
下面用 0 1 2 3 4 5 分别表示 <Begin> I have a cat <end>
在这里插入图片描述

首先进行和之前的self-attention一样的操作,线性转换得到QKV,然后计算QK T ^T T
在这里插入图片描述

在得到 QKT 之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用 Mask矩阵遮挡住每一个单词之后的信息,也就是直接把每个timestep对应单词之后的元素值置0:
在这里插入图片描述

得到 Mask QK T ^T T 之后进行 Softmax,每一行的和都为 1

使用 Mask QKT 与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 Z 1 Z_1 Z1 是只包含单词 1 信息的。
在这里插入图片描述
得到一个 Mask Self-Attention 的输出矩阵 Zi,然后和 Encoder 类似,通过 Multi-Head Attention 拼接多个输出 Zi 然后计算得到第一个 Multi-Head Attention 的输出 Z,Z与输入 X 维度一样。

1.4 Softmax 预测输出单词

Decoder block 最后的部分是利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z 0 Z_0 Z0 只包含单词 0 的信息,如下:
在这里插入图片描述

Softmax 根据输出矩阵的每一行预测下一个单词

在这里插入图片描述

1.5 Transformer优势

相比RNN,Transformer能够比较好地并行训练。
Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。

2. BERT

待补

3. 其他参考资料

  1. Transformer 模型详解:这是我看过写得最好的一篇transformer博文,清晰简洁,深入浅出。本文基本架构全部参考此文
  2. 我还没看
    1. Attention Is All You Need
    2. The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.
    3. The Annotated Transformer(代码:harvardnlp/annotated-transformer: An annotated implementation of the Transformer paper.,老版博文:The Annotated Transformer)

  1. 我看的是What is Teacher Forcing for Recurrent Neural Networks?
    总之意思就是用真实值而非上一timestep的输出值作为下一timestep的输入,效果会更好。(RNN中就直接切换上一cell的输出值/上一cell位置的真实标签,在Transformer中则通过mask实现) ↩︎

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

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

相关文章

[附源码]计算机毕业设计JAVA篮球装备商城系统

[附源码]计算机毕业设计JAVA篮球装备商城系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

HTTP/2是什么?和HTTP/1.1有什么不同?和SPDY有什么不同?

HTTP/2简介 HTTP/2 是超文本传输协议第2版&#xff0c;最初命名为 HTTP 2.0 &#xff0c;其简称为 h2&#xff08;基于TLS/1.2或以上版本的加密连接&#xff09;或 h2c&#xff08;非加密连接&#xff09;&#xff0c;是HTTP协议的的第二个主要版本&#xff0c;使用于万维网。 …

备考2023年软考需要了解什么?

2022年软考已经结束啦&#xff01;下半年还是有不少地区取消了&#xff0c;没能报上名或是没能正常参考的朋友们&#xff0c;只能把目光转向2023年了。 这篇文章就来给大家讲讲备考2023年软考需要了解什么&#xff1f; 软考小白必看哦&#xff01; 一、软考是啥&#xff1f;…

带你走进神奇的元宇宙的世界

&#x1f3e0;个人主页&#xff1a;黑洞晓威 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晓威&#xff0c;一名普普通通的大二在校生&#xff0c;希望在CSDN中与大家一起成长。&#x1f381;如果你也在正在学习Java&#xff0c;欢迎各位大佬来到我的博客查漏补缺…

阿里架构师推荐,微服务分布式构架开发实战PDF,快快收藏吧

什么是微服务架构 微服务是一种软件架构风格&#xff0c;目标是将一个复杂的应用拆分成多个服务模块&#xff0c;每个模块专注单一业务功能对外提供服务&#xff0c;并可以独立编译及部署&#xff0c;同时各模块间互相通信彼此协作&#xff0c;组合为整体对外提供完整服务。 微…

嵌入式开发学习之--创建工程

提示&#xff1a;本篇文章依旧是了解为主&#xff0c;实际做项目时直接找开源的类似项目做模板更效率。 文章目录一、前言二、新建工程三、使用模板工程四、总结一、前言 前面的学习&#xff0c;都是文件内的代码联系&#xff0c;这一篇&#xff0c;是学习文件与目录的联系。当…

数字信号处理-8-自相关

1 皮尔森相关系数 假设 x 和 y 均为 N 个样本的数组&#xff0c;皮尔森公式如下&#xff1a; 皮尔森相关系数总是在 -1 到 1 之间&#xff08;包含这两个字&#xff09;。ρ 的绝对值意味着相关性的强度。ρ 接近 1 表示强正相关&#xff1b;ρ 接近 -1 表示强负相关&#xf…

上传文件很费时费力?那是你没用对方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、前端直传的优点二、实现步骤2.1、后端方面2.1.1 添加依赖2.1.2 增加接口2.1.3 测试接口2.2、前端方面2.2.1 安装 cos-js-sdk-v5 依赖2.2.2 新建组件2.2.3 使…

你的哪些SQL慢?看看MySQL慢查询日志吧

前言 在项目里面&#xff0c;多多少少都隐藏着一些执行比较慢的SQL, 不同的开发测试人员在平时使用的过程中多多少少都能够遇到&#xff0c;但是无法立马有时间去排查解决。那么如果有一个文件能够将这些使用过程中比较慢的SQL记录下来&#xff0c;定期去分析排查&#xff0c;…

meta视口标签

属性解释说明width宽度设置的是viewport宽度&#xff0c;可以设置device-width特殊值initial-scale初始缩放比&#xff0c;大于0的数字maximum-scale最大缩放比&#xff0c;大于0的数字minimum-scale最小缩放比&#xff0c;大于0的数字user-scalable用户是否可以缩放&#xff0…

关于我们编写好的java程序是如何运行部署的

了解如何去查看项目如何运行怎么部署java项目部署到服务器的程序和在本地运行的程序有什么不同java中的Class文件是如何形成的Class文件如何执行的怎么部署java项目 首先宏观的说一下&#xff0c;程序的运行都是要有一个启动入口的&#xff0c;也就是我们经常说的main函数是程…

【Shell 脚本速成】03、Shell 脚本实战案例(一)数据磁盘初始化

目录 一、案例应用场景 二、案例需求 脚本所需相关知识点 三、案例算法 四、代码实现 五、实现验证 一、案例应用场景 生产环境中的服务器一般会分为系统盘和数据盘两种磁盘&#xff0c;以dell R730举例&#xff0c;该服务器是一个2U的机架式服务器&#xff0c;满载可以挂…

HTML+CSS简单的网页制作期末作业——浙江旅游景点介绍网页制作

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

Redisson分布锁原理分析及源码解读

本文源码解读基于Redisson 3.18.0 版本 Redisson分布锁实现原理 Redisson锁实现基本原理大致如下图所示&#xff1a; 客户端执行Lua脚本去获取锁&#xff0c;如果获取失败&#xff0c;则订阅解锁消息&#xff0c;并挂起线程。 客户端解锁时执行一段Lua脚本&#xff0c;删除锁的…

[附源码]计算机毕业设计JAVA课程资源系统管理

[附源码]计算机毕业设计JAVA课程资源系统管理 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

PowerJob 定时从SFTP下载文件拆的坑

一. 业务需求 SFTP上有多个目录, 每小时要下载一次文件, 每个目录的下载任务都是一个独立的工作流任务. 二.问题描述 手动执行每个任务可以正常执行, 但是当所有任务都开启定定时任务执行时(每小时执行一次),任务实例就会报错. 三.问题分析 查看服务端和worker端的日志, …

数据采集-“消防知识网上答题挑战赛”题库

为普及消防法律法规和消防安全知识&#xff0c;提升全员消防安全意识&#xff0c;提高抗御火灾、自防自救和组织疏散能力&#xff0c;集团公司近日部署11月份集中开展消防宣传月活动。 为“全民消防”营造浓厚氛围&#xff0c;集团公司以消防知识为主要内容&#xff0c;整理形…

关于如何快速学好,学懂Linux内核。内含学习路线

学习linux内核&#xff0c;这个可不像学一门语言&#xff0c;c或者java一个月或者3月你就能精通掌握。学习linux内核是需要一步一步循序渐进&#xff0c;掌握正确的linux内核学习路线对学习至关重要&#xff0c;本篇文章就来分享学习linux内核的一些建议吧。 1. 了解操作系统基…

nginx(六十一)proxy模块(二)修改发往上游的请求

一 修改发往上游的请求 重点&#xff1a; 利用指令更改转发给上游服务器的HTTP报文的内容1) 请求行 --> proxy_method、url、proxy_http_version2&#xff09;请求头 --> proxy_set_header、proxy_pass_request_headers3&#xff09;请求体 --> proxy_pass_request_b…

SpringBoot入口深入

这里写目录标题1.run&#xff08;&#xff09;1.1 程序运行监听器 SpringApplicationRunListeners1.2 应用参数 ApplicationArguments启动加载顺序1.run&#xff08;&#xff09; run()方法是一个SpringBoot程序的入口 SpringApplication.run(Application.class, args);看看方…