NLP——ELMO;BERT;Transformers

news2025/1/23 22:33:06

文章目录

  • ELMO
    • ELMO 简介
    • ELMO 优点
    • 利用了多层的 hidden 表示
    • ELMO 缺点
  • BERT
    • BERT V.S. ELMO
    • 两种预训练任务
      • Object1: Masked Language Model
      • Object2: Next sentence prediction
    • 训练细节
    • 如何使用 BERT
    • BERT 应用——垃圾邮件分类
  • Transformer
    • self-attention
    • Multi-head Attention
    • Transformer Block
    • Position encoding

ELMO

在这里插入图片描述

ELMO 简介

  • ELMo(Embeddings from Language Models)是一个在2018年由Allen AI研究所开发的新型深度语义词嵌入(word embedding)。ELMo词嵌入是基于上下文的,这意味着对于任何给定的词,它的表示都会根据它出现的上下文而变化。 这是一个重要的进步,因为传统的词嵌入,如Word2Vec或GloVe,为每个词提供一个固定的表示,不考虑词在特定上下文中可能有的不同含义。

  • ELMo的嵌入是通过训练一个**双向的语言模型(bi-directional language model)并使用模型的隐藏状态作为词的嵌入来产生的。**这个语言模型是一个双向的长短期记忆网络(Bi-LSTM),它从左到右(正向)和从右到左(反向)阅读文本,然后将两个方向的隐藏状态拼接在一起,得到每个词的嵌入。

ELMO 优点

相较于以往的方法,ELMo具有几个重要的优点:

  • 上下文感知:由于ELMo是基于上下文的,它能够捕捉到词义消歧的信息,例如词“play”的不同含义在不同的上下文中。

  • 预训练:和其他词嵌入一样,ELMo是预训练的,这意味着它可以被用作各种NLP任务的输入,从而提高模型的性能。

  • 深度表示:由于ELMo使用了深度神经网络(在这种情况下是Bi-LSTM),它可以捕捉到词的复杂语义信息。

然而,与此同时,ELMo模型需要大量的计算资源和时间来训练,这是它的主要缺点。但一旦训练完成,可以将训练得到的模型用于各种NLP任务。
在这里插入图片描述

利用了多层的 hidden 表示

在这里插入图片描述

  • 在传统的RNN(循环神经网络)或者LSTM(长短期记忆网络)中,通常会使用一个堆叠的结构,也就是多层的LSTM。在这种结构中,底层LSTM捕捉了一些局部和语法方面的信息,而顶层LSTM捕捉了一些更全局、更抽象的语义信息。这是因为底层的LSTM处理的是原始的输入词,而顶层的LSTM处理的是底层LSTM的输出,因此,顶层LSTM有更高层次的、更全局的视角。
  • 然而,在传统的多层LSTM中,我们通常只使用最顶层的隐藏状态,忽略了底层的隐藏状态。这可能会损失一些有用的信息。
  • ELMo的一个重要的创新就是使用了所有层次的隐藏状态。 对于每个词,ELMo的表示是所有层次隐藏状态的加权平均权重是通过训练学习的,不同的任务可能会赋予不同层次的隐藏状态不同的权重。 这意味着,对于不同的任务,我们可能会更关注不同层次的隐藏状态。 例如,命名实体识别可能更关注底层的语法信息,而情感分析可能更关注顶层的语义信息。
  • 通过这种方式,ELMo能够捕捉到词的深层次的语义信息,同时也考虑了词的上下文信息。这使得ELMo在很多自然语言处理任务上都取得了非常好的效果。

ELMO 缺点

  • 但是由于 ELMO 是基于 RNN 原理的模型,因此受制于 RNN 的几个缺点:
    在这里插入图片描述
    在这里插入图片描述

  • 值得注意的是:ELMo模型使用的是双向长短期记忆网络(Bi-LSTM)模型,它在两个方向上分别训练模型——从左到右和从右到左。这两个方向的LSTM是独立的,它们没有共享参数。 然后,ELMo将两个方向的隐藏状态进行拼接或者加权平均来得到词的表示。

  • 同时 ELMO 还有以下缺陷:

    • 计算成本高: Bi-LSTM需要在两个方向上 分别进行前向传播和反向传播,这使得它的计算成本比单向LSTM更高。 此外,LSTM模型本身就有很多参数,需要大量的计算资源和时间来训练。

    • 无法并行化: 由于LSTM是一种循环神经网络,它需要**按照时间步骤的顺序进行计算,**这使得它无法进行并行化计算。这也是为什么训练LSTM模型需要大量时间的原因。

    • 可能损失长距离信息: 虽然LSTM设计成可以处理梯度消失问题,从而捕捉到一定程度的长距离依赖,但在实际应用中,如果序列过长,LSTM仍然可能无法捕捉到太长距离的信息。

