白话transformer(一):注意力机制

前面我们分篇讲述了transformer的原理,但是对于很多刚接触transformer的人来说可能会有一点懵,所以我们接下来会分三篇文章用白话的形式在将transformer 讲一遍。
前文链接
Bert基础(一)–自注意力机制

Bert基础(二)–多头注意力

Bert基础(三)–位置编码

Bert基础(四)–解码器(上)

Bert基础(五)–解码器(下)

注意力机制其实最大的作用就是对词嵌入也就是embedding的优化,下面我们来看下是怎么做到的

1、 词嵌入

我们人类最擅长的就是自然语言的表达,而计算机擅长的事数字的计算,如何将人类的表达方式让计算机能够理解呢,就需要一个桥梁连接起来。

这个桥梁就是embedding,embedding 即词嵌入,是NLP领域最重要部分;embedding就是将文本变成数字,让每个或者每段文本都有很好的与之对应的数字表示,那么需要解决的问题就会变得容易很多,embeddings 越好模型就会越好
在这里插入图片描述

2、 例子

在这里插入图片描述
我们这里有一堆文本单词,在一个二维的坐标系中,每个单词都有一个水平和垂直的坐标,比如香蕉是6,5,

那么现在出现了一个新的单词,apple(🍎),如果让我们给苹果安排一个位置,应该在哪里最合适呢?

很明显是右上角,因为这里全部是水果,embedding的作用就是相似的单词会被赋予相似的数字
在这里插入图片描述

当然,对于一个单词其实不会只有两个维度,可以使很多,分别来表示其中一个属性,比如大小、颜色、形状等,如下
在这里插入图片描述

3、 问题

现在我们重新定义一个坐标系
在这里插入图片描述
右上角是草莓和橘子,左下角是苹果和window系统;根据我们的正常理解,右上角是水果类,左下角是计算机类;

OK,下面我们又有几个新的单词出现了,需要我们预测他们的坐标。

在这里插入图片描述

我们其实很容易的可以区分,车厘子和香蕉是水果,应该在右上角;安卓和电脑应该属于计算机那个类别,放在右下角。
在这里插入图片描述

到现在为止,事情看上去还是很简单的,但是现在来了一个单词苹果(apple)

这个单词应该放在哪里呢???

苹果如果表示吃的水果应该在右上角,如果是手机的话应该在左下角。而对于embedding而言,不管是自己创建Vocabulary单词表还是使用word2vec,都不能解决歧义。

我们先把单词苹果(apple)放在中间的位置,那么我们该如何解决这个问题的,下面注意力就要出场了。

4、 注意力机制

注意力机制就是来解决单词歧义问题的
在这里插入图片描述

论文中提到的注意力就是使用了查询、键、值三个矩阵,我们在介绍中不是为了解释论文架构,而是说清楚注意力到底是怎么实现的。

在这里插入图片描述
现在我们来看两个文本,根据第一句话我们应该明白,这里面提到了橘子,我们人类是知道橙子属于水果,提到苹果这个词语时,那么苹果应该是可以吃的苹果;同样在第二个句子中提到了手机,那么我们应该明白这里指的是苹果手机。
在这里插入图片描述

我们人类可以根据经验进行判断,但是计算机是不知道的

下面我们来看看注意力机制是如何做到的?

在前面我们提到了,我们先把苹果这个单词初始化,放在中间的位置;当输入是第一句话时,提到了orange,那么这个地方出现的apple应该向右上角移动。
在这里插入图片描述

而,第二句话出现时,apple这个单词应该向左下角移动
在这里插入图片描述
其相应的坐标如下
在这里插入图片描述

5、 原理

要想实现上述过程,计算机就必须要计算所有单词来查看或者评估苹果这个词,通过程序不断的训练会发现,苹果和橘子这两个词比较接近,而与其他的词关系不是很大,那么orang就与apple这个单词相关性更大,我们这里绘制了更粗的连线,我们可以把他们想象成单词之间是有相互吸引力的,连线越粗其吸引力越大,最后距离就会越近。
在这里插入图片描述

其实,所有的单词之间都有相互的吸引力,但是随着不断的训练,单词之间会趋于一个平衡,比如buy这个单词,与他相关的单词会相互吸引聚成一簇,比如sell等,而苹果、橘子等水果相关的词会聚集在一起,可以想象成Kmeans聚类算法。

或者想象一下我们的宇宙空间的星球,他们之间都是有作用力的,因为地球和月球比较近,相互吸引力越大,所以相关性越大;而月球与其他的相求也有吸引力,但是比起与地球之间的相互吸引力就太弱了,也就是月球的大部分注意力都在地球上。

