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

news2024/10/7 20:36:51

一、说明

        众所周知,变压器架构是自然语言处理(NLP)领域的突破。它克服了 seq-to-seq 模型(如 RNN 等)无法捕获文本中的长期依赖性的局限性。变压器架构被证明是革命性架构(如 BERT、GPT 和 T5 及其变体)的基石。正如许多人所说,NLP正处于黄金时代,说变压器模型是一切开始的地方并没有错。

二、对变压器架构的需求

        如前所述,需求是发明之母。传统的 seq-to-seq 模型在处理长文本时并不好。这意味着模型在处理输入序列的后半部分时,往往会忘记输入序列前半部分的学习。这种信息丢失是不可取的。

        尽管像 LSTM 和 GRU 这样的门控架构通过丢弃在记住重要信息的过程中无用的信息,在处理长期依赖关系方面表现出一些改进,但这仍然不够。世界需要更强大的东西,2015年,Bahdanau等人引入了“注意力机制”。 它们与RNN / LSTM结合使用,以模仿人类行为,专注于选择性事物,而忽略其余事物。Bahdanau建议为句子中的每个单词分配相对重要性,以便模型专注于重要的单词而忽略其余单词。它被认为是对神经机器翻译任务的编码器-解码器模型的巨大改进,很快,注意力机制的应用也在其他任务中推广。

变压器模型时代

        变压器模型完全基于一种注意力机制,也称为“自我注意”。这种架构在 2017 年的论文“注意力是你所需要的一切”中向世界介绍。它由编码器-解码器架构组成。

无花果。高级转换器模型体系结构(来源:作者)

在高层次上,

  • 编码器负责接受输入的句子并将其转换为隐藏的表示形式,丢弃所有无用的信息。
  • 解码器接受此隐藏表示形式并尝试生成目标句子。

在本文中,我们将深入研究变压器模型的编码器组件的详细细分。在下一篇文章中,我们将详细介绍解码器组件。让我们开始吧!

三、变压器编码器

        变压器的编码器块由一堆按顺序工作的N个编码器组成。一个编码器的输出是下一个编码器的输入,依此类推。最后一个编码器的输出是馈送到解码器块的输入句子的最终表示形式。

无花果。带堆叠编码器的Enoder模块(来源:作者)

如下图所示,每个编码器块可以进一步分成两个组件。

        无花果。编码器层的组件(来源:作者)

        让我们逐一详细研究这些组件中的每一个,以了解编码器块的工作原理。编码器模块中的第一个组成部分是多头注意力,但在我们进入细节之前,让我们先了解一个基本概念:自我注意