BERT

  • 为了解决 ELMO 模型存在的诸多问题,BERT 应运而生
    在这里插入图片描述
    BERT (Bidirectional Encoder Representations from Transformers) 是一个基于Transformer的模型,与ELMo相比,有一些重要的改进和优点:

  • 全方位的上下文感知: 虽然ELMo是一个上下文敏感的模型,但是它通过两个单向的LSTM来分别捕获上下文信息。BERT通过使用Transformer的自注意力机制,在每个位置都能捕获双向的上下文信息。 这使得BERT在理解上下文中的词语时更为全面。

    • 在ELMo中,双向上下文信息的获取是通过两个独立的、单向的长短期记忆网络(LSTM)完成的。一个LSTM从左到右读取序列,另一个从右到左读取。每个LSTM只能获取单向的上下文信息,然后将两个方向的信息结合起来得到最后的词表示。这种方式虽然能够捕获到双向的上下文信息,但是因为两个方向的信息是独立处理和结合的,所以被认为是"浅"的双向表示。
    • 相比之下,BERT使用的是基于Transformer的模型,该模型采用自注意力机制(self-attention mechanism)来获取双向上下文信息。在自注意力机制中,每个词的表示都会考虑到整个序列中所有词的信息,而且这个过程是同时进行的,不需要像LSTM那样一步一步地处理。 这样,每个词的表示都是在同时考虑到双向上下文信息的情况下得到的,因此被认为是"深"的双向表示。
  • 并行计算: BERT使用的 Transformer 结构允许在计算时进行并行化,相比于ELMo中使用的RNN(Recurrent Neural Network,如LSTM),BERT在训练和预测时都能更有效地利用硬件资源。

  • 预训练任务的设计: BERT使用了两种预训练任务,Masked Language Model (MLM) 和 Next Sentence Prediction (NSP)。MLM任务允许模型在预测被遮蔽(masked)的词时考虑到整个上下文,而NSP任务则让模型理解句子间的关系。这两种任务都使BERT在处理下游任务时具有更强的理解能力。

  • 更强的性能: 在多种NLP任务上,BERT都比ELMo展现出了更好的性能。比如在阅读理解、情感分类、命名实体识别等任务上,BERT都设立了新的性能标准。

虽然BERT在以上方面都优于ELMo,但值得注意的是,BERT模型相比于ELMo更加复杂和参数更多,因此需要更多的计算资源和时间进行训练。不过,和ELMo一样,BERT模型一般也是预训练好后,用于各种下游任务,而不需要在每个特定任务上从头开始训练。

BERT V.S. ELMO

在这里插入图片描述

  • 从这张图中清晰看出,对 ELMO, E 1 E_1 E1 分别输入两个 LSTM,在左边的 LSTM 的第一层 E 1 E_1 E1 被隐层编码,然后到第二个时间步 E 2 E_2 E2 的信息也被纳入进来,由此 E 1 E_1 E1 E 2 E_2 E2 的信息被模型综合考虑、表示;对于逆向的 LSTM 也是如此
  • 然而,虽然这种方法可以获取双向的上下文信息,但是由于正向和反向的信息是独立处理的,具体来说,我们并没有在同一时间考虑左右两个方向的上下文。也就是说,**正向LSTM在处理序列时,并不知道反向LSTM的输出,反之亦然。**因此,这种双向表示可能没有充分利用双向上下文信息,只是生硬地拼接了双向的上下文的表示使得表示更加丰富了。
  • 但是 BERT 不同,BERT 没有时间步的概念,因此,BERT通过使用Transformer的自注意力机制,在每个位置都能同时考虑整个输入序列中的所有词。从图中可以看出,每个词向量的表示都是结合所有的上下文信息。

在这里插入图片描述
在这里插入图片描述

