【NLP】预训练模型——GPT1

article/2025/8/24 23:05:33

背景

废话不多说,先把三篇论文链接放出来:GPT1:Improving Language Understanding by Generative Pre-Training、GPT2:Language Models are Unsupervised Multitask Learners、GPT3:Language Models are Few-Shot Learners。李沐老师也在B站上放了介绍GPT模型的视频:GPT,GPT-2,GPT-3 论文精读【论文精读】.

首先我们理一下Transformer出现后一些语言模型出现的时间段:Transformer:2017/06,GPT1:2018/06,BERT:2018/10,GTP2:2019/02,GPT3:2020/05. 从模型出现的时间先后顺序来看,真是竞争激烈呀。

GPT1

我们知道在NLP领域中包含了很多任务,如问答,语义相似度,文本分类等。尽管大量的无标记文本语料库非常丰富,但用于学习这些特定任务的有标记数据却很少,那么在进行模型训练时就比较难了。GTP1这篇论文就是说,其通过在不同的无标签文本语料库上对语言模型进行生成式预训练,然后对每个特定任务进行区别性微调,可以在这些任务上获得很好的效果。与以前的方法相比,GPT1在微调期间使用任务感知的输入转换,以实现有效的转换,同时对模型架构进行最小的更改。在这里我们可以想到word2vec,虽然其也是预训练模型,但是我们依然会根据任务类型去构造一个神经网络,而GPT1就不需要。GPT1在自然语言理解的广泛基准上的效果说明了这种方式的有效性。GTP1在通用任务不可知模型优于使用为每个任务专门制作的架构的区别训练模型,在研究的12个任务中有9个显著提高了技术水平。

在此之前,最成功的的预训练模型当然还是word2vec。文中提出了2个主要问题,1.如何在给定未标注的语料该选择什么样的损失函数呢?当然这时也会有一些任务如语言模型,机器翻译等,但是却没有一个损失函数在所有任务都表现的好;2.怎么把学到的文本表示 有效地传递到下游任务中?

GPT1的做法是在大量的无标签语料上使用半监督(semi-supervised)的方法学习一个语言模型,然后在下游任务进行微调。截止目前,语言模型中我们能够想到较好的就是RNN和Transformer相关的内容了。相比于RNN,Transformer学到的特征更加稳健,文中解释说,与循环网络等替代方案相比,这种模型选择为我们提供了更有结构的内存,用于处理文本中的长期依赖关系,从而在不同的任务中产生了健壮的传输性能(This model choice provides us with a more structured memory for handling long-term dependencies intext, compared to alternatives like recurrent networks, resulting in robust transfer performance acrossdiverse tasks. )以及在进行迁移的时候用的是一个任务相关的输入表示(During transfer, we utilize task-specific input adaptations derived from traversal-styleapproaches, which process structured text input as a single contiguous sequence of tokens)

模型结构

模型训练包括两个阶段。第一阶段是在大型语料库上学习高容量的语言模型。接下来是微调阶段,在此阶段,调整模型以适应带有标记数据的判别任务。

无监督的预训练

现有无监督语料数据 U = { u 1 , ⋯ , u n } {\mathcal U} = \{ u_1,\cdots,u_n \} U={u1,,un},文中使用了一个标准的语言模型去最小化如下的似然函数:
L 1 ( U ) = ∑ ⋅ i log ⁡ P ( u i ∣ u i − k , … , u i − 1 ; Θ ) L_{1}(\mathcal{U})=\sum_{\cdot_{i}} \log P\left(u_{i} \mid u_{i-k}, \ldots, u_{i-1} ; \Theta\right) L1(U)=ilogP(uiuik,,ui1;Θ)
其中 Θ \Theta Θ就是GPT1模型,然后就是用前 k k k个token去预测第 i i i个token的概率,也就是窗口大小,是一个超参数。那么从第0个位置开始到最后得到所有的结果加起来就得到了目标函数 L 1 L_1 L1,选择log函数也是为了避免概率相乘到最后值就没有了。换句话说就是使得模型能够最大概率化语料信息。

文中使用的是多层的Transformer decoder。在Transformer的decoder由于掩码的存在提取特征的时候只能看到当前字符前面的内容,后面的内容在计算注意力机制时都是0.

在预测的过程中,加入给定上下文 U = ( u k , ⋯ , u − 1 ) U=(u_{_k},\cdots,u_{-1}) U=(uk,,u1)是上下文token的向量, n n n表示transformer decoder的层数, W e W_e We是token embedding矩阵, W p W_p Wp则是位置向量的embedding矩阵。那么预测上下文为 U U U的下一个词的过程如下:
h 0 = U W e + W p h l = t r a n s f o r m e r _ b l o c k ( h l − 1 ) , ∀ i ∈ [ 1 , n ] P ( u ) = s o f t m a x ( h n W e T ) h_0 = UW_e+W_p \\ h_l = transformer\_block(h_{l-1}),\forall { i\in[1, n]}\\ P(u)=softmax(h_nW_e^{T}) h0=UWe+Wphl=transformer_block(hl1),i[1,n]P(u)=softmax(hnWeT)

