Bert基础(一)--自注意力机制

1、简介

当下最先进的深度学习架构之一,Transformer被广泛应用于自然语言处理领域。它不单替代了以前流行的循环神经网络(recurrent neural network, RNN)和长短期记忆(long short-term memory, LSTM)网络,并且以它为基础衍生出了诸如BERT、GPT-3、T5等知名架构。

本文将带领你深入了解Transformer的实现细节及工作原理。本章首先介绍Transformer的基本概念,然后通过一个文本翻译实例进一步讲解Transformer如何将编码器−解码器架构用于语言翻译任务。我们将通过探讨编码器(encoder)的组成部分了解它的工作原理。之后,我们将深入了解解码器(decoder)的组成部分。最后,我们将整合编码器和解码器,进而理解Transformer的整体工作原理。

2、Transformer简介

循环神经网络和长短期记忆网络已经广泛应用于时序任务,比如文本预测、机器翻译、文章生成等。然而,它们面临的一大问题就是如何记录长期依赖。

为了解决这个问题,一个名为Transformer的新架构应运而生。从那以后,Transformer被应用到多个自然语言处理方向,到目前为止还未有新的架构能够将其替代。可以说,它的出现是自然语言处理领域的突破,并为新的革命性架构(BERT、GPT-3、T5等)打下了理论基础。

Transformer完全依赖于注意力机制,并摒弃了循环。它使用的是一种特殊的注意力机制,称为自注意力(self-attention)。我们将在后面介绍具体细节。

让我们通过一个文本翻译实例来了解Transformer是如何工作的。Transformer由编码器和解码器两部分组成。首先,向编码器输入一句话(原句),让其学习这句话的特征[插图],再将特征作为输入传输给解码器。最后,此特征会通过解码器生成输出句(目标句)。

假设我们需要将一个句子从英文翻译为法文。如图所示,首先,我们需要将这个英文句子(原句)输进编码器。编码器将提取英文句子的特征并提供给解码器。最后,解码器通过特征完成法文句子(目标句)的翻译。
在这里插入图片描述
此方法看起来很简单,但是如何实现呢?Transformer中的编码器和解码器是如何将英文(原句)转换为法文(目标句)的呢?编码器和解码器的内部又是怎样工作的呢?接下来,我们将按照数据处理的顺序,依次讲解编码器和解码器.

2.1 理解编码器

Transformer中的编码器不止一个,而是由一组N 个编码器串联而成。一个编码器的输出作为下一个编码器的输入。在图中有N 个编码器,每一个编码器都从下方接收数据,再输出给上方。以此类推,原句中的特征会由最后一个编码器输出。编码器模块的主要功能就是提取原句中的特征。
在这里插入图片描述
需要注意的是,在Transformer原论文“Attention Is All You Need”中,作者使用了N = 6,也就是说,一共有6个编码器叠加在一起。当然,我们可以尝试使用不同的N 值。这里为了方便理解,我们使用N=2,如图所示。
在这里插入图片描述
编码器到底是如何工作的呢?它又是如何提取出原句(输入句)的特征的呢?要进一步理解,我们可以将编码器再次分解。下图展示了编码器的组成部分。
在这里插入图片描述
从上图中可知,每一个编码器的构造都是相同的,并且包含两个部分:

  • 多头注意力层
  • 前馈网络层

现在我们来学习这两部分是如何工作的。要了解多头注意力机制的工作原理,我们首先需要理解什么是自注意力机制。

2.2 自注意力机制

让我们通过一个例子来快速理解自注意力机制。请看下面的例句:
A dog ate the food because it was hungry(一只狗吃了食物,因为它很饿)

例句中的代词it(它)可以指代dog(狗)或者food(食物)。当读这段文字的时候,我们自然而然地认为it指代的是dog,而不是food。但是当计算机模型在面对这两种选择时该如何决定呢?这时,自注意力机制有助于解决这个问题。