两种预训练任务

Object1: Masked Language Model

在这里插入图片描述

  • 在 MLM 中,输入序列的一部分词会被替换为一个特殊的 [MASK] 标记,然后模型的任务是预测这些被遮蔽的词。这使得模型必须理解上下文,才能准确地预测被遮蔽的词。

Object2: Next sentence prediction

在这里插入图片描述

  • 在 NSP 任务中,模型需要预测两个句子是否是连续的,这使得模型必须理解句子间的关系。

训练细节

在这里插入图片描述

如何使用 BERT

在这里插入图片描述

BERT 应用——垃圾邮件分类

在这里插入图片描述
在这里插入图片描述

  • 只需要使用 [cls] 位置的信息进行分类即可

Transformer

self-attention

在这里插入图片描述在这里插入图片描述

  • 具体的计算过程请参考我的另一篇博客:Transformer解读之:Transformer 中的 Attention 机制
    在这里插入图片描述
    在这里插入图片描述

Multi-head Attention

在这里插入图片描述

Transformer Block

在这里插入图片描述

Position encoding

Transformer模型是一种处理序列数据的模型,它完全依赖于自注意力(Self-Attention)机制。这种机制允许模型为序列中的每个元素生成一个上下文相关的表示,这一表示不仅考虑到该元素本身,而且还考虑到其他元素。

然而,自注意力机制本身是不包含顺序信息的,也就是说,它对输入序列的顺序不敏感。这在自然语言处理等需要考虑元素顺序的任务中是一个问题。

为了解决这个问题,Transformer引入了位置编码(Position Encoding)来加入序列中元素的位置信息。这种编码是将每个位置 i i i 编码为一个向量,然后将这个向量加到对应位置的元素的表示上。

位置编码的设计需要满足两个条件:一是,不同位置的编码需要不同;二是,它需要能够表示出位置之间的相对关系。

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

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

相关文章

chatgpt赋能python:Python中如何判断奇偶数

Python中如何判断奇偶数 当我们在Python中编写程序时,有时需要判断一个数是奇数还是偶数,因为根据不同的情况,我们需要对不同的数值进行不同的处理。那么在Python中,该如何判断一个数是奇数还是偶数呢? 判断奇偶数的…

【JavaEE进阶】mybatis

目录: 一、Mybatis是什么 三个映射关系如下图: 二、mybatis的使用(前置工作简单案例) 第一步:导入MAVEN依赖 第二步: 在spring项目当中新建数据源 第三步:新建一个实体类,是和…

Shell编程规范与变量使用

