【Bert101】变压器模型背后的复杂数学【03/4】

一、说明 

        在上一篇文章中,我们详细介绍了变压器模型的编码器块的工作原理。如果您还没有读过那篇文章,我建议您在开始这篇文章之前先阅读它,因为本文中介绍了其中涵盖的概念。您可以前往:

【Bert101】变压器模型背后的复杂数学【02/4】

        如果你已经读过它,太棒了!让我们开始深入了解解码器块以及与之相关的复杂数学。

二、变压器解码器

        与转换器模型的编码器块一样,解码器块由 N 个堆叠解码器组成,这些解码器按顺序运行并接受来自前一个解码器的输入。但是,这不是解码器接受的唯一输入。编码器块生成的句子表示形式将馈送到解码器块中的每个解码器。因此,我们可以得出结论,每个解码器接受两个不同的输入:

  • 来自编码器块的句子表示
  • 上一个解码器的输出

图1.编码器和解码器模块一起工作(图片来自作者)

        在我们深入研究构成解码器的不同组件之前,必须对解码器通常如何生成输出句子或目标句子有一个直觉。

三、目标句子是如何生成的?

        在时间步长 t=1 时,只有 <sos> 标记或句子的开头作为输入传递到解码器块。基于<sos>,目标句子的第一个单词由解码器块生成。

        在下一个时间戳中,即t=2,解码器块的输入包括<sos>令牌以及解码器块生成的第一个单词。下一个单词基于此输入生成。

        同样,随着时间戳的增量,解码器块的输入长度随着在上一个时间戳中生成的单词添加到当前输入句子中而增加。

        当解码器块完成整个目标句子的生成时,将生成<eos>或句子末尾标记。您可以将其视为递归过程!

图2 使用解码器递归生成输出令牌(图片来自作者)

        现在,当输入被提供给变压器模型并且我们期待输出时,这就是应该发生的情况。但是在训练/微调转换器模型时,我们已经在训练数据集中有了目标句子。那么它是如何工作的呢?

        它给我们带来了解码器的一个极其重要的概念:蒙面多头注意力。听起来很耳熟?当然,确实如此。在上一部分,我们了解了编码器块中使用的多头注意力的概念。现在让我们了解这两者的不同之处。

四、Mask多头注意力

        解码器块逐字生成目标句子,因此,必须对模型进行类似的训练,以便即使使用有限的标记集也可以做出准确的预测。

        因此,顾名思义,我们在计算自我注意矩阵之前屏蔽了句子右侧尚未预测的所有标记。这将确保自我注意机制仅考虑在预测的每个递归步骤中可供模型使用的令牌。

        让我们举一个简单的例子来理解它:

图3.遮罩多头注意力矩阵表示(图片来自作者)

        计算自我注意力矩阵的步骤和公式将与我们在编码器块中所做的相同。我们将在本文中简要介绍这些步骤。为了更深入地了解,请随时前往本系列文章的前一部分。

  • 为目标句子生成嵌入并获取目标矩阵 Y
  • 通过将随机权重矩阵 Wq、Wk 和 Wv 与目标矩阵 Y 相乘,将目标句子转换为 Q、K 和 V
  • 计算 Q 和 K 转置的点积
  • 通过将点积除以嵌入维度的平方根 dk) 来缩放点积)
  • 通过将所有单元格替换为 <mask> 来对缩放矩阵应用掩码 — inf
  • 现在在矩阵上应用 softmax 函数并将其与 Vi 矩阵相乘以生成注意力矩阵 Zi
  • 将多个注意力矩阵 Zi 连接成单个注意力矩阵 M

此注意力矩阵将与编码器块生成的输入句子表示形式一起馈送到解码器块的下一个组件。现在让我们了解解码器块如何使用这两个矩阵。

五、多头注意力

解码器块的这个子层也称为“编码器-解码器注意层”,因为它接受屏蔽的注意力矩阵(M)和编码器(R)的句子表示

图4.多头注意力机制(图片来自作者)

自我注意矩阵的计算与上一步中的计算方式非常相似,只是略有改动。由于我们有两个输入矩阵,因此它们被转换为Q,K和V,如下所示:

  • Q 使用 Wq 和 M 生成
  • K&V矩阵使用Wk&Wv和R生成

到现在为止,您必须已经了解,变压器模型背后的每个步骤和计算都有一个非常具体的原因。同样,这些矩阵中的每一个都是使用不同的输入矩阵生成的也是有原因的。你能猜到吗?

快速提示:答案在于如何计算自我注意力矩阵......

是的,你做对了!

