首页 > 其他分享 >信我!这里有普通人也能理解的 Transformer

信我!这里有普通人也能理解的 Transformer

时间:2024-06-30 21:58:37浏览次数:23  
标签:Transformer RNN 普通人 模型 Attention 理解 序列 机制 注意力

引言

如今爆火的大模型,GPT-3,BERT 等,通过大量的参数和数据,为我们提供了前所未有的自然语言处理能力,使得机器能够更好地理解和生成人类的语言。而注意力机制无疑是重要的基石之一,作为一种新的神经网络结构,使得模型能够更好地捕捉序列中的长距离依赖关系,从而大大提高了模型的性能。

本文将从通俗和学术两个角度,详细介绍大模型和注意力机制的基础知识。无论你是对人工智能感兴趣的初学者,还是寻求深入理解的开发者,都能在本文中找到你需要的内容。我们将从 RNN 开始,介绍其原理和局限性,然后介绍 LSTM 如何解决这些问题,接着我们将深入探讨注意力机制的历史、原理和类型,最后我们将介绍 Transformer 模型,以及它相较于 LSTM 的优势。希望通过本文,能让你对注意力机制有更深入的理解。

NLP 和 LLM 是怎样的关系?

现如今,人人嘴边挂着的大模型,其实更准确的名称是:大语言模型(Large Language Model,缩写LLM),刚接触 LLM,会时常伴随着另一个名词 NLP 自然语言处理(Natural Language Processing),那这两者到底是怎样的关系呢?

简单理解 NLP是人工智能的一个分支,同时也是一个广泛的领域,它研究如何让计算机理解、生成和处理自然语言,支持用户使用自然语言文本或语音来询问数据。

我们使用的手机语音助手,如 Siri,小爱等,我们日常使用的一些功能包括 Web 搜索、垃圾邮件过滤、自动文本或语音翻译等都采用了 NLP 技术。

而 LLM 是这个领域中的一个重要工具。通过训练和使用语言模型,我们可以解决 NLP 中的各种任务,从而让计算机更好地理解和处理自然语言。

模型初代目:RNN

说到语言,第一个让人想到的一定是的不同语言之间的翻译问题,而语言模型首要解决的问题,一般也会是翻译,毕竟相较于让机器能具有情感的与人交流,翻译问题更像是考试,成果的好坏也能更直观的展现。以下的实例我们都以翻译问题来看

RNN(Recurrent Neural Network)循环神经网络,NLP里最常用、最传统的深度学习模型,在自然语言处理、语音识别等有很广泛的用途。

经典的 RNN 结构

image.png

x 是输入,y 是输出,h 是隐藏层,若是对应到一句话的翻译就是:

image.png

可以看出整个结构中最重要的就是隐藏层 h,作为普通小白,我们可以把整个结构看作是一次接力看剧的游戏,游戏规则是:一群人看一部电视剧,每个人只能看其中的一集,并总结出这集讲了什么,最后所有人的总结拼凑起来就是这部剧的大概脉络。

其中 h 层是一个个的人,很明显这部剧有四集,x1 代表这个剧的第一集,名叫 h1 的人看了第一集后,总结出了第一集的内容 y1,以此类推,四个人看完自己的剧集都总结出了各自内容,分别是 y1,y2,y3 和 y4。

但在很多剧中都会有个前情提要的环节,因为很多时候第一集会把出场人物介绍完,后续的剧集就不会进行介绍了,或是前一集发生事情的结果是后一集的起因,这样只看了后一集的人肯定会云里雾里,不知道这集讲了什么。所以 h1 不仅要总结出自己负责的第一集内容,还要把第一集的内容全部复述给 h2,方便他理解第二集的内容,h2 需要把第一集和第二集的内容全部复述给 h3,以此类推。

image.png

这其实就是 隐状态h 的作用,保存数据用于输出,和传递模型在处理序列数据时的历史信息。意味着每个 y 前的输出不仅依赖于当前 x 的输入,还依赖于之前 x 的输入。

Encoder-Decoder 模型

RNN 作为NLP中最常用、最传统的深度学习模型,不仅仅适用于翻译问题,还可以应用于解决更多复杂的场景。通过对RNN 结构的简单变化,我们可以灵活地适应不同的任务需求。

N 对 1

主要用于判断输入的类型或是总结性工作