基于监督的微调(fine-tuning)

使用 L 1 L_1 L1目标函数公式训练出一个模型后,我们就可以用这个模型的参数去进行supervised的任务了。这个训练后的模型就是我们所说的预训练模型。假设我们有标记的语料 C C C,每一个样本是一段序列 x 1 , ⋯ , x m x^1,\cdots,x^m x1,,xm,其对应的标签是 y y y。输入数据经过我们的预训练模型之后就得到一个 h l m h_l^m hlm。这个 h l m h_l^m hlm就是根据任务增加的一个线性输出层的输入,预测结果为 y y y。如下公式:
P ( y ∣ x 1 , … , x m ) = softmax ⁡ ( h l m W y ) P\left(y \mid x^{1}, \ldots, x^{m}\right)=\operatorname{softmax}\left(h_{l}^{m} W_{y}\right) P(yx1,,xm)=softmax(hlmWy)
微调模型的损失函数如下:
L 2 ( C ) = ∑ ( x , y ) log ⁡ P ( y ∣ x 1 , … , x m ) L_{2}(\mathcal{C})=\sum_{(x, y)} \log P\left(y \mid x^{1}, \ldots, x^{m}\right) L2(C)=(x,y)logP(yx1,,xm)
论文中还说,如果加入给你一个序列预测序列的下一个词的损失,即 L 1 L_1 L1,加入到损失函数中,效果会更好,即有了如下损失函数:
L 3 ( C ) = L 2 ( C ) + λ ∗ L 1 ( C ) L_{3}(\mathcal{C})=L_{2}(\mathcal{C})+\lambda * L_{1}(\mathcal{C}) L3(C)=L2(C)+λL1(C)
其中 λ \lambda λ是一个超参数。

总的来说,在微调人中只需要额外的参数 W y W_y Wy。那么如何将NLP中任务输入使用预训练模型表示和处理呢?先看一下这个图:
请添加图片描述
以文本分类任务为例,为文本的收尾添加指定的delimiter,然后送入到Transformer,紧接着一个Linear即可。第二个任务就是Entailment(蕴含),也就是之前我们介绍的NIU任务。其他的任务则是按照上面的图形进行拼接就行了。

总的来说,通过构造不同类型的预训练模型的输入,去完成多项NLP任务,预训练模型本身是不会变的。


http://chatgpt.dhexx.cn/article/0Xph2Per.shtml

相关文章

ResNet50修改网络适应灰度图片并加载预训练模型

此博文是修改https://blog.csdn.net/jiacong_wang/article/details/105631229 这位大大的博文而成的,自己根据自己的情况稍微加了点东西 要修改的地方有4处 1.修改网络第一层,把3通道改为1 法一:直接在定义网络的地方修改 self.conv1 nn.…

TD-LTE R8 预编码学习笔记

预编码: MIMO系统中,当发射端通过某种方式获得一定的CSI(瞬时值,短期或中长期统计信息),就能通过一定的预处理方式对各个数据流加载的功率,速率乃至发射方向进行优化,并通过预处理在…

Task2-基于MobileaNet的预训练模型优化

##项目背景 mobilenet_v2_0.75_224 预训练模型是基于224224的训练集图片训练而来,需要通过imagenet 100M数据集把模型训练成适用于448448的预训练模型 ##思考的问题 1、预训练模型怎么使用和导入 2、如何在服务器上训练 3、如何把训练集弄出来 4、如何评价训练效果…

波束形成 基于对角加载的稳健自适应波束形成

前言 本人刚刚入门阵列信号处理的波束形成方向,因此仿真过程中可能会出现错误,如果诸位大佬发现仿真过程中有错误,请不吝指出谢谢。 对角加载(Diagonal Loading, DL)是一种比较常用的提高Capon波束形成器鲁棒性的方法,通过在样本协…

Unity大场景数据加载及优化方案

前段时间,有几个虚拟仿真公司跟我请教关于大地形的加载优化问题,它们使用的引擎都是自己研发的,引擎对于开发者来说,大同小异,它们的基本构造是一样的,关键是在于解决问题的方法,正是基于这个前…

预训练模型

目录 一、BERT1、贡献1.1 MLM任务1.2 NSP任务 2、实验细节 二、ALBERT1、贡献1.1 词向量分解1.2 层参数共享1.3 SOP任务 三、 ERNIE1、贡献2、实验细节2.1 语料2.2 MLM任务2.3 DLM任务 四、DistilBERT1、贡献2、实验细节 五、RoBERTa1、贡献2、实验细节2.1 动态mask2.2 去掉NSP…

改动模型后,加载部分预训练权重文件

