自然语言处理基础知识入门(六) GPT模型详解

在这里插入图片描述

GPT

  • 前言
  • 一、GPT模型
    • 1.1 为什么采用Decoder模块?
    • 1.2 为什么不使用Encoder模块?
  • 二、 模型训练
    • 2.1 预训练阶段
    • 2.2 半监督微调
  • 总结

前言

在之前的章节中,深入探究了预训练ELMo模型的架构与实现原理。通过采用双向LSTM架构在大规模文本数据上进行预训练,ELMo模型成功地为预训练模型时代的开启奠定了基础。继ELMo之后,OpenAI基于transformer架构发布了GPT(Generative Pre-training Transformer)模型,该模型同样采用预训练策略,进一步推动了自然语言处理领域的语言模型发展。在本章节,以GPT模型为起点,初步的学习ChatGPT等基于对话的AI模型背后的原理与技术演化。这将为读者深入理解当前模型在理解和生成自然语言方面的先进能力提供重要视角。鉴于Bert模型也是在GPT之后推出,为了保持学习的连贯性和理论发展的时间线顺序,本章节将优先探讨GPT模型。

一、GPT模型

按照惯例,首先对GPT下一个直白的定义。

GPT(Generative Pre-training Transformer)是由移除了交叉注意力(cross-attention)层的多层Transformer decoder构成的。

下图通过Transformer的整体架构图直观的展示GPT具体采用的区域,图中红色矩形表示GPT具体采用的部分,为Transformer decoder模块并且删除了模型了cross-attention层。

在这里插入图片描述

1.1 为什么采用Decoder模块?

要理解为何GPT采用decoder结构,首先需要了解其在预训练阶段的核心任务。GPT在本质上执行的是一个序列生成任务,类似于经典的文本接龙游戏(或称为语言模型预测任务),其目标是基于给定文本序列之前的部分,预测接下来可能出现的文本内容。换而言之,这个任务要求模型使用已知的输入信息(即前文),来预测当前可能出现的单词,这与循环神经网络(RNN)处理序列数据的方式相似。当前例子参考Lee老师针对GPT的讲解。

在这里插入图片描述

使用transformer架构decoder的作用是可以实现模型的并行化处理(主要是Transformer优于RNN的原因),这得益于自注意力机制的能力,从而不在像传统的RNN一样,并能更好地捕捉复杂的模式和依赖关系。这样的设计使得 GPT 不仅能模仿 RNN 文本生成的自回归特性,还能摆脱RNN在处理长序列时可能遇到的梯度消失等问题,从而在自然语言生成任务中实现更佳的性能。对这部分有疑问的同学可以参考当前专栏Transformer部分的内容

1.2 为什么不使用Encoder模块?

上文中讨论了预训练阶段的核心任务。GPT在本质上执行的是一个序列生成任务,自注意力带来的并行化优势选择了Transformer架构。因此采用了Decoder结构,那为什么不使用Encoder呢?
在这里插入图片描述

关键在于生成任务所需的Masked机制。正如上图所展示的,一个没有交叉注意力层的Decoder与Encoder的主要区别在于Masked机制。如果在生成任务中不应用Masked机制,模型就将直接“窥视”到正确答案,这显然违背了序列生成所需的自回归性质。因此,GPT设计中采纳了Decoder结构。本身模型不具备Encoder部分所以也不存在需要编码器指导输出,故此摒弃掉cross-attention层。

这样的设计选择体现了模型结构与任务目标的紧密配合,确保了模型能够有效且高效地处理序列生成任务,为其在各类自然语言处理应用中的成功奠定了基础。

二、 模型训练

在ELMo模型中,双向LSTM的参数在预训练阶段被学习并固定下来。当ELMo被用于下游任务(如文本分类、问答系统等)的fine-tuning阶段时,双向LSTM生成的上下文依赖表示(即深层语言特征)是不变的。变化的是对这些深层特征的使用方式,即通过调整特定于任务的缩放参数(S参数)和全局调整参数(gamma)来优化ELMo嵌入对于特定任务的表现。具体有疑问的同学可以参考当前专栏ELMo的文章

简而言之,在ELMo模型的应用过程中,双向LSTM的参数保持不变,变化的是如何利用ELMo生成的上下文特征来最佳地适应特定下游任务的需求。和ELMo类似,GPT(Generative Pretraining Transformer)模型也包含了两个主要阶段:预训练(pretraining)阶段和微调(fine-tuning)阶段。

