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

一、介绍

        近几年自然语言处理有很大的进展,从 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的核心概念是什么。

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

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

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

相关文章

C语言——操作符详解

前言:这篇文章主要讲解一下C语言中常见的操作符的使用,做一下整理,便于日后回顾,同时也希望能帮助到大家。 🎬个人简介:努力学习ing 📝CSDN主页 愚润求学 🌄每日鸡汤:念…

黑马程序员 计算机网络(笔记)

参考文章:【黑马程序员】计算机网络概述~ 程序员必须掌握的入门基础知识! 参考文章:黑马程序员Linux运维工作场景解决方案零基础到就业 参考文章:网络安全运维进阶教程,运维工程师深度学习教程 文章目录 linux入门到…

2023.11.17使用flask将多个图片文件上传至服务器

2023.11.17使用flask将多个图片文件上传至服务器 实现功能: 1、同时上传多个图片文件 2、验证文件扩展名 3、显示上传文件的文件名 4、显示文件上传结果 程序结构 main.py from flask import Flask, request, jsonify, render_template import osapp Flask(__n…

Android 10.0 系统修改usb连接电脑mtp和PTP的显示名称

1.前言 在10.0的产品定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的 方法来解决这个问题 2.系统修改usb连…

[AutoSar]工程中的cpuload陷阱(三)测试

目录 关键词平台说明背景一、 测试结果对比1.1 不带cache1.2 带cache 二、小结 关键词 嵌入式、C语言、autosar 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C,C编译器HighTec (GCC) 背景 接着工程中的cpuload陷阱(二)中的描述…

装饰模式 rust和java的实现

装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。 装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。 这种模式创建了一个装饰类,用来包装原有的类&am…

(数据库管理系统)DBMS与(数据库系统)DBS的区别

数据库管理系统(DBMS,Database Management System)和数据库系统(DBS,Database System)是两个相关但不同的概念。 DBS是一个更广泛的概念,指的是计算机系统引入数据库后的系统,包括数…

翻译软件Mate Translate mac中文版介绍说明

Mate Translate mac可以帮你翻译超过100种语言的单词和短语,使用文本到语音转换,并浏览历史上已经完成的翻译。你还可以使用Control S在弹出窗口中快速交换语言。 Mate Translate Mac版软件介绍 Mate Translate 可以在你的所有设备之间轻松同步&#x…

微机原理练习题_13

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。) 1、十六进制数5BF.C8转换成二进制数是() A. 11011100111111101B B. 010111011011.01101B C. 010110111111.11001B D. 010111011011.11001B 2,最适合…

Ps:变换

可以向选区、整个图层、多个图层或图层蒙版应用变换 Transform,还可以向路径、矢量形状、矢量蒙版、选区边界或 Alpha 通道应用变换。 若要变换栅格(像素)图像,建议先将其转换为智能对象,以便进行非破坏性的变换。 Ps菜…

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

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

NSS [鹤城杯 2021]Middle magic

NSS [鹤城杯 2021]Middle magic 源码直接给了。 粗略一看&#xff0c;一共三个关卡 先看第一关&#xff1a; if(isset($_GET[aaa]) && strlen($_GET[aaa]) < 20){$aaa preg_replace(/^(.*)level(.*)$/, ${1}<!-- filtered -->${2}, $_GET[aaa]);if(preg_m…

nodejs微信小程序-实验室上机管理系统的设计与实现-安卓-python-PHP-计算机毕业设计

用户&#xff1a;管理员、教师、学生 基础功能&#xff1a;管理课表、管理机房情况、预约机房预约&#xff1b;权限不同&#xff0c;预约类型不同&#xff0c;教师可选课堂预约和个人&#xff1b;课堂预约。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 …

深入理解注意力机制(下)——缩放点积注意力及示例

一、介绍 在这篇文章中&#xff0c;我们将重点介绍 Transformer 背后的 Scaled Dot-Product Attention&#xff0c;并详细解释其计算逻辑和设计原理。 在文章的最后&#xff0c;我们还会提供一个Attention的使用示例&#xff0c;希望读者看完后能够对Attention有更全面的了解。…

ICASSP2023年SPGC多语言AD检测的论文总结

文章目录 引言正文AbstractRelated ArticleNo.1: CONSEN: COMPLEMENTARY AND SIMULTANEOUS ENSEMBLE FOR ALZHEIMERSDISEASE DETECTION AND MMSE SCORE PREDICTION特征相关模型结构数据处理结果分析 No.2: CROSS-LINGUAL TRANSFER LEARNING FOR ALZHEIMERS DETECTION FROM SPON…

【Flink】窗口(Window)

窗口理解 窗口&#xff08;Window&#xff09;是处理无界流的关键所在。窗口可以将数据流装入大小有限的“桶”中&#xff0c;再对每个“桶”加以处理。 本文的重心将放在 Flink 如何进行窗口操作以及开发者如何尽可能地利用 Flink 所提供的功能。 对窗口的正确理解&#xff…

函数式编程框架 functionaljava 简介

文章目录 一、函数式编程起源二、functionaljava 框架简介 一、函数式编程起源 ​ 函数式编程起源于数理逻辑&#xff08;范畴论&#xff0c;Category Theory&#xff09;&#xff0c;起源于λ演算&#xff0c;这是一种演算法&#xff0c;它定义一些基础的数据结构&#xff0c…

蓝桥杯单片机综合练习——工厂灯光控制

一、题目 二、代码 #include <reg52.h>sfr AUXR 0x8e; //定义辅助寄存器sbit S5 P3^2; //定义S5按键引脚 sbit S4 P3^3; //定义S4按键引脚unsigned char led_stat 0xff; //定义LED当前状态 unsigned char count 0; //定义50ms定时中断累…

012 C++ AVL_tree

前言 本文将会向你介绍AVL平衡二叉搜索树的实现 引入AVL树 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序普通的二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M…

【Feign】 基于 Feign 远程调用、 自定义配置、性能优化、实现 Feign 最佳实践

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; SpringCloud MybatisPlus JVM 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Feign 一、 基于 Feign 远程调用1.1 RestTemplate方式…