在这里插入图片描述

所以如果上下文一直在讨论香蕉、橘子等水果,那么接下来出现的apple这个单词大概率就是我们吃的苹果,那么聚集在一起的水果这个簇就会把apple这个单词拉到水果簇中心的方向。

其实这就模型跟踪内容的方式,也就是注意力机制的可视化的步骤。

6、 多头注意力

当我们建立好了一个注意力机制后,那么我们怎么确定这是一个非常好的embedding呢?
理想情况下可以有很多的词嵌入,把他们结合起来形成一个更强大的词嵌入矩阵
我们看一下现在我们有三个初始化的embedding矩阵,自己想一下,哪一个词嵌入是最好的
在这里插入图片描述

当然是第一个,因为他可以把两个不同簇分得更开,更加容易辨别。当我们对apple进行训练时,不管结果是拉向橘子还是手机,他们在拉近一个的同时会远离另外一个,这样就类似于聚类时可以很确定的将这个点进行归类,消除歧义。

在这里插入图片描述

所以我们初始化一个词嵌入时,有可能是第一种好的,也有可能是第二个比较差的,所以我们多使用几个,获取得到好的embedding的概率就会越大。

7、 线性变换

当然如果嵌入多了也会有问题,如果我们从不同的方式或者维度进行创建词嵌入矩阵,那么结果会变的不可控制,所以我们不能仅仅采用一大堆的嵌入进行组合
我们要做的是建立一个词嵌入矩阵,在此基础上进行修改和转换,就是我们要讲的线性变换

在这里插入图片描述

比如我们对原始embedding进行了两种变换,那么大家可以考虑下那种变换是变得更好呢

很明显是第三种,那么现在我们为了能够选出更好的词嵌入,我们可以给出评分,好的词嵌入给高的分数,不好的给予低的分数

在这里插入图片描述

最终的得分就是查询矩阵、键矩阵和值矩阵要做的事情

在这里插入图片描述

  • 首先我们根据文本创建一初始的词嵌入,现在我们使用Q、K来创建变换
  • V矩阵帮助我们进行评分,好的变化给予高的权重,不好的赋值较低的权重
  • 根据得分我们将所有的矩阵进行加权求和得到最终的词嵌入

以上就是注意力机制的全部内容,下一篇会讲一下Q、K、V矩阵相关知识。。。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

独立游戏《星尘异变》UE5 C++程序开发日志1——项目与代码管理

写在前面:本日志系列将会向大家介绍在《星尘异变》这款模拟经营游戏,在开发时用到的与C相关的泛用代码与算法,主要记录UE5C与原生C的用法区别,以及遇到的问题和解决办法,因为这是我本人从ACM退役以后第一个从头开始的项…

类加载器分类

类加载器(Class Loader)是Java虚拟机(JVM)的一个重要组件,负责加载Java类到内存中并使其可以被JVM执行。类加载器是Java程序的核心机制之一。 主要有一下四种类加载器: (1)启动类加…

01tire算法

01tire算法 #include<bits/stdc.h> using namespace std; #define maxn 210000 int a[maxn], ch[maxn][2], val[maxn], n, ans, tot; void insert(int x) {int now 0;for (int j 31; j > 0; j -- ){int pos ((x >> i) & 1);if (!ch[now][pos])ch[now][po…

【贪心算法】专题练习二

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;买卖股票的最佳时机&#x1f449;&…

Android Stdio Execution failed for task ‘:app:compileDebugKotlin‘ 报错解决

具体报错信息如下&#xff1a; compileDebugJavaWithJavac task (current target is 1.8) and compileDebugKotlin task (current target is 17)jvm target compatibility should be set to the same Java version.很显然&#xff0c;这是一个版本冲突问题&#xff0c;compile…

深入理解C语言:开发属于你的三子棋小游戏

三子棋 1. 前言2. 准备工作3. 使用二维数组存储下棋的数据4. 初始化棋盘为全空格5. 打印棋盘6. 玩家下棋7. 电脑下棋8. 判断输赢9. 效果展示10. 完整代码 1. 前言 大家好&#xff0c;我是努力学习游泳的鱼&#xff0c;今天我们会用C语言实现三子棋。所谓三子棋&#xff0c;就是…

分享经典、现代和前沿软件工程课程

随着信息技术的发展&#xff0c;软件已经深入到人类社会生产和生活的各个方面。软件工程是将工程化的方法运用到软件的开发、运行和维护之中&#xff0c;以达到提高软件质量&#xff0c;降低开发成本的目的。软件工程已经成为当今最活跃、最热门的学科之一。 本次软件工程MOOC课…