v2-6caa75392fe47801e605d5e8f2d3a100_1440w.webp

1 对 N

1 对 N 这种结构一般有两种:

第一种主要用于输入一段文字进行演进或扩写,或是输入图像或音乐进行优化等场景

v2-87ebd6a82e32e81657682ffa0ba084ee_1440w.webp

第二种主要用于输入一段文字进行拆解,或是输入图像或音乐进行信息提取等场景

v2-16e626b6e99fb1d23c8a54536f7d28dc_1440w.webp

Encoder-Decoder 模型(N 对 M)

然而在实际解决问题的过程中,大部分问题输入和输出都不是等长的,无论是最开始的 N 对 N,还是变种的 1 对 N 和 N 对 1 都只是解决特殊问题的结构。

而后演变出的最灵活,也是使用频率最高的一种 RNN 变种,解决了这个难题,这种结构一般也被称为 Encoder-Decoder 模型或是 Seq2Seq(sequence to sequence) 模型。

从图中可看出,其实就是将 N 对 1 与 1 对 N 两种结构的 RNN 相结合,分别控制各自 N 的数量来达到 N 对 M 的效果,同理,N 对 M 同样也有两种:

image.png

前部分 RNN 只负责接收输入信息,可以理解为在为信息编码,被称为 Encoder,将 encode 后的结果赋值给 c,再将 c 作为后部分的输入,后部分 RNN 就只进行对输入信息进行解码,称为 Decoder。这种模型不限制输入输出的长度,因此应用最为广泛。

这里有一点需要注意:虽然我们是用 RNN 来引出的 Encoder-Decoder 模型,但 Encoder-Decoder 模型并不等同或属于 RNN 模型的一类,因为只要符合编码-解码的结构都可以被称为 Encoder-Decoder 模型,即使 Encoder 和 Decoder 不是通过 RNN 模型来实现的,所以说 RNN 模型和 Encoder-Decoder 模型没有从属关系。

RNN 的缺点

如果把 RNN 还是看作一次接力看剧的游戏,但这次这个剧集很长,可能是上万,十万,甚至是百万集,那么随着中间人的口口相传,慢慢的,最开始的一些剧集的内容在传递的过程慢慢被遗忘。这就是 RNN 的一个主要问题,它在处理长序列时,往往会忘记序列开始部分的信息。这就像是这个人的记忆有限,不能记住所有的情节。这种问题在 RNN 中被称为“长期依赖问题”。

用专业的语言来说,就是 RNN 在处理长序列时,往往难以捕捉到序列中的长期依赖关系。这是因为在 RNN 的训练过程中,会出现梯度消失或梯度爆炸的问题。当序列很长时,这个问题会变得更加严重。梯度消失会导致 RNN 难以学习到序列中早期的信息,而梯度爆炸则会导致训练过程不稳定。这两个问题都会限制 RNN 处理长序列的能力。

有关梯度爆炸和梯度消失的问题,网上有大量的从公式推导的文章,有兴趣的同学可以搜索看看,这里就不做详细解释了,只要记住 RNN 也是比较“健忘”的,不擅长处理长篇幅的事情。

进阶版:LSTM

正如我们所看到的,RNN 在处理长序列时存在一些困难,尤其是在捕捉长期依赖关系方面。这是因为在训练过程中,RNN容易遇到梯度消失或梯度爆炸的问题。那么,有没有一种方法可以解决这些问题,使得我们的模型能够更好地处理长序列呢?

答案是肯定的。这就是我们接下来要介绍的模型:长短期记忆网络(Long Short-Term Memory,简称LSTM)。LSTM 是 RNN 的一种变体,它通过引入一种特殊的结构 - “门”,来控制信息的流动,从而有效地解决了 RNN 的长期依赖问题。

老规矩,依然看作是一次接力看剧的游戏,但换了一批接力的人玩,这批人更聪明,他们在传递剧集信息时不再复述每一集的全部内容了,他们有了总结信息的能力,会选择传递剧情的关键有用的信息,忽略无用的信息,这样在传递过程中每个人要记忆的信息大大减少了,但关键信息都保留了下来,对最后剧情的复现影响不大。

image.png