还是以上句为例,我们的模型首先需要计算出单词A的特征值,其次计算dog的特征值,然后计算ate的特征值,以此类推。当计算每个词的特征值时,模型都需要遍历每个词与句子中其他词的关系。模型可以通过词与词之间的关系来更好地理解当前词的意思。

比如,当计算it的特征值时,模型会将it与句子中的其他词一一关联,以便更好地理解它的意思。如下图所示,it的特征值由它本身与句子中其他词的关系计算所得。通过关系连线,模型可以明确知道原句中it所指代的是dog而不是food,这是因为it与dog的关系更紧密,关系连线相较于其他词也更粗。
在这里插入图片描述
我们已经初步了解了什么是自注意力机制,下面我们将关注它具体是如何实现的。

为简单起见,我们假设输入句(原句)为I am good(我很好)。首先,我们将每个词转化为其对应的词嵌入向量。需要注意的是,嵌入只是词的特征向量,这个特征向量也是需要通过训练获得的。
单词I的词嵌入向量可以用x1来表示,相应地,am为x2,good为x3,即:

  • 单词I的词嵌入向量 x 1 = [ 1.76 , 2.22 , … … , 6.66 ] x_1 = [1.76, 2.22 ,……, 6.66] x1=[1.76,2.22,……,6.66]
  • 单词am的词嵌入向量 x 2 = [ 7.77 , 0.631 , … … , 5.35 ] x_2 = [7.77, 0.631 ,……, 5.35] x2=[7.77,0.631,……,5.35]
  • 单词good的词嵌入向量 x 3 = [ 11.44 , 10.10 , … … , 3.33 ] x_3 = [11.44, 10.10 ,……, 3.33] x3=[11.44,10.10,……,3.33]

这样一来,原句I am good就可以用一个矩阵[插图](输入矩阵或嵌入矩阵)来表示,如下图所示。
在这里插入图片描述

图1-6中的值为随意设定,只是为了让我们更好地理解其背后的数学原理。

通过输入矩阵X,我们可以看出,矩阵的第一行表示单词I的词嵌入向量。以此类推,第二行对应单词am的词嵌入向量,第三行对应单词good的词嵌入向量。所以矩阵X的维度为[句子的长度×词嵌入向量维度]。原句的长度为3,假设词嵌入向量维度为512,那么输入矩阵的维度就是[3×512]。

现在通过矩阵X,我们再创建三个新的矩阵:查询(query)矩阵Q、键(key)矩阵K,以及值(value)矩阵V。等一下,怎么又多了三个矩阵?为何需要创建它们?接下来,我们将继续了解在自注意力机制中如何使用这三个矩阵。

为了创建查询矩阵、键矩阵和值矩阵,我们需要先创建另外三个权重矩阵,分别为 W Q 、 W K 、 W V W^Q 、W^K、W^V WQWKWV。用矩阵X分别乘以矩阵 W Q 、 W K 、 W V W^Q 、W^K、W^V WQWKWV,就可以依次创建出查询矩阵Q、键矩阵K和值矩阵V。

值得注意的是,权重矩阵 W Q 、 W K 、 W V W^Q 、W^K、W^V WQWKWV的初始值完全是随机的,但最优值则需要通过训练获得。我们取得的权值越优,通过计算所得的查询矩阵、键矩阵和值矩阵也会越精确。

如图所示,将输入矩阵X分别乘以 W Q 、 W K 、 W V W^Q 、W^K、W^V WQWKWV后,我们就可以得出对应的查询矩阵、键矩阵和值矩阵。

在这里插入图片描述
根据上图,我们可以总结出以下三点。

  • 三个矩阵的第一行 q 1 , k 1 , v 1 q_1,k_1,v_1 q1,k1,v1分别代表单词I的查询向量、键向量和值向量。
  • 三个矩阵的第二行 q 2 , k 2 , v 2 q_2,k_2,v_2 q2,k2,v2分别代表单词am的查询向量、键向量和值向量。
  • 三个矩阵的第三行 q 3 , k 3 , v 3 q_3,k_3,v_3 q3,k3,v3分别代表单词good的查询向量、键向量和值向量。