3. 1 自我注意机制

        每个人脑海中可能出现的第一个问题:注意力和自我注意力是不同的概念吗? 是的,他们是。(咄!

        传统上,注意力机制是为神经机器翻译任务而存在的,如上一节所述。因此,本质上应用了注意力机制来映射源句和目标句。当 seq-to-seq 模型逐个令牌执行翻译任务时,注意机制可帮助我们在为目标句子生成标记 x 时识别源句子中的哪些标记需要更多关注。为此,它利用编码器和解码器的隐藏状态表示来计算注意力分数,并根据这些分数生成上下文向量作为解码器的输入。如果您想了解有关注意力机制的更多信息,请跳到这篇文章(精彩的解释!

        回到自我注意,主要思想是计算注意力分数,同时将源句子映射到自身。如果你有这样的句子,

“男孩没有过马路因为它太宽了。

        我们人类很容易理解上面句子中的“它”一词指的是“道路”,但是我们如何使我们的语言模型也理解这种关系呢?这就是自我关注的地方!

在高层次上,将句子中的每个单词与句子中的每个其他单词进行比较,以量化关系并理解上下文。出于表示目的,您可以参考下图。

让我们详细看看这种自我注意是如何计算的(真实)。

  • 为输入句子生成嵌入

查找所有单词的嵌入并将它们转换为输入矩阵。这些嵌入可以通过简单的标记化和独热编码生成,也可以通过嵌入算法(如BERT等)生成。输入矩阵的维度将等于句子长度 x 嵌入维度。我们称此输入矩阵为 X 以供将来参考。

  • 将输入矩阵转换为Q,K和V

为了计算自我注意,我们需要将X(输入矩阵)转换为三个新矩阵:
- 查询 (Q)- 键 (K)- 值 (V)

 

为了计算这三个矩阵,我们将随机初始化三个权重矩阵,即Wq,Wk和Wv。输入矩阵X将与这些权重矩阵Wq,Wk和Wv相乘,分别获得Q,K和V的值。在此过程中将学习权重矩阵的最佳值,以获得更准确的Q,K和V值。

  • 计算 Q 和 K 转置的点积

从上图中,我们可以暗示 qi、ki 和 vi 表示句子中第 i 个单词的 Q、K 和 V 的值。

无花果。Q 和 K 转置的点积示例(来源:作者)

输出矩阵的第一行将告诉您由 q1 表示的 word1 如何与使用点积的句子中的其余单词相关。点积的值越高,单词越相关。为了直观地了解计算此点积的原因,您可以在信息检索方面理解 Q(查询)和 K(键)矩阵。所以在这里,
- Q 或查询 = 您正在搜索的术语
- K 或 Key = 搜索引擎中的一组关键字,与 Q 进行比较和匹配。

  • 缩放点积

与上一步一样,我们正在计算两个矩阵的点积,即执行乘法运算,该值有可能爆炸。为了确保这种情况不会发生并且梯度稳定,我们将 Q 和 K 转置的点积除以嵌入维度 (dk) 的平方根。

  • 使用 softmax 规范化值

使用 softmax 函数进行归一化将产生介于 0 和 1 之间的值。具有高比例点积的单元格将进一步升高,而低值将减少,使匹配的单词对之间的区别更加清晰。生成的输出矩阵可以视为分数矩阵S

  • 计算注意力矩阵 Z

        将值矩阵或V乘以从上一步获得的分数矩阵S,以计算注意力矩阵Z。

        但是等等,为什么要乘法?

        假设 Si = [0.9, 0.07, 0.03] 是句子中第 i 个单词的分数矩阵值。将此向量与 V 矩阵相乘以计算 Zi(第 i 个单词的注意力矩阵)。

Zi = [0.9 * V1 + 0.07 * V2 + 0.03 * V3]

        我们是否可以说,为了理解第 i 个单词的上下文,我们应该只关注 word1(即 V1),因为注意力分数值的 90% 来自 V1?我们可以清楚地定义重要的单词,在这些单词中,应该更加注意理解第i个单词的上下文。

        因此,我们可以得出结论,一个词在Zi表示中的贡献越高,单词之间的批判性和相关性就越大。

        现在我们知道了如何计算自我注意力矩阵,让我们了解多头注意力机制的概念。

3.2 多头注意力机制

        如果您的分数矩阵偏向于特定的单词表示,会发生什么?它会误导您的模型,结果不会像我们预期的那样准确。让我们看一个例子来更好地理解这一点。

        S1:“一切都很好

        Z(井) = 0.6 * V(全部) + 0.0 * v(是) + 0.4 * V(井)

        S2:“狗吃了食物,因为它饿了

        Z(它) = 0.0 * V(的) + 1.0 * V(狗) + 0.0 * V(吃) + ...... + 0.0 * V(饥饿)

        在 S1 情况下,在计算 Z(well) 时,对 V(all) 给予了更多的重要性。它甚至比V(好吧)本身还要多。无法保证这有多准确。

        在 S2 的情况下,在计算 Z(it) 时,所有的重要性都给了 V(dog),而其余单词的分数也是 0.0,包括 V(it)。这看起来可以接受,因为“it”这个词是模棱两可的。将它更多地与另一个词联系起来而不是将这个词本身联系起来是有意义的。这就是计算自我注意力的全部目的。处理输入句子中歧义单词的上下文。

        换句话说,我们可以说,如果当前单词是模棱两可的,那么在计算自我注意时可以更加重视其他单词,但在其他情况下,这可能会对模型产生误导。那么,我们现在该怎么办?

        如果我们计算多个注意力矩阵而不是计算一个注意力矩阵并从中导出最终的注意力矩阵会怎样?

        这正是多头注意力的全部意义所在!我们计算注意力矩阵z1,z2,z3,.....,zm的多个版本,并将它们连接起来以得出最终的注意力矩阵。这样我们就可以对自己的注意力矩阵更有信心。

        转到下一个重要概念,

3.3 位置编码

        在seq-to-seq模型中,输入的句子被逐字输入到网络,这允许模型跟踪单词相对于其他单词的位置。

        但在变压器模型中,我们遵循不同的方法。它们不是逐字逐句地输入,而是并行馈送,这有助于减少训练时间和学习长期依赖性。但是使用这种方法,单词顺序就丢失了。但是,要正确理解句子的含义,词序非常重要。为了克服这个问题,引入了一种称为“位置编码”(P)的新矩阵。

        该矩阵 P 与输入矩阵 X 一起发送,以包含与词序相关的信息。出于显而易见的原因,X 和 P 矩阵的维度是相同的。

        为了计算位置编码,使用下面给出的公式。

        fig。计算位置编码的公式(来源:作者)

在上面的公式中,

  • pos = 单词在句子中的位置
  • d = 字/标记嵌入的维度
  • i = 表示嵌入中的每个维度

在计算中,d 是固定的,但 pos 和 i 会有所不同。如果 d=512,则 i ∈ [0, 255],因为我们取 2i。

如果您想了解更多信息,本视频将深入介绍位置编码。

转换器神经网络可视化指南 — (第 1 部分)位置嵌入

我正在使用上述视频中的一些视觉效果来用我的话来解释这个概念。

无花果。位置编码向量表示(来源:作者)

上图显示了位置编码向量的示例以及不同的变量值。

无花果。具有常数 i 和 d 的位置编码向量(来源:作者)

fig。具有常数 i 和 d 的位置编码向量(来源:作者)

上图显示了如果 i 是常量并且只有 pos 变化,PE(pos, 2i) 的值将如何变化。众所周知,正弦波是一个周期函数,倾向于在固定间隔后重复。我们可以看到 pos = 0 和 pos = 6 的编码向量是相同的。这是不可取的,因为我们需要不同的位置编码向量来表示不同的 pos 值

这可以通过改变正弦波的频率来实现。

无花果。具有不同 pos 和 i 的位置编码向量(来源:作者)

随着i的值变化,正弦波的频率也随之变化,导致不同的波,因此,导致每个位置编码向量的值不同。这正是我们想要实现的目标。

位置编码矩阵(P)被添加到输入矩阵(X)并馈送到编码器。

无花果。将位置编码添加到输入嵌入(来源:作者)

编码器的下一个组件是前馈网络

3.4 前馈网络

        编码器块中的这个子层是具有两个密集层和 ReLU 激活的经典神经网络。它接受来自多头注意力层的输入,对同一层执行一些非线性变换,最后生成上下文化向量。全连接层负责考虑每个注意力头并从中学习相关信息。由于注意力向量彼此独立,因此它们可以以并行方式传递到变压器网络。

        编码器块的最后一个也是最后一个组件是Add&Norm组件

3.5 添加和规范组件

这是一个残差层,然后是层归一化。残差层确保在处理过程中不会丢失与子层输入相关的重要信息。而规范化层可促进更快的模型训练并防止值发生大量变化。

无花果。包含添加和规范层的编码器组件(来源:作者)

        在编码器中,有两个添加层和规范层:

  • 将多头注意力子层的输入连接到其输出
  • 将前馈网络子图层的输入连接到其输出

        至此,我们总结编码器的内部工作。总结本文,让我们快速回顾一下编码器使用的步骤:

  • 生成输入句子的嵌入或标记化表示。这将是我们的输入矩阵 X。
  • 生成位置嵌入以保留与输入句子的词序相关的信息,并将其添加到输入矩阵 X 中。
  • 随机初始化三个矩阵:Wq,Wk和Wv,即查询,键和值的权重。这些权重将在变压器模型训练期间更新。
  • 将输入矩阵X与Wq,Wk和Wv中的每一个相乘,以生成Q(查询),K(键)和V(值)矩阵。
  • 计算 Q 和 K 转置的点积,通过将其除以 dk 的平方根或嵌入维数来缩放乘积,最后使用 softmax 函数对其进行归一化。
  • 通过将 V 或值矩阵乘以 softmax 函数的输出来计算注意力矩阵 Z。
  • 将此注意力矩阵传递给前馈网络以执行非线性转换并生成上下文化嵌入。

四、后记 

        在下一篇文章中,我们将了解转换器模型的解码器组件的工作原理。这就是本文的全部内容。我希望你觉得它有用。如果你这样做了,请不要忘记鼓掌并与您的朋友分享。

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

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

相关文章

Java经典OJ题 回文

OJ题 回文 1.题目2.判断范围是否合理2.1 普通代码2.2 优化代码 3.判断回文的关系代码4.总代码 1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字…

Multipass虚拟机设置局域网固定IP同时实现快速openshell的链接

本文只介绍在windows下实现的过程,Ubuntu采用22.04 安装multipass后,在卓面右下角Open shell 就可以链接默认实例Primary,当然如果你有多个虚拟机,可以针对不同内容单独建立终端的链接,而本文仅仅用Primary来说明。 …

孤儿进程与僵尸进程

进程退出 关于进程退出有两个函数 exit和 _exit:其主要差别是在于是否直接退出。 其流程主要区别如下: 孤儿进程(不存在危害) 父进程运行结束,但子进程还在运行(未运行结束),这…

VS中.cu文件属性中项目类型没有cuda

问题 VS中.cu文件属性中项目类型没有cuda 解决办法 右键项目“自定义” ![请添加图片描述](https://img-blog.csdnimg.cn/9717093332604b5982e67b15108c9ec8.png 再回到cu文件右键属性就会出现cuda选项了 请添加图片描述

SQL 基础查询

msyql 不区分大小写 DDL 数据定义语言 查询 show databases create database db01 创建数据库 create database if not exists db01 创建数据库 删除数据库 drop database if exists db01 使用数据库 use 数据库名 CREATE TABLE tb_user(id int PRIMARY KEY COMMENT i…

插入排序(Java实例代码)

目录 插入排序 一、概念及其介绍 二、适用说明 三、过程图示 四、Java 实例代码 InsertionSort.java 文件代码: 插入排序 一、概念及其介绍 插入排序(InsertionSort),一般也被称为直接插入排序。 对于少量元素的排序,它是一个有效的算…

Unreal View Model结合GAS使用

这个东西真的难用,各种问题,记录下 官方文档 bilibili教学 开启插件 插件开启 Viewmodel: build.cs内PublicDependencyModuleNames加上ModelViewViewModel 创建ViewModel类 #pragma once#include "CoreMinimal.h" #include &quo…

Python版本Open3D基本使用

最近想完成一个点云进行三维旋转展示的效果,从网上找到可以通过Open3D进行实现。参考链接为:如何将点云文件制作成旋转的GIF图(Open3D) 因此想参考上述过程实现一下,在操作的过程中遇到了一系列的问题,在此记录。 1)博主安装了Pycharm作为编译器,使用学生身份认证,获取…

Android FrameWork 层 Handler源码解析

Handler生产者-消费者模型 在android开发中,经常会在子线程中进行一些耗时操作,当操作完毕后会通过handler发送一些数据给主线程,通知主线程做相应的操作。 其中:子线程、handler、主线程,其实构成了线程模型中经典的…

docker搭建LNMP

docker安装 略 下载镜像 nginx:最新版php-fpm:根据自己需求而定mysql:根据自己需求定 以下是我搭建LNMP使用的镜像版本 rootVM-12-16-ubuntu:/docker/lnmp/php/etc# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0…

51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验六 静态数码管显示

目录 前言 一、原理图及知识点介绍 1.1、数码管原理图: 二、代码分析 前言 第一个实验: 51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验一 点亮第一个LED_ManGo CHEN的博客-CSDN博客 第二个实验:51单片机&am…

【踩坑】最新亲测能用!修复MacOS安装软件时提示“应该移到废纸篓”并且无法打开软件

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 目录 网上方法的尝试 方法一:xattr 方法二:UPX 真的能用的方法 GateKeeper_Helper.command的内容 网上方法的尝试 方法一:xattr 以前的Mac版本可以通过以下方式来解开限…

从ChatGLM2-6B来看大模型扩展上下文和加速推理相关技术

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性: 更强大的性能:基于 ChatGLM 初代模型的开发经验,全面…

【深入探索Docker】:开启容器化时代的技术奇迹

深入探索Docker 深入探索Docker:开启容器化时代的技术奇迹前言1. 容器化:实现快速部署和可移植性2. 虚拟化:提高安全性和可靠性3. 映像:打包应用及依赖项的模板4. 网络管理:连接容器和主机5. 持久化数据:保…

Linux 终端命令之文件浏览(3) less

Linux 文件浏览命令 cat, more, less, head, tail,此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

多个 el-select 下拉框调用同一个数组时,下拉框的值不能重复

实现的效果 多个下拉框,每个下拉框选中的值不能重复,选过的下拉值会被过滤 共用一个接口 realUserList , 里面是部门的人 四个下拉框必选,数据结构如下 我使用的方法是计算属性完成, 我是从vuex 里面的获取的数据( alreaySelectUser ), …

Linux MQTT智能家居(温度,湿度,环境监测,摄像头等界面布局设置)

文章目录 前言一、温度湿度曲线布局二、环境监测界面布局三、摄像头界面布局总结 前言 本篇文章来完成另外三个界面的布局设置。 这里会使用到 feiyangqingyun的一些控件库。 一、温度湿度曲线布局 TempHumtiy.h: #ifndef TEMPHUMTIY_H #define TEMPHUMTIY_H#include <…

Maven 基础学习及使用

Maven1 Maven简介1.1 Maven模型1.2 仓库 2 Maven安装配置3 Maven基本使用3.1 Maven 常用命令3.2 Maven 生命周期 4 IDEA使用Maven4.1 IDEA配置Maven环境4.2 Maven 坐标详解4.3 IDEA 创建 Maven项目4.4 IDEA 导入 Maven项目 5 依赖管理5.1 使用坐标引入jar包5.2 依赖范围 Maven …

UVA-1601 万圣节后的早晨 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 以三个点的当前位置作为状态&#xff0c;广度优先遍历&#xff0c;找到终点即为最短次数。 注意&#xff1a; 一次可以移动多个点&#xff0c;但是每个点只能移动一步。在同一次中&#xf…