跟着这份指南,让你的下拉列表设计更加顺畅!

下拉列表广泛应用于UI设计中&#xff0c;可以简化界面&#xff0c;帮助用户缩小选择范围&#xff0c;减轻用户认知负担&#xff0c;防止数据输入错误。但与此同时&#xff0c;它也是一个受到用户批评的灾区。在某些情况下&#xff0c;下拉列表不仅意义不大&#xff0c;而且对用…

全新攻击面管理平台

首页大屏 内测阶段&#xff0c;免费试用一个月 有兴趣体验的师傅&#xff0c;来长亭云图极速版群里找我 py

面试经典150题【51-60】

文章目录 面试经典150题【51-60】71.简化路径155.最小栈150.逆波兰表达式求值224.基本计算器141.环形链表2.两数相加21.合并两个有序链表138.随机链表的复制19.删除链表的倒数第N个节点82.删除链表中的重复元素II 面试经典150题【51-60】 71.简化路径 先用split(“/”)分开。然…

Flutter混合栈管理方案对比

1.Google官方&#xff08;多引擎方案&#xff09; Google官方建议的方式是多引擎方案&#xff0c;即每次使用一个新的FlutterEngine来渲染Widget树&#xff0c;存在的主要问题是每个引擎都要有比较大的内存等资源消耗&#xff0c;虽然Flutter 2.0之后的FlutterEngineGroup通过在…

如何选择O2OA(翱途)开发平台的部署架构?

概述 O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持公有云&#xff0c;私有云和混合云部署&#xff0c;也支持复杂的网络结构下的分布式部署。本篇主要介绍O2OA(翱途)开发平台支持的部署环境以及常用的集群部署架构。 软硬件环境说明 支持的云化平台&#xff1a; 华为云…

【算法】二叉搜索树的插入、删除、转换操作

1 二叉搜索树的插入操作 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能…

卷积神经网络(CNN)原理与实现

卷积神经网络(CNN) 卷积神经网络原理卷积神经网络的数学推导卷积层反向传播算法数学推导卷积层实现代码 卷积神经网络(CNN) 卷积神经网络原理 卷积神经网络是一种用于图像、语音、自然语言等数据的深度学习模型&#xff0c;其核心思想是使用卷积操作提取输入数据的特征&…

【开源项目】经典开源项目数字孪生智慧医院

飞渡科技数字孪生医院管理平台&#xff0c;融合数字孪生、物联网IOT、无线定位等技术&#xff0c;提供病房管理、医疗管理、照明管理、停车场管理等应用&#xff0c;同时结合完善的安防系统&#xff0c;立体化、全覆盖的视频监控体系&#xff0c;实现医院数字化卓越运营以及精细…

汇编语言程序设计实验二

实验目的和要求 继续学习使用DEBUG程序的各种命令。利用DEBUG学习了解计算机取指令、执行指令的工作过程。 掌握8086/8088基本指令的使用方法和功能。 实验环境 DOSBox 0.74 实验内容与过程 1&#xff0e; 按照下列给定步骤完成求累加和程序: 程序: MOV BX,1000MOV C…

MBR10200FCT-ASEMI适配开关电源MBR10200FCT

编辑&#xff1a;ll MBR10200FCT-ASEMI适配开关电源MBR10200FCT 型号&#xff1a;MBR10200FCT 品牌&#xff1a;ASEMI 封装&#xff1a;ITO-220AB 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;10A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xf…

BUUCTF---[极客大挑战 2019]Upload1

1.题目描述 2.点开链接&#xff0c;需要上传文件&#xff0c;要求是image&#xff0c;上传文件后缀为jpg的一句话木马&#xff0c;发现被检测到了 3.换另一个木马试试 GIF89a? <script language"php">eval($_REQUEST[1])</script> 发现可以上传成功 4…

(C语言)sizeof和strlen的对比(详解)

sizeof和strlen的对⽐&#xff08;详解&#xff09; 1. sizeof sizeof是用来计算变量所占内存空间大小的&#xff0c; 单位是字节&#xff0c;如果操作数是类型的话&#xff0c;计算的是用类型创建的变量所占空间的大小。 sizeof 只关注占用内存空间的大小 &#xff0c;不在乎内…

GitLab EE 企业版破解

在当今数字化时代&#xff0c;软件开发与团队协作已经成为现代企业不可或缺的一部分。而在这个过程中&#xff0c;版本控制、协作和持续集成等工具的运用变得至关重要。GitLab作为一个领先的、完整的DevOps平台&#xff0c;为团队提供了一个集成的解决方案&#xff0c;使得软件…