因为每个向量的维度均为64,所以对应的矩阵维度为[句子长度×64]。因为我们的句子长度为3,所以代入后可得维度为[3×64]。至此,我们还是不明白为什么要计算这些值。该如何使用查询矩阵、键矩阵和值矩阵呢?它们怎样才能用于自注意力模型呢?这些问题将在下面进行解答。

2.3 理解自注意力机制

目前,我们学习了如何计算查询矩阵Q、键矩阵K和值矩阵V,并知道它们是基于输入矩阵X计算而来的。现在,让我们学习查询矩阵、键矩阵和值矩阵如何应用于自注意力机制。

要计算一个词的特征值,自注意力机制会使该词与给定句子中的所有词联系起来。还是以I am good这句话为例。为了计算单词I的特征值,我们将单词I与句子中的所有单词一一关联,如图所示。
在这里插入图片描述
了解一个词与句子中所有词的相关程度有助于更精确地计算特征值。现在,让我们学习自注意力机制如何利用查询矩阵、键矩阵和值矩阵将一个词与句子中的所有词联系起来。自注意力机制包括4个步骤,我们来逐一学习。

第1步

自注意力机制首先要计算查询矩阵Q与键矩阵V的点积,两个矩阵如图所示。
在这里插入图片描述
下图显示了查询矩阵Q与键矩阵 K T K^T KT的点积结果
在这里插入图片描述
但为何需要计算查询矩阵与键矩阵的点积呢? Q ⋅ K T Q · K^T QKT到底是什么意思?下面,我们将通过细看 Q ⋅ K T Q · K^T QKT的结果来理解以上问题。

首先,来看[插图]矩阵的第一行,如下图所示。可以看到,这一行计算的是查询向量 q 1 q_1 q1(I)与所有的键向量 k 1 k_1 k1(I)、 k 2 k_2 k2(am)和 k 3 ( g o o d ) k_3(good) k3(good)的点积。通过计算两个向量的点积可以知道它们之间的相似度。

因此,通过计算查询向量( q 1 q_1 q1)和键向量( k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3)的点积,可以了解单词I与句子中的所有单词的相似度。我们了解到,I这个词与自己的关系比与am和good这两个词的关系更紧密,因为点积值 q 1 ⋅ k 1 q_1·k_1 q1k1大于 q 1 ⋅ k 2 q_1·k_2 q1k2 q 1 ⋅ k 3 q_1·k_3 q1k3
在这里插入图片描述

注意,这里使用的数值是任意选择的,只是为了让我们更好地理解背后的数学原理。

现在来看 Q ⋅ K T Q · K^T QKT矩阵的第二行,如下图所示。现在需要计算查询向量 q 2 q_2 q2(am)与所有的键向量 k 1 k_1 k1(I)、 k 2 k_2 k2(am)和 k 3 ( g o o d ) k_3(good) k3(good)的点积。这样一来,我们就可以知道am与句中所有词的相似度。通过查看 Q ⋅ K T Q · K^T QKT矩阵的第二行可以知道,单词am与自己的关系最为密切,因为点积值最大。

在这里插入图片描述
同理,来看 Q ⋅ K T Q · K^T QKT矩阵的第三行。如下图所示,计算查询向量 q 3 q_3 q3(good)与所有键向量 k 1 k_1 k1(I)、 k 2 k_2 k2(am)和 k 3 ( g o o d ) k_3(good) k3(good)的点积。
从结果可知,good与自己的关系更密切,因为点积值 q 3 ⋅ k 3 q_3·k_3 q3k3大于 q 3 ⋅ k 1 q_3·k_1 q3k1 q 3 ⋅ k 2 q_3·k_2 q3k2

在这里插入图片描述
综上所述,计算查询矩阵Q与键矩阵 K V K^V KV的点积,从而得到相似度分数。这有助于我们了解句子中每个词与所有其他词的相似度。

