深度学习(八):bert理解之transformer

1.主要结构

transformer 是一种深度学习模型,主要用于处理序列数据,如自然语言处理任务。它在 2017 年由 Vaswani 等人在论文 “Attention is All You Need” 中提出。

Transformer 的主要特点是它完全放弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),而是完全依赖于注意力机制(Attention Mechanism)来捕捉输入序列中的模式。

Transformer 的主要组成部分包括:
在这里插入图片描述

1.自注意力机制(Self-Attention):自注意力机制能够处理序列数据,并且能够关注到序列中的任何位置,从而捕捉到长距离的依赖关系。

2.位置编码(Positional Encoding):由于 Transformer 没有循环和卷积操作,所以需要额外的位置编码来捕捉序列中的顺序信息。

3.编码器和解码器(Encoder and Decoder):Transformer 模型由编码器和解码器组成。编码器用于处理输入序列,解码器用于生成输出序列。编码器和解码器都是由多层自注意力层和全连接层堆叠而成。

2.自注意力机制

个人理解就是把字符编码后通过公式相乘变为另一个向量。

通过关注X中的词嵌入,我们在Y中生成了复合嵌入(加权平均值)。例如,Y中的dog嵌入是X中的the、dog和ran嵌入的组合,权重分别为0.2、0.7 和0.1。

构建词嵌入如何帮助模型实现理解语言的最终目标?要完全理解语言,仅仅理解组成句子的各个单词是不够的;还需要理解组成句子的各个单词。模型必须理解单词在句子上下文中如何相互关联。注意力机制通过形成模型可以推理的复合表示,使模型能够做到这一点。例如,当语言模型尝试预测句子“the runningdog was ___”中的下一个单词时,除了单独的“running ”或“dog”概念之外,模型还应该理解“runningdog”的复合概念;例如,走狗经常喘气,所以喘气是句子中合理的下一个词。在这里插入图片描述

2.1注意力可视化

通过bertviz可视化,bert模型记得替换

from bertviz import head_view, model_view
from transformers import BertTokenizer, BertModel
import imageio
model_version = 'D:\PycharmProjects\Multimodal emotion\model\\bert-base-chinese'
model = BertModel.from_pretrained(model_version, output_attentions=True)
tokenizer = BertTokenizer.from_pretrained(model_version)
sentence_a = "好不好?燕子,你要开心,你要幸福,好不好?"
sentence_b = "开心啊,幸福。你的世界以后没有我了,没关系,你要自己幸福。"
inputs = tokenizer.encode_plus(sentence_a, sentence_b, return_tensors='pt')
print(inputs)
input_ids = inputs['input_ids']
print(input_ids)
token_type_ids = inputs['token_type_ids']
print(token_type_ids)
attention = model(input_ids, token_type_ids=token_type_ids)[-1]
print(attention)
sentence_b_start = token_type_ids[0].tolist().index(1)
print(sentence_b_start)
input_id_list = input_ids[0].tolist() # Batch index 0
print(input_id_list)
tokens = tokenizer.convert_ids_to_tokens(input_id_list) 
print(tokens)head_view(attention, tokens, sentence_b_start)

下面的可视化(在此处以交互形式提供)显示了示例输入文本引起的注意力。该视图将注意力可视化为连接正在更新的单词(左)和正在关注的单词(右)的线,遵循上图的设计。颜色强度反映注意力权重;接近 1 的权重显示为非常暗的线条,而接近 0 的权重显示为微弱的线条或根本不可见。用户可以突出显示特定单词以仅看到来自该单词的注意力。
在这里插入图片描述

升级一下,来讲多头注意力

它扩展了模型关注不同位置的能力。原来的编码 包含一些其他编码,但它可能由实际单词本身主导。如果我们翻译一个句子,比如“The Animal did not cross the street because it was tooert”,那么知道“it”指的是哪个单词会很有用。

它为注意力层提供了多个“表示子空间”。正如我们接下来将看到的,通过多头注意力,我们不仅拥有一组查询/键/值权重矩阵,而且拥有多组查询/键/值权重矩阵(Transformer 使用八个注意力头,因此我们最终为每个编码器/解码器提供八组,但是bert用12或24) 。这些集合中的每一个都是随机初始化的。然后,在训练之后,每个集合用于将输入嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。

BERT 还堆叠了多个注意力层,每个注意力层都对前一层的输出进行操作。通过这种词嵌入的重复组合,BERT 能够在到达模型最深层时形成非常丰富的表示。我们接着写代码展示

model_view(attention, tokens, sentence_b_start)

由于注意力头不共享参数,因此每个头都会学习独特的注意力模式。我们在这里考虑的 BERT 版本——BERT Base——有 12 层和 12 个头,总共有 12 x 12 = 144 个不同的注意力机制。我们可以使用模型视图(此处以交互形式提供)同时可视化所有头部的注意力:

在这里插入图片描述
接着我们引入一些概念:

  • 查询 q:查询 向量q编码左侧正在关注的单词,即“查询”其他单词的单词。在上面的示例中,“on”(所选单词)的查询向量被突出显示。

  • 密钥k:密钥向量k对右侧所关注的单词进行编码。关键字向量和查询向量一起确定两个单词之间的兼容性分数。

  • q×k (elementwise):所选单词的查询向量与每个键向量之间的元素乘积。这是点积(元素乘积之和)的前身,包含在内是为了可视化目的,因为它显示了查询和键向量中的各个元素如何对点积做出贡献。

  • q·k:所选查询向量和每个关键 向量的缩放点积(见上文)。这是非标准化注意力分数。 Softmax:缩放点积的

  • Softmax。这会将注意力分数标准化为正值且总和为 1。
    代码

from bertviz.transformers_neuron_view import BertModel, BertTokenizer
from bertviz.neuron_view import showmodel_type = 'bert'
model_version = 'D:\PycharmProjects\Multimodal emotion\model\\bert-base-chinese'
model = BertModel.from_pretrained(model_version, output_attentions=True)
tokenizer = BertTokenizer.from_pretrained(model_version, do_lower_case=True)
show(model, model_type, tokenizer, sentence_a, sentence_b, layer=4, head=3)

该视图跟踪从左侧所选单词到右侧完整单词序列的注意力计算。正值显示为蓝色,负值显示为橙色,颜色强度代表大小。与前面介绍的注意力头视图一样,连接线表示相连单词之间的注意力强度。
在这里插入图片描述

2.2原理

回顾上面我所说的概念,运用如下公式
在这里插入图片描述
计算得分,多头是这样子的,就是增加了维度,把多头注意力拼接在一起
在这里插入图片描述
transformer的结构:
在这里插入图片描述
经历多头注意力再经过归一化层和前馈神经网络,每个head64维,因为有8个head,应该得到512维,但是bert有12个head,应该得到768维。
举个简单的例子来理解一下
这是利用transformer进行翻译
在这里插入图片描述
在这里插入图片描述
encoders是编码器,decoders是解码器。

3.Positional Encoding

一句话概括,Positional Encoding就是句子中词语相对位置的编码,让Transformer保留词语的位置信息。
t t t表示当前词语在句子中的位置,
p t → \overrightarrow{p_t} pt 表示的是该词语对应的位置编码,
d d d表示的是编码的维度。
公式如下
p t → = [ sin ⁡ ( ω 1 . t ) cos ⁡ ( ω 1 . t ) sin ⁡ ( ω 2 . t ) cos ⁡ ( ω 2 . t ) ⋮ sin ⁡ ( ω d / 2 . t ) cos ⁡ ( ω d / 2 . t ) ] d × 1 \left.\overrightarrow{p_t}=\left[\begin{array}{c}\sin(\omega_1.t)\\\cos(\omega_1.t)\\\\\sin(\omega_2.t)\\\cos(\omega_2.t)\\\\\vdots\\\\\sin(\omega_{d/2}.t)\\\cos(\omega_{d/2}.t)\end{array}\right.\right]_{d\times1} pt = sin(ω1.t)cos(ω1.t)sin(ω2.t)cos(ω2.t)sin(ωd/2.t)cos(ωd/2.t) d×1
从公式可以看出,其实一个词语的位置编码是由不同频率的余弦函数函数组成的,从低位到高位。
不同频率的sines和cosines组合其实也是同样的道理,通过调整三角函数的频率,我们可以实现这种低位到高位的变化,这样的话,位置信息就表示出来了。

在这里插入图片描述

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

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

相关文章

智能优化算法应用:基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.爬行动物算法4.实验参数设定5.算法结果6.…

PHP函数定义和分类