加载部分预训练权重文件 最近在做姿态估计相关内容,需要将Hrnet模型修改,Hrnet是基于coco数据集训练的,coco数据集是17个关节点,而我需要的是15个关节点,在将数据集标好训练之后,发现由于数据量比较小&…

Pointer 0x0, not in getPreloadedDrawables android 系统资源预加载

Android系统在启动的时候,会对一些系统资源进行预加载。这样不仅使得应用程序在需要时可以快速地访问这些资源,还使得这些资源能够在不同应用程序之间进行共享。在硬件加速渲染环境中,这些预加载资源还有进一步优化的空间。Android系统提供了…

OpenCV | 基本矩阵操作

起因 在2013年1月份发行的OpenCV 2.4.4中,对Java的支持也正式发布。同时也有支持Python。 环境配置 这里的环境配置十分简单,在这里,操作系统64位,所以选这个,将里面的opencv_java342.dll负责到你本地下载的JDK的bin目录下,和JDK下的JRE目录下的bin目录下。 我使用的…

Android应用程序UI硬件加速渲染的预加载资源地图集服务(Asset Atlas Service)分析

我们知道,Android系统在启动的时候,会对一些系统资源进行预加载。这样不仅使得应用程序在需要时可以快速地访问这些资源,还使得这些资源能够在不同应用程序之间进行共享。在硬件加速渲染环境中,这些预加载资源还有进一步优化的空间…

预训练词嵌入

作者|ARAVIND PAI 编译|VK 来源|Analytics Vidhya 概述 理解预训练词嵌入的重要性 了解两种流行的预训练词嵌入类型:Word2Vec和GloVe 预训练词嵌入与从头学习嵌入的性能比较 介绍 我们如何让机器理解文本数据?我们知道机器非常擅长处理和处理数字数据,但如果我们向它们提供…

【论文整理】风格迁移中格拉姆矩阵(Gram Matrix)的使用

Gram矩阵在风格迁移中的使用 1、格拉姆矩阵的定义2、风格迁移的任务描述3、格拉姆矩阵的使用方法3、实现过程4、总结5、参考文献 1、格拉姆矩阵的定义 1) 什么是格拉姆矩阵: 在内积空间中,一组向量[v1, v2, … , vn]的格拉姆矩阵&#xff0…

Tensorflow加载Vgg预训练模型

很多深度神经网络模型需要加载预训练过的Vgg参数,比如说:风格迁移、目标检测、图像标注等计算机视觉中常见的任务。那么到底如何加载Vgg模型呢?Vgg文件的参数到底有何意义呢?加载后的模型该如何使用呢?本文将以Vgg19为…

混淆矩阵、准确率、F1和召回率的具体实现及混淆矩阵的可视化

utils专栏不会细讲概念性的内容,偏向实际使用,如有问题,欢迎留言。如果对你有帮助就点个赞哈,也不搞什么粉丝可见有的没的,有帮助点个赞就ok 1、混淆矩阵、准确率、F1和召回率的计算 混淆矩阵 对于混淆矩阵的计算…

预编码技术

预编码的基本原理 TD-LTE下行传输采用了MIMO-OFDM的物理层构架,通过最多4个发射天线并行传输多个(最多4个)数据流,能够有效地提高峰值传输速率。LTE的物理层处理过程中,预编码是其核心功能模块,物理下行共…

pytorch 计算混淆矩阵

混淆矩阵是评估模型结果的一种指标 用来判断分类模型的好坏 预测对了 为对角线 还可以通过矩阵的上下角发现哪些容易出错 从这个 矩阵出发 可以得到 acc ! precision recall 特异度? 目标检测01笔记AP mAP recall precision是什么 查全率是什么 查准率…

Code::Blocks 相关

文库上的使用教程 http://blog.csdn.net/JGood/article/details/5252119 使用手册 http://blog.csdn.net/liquanhai/article/details/6618300 一.Code::blocks Code::blocks集成开发环境是一个支持编译、链接、调试许多种语言的IDE,支持VS6.0到VS200…

mysql8 sql_mode去掉only_full_group_by

1.查询版本与sqlmode: select version(), sql_mode; 2.修改sqlmode,执行下面两句代码: set global sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION;set session sql_modeSTRICT_TRANS_TABLES,NO_…

- MySQL - 存储过程 Stored Procedure

文章目录 存储过程是什么存储过程的优点存储过程的缺点存储过程分类存储过程的查询语句存储过程的创建和调用语法实例 - IN、OUT、INOUT条件语句循环语句迭代 存储过程是什么 存储过程是一组为了完成特定功能的SQL语句集,存储在数据库中,一次编译多次使…

mysql的delete语句_mysql删除语句

展开全部 mysql删除语句如下: 1、delete删除一行:delete from student where id1。 2、delete删除多行:delete from student where in (1,2,3)3。 3、删62616964757a686964616fe78988e69d8331333433623162除表的所有数据:delete f…