第2步

自注意力机制的第2步是将 Q ⋅ K T Q · K^T QKT矩阵除以键向量维度的平方根。这样做的目的主要是获得稳定的梯度。

我们用 d k d_k dk来表示键向量维度。然后,将 Q ⋅ K T Q · K^T QKT除以 d k \sqrt{d_k} dk 。在本例中,键向量维度是64。取64的平方根,我们得到8。将第1步中算出的 Q ⋅ K T Q · K^T QKT除以8,如下图所示。

在这里插入图片描述

第3步

目前所得的相似度分数尚未被归一化,我们需要使用softmax函数对其进行归一化处理。如下图所示,应用softmax函数将使数值分布在0到1的范围内,且每一行的所有数之和等于1。

在这里插入图片描述
我们将上图中的矩阵称为分数矩阵。通过这些分数,我们可以了解句子中的每个词与所有词的相关程度。以图中的分数矩阵的第一行为例,它告诉我们,I这个词与它本身的相关程度是90%,与am这个词的相关程度是7%,与good这个词的相关程度是3%。

第4步

至此,我们计算了查询矩阵与键矩阵的点积,得到了分数,然后用softmax函数将分数归一化。自注意力机制的最后一步是计算注意力矩阵Z。注意力矩阵包含句子中每个单词的注意力值。它可以通过将分数矩阵softmax ( Q ⋅ K T / d k Q · K^T/\sqrt{d_k} QKT/dk )乘以值矩阵V得出,如图所示。
在这里插入图片描述
假设计算结果如下图所示。
在这里插入图片描述注意力矩阵Z就是值向量与分数加权之后求和所得到的结果。让我们逐行理解这个计算过程。首先,第一行 z 1 z_1 z1对应I这个词的自注意力值,它通过下图所示的方法计算所得。
在这里插入图片描述
从上图中可以看出,单词I的自注意力值 z 1 z_1 z1是分数加权的值向量之和。所以, z 1 z_1 z1的值将包含90%的值向量 v 1 v_1 v1(I)、7%的值向量 v 2 v_2 v2(am),以及3%的值向量 v 3 v_3 v3(good)。

这有什么用呢?为了回答这个问题,让我们回过头去看之前的例句:A dog ate the food because it was hungry(一只狗吃了食物,因为它很饿)。在这里,it这个词表示dog。我们将按照前面的步骤来计算it这个词的自注意力值。假设计算过程如图所示。
在这里插入图片描述
从图中可以看出,it这个词的自注意力值包含100%的值向量 v 2 v_2 v2(dog)。这有助于模型理解it这个词实际上指的是dog而不是food。这也再次说明,通过自注意力机制,我们可以了解一个词与句子中所有词的相关程度。回到I am good这个例子,单词am的自注意力值 v 2 v_2 v2也是分数加权的值向量之和,如图所示。
在这里插入图片描述
从上图中可以看出, z 2 z_2 z2的值包含2.5%的值向量 v 1 v_1 v1(I)、95%的值向量 v 2 v_2 v2(am),以及2.5%的值向量 v 3 v_3 v3(good)。

同样,单词good的自注意力值 z 3 z_3 z3也是分数加权的值向量之和,如图所示。
在这里插入图片描述
可见, z 3 z_3 z3的值包含21%的值向量 v 1 v_1 v1(I)、3%的值向量 v 2 v_2 v2(am),以及76%的值向量 v 3 v_3 v3(good)。

综上所述,注意力矩阵Z由句子中所有单词的自注意力值组成,它的计算公式如下。

Z = s o f t m a x ( Q ⋅ K T d k ) V Z = softmax(\frac{Q·K^T}{\sqrt{d_k}})V Z=softmax(dk QKT)V