LSTM 中的特殊结构 - “门”就相当于总结信息的能力。每个 LSTM 单元都有自己的输入门、遗忘门和输出门,这些门的状态是由输入数据和单元的当前状态决定的。这意味着,对于同一输入,不同的 LSTM 单元可能会有不同的门状态,因此它们可能会选择记住或忘记不同的信息。这种设计使得LSTM能够在处理复杂和长序列的数据时,更好地捕捉到数据中的长期依赖关系。

具体的 LSTM 图如下:

image.png

这是单个 LSTM 单元内部结构图,其中三个门分别是:

相关文章

  • Transformer详解encoder
    目录1.InputEmbedding2.PositionalEncoding3.Multi-HeadAttention4.Add&Norm5.Feedforward+Add&Norm6.代码展示(1)layer_norm(2)encoder_layer=1最近刚好梳理了下transformer,今天就来讲讲它~        Transformer是谷歌大脑2017年在论文attention......
  • 对前端js高级面向对象的理解? 如何理解前端js中的内置对象、 对象原型、原型链?
    对象前言对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法)对象是javascript中的一个重要的概念,甚至有“JavaScript中万物皆是对象”的说法。首先看面向对象 面向对象编程将一个系统抽象为许多对象的集合,每一个对象代表了这个系......
  • transformer在图像分类上的应用以及pytorch代码实现_transformer 图片分类
    本文简单介绍transformers的原理,主要介绍transformers如何应用在图像分类上的任务。1.对transformers的简单介绍transformers在自然语言处理领域有着天然的优势,transformers改进了RNN(循环神经网络)训练慢,不能够建立序列之间的长期依赖,记忆消失的缺点。transformers的核心......
  • [本科项目实训] Hugging Face Transformers 模型部署与微调
    TransformersHuggingFaceTransformer提供了模型的加载、推理、微调接口,使用该库可以轻松完成自然语言模型的部署微调工作,其有继承自AutoClass的四个最为常见的接口,且调用方式均为AutoClass.from_pretrain("model_name"):AutoTokenizer:用于文本分词AutoFeatureExtractor:用......
  • 深入理解泛型(经典详解)
    深入理解泛型(经典详解):<T>T和T的使用以及public<E>List<E>get()泛型方法详解、类型擦除、通配符的使用、泛型类的应用、泛型之间的继承_泛型t-CSDN博客一、为什么要使用泛型?泛型俗称“标签”,使用<E>表示。泛型就是在允许定义类,接口时通过一个标识表示某个属性的类型或者......
  • Swift Combine — Debounce和Throttle的理解与使用
    Debounce和Throttle是两种常用的操作符,用于控制数据流的频率和处理延迟。但它们的实现方式略有不同。理解这些差异对于在Combine代码中做出正确选择至关重要。DebounceDebounce操作符用于限制数据流的频率,只有在指定的时间间隔内没有新数据到达时,才会将最后一个数据发......
  • suspendCancellableCoroutine: 深入理解及使用技巧
    作为一名安卓开发工程师,我们在日常开发中经常会遇到需要挂起协程以等待某些异步操作完成的情况。Kotlin的协程为我们提供了丰富的挂起函数,其中一个非常重要且强大的函数就suspendCancellableCoroutine。本文将深入探讨suspendCancellableCoroutine的使用及其内部机制,帮助......
  • @RestController如何理解
    【SpringBoot】带你一文彻底搞懂RestController和Controller的关系与区别-CSDN博客目录什么是@RestController,什么是@Controller使用@ResponseBody注解让方法返回值作为响应内容是什么意思举例说明@RestController@Controller什么时候需要返回的是视图,什么时候需要返回数据......
  • 一键掌控,智慧升级:度假酒店可视化管理解决方案全解析
    在繁忙的都市生活中,度假酒店成了许多人逃离喧嚣、寻找宁静的首选之地。然而,随着旅游业的蓬勃发展,度假酒店面临的挑战也日益增多。如何提升服务质量、确保客人满意度、优化运营效率,成为了摆在各大度假酒店面前的难题。 传统的酒店管理模式往往依赖于人工巡查、纸质记录等方式,不......
  • RNN 和 Transformer 架构 之间的区别和联系
    递归神经网络(RNN)和Transformer是两种广泛应用于序列数据处理的神经网络架构,它们在设计原理、应用场景以及性能表现上有显著的区别和联系。RNN(RecurrentNeuralNetwork)基本概念RNN是一种能够处理序列数据的神经网络,每个时刻的输出依赖于当前输入和前一个时刻的隐藏状态。RNN通......