如果你还记得,当我们使用输入句子理解自我注意的概念时,我们谈到了它如何在将源句子映射到自身时计算注意力分数。将源句子中的每个单词与同一句子中的每个其他单词进行比较,以量化关系并理解上下文。

在这里,我们也在做同样的事情,唯一的区别是,我们将输入句子的每个单词(K-转置)与目标句子单词(Q)进行比较。它将帮助我们量化这两个句子之间的相似程度,并理解单词之间的关系。

图5.带有输入句子和目标句子的注意力矩阵表示(图片来自作者)

最后,生成的注意力矩阵 Zi 将是维度 N X 1,其中 N = 目标句子的字数。

由于这也是一个多头注意力层,为了生成最终的注意力矩阵,将多个注意力矩阵串联起来。

有了这个,我们已经涵盖了解码器块的所有独特组件。但是,其他一些组件的功能与编码器块中的功能相同。让我们也简要地看一下它们:

  • 位置编码 — 就像编码器块一样,为了保留目标句子的词序,我们在将目标嵌入添加到目标嵌入之前,将其馈送到屏蔽多注意力层。
  • 前馈网络 — 解码器块中的这个子层是具有两个密集层和 ReLU 激活的经典神经网络。它接受来自多头注意力层的输入,对同一层执行一些非线性变换,最后生成上下文化向量。
  • 添加和规范组件 — 这是一个残差层,然后是层规范化。它有助于加快模型训练,同时确保不会丢失来自子层的信息。

我们在第 1 部分中详细介绍了这些概念。

有了这个,我们也完成了解码器块的内部工作。正如您可能已经猜到的那样,编码器和解码器块都用于处理和生成输入句子的上下文化向量。那么谁来执行实际的下一个单词预测任务呢?让我们来了解一下。

六、线性和softmax层

        它位于解码器网络的顶部,接受堆栈中最后一个解码器生成的输出矩阵作为输入。此输出矩阵将转换为与词汇表大小相同大小的 logit 向量。然后,我们在此 logit 向量上应用 softmax 函数以生成对应于每个单词的概率。概率最高的单词被预测为下一个单词。该模型使用 Adam 优化器针对交叉熵损失进行了优化。

        为了避免过度拟合,在编码器/解码器网络的每个子层之后都添加了dropout层

        这就是整个变压器模型的全部内容。至此,我们用最简单的语言完成了变压器模型架构的深入演练。

七、结论

        既然您已经了解了变压器模型的所有知识,那么在此基础上构建知识并深入研究更复杂的LLM模型架构(如BERT,GPT等)应该不难。

        您可以参考以下资源:

  1. BERT 101 - State Of The Art NLP Model Explained
  2. The Illustrated GPT-2 (Visualizing Transformer Language Models) – Jay Alammar – Visualizing machine learning one concept at a time.

        我希望这篇由两部分组成的文章能让变压器模型不那么令人生畏。

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

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

相关文章

数字图像处理 --- 相机的内参与外参(CV学习笔记)

Pinhole Camera Model&#xff08;针孔相机模型&#xff09; 针孔相机是一种没有镜头、只有一个小光圈的简单相机。 光线穿过光圈并在相机的另一侧呈现倒立的图像。为了建模方便&#xff0c;我们可以把物理成像平面(image plane)上的图像移到实际场景(3D object)和焦点(focal p…

基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux

2023年目前要说最热的点&#xff0c;肯定是ChatGPT了。 ChatGPT官方提供的网页版本&#xff0c;还有需要科*上网&#xff0c;很多人都会基于此进行封装。 现在是移动互联网时代&#xff0c;基于手机APP的需求还是很大的。 所以&#xff0c;今天给大家推荐一个ChatGPT客户端开…

Vue电商项目--组件通信

组件通信6种方式 第一种&#xff1a;props 适用于的场景&#xff1a;父子组件通信 注意事项&#xff1a; 如果父组件给子组件传递数据&#xff08;函数&#xff09;&#xff1a;本质其实是子组件给父组件传递数据 如果父组件给子组件传递的数据&#xff08;非函数&#xf…

期权定价模型系列【1】—BSM通用式模型

这是期权定价模型专栏的第一篇文章&#xff0c;此专栏旨在分享一些期权定价模型&#xff0c;将会从最基础的BSM模型开始写起&#xff0c;逐步扩散到蒙特卡洛模拟、二叉树等数值法模型&#xff0c;以及跳跃扩散模型、随机波动率模型&#xff0c;神经网络模型等等。 如果你觉得有…

Java负载均衡算法实现与原理分析(轮询、随机、哈希、加权、最小连接)