2.1 预训练阶段

在这个阶段,它通过Transformer中修改的Decodr模块和自回归语言建模目标进行训练,以此捕捉文本中的长期依赖性和复杂的语言模式。这个阶段不专注于任何特定的下游任务,而是旨在学习一个通用的语言模型。

GPT模型利用了庞大的未标注文本数据集,包括维基百科和各种网页内容。此阶段的训练目标是通过调整模型参数来最大化数据集上的对数似然(log-likelihood)。从下图中原论文中对预训练阶段的描述可以看出,模型的结构在这一阶段保持相对简化,主要通过滑动窗口方法来构建语言模型,这与连续词袋模型(CBOW)有相似之处。目的是通过最小化损失函数,引导模型逐步迭代更新参数,以精炼其内部表示,从而更好地预测文本中单词的上下文关系。

请添加图片描述

下图中,通过观察论文中的细节可以看到模型的具体架构,就是一个多层堆叠的没有交叉注意力的Decoder:

请添加图片描述

尽管模型的调整似乎较为微小,但存在一个细节尤其值得关注:模型放弃了Transformer架构中对位置编码的常规处理方式,转而采用了一种可学习的参数矩阵 w p w_p wp 来处理位置信息。与此同时, W e W_e We 作为嵌入矩阵,其实质与Transformer架构中的处理方式并没有显著差异。这个矩阵可以是通过word2vec、GloVe或其他预训练模型生成的,用于将单词从稀疏的One-hot编码转换为密集的向量表示形式。以赋予模型一个良好的起点和对词汇之间语义相似性的基础理解,但是在后续的训练过程中,这个矩阵往往会随着损失函数的反向传播而被适当地调整。

2.2 半监督微调

在这个阶段,GPT对特定的下游任务进行微调。通常,模型会继承预训练阶段学到的参数,然后在目标任务的数据集上进行进一步训练。在微调阶段,可以对整个模型进行调整,或者只调整特定的层。此时,模型的目标是最大限度地提高在特定任务上的性能。论文中直观的给出了一个和微调相关的例子:

假设有一个标注数据集 C C C ,其中每个实例由一系列输入令牌 x 1 , . . . , x m x_1,...,x_m x1,...,xm 以及一个标签 y y y 组成。输入通过我们预训练的模型传递,以获得最终的Transformer块的激活 h m l h_m^l hml,然后这个激活被送入一个新增的线性输出层(带有参数 W y W_y Wy)来预测 y y y

P ( y ∣ x 1 , . . . , x m ) = softmax ( h m l W y ) . P(y|x_1,...,x_m) = \text{softmax}(h_m^l W_y). P(yx1,...,xm)=softmax(hmlWy).

以下要最大化的目标:

L 2 ( C ) = ∑ ( x , y ) log ⁡ P ( y ∣ x 1 , . . . , x m ) . L_2(C) = \sum_{(x,y)}\log P(y|x_1,...,x_m). L2(C)=(x,y)logP(yx1,...,xm).

上文的例子揭示了在微调阶段,GPT模型会利用带有标签的数据集 ( x , y ) (x, y) (x,y) 进行训练,并通过引入一个新的可学习的权重矩阵 W y W_y Wy 来适配具体的任务需求。这一做法表明,在面对不同任务时,GPT模型能够灵活地加入特定任务相关的可学习参数,以便对模型进行针对性的微调。通过这种方式,GPT不仅能够保留在大规模无标注数据上预训练所学到的通用语言表示能力,还能够通过额外参数的引入与调整,有效地适应并优化特定的下游任务表现。这种策略大大增强了GPT等预训练模型在多种自然语言处理任务中的应用灵活性和效果。

会不会出现模型为了当前任务的准确性而去修改动经过大量无监督训练得到的学习语意内容的参数呢?这样会不会影响模型的语义理解能力?GPT给出解决方式如下

请添加图片描述
微调阶段确实采用了两部分损失函数来进行模型参数的优化,具体目标如下(带有权重 λ \lambda λ):

L 3 ( C ) = L 2 ( C ) + λ ∗ L 1 ( C ) L_3(C) = L_2(C) + \lambda \ast L_1(C) L3(C)=L2(C)+λL1(C)