现将自注意力机制的计算步骤总结如下:
(1) 计算查询矩阵与键矩阵的点积 Q ⋅ K T Q·K^T QKT,求得相似值,称为分数;
(2) 将[插图]除以键向量维度的平方根 d k \sqrt{d_k} dk
(3) 用softmax函数对分数进行归一化处理,得到分数矩阵 s o f t m a x ( Q ⋅ K T d k ) softmax(\frac{Q·K^T}{\sqrt{d_k}}) softmax(dk QKT)
(4) 通过将分数矩阵与值矩阵 V V V相乘,计算出注意力矩阵 Z Z Z
自注意力机制的计算流程图如图所示。

在这里插入图片描述
自注意力机制也被称为缩放点积注意力机制,这是因为其计算过程是先求查询矩阵与键矩阵的点积,再用 d k \sqrt{d_k} dk 对结果进行缩放。

我们已经了解了自注意力机制的工作原理。在下节中,我们将了解多头注意力层。

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

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

相关文章

从入门到精通:AI绘画与修图实战指南

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在这篇文章中,我们将深入探讨如何利…

一篇博客教会你让Spring扫描自定义注解

文章目录 自定义注解使用注解Spring 管理其他 Spring 支持扫描开发人员自定义的注解,从而使开发人员更加灵活方便地使用注解。 自定义注解 我们可以在我们自定义的注解上添加 Spring 的 Component 注解,这样 Spring 框架就会将我们自定义的注解标识的类…

Avalonia 初学笔记(1):环境配置

文章目录 相关链接前言Avalonia 官方文档Avalonia 环境配置我的本地环境下载Visual Studio Avalonia 插件 Avalonia 新建项目平台选择新建项目平台选择设计器选择扩展选择最终选择 默认项目运行 Avalonia 官方Demo总结 相关链接 Avalonia学习笔记 CSDN博客专栏 前言 最近想了解…

揭秘智能商品计划管理系统:为何服装企业老板争相引入?

在如今日新月异的商业环境中,服装企业老板们纷纷将目光转向了一种名为“智能商品计划管理系统”的创新工具。这种系统不仅具有高度的自动化和智能化特性,还能显著提升企业的运营效率、减少库存积压,并帮助企业在激烈的市场竞争中占据优势地位…

springboot当中使用EMQX(MQTT协议)

本篇博客主要围绕EMQX是什么?、能干什么?、怎么用? 三点来进行整理。 1、MQTT协议 1.1、MQTT简介 在了解EMQX前首先了解一下MQTT协议,MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输&#xff0…

【从Python基础到深度学习】 8. VIM两种状态

一、安装 sudo apt install vim 二、VIM两种模式 - 命令状态/编辑状态 1.1 进入/退出VIM 进入VIM vim 退出vim :q <enter> 2.2 根目录下添加配置文件 window下创建vimrc类型文件内容如下&#xff1a; set nu set cursorline set hlsearch set tabstop4 使用Wins…

如何在CentOS安装SQL Server数据库并实现无公网ip环境远程连接

文章目录 前言1. 安装sql server2. 局域网测试连接3. 安装cpolar内网穿透4. 将sqlserver映射到公网5. 公网远程连接6.固定连接公网地址7.使用固定公网地址连接 前言 简单几步实现在Linux centos环境下安装部署sql server数据库&#xff0c;并结合cpolar内网穿透工具&#xff0…

http相关概念以及apache的功能

概念 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络 万维网&#xff1a;www &#xff08;不是网络&#xff0c;而是数据库&#xff09;是网页与网页之间的跳转关系 URL:万维网使用统一资源定位符&#xff0c;…

【JVM篇】ThreadLocal中为什么要使用弱引用

文章目录 &#x1f354;ThreadLocal中为什么要使用弱引用⭐总结 &#x1f354;ThreadLocal中为什么要使用弱引用 ThreadLocal可以在线程中存放线程的本地变量&#xff0c;保证数据的线程安全 ThreadLocal是这样子保存对象的&#xff1a; 在每个线程中&#xff0c;存放了一个…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十一章 基础界面开发 (组件封装和使用)