函数的含义和定义格式 在PHP中,允许程序员将常用的流程或者变量等组件组织成一个固定的格式实现特定功能,也就是说函数是具有特定功能特定格式的代码段。 函数的定义格式如下: function 函数名(参数1,参数2,参数n) {…

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点,关于vue的路由守卫。也就是鉴权,不是所有的组件任何人都可以访问到的,需要权限,而根据权限…

Hadoop入门学习笔记——六、连接到Hive

视频课程地址:https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接:https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记(汇总) 目录 六、连接到Hive6.1. 使用Hive的Shell客户端6.2. 使用Beel…

vue3(五)-基础入门之计算属性

一、计算属性 1.计算属性与普通方法的的区别: 计算属性在需要渲染数据时调用一次,而后将结果缓存起来。只有计算属性所依赖的数据发生改变时才会重新调用函数,否则每次渲染相同的数据都只会从缓存中读取。 普通方法在每次数据需要渲染时都会…

CGAL的网格简化

1、介绍 曲面网格简化是减少曲面网格中使用的面数,同时尽可能保持整体形状、体积和边界的过程。它是细分法的反面。 这里提出的算法可以使用称为边折叠的方法简化任何有向2流形曲面,具有任意数量的连接组件,有或没有边界(边界或孔…

为什么react call api in cDidMount

为什么react call api in cDM 首先,放到constructor或者cWillMount不是语法错误 参考1 参考2 根据上2个参考,总结为: 1、官网就是这么建议的: 2、17版本后的react 由于fiber的出现导致 cWM 会调用多次! cWM 方法已…

Redis数据一致解决方案

文章目录 前言技术积累查询缓存业务流程更新缓存业务流程 更新缓存问题解决方案写在最后 前言 当前的应用服务很多都有着高并发的业务场景,对于高并发的解决方案一般会用到缓存来降低数据库压力,并且还能够提高系统性能减少请求耗时,比如我们…

深度学习(七):bert理解之输入形式

传统的预训练方法存在一些问题,如单向语言模型的局限性和无法处理双向上下文的限制。为了解决这些问题,一种新的预训练方法随即被提出,即BERT(Bidirectional Encoder Representations from Transformers)。通过在大规模…

蓝牙技术在物联网中的应用

随着蓝牙技术的不断演进和发展,蓝牙已经从单一的传统蓝牙技术发展成集传统蓝牙。高速蓝牙和低耗能蓝牙于一体的综合技术,不同的应用标准更是超过40个越来越广的技术领域和越来越多的应用场景,使得目前的蓝牙技术成为包含传感器技术、识别技术…

【Spring Security】打造安全无忧的Web应用--使用篇

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Spring Security的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Spring Security中的授权是…

Netty-2-数据编解码

解析编解码支持的原理 以编码为例,要将对象序列化成字节流,你可以使用MessageToByteEncoder或MessageToMessageEncoder类。 这两个类都继承自ChannelOutboundHandlerAdapter适配器类,用于进行数据的转换。 其中,对于MessageToMe…

基于 Webpack 插件体系的 Mock 服务

背景 在软件研发流程中,对于前后端分离的架构体系而言,为了能够更快速、高效的实现功能的开发,研发团队通常来说会在产品原型阶段对前后端联调的数据接口进行结构设计及约定,进而可以分别同步进行对应功能的实现,提升研…

深度学习 | 基础卷积神经网络

卷积神经网络是人脸识别、自动驾驶汽车等大多数计算机视觉应用的支柱。可以认为是一种特殊的神经网络架构,其中基本的矩阵乘法运算被卷积运算取代,专门处理具有网格状拓扑结构的数据。 1、全连接层的问题 1.1、全连接层的问题 “全连接层”的特点是每个…

kubernetes集群 应用实践 kafka部署

kubernetes集群 应用实践 kafka部署 零.1、环境说明 零.2、kafka架构说明 zookeeper在kafka集群中的作用 一、Broker注册 二、Topic注册 三、Topic Partition选主 四、生产者负载均衡 五、消费者负载均衡 一、持久化存储资源准备 1.1 创建共享目录 [rootnfsserver ~]# mkdir -…

锯齿云服务器租赁使用教程

首先登陆锯齿云账号 网盘上传数据集与代码 随后我们需要做的是将所需要的数据集与代码上传到网盘(也可以直接在租用服务器后将数据集与代码传到服务器的硬盘上,但这样做会消耗大量时间,造成资源浪费) 点击工作空间:…

谷粒商城-商品服务-新增商品功能开发(商品图片无法展示问题没有解决)

在网关配置路由 - id: member_routeuri: lb://gulimemberpredicates:- Path/api/gulimember/**filters:- RewritePath/api/(?<segment>.*),/$\{segment}并将所有逆向生成的工程调式出来 获取分类关联的品牌 例如&#xff1a;手机&#xff08;分类&#xff09;-> 品…

Python算法例26 落单的数Ⅳ

1. 问题描述 给定数组&#xff0c;除了一个数出现一次外&#xff0c;所有数都出现两次&#xff0c;并且所有出现两次的数都挨着&#xff0c;找出出现一次的数。 2. 问题示例 给出nums[3&#xff0c;3&#xff0c;2&#xff0c;2&#xff0c;4&#xff0c;5&#xff0c;5]&am…

ZooKeeper 使用介绍和原理详解

目录 1. 介绍 重要性 应用场景 2. ZooKeeper 架构 服务角色 数据模型 工作原理 3. 安装和配置 下载 ZooKeeper 安装和配置 启动 ZooKeeper 验证和管理 停止和关闭 4. ZooKeeper 数据模型 数据结构和层次命名空间&#xff1a; 节点类型和 Watcher 机制&#xff…

基于python的excel检查和读写软件

软件版本&#xff1a;python3.6 窗口和界面gui代码&#xff1a; class mygui:def _init_(self):passdef run(self):root Tkinter.Tk()root.title(ExcelRun)max_w, max_h root.maxsize()root.geometry(f500x500{int((max_w - 500) / 2)}{int((max_h - 300) / 2)}) # 居中显示…