采用两个损失函数的目的,正是为了在使用有标签数据进行微调时,仍然能够保持与在无标签数据上训练时相同的模型架构。这种设计使模型在接受通过梯度下降法进行参数更新的同时,也面临着一个挑战——如何在适应新任务的需求中,不丢失先前在广泛语境下学到的语义信息。

具体而言,第一个损失 L 1 ( C ) L_1(C) L1(C)关注于维持模型对大量无标签文本数据的理解,即保留在预训练阶段获得的语义知识;而第二个损失 L 2 ( C ) L_2(C) L2(C)则针对模型在有标签数据集上的表现,旨在提升模型对特定任务的适应性和准确度。通过将这两个损失组合为一个总体目标 L 3 ( C ) L_3(C) L3(C),模型被引导在学习新任务的同时,也不过度偏离其原有的语言模型基础。

这种权衡策略,旨在防止模型过度拟合新任务而损失其通用的语义理解能力。 通过在自由接龙和目标任务之间建立平衡,确保了模型不仅能够高效地适应新任务,同时也维护了其作为一个强大通用语言模型的核心价值。这种做法体现了对模型灵活性和泛化能力的重视,同时也展示了如何通过精心设计的训练策略来优化模型性能。

请添加图片描述

论文中展示了四种针对微调任务的监督学习方式,旨在尽量减少对模型整体架构的修改以完成各项任务。如上图所示,左侧是我们提到的多层堆叠的解码器部分,该模型架构保持不变。而右侧则根据不同任务的需求,简单地添加了略有不同形式的线性层,这种设计使模型能够灵活适应多种任务,同时保持核心架构的稳定性。

总结

尽管论文的篇幅并不庞大,但GPT模型所带来的显著性能提升无疑充分体现了"大力出奇迹"的理念。目前的GPT已经在能力上取得了巨大的飞跃,现代大模型时代不仅验证了Transformer架构的卓越性能,也预示着一个更加关注参数规模的时代正式到来。随着越来越多技术细节的隐藏,可见技术上的突破越来愈多,对计算资源的依赖与日俱增,一定程度上表明强大算力在推动自然语言处理进步中重要地位。后续将会迎来本专栏的收尾工作总结Bert模型,期望能够使读者对这部分的内容有一个深层的认识,从而更好的开展科研工作。

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

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

相关文章

[数据集][目标检测][数据集][目标检测]智能手机检测数据集VOC格式5447张

数据集格式:Pascal VOC格式(不包含分割的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):5447 标注数量(xml文件个数):5447 标注类别数:1 标注类别名称:["phone"] 每个类别标注的框数&#xff…

2024年华为OD机试真题-执行时长-Python-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: 为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务,假设GPU最多一次执行n个任务,一次执…

Qt程序错误“QObject::connect: Cannot queue arguments of type ‘QTextCursor’”的解决方法

背景: 在Qt的线程中调用QTexiEdit控件的append(QString)或insertPlainText(QString),线程首次执行会报错 “QObject::connect: Cannot queue arguments of type ‘QTextCursor”,销毁该线程&a…

Pytorch中Tensor的类型对应表

Data typedtypeCPU tensorGPU tensor32位浮点数torch.float32 or torch.floattorch.FloatTensortorch.cuda.FloatTensor64位浮点数torch.float64 or torch.doubletorch.DoubleTensortorch.cuda.DoubleTensor16位浮点数torch.float16 or torch.halftorch.HalfTensortorch.cuda.H…

Flutter 中的 SliverWithKeepAliveWidget 小部件:全面指南

Flutter 中的 SliverWithKeepAliveWidget 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中,SliverWithKeepAliveWidget 是一…

宝塔Linux面板-Docker管理(2024详解)

上一篇文章《宝塔Linux可视化运维面板-详细教程2024》,详细介绍了宝塔Linux面板的详细安装和配置方法。本文详细介绍使用Linux面板管理服务器Docker环境。 目录 1、安装Docker 1.1 在线安装 ​编辑 1.2 手动安装 1.3 运行状态 1.4 镜像加速 2 应用商店 3 总览 4 容器 …

高德地图 JS API用于绘画船舶轨迹

文章目录 引言I 2.0升级指南1.1 修改 JSAPI 引用中的版本号到 2.01.2 相应修改II 1.4.15 文档引言 地图 JS API 2.0 是高德开放平台免费提供的第四代 Web 地图渲染引擎, 以 WebGL 为主要绘图手段,本着“更轻、更快、更易用”的服务原则,广泛采用了各种前沿技术,交互体验、…

