深入理解注意力机制(上)-起源

一、介绍

        近几年自然语言处理有很大的进展,从 2018 年 Google 推出的 BERT,到后来的 GPT、ChatGPT 等,这些模型当时能取得这样的成果,除了庞大的数据量及损害资源外,最重要的是的就是背后的Transformer模型,以及其使用的Attention Mechanism。

        今天这篇文章将分为两个部分,上一篇介绍序列到序列模型遇到的困难,为何要引入 Attentino 以及机制;下一篇则作用在 Transformer 背后的 Scaled Dot-Product Attention 以及实际的使用示例。

二、机器翻译

        在开始之前,我们先介绍一个自然语言处理的领域:机器翻译。

        翻译是一种典型的序列到序列(Sequence to Sequence)问题,意思就是:

  1. 输入是一个长度可以改变的序列(例如一个中文句子。“今天天气很晴朗”)
  2. 输出是一个长度可以改变的序列(例如一个英文句子。“今天阳光明媚”)

        假设今天 Transformer 还没有被发明,电脑会如何处理这类问题呢?

                直觉上会想到的作法大概就像上面这张图一样,分为两个步骤:

  1. 把输入序列(中文句子)一个字一个字读完
    在上面的表格中,每个 x 对应的就是一个字,而电脑会去读第一个字,读完后存起来,再读下一个字(先读「今」,再读「天」……),之后把所有资讯存在中间的上下文向量。
  2. 计算输出序列(中文句子)
    输出时,模型会根据上下文向量存储的信息,一个字一个字的输出(“it”, “'s”, “sunny”, ……)。

实践上确实可以用这样的模型制作机器翻译,但是上面的例句很短,如果今天我希望机器处理长一点的输入(例如这篇文章),那么会遇到下面的问题:

  1. 上下文向量维度太小,把比较前面的字给忘了
  2. 读完前面才能读后面,速度很慢

针对这一个问题,下面的模型提出了解方

通过联合学习对齐和翻译进行神经机器翻译

        这篇论文试图解决上面提出的第一点问题,概念其实很简单,既然 Context Vector 不可能存下整个输入句的信息,那我就在每次输出字的时候都看一遍整个句子就好了

        注意的做法就是在输出每个字的时候分别给输入的字每个一个权重,再让输入的句子做加权平均。

        在下面的模型中,输入的每个字会被先转成隐藏状态(下面的h,可以想成词嵌入),然后模型根据目前翻译到的字和每个字各自的隐藏状态来计算Attention分数。

        计算分数的函式会由模型自己学会。

        举例:假设现在模型已经输出“It's sunny”,准备要输出下一个字

        但是在输出前,需要先确定哪些中文字对下一个输出来说比较重要,所以它用某个函数 α 来计算每个字该有的分数,α("sunny", 今) = 0.8, α (“晴”,天) = 0.6 ……

        按理来说,下一个字是“今天”,所以输入中和「今天」两个字有关的部分会比较高分。

        因此,在输出“今天”之前,每个中文字可能会有下面的分数。

  • 「今」:0.8
  • 「天」:0.6
  • 「气」:0.05
  • 「很」:0.01
  • ……

        接下来把「今」的隐藏状态乘上 0.8、把「天」的隐藏状态乘上 0.6 ……,接着把所有的隐藏状态加起来,用它来计算下一个输出的英文字应该是什么。

        这个模型其实就是Attention的雏型,Attention的概念就是:

  1. 赋予输入每个字一个权重
  2. 将输入的字做加权计算

        之后讲话注意的时候经常会提到三个东西,Query、Key 和 Value,虽然本文没有明确提到这三个词,但是从上面的模型架构已经可以看出一些端倪:

  • 查询:翻译到的前一个字(“sunny”)
  • Key、Value:每个字的隐藏状态
  • 注意分数:α函式算出的分数

        你可以用下面的句子来理解注意,对于现在的查询(正在翻译的英文字)来说,哪个键(中文字)最重要。

        而在这个模型中,Value 和 Key 本质上是一样的东西。

三、结论

        这篇文章详细介绍了Attention机制的起源,虽然现在在做自然语言处理时使用的大多不是这个模型,但是通过前面的介绍可以理解为什么需要推出这个机制,以及Attention的核心概念是什么。

下一篇文章将介绍现在大家使用缩放点积注意力的逻辑以及使用示例。欢乐哭泣

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

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

相关文章

开源博客项目Blog .NET Core源码学习(6:雪花算法)

Blog .NET项目中有多种数据类生成对象实例时需要唯一标识,一般做法要么使用GUID,也可以保存到数据库时使用数据库表的自增长ID,也可以自定义规则以确保产生不重复的唯一标识,而在Blog .NET项目中使用雪花算法生成唯一标识。   关…

Python中,我们可以使用pandas和numpy库对Excel数据进行预处理,包括读取数据、数据清洗、异常值剔除等

文章目录 一、什么是数据预处理二、对excel数据进行详细的数据预处理操作总结 一、什么是数据预处理 数据预处理是一种对数据进行清洗、整理、转换等操作的过程,旨在提高数据质量,使其适应模型的需求,从而改进数据挖掘或机器学习的结果。 数…

vscode 创建 运行c++ 项目

1 扩展 install c 2.1安装 mingw g 下载 MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net win32下载地址 Download x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z (MinGW-w64 - for 32 and 64 bit Windows) 2.2 把 文件夹 bin 路径 添加到环境…

智慧卫生间

智慧卫生间 系统组成智慧卫生间系统结构图门锁感应开关开关量采集模块中控主机服务端/云平台 API文档获取ApiKey/SecretKey获取Access_token获取卫生间实时数据返回说明 系统组成 智慧卫生间系统结构图 #mermaid-svg-JRsKYT6nIM1tYip1 {font-family:"trebuchet ms",…

贪吃蛇游戏

一、创建新项目 创建一个新的项目,并命名。 创建一个名为images的文件夹用来存放游戏相关图片。 然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类, 创建一个com.xxx.controller的包用来存放启动的入口类(控制类) 二、游戏界…

数理统计的基本概念(一)

文章目录 总体、样本与统计量总体及其分布样本及其分布统计量统计量概念样本矩顺序统计量及其分布样本中位数与样本极差经验分布函数 参考文献 总体、样本与统计量 总体及其分布 在数理统计中,称所研究的对象的全体为总体,总体中的元素称为个体。若总体…

Kafka 集群如何实现数据同步?

哈喽大家好,我是咸鱼 最近这段时间比较忙,将近一周没更新文章,再不更新我那为数不多的粉丝量就要库库往下掉了 T﹏T 刚好最近在学 Kafka,于是决定写篇跟 Kafka 相关的文章(文中有不对的地方欢迎大家指出)…

Unity2021及以上 启动或者禁用自动刷新

Unity 2021以以上启动自动刷新 Edit---> Preferences--> Asset Pipline --> Auto Refresh 禁用的结果 如果不启动自动刷新在Project面板选择Refresh是不会刷新已经修改后的脚本的。

数据挖掘复盘——apriori

read_csv函数返回的数据类型是Dataframe类型 对于Dataframe类型使用条件表达式 dfdf.loc[df.loc[:,0]2]df: 这是一个DataFrame对象的变量名,表示一个二维的表格型数据结构,类似于电子表格或SQL表。 df.loc[:, 0]: 这是使用DataFrame的.loc属性来进行…

一文了解Word2vec 阐述训练流程

一文了解Word2vec 阐述训练流程 个性嵌入(Personality Embeddings) 词嵌入(Word Embeddings) 嵌入向量效果分析 语言模型 模型介绍 模型训练 Word2vec训练方法 CBOW方法 Skip-gram方法 CBOW方法与Skip-gram方法总结 重构…

nodejs+vue慢性胃炎健康管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于慢性胃炎健康管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了慢性胃炎健康管理系统, 系统首页、个…

AtCoder Beginner Contest 329 题解A~F

A - Spread 输入字符串&#xff0c;字符之间加上空格输出 B - Next 输出数组当中第二大的数 C - Count xxx 统计每个字符出现过的最长长度&#xff0c;再累加即可 #include<bits/stdc.h> #pragma GCC optimize("Ofast") #define INF 0x3f3f3f3f #define I…

【面试经典150 | 算术平方根】

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;数学表达式方法二&#xff1a;二分法 其他语言python3 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并…

【NGINX--1】基础知识

1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…

广州华锐互动VRAR:VR教学楼地震模拟体验增强学生防震减灾意识

在当今社会&#xff0c;地震作为一种自然灾害&#xff0c;给人们的生活带来了巨大的威胁。特别是在学校这样的集体场所&#xff0c;一旦发生地震&#xff0c;后果将不堪设想。因此&#xff0c;加强校园安全教育&#xff0c;提高师生的防震减灾意识和能力&#xff0c;已经成为了…

Python编程技巧 – 使用字符串(Strings)

Python编程技巧 – 使用字符串&#xff08;Strings) Python Programming Essentials – Using Strings 本文简要介绍如何使用字符串&#xff0c;来进行Python编程。字符串有很多用途&#xff0c;包括输出结果、反馈状态、数据处理以及切片和文本筛选等 1. 字符串 字符串(St…

Python学习之——正则表达式

Python学习之——正则表达式 参考常见用法re.matchre.search分组re.subre.findall使用编译后的正则表达式 实例 参考 Python3 正则表达式 正则表达式 - 简介 简单使用&#xff1a;python re.match函数的使用 分组捕获&#xff1a;Python正则表达式之re.match() Python通过re…

2023.11.18html中如何使用input/button进行网页跳转

2023.11.18html中如何使用input/button进行网页跳转 在做网页时有时会用元素&#xff0c;有时会用元素进行form表单操作或者网页跳转&#xff0c;但是用bootstrap时两种元素会出现不同的样式&#xff0c;为了样式一致&#xff0c;有时需要使用这两种元素相互实现其常用功能。 …

大数据学习(22)-spark

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

详解自动化测试之 Selenium

目录 1. 什么是自动化 2.自动化测试的分类 3. selenium&#xff08;web 自动化测试工具&#xff09; 1&#xff09;选择 selenium 的原因 2&#xff09;环境部署 3&#xff09;什么是驱动&#xff1f; 4. 一个简单的自动化例子 5.selenium 常用方法 5.1 查找页面元素&…