前言 Vue 是前端开发中非常常见的一种框架&#xff0c;它的易用性和灵活性使得它成为了很多开发者的首选。而在 Vue2 版本中&#xff0c;组件的开发也变得非常简单&#xff0c;但随着 Vue3 版本的发布&#xff0c;组件开发有了更多的特性和优化&#xff0c;为我们的业务开发带…

有事休假店铺无人看守怎么办?智能远程视频监控系统保卫店铺安全

在春节期间&#xff0c;很多自营店主也得到了久违的假期&#xff0c;虽然很多店主都是长期在店铺中看守&#xff0c;但遇到春节这样的日子&#xff0c;多数人还是选择回乡休假。面对店主休假或有事不能管理店铺时&#xff0c;传统的监控虽然可以做到单一的监控&#xff0c;却仍…

用HTML Canvas和JavaScript创建美丽的花朵动画效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>炫酷花朵</title><style>* {margin: 0;padding: 0;overflow: hidden;bac…

Windows 使设置更改立即生效——并行发送广播消息

目录 前言 1 遍历窗口句柄列表 2 使用 SendMessageTimeout 发送延时消息 3 并行发送消息实现模拟广播消息 4 修改 UIPI 消息过滤器设置 5 托盘图标刷新的处理 6 完整代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_5907…

不知如何获取1688工厂档案信息,你还在为此烦恼吗?

阿里巴巴集团旗下的B2B电子商务网站&#xff0c;提供海量优质商品&#xff0c;为采购商和供应商提供交流、合作、采购等服务&#xff0c;是很多没有货源优势的电商卖家首选的货源途径&#xff0c;也是国内最大、货源种类最齐全的货源网站。 不少做跨境电商无货源的朋友都想要1…

c# #if 与 Conditional属性宏的区别

测试代码 using System; using System.Diagnostics;namespace ConsoleApp1 {public class TestClass{[Conditional("Debug1")]public static void Func1(){Console.WriteLine("Conditional 宏");}public static void Func2(){ #if Debug2Console.WriteLin…

欠定方程组及其求解

欠定方程组是指方程的数量少于未知数的数量的方程组。在这种情况下&#xff0c;通常有无限多个解&#xff0c;因为给定的方程不足以唯一确定所有未知数的值。在某些情况下&#xff0c;我们可以利用额外的信息或假设&#xff0c;如稀疏性或其他约束&#xff0c;来找到一个合理的…

AT24C02(I2C总线)通信的学习

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、存储器介绍二、AT24C02芯片二、I2C总线I2C电路规范I2C时序结构I2C数据帧AT24C02数据帧 总结 前言 学习AT24C02(I2C总线)芯片 一、存储器介绍 RAM&#xf…

更改WordPress作者存档链接author和Slug插件Edit Author Slug

WordPress默认所有用户的存档永久链接都是/author/username/&#xff0c;不管是管理员还是订阅者或贡献者或作者或编辑。如果你想要自定义用户存档链接&#xff0c;比如根据角色不同使用不一样的author&#xff0c;或者自定义作者链接中的用户名Slug&#xff0c;那么建议考虑使…

解决kkFileView4.4.0版本pdf、word不能预览问题

这里使用的是http下载流url预览&#xff0c;遇到的问题。 官方使用指南&#xff1a;kkFileView - 在线文件预览 1 前端测试代码 1.1 官方示例代码 1.2 本人测试代码 注意&#xff1a;要给预览文件的url进行编码encodeURIComponent(Base64.encode(previewUrl))。 <!DOCTYP…

人工智能|机器学习——基于机器学习的舌苔检测

代码下载&#xff1a; 基于深度学习的舌苔检测毕设留档.zip资源-CSDN文库 1 研究背景 1.1.研究背景与意义 目前随着人们生活水平的不断提高&#xff0c;对于中医主张的理念越来越认可&#xff0c;对中医的需求也越来越多。在诊断中&#xff0c;中医通过观察人的舌头的舌质、苔…