目录 一、Shell编程概述 1.Shell脚本的概念 2.Shell脚本的应用场景 3.Shell的作用 4.Linux系统中支持的shell 二、Shell编程规范 1.编写Shell脚本规范步骤 2.Shell脚本执行方法 (1)以绝对路径执行(需要赋予脚本文件执行权限&#xf…

stable diffusion webui 文生图(txt2img)api接口调用(使用C#)

唠嗑 本次将跟读者讲一下如何通过C#请求sd webui api 【txt2img】接口,如果读者觉得文章有用,请给【点个赞】吧,有问题可以评论区提问。 实战 1.配置api启用参数 启动webui时,需加上【–api】 命令以保证api接口可以被调用。如…

Shell脚本文本三剑客之awk编辑器

目录 一、sed编辑器简介 二、sed工作流程 三、sed命令 四、sed命令的使用 1.sed打印文件内容(p) (1)打印文件所有行 (2)打印文件指定行 2.sed增加、插入、替换行(a、i、c) …

Shell脚本之正则表达式详解

目录 一、正则表达式简介 二、正则表达式的组成 三、正则表达式分类 四、正则表达式字符用法 1.基础正则表达式常见元字符(支持grep、egrep、sed、awk) 2. 扩展正则表达式元字符(支持:egrep、grep -E、awk、sed -r&#xff…

C语言之数据在内存中的存储(2)

本章重点:浮点数在内存中的存储 浮点数:数学中的小数 eg.123.45 12.345*10^1 1.2345*10^2 1E10:1.0*10^10 整型家族的类型,表示范围:limits.h 浮点数:float.h 大家可以猜测一下打印的这四个数字…

Unity中动画系统的性能优化

降低骨骼数,减少面片数。 方法: 1.勾选Optimize Game Objects,以剔除骨骼节点对应的Transform节点 2.开启多线程渲染选项 主要影响的函数调用开销,可以在profiler中查看: Animators.Update MeshSkinning.Update C…

【TCP/IP】多进程服务器的实现(进阶) - 信号处理及signal、sigaction函数

目录 信号 signal函数 sigaction函数 尝试用信号来处理僵尸进程 我们在之前学习了如何处理“僵尸进程”,但也会有疑问:调用wait和waitpid函数时我们关注的始终是在子进程上,那么父进程上的管控(对于子进程)该如何实…

STM32——05-按键、时钟控制、中断复位 点亮LED灯

如何点亮一颗LED灯 编程实现点灯 常用的 GPIO HAL 库函数: void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init ); void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState PinState ); void HAL_GPIO_Togg…

chatgpt赋能python:Python如何创建新项目

Python如何创建新项目 Python已经成为了全球最受欢迎的编程语言之一。如果您是一个有经验的Python工程师,您可能已经知道如何在命令行上创建新项目。但是,如果您是一个新手或初学者,您可能需要一些指导来开始创建新的项目。在本篇文章中&…

Vue中如何进行样式绑定?

Vue中如何进行样式绑定? 在Vue中,我们可以很方便地进行样式绑定。样式绑定是将CSS样式与Vue组件中的数据进行关联的一种技术。通过样式绑定,我们可以根据组件的状态动态地修改其外观。本文将介绍Vue中的样式绑定,包括类绑定、内联…

chatgpt赋能python:Python如何进行升序排列?

Python如何进行升序排列? Python是一门广泛应用于Web开发、数据科学、人工智能、机器学习等领域的编程语言。在这个快速发展的世界中,如何高效地排序数据是非常重要的。本文将介绍Python中如何进行升序排序。 基本排序方法 Python提供了一个内置函数s…

Vue 中的列表渲染

Vue 中的列表渲染 在 Vue 中,列表渲染是非常常见的操作。它允许我们将一个数组中的数据渲染为一个列表,从而实现数据的展示和交互。在本文中,我们将探讨 Vue 中的列表渲染的基本原理和用法,并给出一些实例代码来帮助读者更好地理…

【模块三:职业成长】38|能力维度三:如何提升解决跨领域冲突的能力?

你好,我是郭东白。今天我们来讨论架构师核心能力的第三个层次——解决跨领域冲突。 上节课我们讲了从程序员到兼职架构师的跨越,也就是如何搭建解决横向问题的能力。 不过,在兼职架构师这个角色中,架构能力是一个加分项&#xff…

chatgpt赋能python:如何使用Python升序排列一个列表?

如何使用Python升序排列一个列表? 在Python编程中,我们经常需要对列表进行排序。列表排序是一种常见的操作,可以帮助我们对数据进行分析和管理。在这篇文章中,我们将学习如何使用Python对一个列表进行升序排列。 什么是升序排列…

时间同步/集群时间同步/在线/离线

目录 一、能够连接外网 二、集群不能连接外网--同步其它服务器时间 一、能够连接外网 1.介绍ntp时间协议 NTP(Network Time Protocol)网络时间协议,是用来使计算机时间同步的一种协议,它可以使计算机对其服务器或时钟源做同步…

【python】【Word】用正则表达式匹配正文中的标题(未使用样式)并通过win32com指定相应样式

标题的格式 二级标题: 数字.数字. 文字 三级标题:数字.数字.数字 文字 python代码 使用方法 只保留一个需要应用的WORD文档运行程序,逐行匹配 使用效果 代码 import win32com.client import redef compile_change_Word_titlestyle():#…

shell脚本语句控制命令(exit、break、continue)

一、exit exit用于直接退出shell脚本程序并返回状态码(状态码可在执行命令执行后用$?查看) 如果不在exit后添加状态码,会默认返回最后一条命令执行后的状态码 exit 加状态码,代表退出程序并向系统指定状态码 状态码…

基于zinx的go tcp通信案例

基于zinx的go tcp通信示例 一、zinx简介:(https://gitee.com/Aceld/zinx/) Zinx是一个基于Golang的轻量级tcp服务框架,根据官方的定位,zinx是在游戏领域或者其他长链接的领域的轻量级企业框架,其使用简单,性能高效,能…