从CSV到数据库(简易)

需求:客户上传CSV文档,要求CSV文档内容查重/插入/更新相关数据。 框架:jdbcTemplate、commons-io、 DB:oracle 相关依赖: 这里本来打算用的2.11.0,无奈正式项目那边用老版本1.3.1,新版本对类型…

人脸识别系统代码--照片识别

1.导包 Tkinter用于创建GUI,PIL用于图像处理,cv2用于OpenCV库,subprocess用于运行其他Python脚本。 import tkinter as tk from tkinter import filedialog from PIL import Image, ImageTk from PIL.Image import Resampling import cv2 i…

常见攻击类型整理

文章目录 网络攻击web攻击XSS攻击存储型XSS反射型XSSDOM型XSS CSRF攻击SQL注入攻击文件上传漏洞业务逻辑漏洞越权访问水平越权垂直越权 密码找回验证码漏洞 信息泄露暴力破解远程命令执行(RCE)xxe注入反序列化文件包含本地文件包含(LFI&#…

iperf3带宽压测工具使用

iperf3带宽压测工具使用 安装下载地址:[下载入口](https://iperf.fr/iperf-download.php)测试结果:时长测试(压测使用):并行测试反向测试UDP 带宽测试 iPerf3 是用于主动测试 IP 网络上最大可用带宽的工具 安装 下载地址&#x…

大话C语言:第21篇 数组

1 数组概述 数组是若干个相同类型的变量在内存中有序存储的集合。 数组是 C 语言中的一种数据结构,用于存储一组具有相同数据类型的数据。 数组在内存中会开辟一块连续的空间 数组中的每个元素可以通过一个索引(下标)来访问,索…

【Python Cookbook】S1E08 在两个字典中寻找相同点

目录 问题解决方案讨论 问题 在两个字典中,如果我们想要找到其中相同的地方,比如相同的键、相同的值等。 解决方案 考虑以下两个字典以及其中内容: a {x: 1,y: 2,z: 3 }b {w: 10,x: 11,y: 2 }要找出这两个字典中的相同之处,…

Java学习19-List、set容器

目录 一.List: 1.List基本介绍: 2.List接口方法: 3.List的三种遍历方式: 4.ArrayList: (1)ArrayLis的基本介绍: (2)ArrayList底层结构和源码分析&…

考研回顾纪录--科软考研失败并调剂兰州大学软件工程专业复试经历

1.背景 本人工作一年后决定考研,遂于2023年4月底离职。5月到家后开始学习。本科东北大学软件工程专业,绩点3.2/5,按照百分制计算是82分。本科纯属混子,只有一个四级551,一个数学竞赛省二等奖,大创学校立项…

算法刷题笔记 最长连续不重复子序列(C++实现)

文章目录 题目描述解题思路实现代码 题目描述 给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数n。第二行包含n个整数(均在 0∼10^5范围内),表示整数序列。…

vue打包时报错文件包过大

1.问题:npm run build 之后出现 2. 翻译之后意思就是某块过大 3. 解决办法:在vite.config.ts文件上添加 build: { chunkSizeWarningLimit: 1600, }, 4.最终打包

UnityLeapMotion流程记录

突然接到一个LeapMotion的项目,回想起上次做LeapMotion还是在几年前,但是当时没有去记录,所以这次就相当于是重新走了一遍流程。很苦恼,赶紧记录下来。防止之后忘记。这次的需求还是比较简单的,用手滑动控制图片序列播…

在Visual Studio2022中同一个项目里写作业,有多个cpp文件会报错

为了省事,在同一个项目里写很多个题目,结果只有一个cpp文件时没出错,写了2个cpp文件再想运行时就出错了; 将不相关的cpp文件移出去 在源文件中对其点击右键,找到“从项目中排除”; 结果如图,剩…

【Android】 怎么设置蓝牙等待设备连接和接收数据

项目需求 1.打开蓝牙之后等待别的蓝牙设备进行连接。 2.连接之后等待别的设备发送数据,然后接收数据。 3.跟别的蓝牙设备断开连接值进入到等待状态,等待别的蓝牙设备连接。 解决方式 //非手机终端的UUID public static final UUID SPP_UUID UUID.fro…