文章目录 一、负载均衡算法概述二、轮询&#xff08;RoundRobin&#xff09;算法1、概述2、Java实现轮询算法3、优缺点 三、随机&#xff08;Random&#xff09;算法1、概述2、Java实现随机算法 四、源地址哈希&#xff08;Hash&#xff09;算法1、概述2、Java实现地址哈希算法…

198、仿真-基于51单片机函数波形发生器调幅度频率波形Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…

Leetcode-每日一题【剑指 Offer 27. 二叉树的镜像】

题目 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 例如输入&#xff1a; 4 / \ 2 7 / \ / \ 1 3 6 9 镜像输出&#xff1a; 4 / \ 7 2 / \ / \ 9 6 3 1 示例 1&#xff1a; 输入&#xff1a;root [4,2,…

(vue)获取对象的键遍历,同时循环el-tab页展示key及内容

(vue)获取对象的键遍历&#xff0c;同时循环el-tab页展示key及内容 效果&#xff1a; 数据结构&#xff1a; "statusData": {"订购广度": [ {"id": 11, "ztName": "广", …

YAPi在线接口文档简单案例(结合Vue前端Demo)

在前后端分离开发中&#xff0c;我们都是基于文档进行开发&#xff0c;那前端人员有时候无法马上拿到后端的数据&#xff0c;该怎么办&#xff1f;我们一般采用mock模拟伪造数据直接进行测试&#xff0c;本篇文章主要介绍YApi在线接口文档的简单使用&#xff0c;并结合Vue的小d…

[保研/考研机试] KY183 素数 北京航空航天大学复试上机题 C++实现

题目链接&#xff1a; 素数https://www.nowcoder.com/share/jump/437195121691718444910 描述 输入一个整数n(2<n<10000)&#xff0c;要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数&#xff0c;如果没有则输出-1。 输入描述&#xff1a; 输入有多…

vue3+element-plus点击列表中的图片预览时,图片被表格覆盖

文章目录 问题解决 问题 视觉 点击图片进行预览&#xff0c;但还能继续选中其他的图片进行预览&#xff0c;鼠标放在表格上&#xff0c;那一行表格也会选中&#xff0c;如图所示第一行的效果。 代码 <el-table-column prop"id" label"ID" width"…

云原生K8S------Yaml文件详解

目录 一&#xff1a;K8S支持的文件格式 1&#xff0c;yaml和json的主要区别 2&#xff0c;YAML语言格式 二&#xff1a;yuml 1、查看 api 资源版本标签 2、写一个yaml文件demo 3、创建service服务对外提供访问并测试 4、详解k8s中的port 三&#xff1a;文件生成 1、kubec…

Vue2到3 Day5 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…

类与对象(加深)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 6.const成员 7.取地址及const取地址操作符重载 1.类的6个默认成员函数 如果…

Mysql 和Oracle的区别

、mysql与oracle都是关系型数据库&#xff0c;Oracle是大型数据库&#xff0c;而MySQL是中小型数据库。但是MySQL是开源的&#xff0c;但是Oracle是收费的&#xff0c;而且比较贵。 1 2 mysql默认端口&#xff1a;3306&#xff0c;默认用户&#xff1a;root oracle默认端口&…

shell脚本开发

shell脚本语言属于弱类型的语言&#xff0c;无需声明变量类型&#xff0c;直接定义使用 shell语言定义的变量&#xff0c;数据类型默认都是字符串类型 调用历史记录命令&#xff1a;&#xff01; 历史记录id

netty基础与原理

Netty线程模型和Reactor模式 简介&#xff1a;reactor模式 和 Netty线程模型 设计模式——Reactor模式&#xff08;反应器设计模式&#xff09;&#xff0c;是一种基于 事件驱动的设计模式&#xff0c;在事件驱动的应用中&#xff0c;将一个或多个客户的 服务请求分离&#x…

【ARM Cache 系列文章 9 -- ARM big.LITTLE技术】

文章目录 big.LITTLE 技术背景big.LITTLE 技术详解big.LITTLE 硬件要求 big.LITTLE 软件模型CPU MigrationGlobal Task SchedulingGlobal Task Scheduling比CPU Migration的优势 转自&#xff1a;https://zhuanlan.zhihu.com/p/630981648 如有侵权&#xff0c;请联系删除 big.L…

Leetcode 21. 合并两个有序链表

题目描述 题目链接&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/description/ 思路 两个链表都是升序链表&#xff0c;新建一个链表&#xff0c;引入伪头节点作为辅助节点&#xff0c;将各节点添加到伪节点之后&#xff0c;再用一个cur节点指向新链表的…

2022年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536 输入 只有一行,一个双精度浮点数。 输出 一行,保留8位小数的浮点数。 样例输入 3.1415926535798932 样例输出 3.14159265 下面是一个使用C语言编写的双精…