大语言模型基础

大语言基础

GPT : Improving Language Understanding by Generative Pre-Training
提出背景

从原始文本中有效学习的能力对于减轻自然语言处理中对监督学习的依赖至关重要。很多深度学习方法需要大量人工标注的数据,限制了它们在很多领域的应用,收集更多的人工标注数据耗时且费钱。而且在有大量标注数据情况下,无监督学习到的好的向量表示能表现的更好。

但是从无标注的文本中利用信息有下面两个挑战

  1. 不清楚那种优化目标能最有效的向量表示,NLP中不同的任务(文本推理、文本问答、文本相似度评估等)用不同的目标,使得在仅在当前任务得到最优结果。
  2. 将学习到的文本表示迁移到目标任务上面的最有效的方法还没有共识,有的改模型结构,有的增加辅助目标。

GPT使用无监督的预训练(pre-training)和有监督的精调(fine-tuning)这种半监督的方式来解决这个问题,目标就是学习一个通用的向量表示,大量的下游任务仅需要做一点调整即可。

评估

四类语音理解任务:自然语言推断、问答、语义相似性、文档分类。

方案详情

两阶段,第一阶段在一个大的文本语料库上面学习一个大容量的语言模型,第二阶段针对下游具体任务精调。

第一阶段:Unsuperviserd pre-training
对于token语料库 U = { u 1 , u 2 , . . . , n n } \mathcal {U}=\{u_1,u_2, ..., n_n\} U={u1,u2,...,nn},用标准的语言建模目标最大化下面的似然函数
L 1 ( U ) = ∑ i log ⁡ P ( u i ∣ u i − k , . . . , u i − 1 ; Θ ) L_1(\mathcal{U} ) = \sum_i \log P(u_i|u_{i-k}, ..., u_{i-1};\Theta) L1(U)=ilogP(uiuik,...,ui1;Θ)
这里 k k k表示上下文窗口size大小,模型参数 Θ \Theta Θ,使用SGD训练。

U = ( u − k , . . . , u − 1 ) U=(u_{-k},...,u_{-1}) U=(uk,...,u1)表示上下文token向量, n n n表示decoder层数, W e W_e We表示token的Embedding矩阵, W p W_p Wp表示位置向量矩阵
h 0 = U W e + W p h_0=UW_e+W_p h0=UWe+Wp
h l = t r a n s f o r m e r _ b l o c k ( h l − 1 ) h_l=\mathrm{transformer\_block}(h_{l-1}) hl=transformer_block(hl1)
P ( u ) = s o f t m a x ( h n W e T ) P(u)=\mathrm{softmax}(h_nW_e^T) P(u)=softmax(hnWeT)

GPT参数量计算,参考Attention机制

使用Transformer的decoder,因为没有encoder,这里去掉了decoder里面需要encoder输入的multi-head attention模块,保留了masked multi-head attention。层数6->12,embedding维度512->768,注意力头数head_num 8->12,FFN层的隐层维度1024->3072。

在这里插入图片描述

这里 N = 4 , d = 768 , V = 40000 N=4,d=768,V=40000 N=4d=768V=40000
GPT预训练模型大小为
12 ∗ ( ( 4 + 2 ∗ 4 ) ∗ 76 8 2 + ( 5 + 4 ) ∗ 768 ) + 40000 ∗ 768 = 115737600 = 115 M 12*((4+2*4)*768^2+(5+4)*768)+40000*768=115737600=115\mathrm M 12((4+24)7682+(5+4)768)+40000768=115737600=115M
GPT还有最后的一个线性输出层,参数量为 d ∗ V d*V dV,加上精调线性层的任务参数,总量为
12 ∗ ( ( 4 + 2 ∗ 4 ) ∗ 76 8 2 + ( 5 + 4 ) ∗ 768 ) + 40000 ∗ 768 + 768 ∗ 40000 + 768 ∗ 40000 = 146457600 = 146 M 12*((4+2*4)*768^2+(5+4)*768)+40000*768 + 768*40000 + 768*40000 =146457600=146\mathrm M 12((4+24)7682+(5+4)768)+40000768+76840000+76840000=146457600=146M

第二阶段:fine-tuning
精调阶段的线性层

P ( y ∣ x 1 , . . . , x m ) = s o f t m a x ( h l W y ) P(y|x^1,...,x^m)=\mathrm{softmax}(h_lW_y) P(yx1,...,xm)=softmax(hlWy)
精调阶段最大化下面的似然函数
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)
最终的似然函数

L 3 = L 2 + L 1 L_3 = L_2 + L_1 L3=L2+L1

模型结构
在这里插入图片描述
所有任务,都需要插入开始和结束符;
对于文本推断任务,把前提和假设用分隔占位符concat起来;
对于语义相似评估任务,因为没有顺序,所以讲text1和text2连接起来作为一个输入,同时将text2和text1连接起来作为输出,经过各个的Transformer后concat起来;
多项选择任务,把context和各个候选答案分别concat起来作为输入;

实验

数据集:BookCorpus,超过7000本书,
在这里插入图片描述

预训练参数配置
在这里插入图片描述
精调参数配置
在这里插入图片描述

在文本推断任务的表现
在这里插入图片描述
在问答任务的表现
在这里插入图片描述
在文本分类任务的表现
在这里插入图片描述
Transformer层数的影响(下面左图),层数越大效果越好;比较Zero-shot的表现,和LSTM比较,Transformer随更新步数增长效果更好,LSTM就差很多,预训练的模型容量比较重要。
在这里插入图片描述
消融分析
精调阶段使用/不使用辅助的LM目标(aux LM);去掉预训练;相同层数的LSTM(单层2048个unit);
在这里插入图片描述

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
提出背景

GPT是从左到右单向的语言模型,ELMo也是单向的(单向的从左到右和单向的从右到左,然后concat到一起),单向的语言模型会限制它在下游的表现。
BERT提出双向的Transformer模型

方案详情

示意图如下
在这里插入图片描述
BERT的输入包括三部分,Token Embedding、Segment Embedding(句子pair中的句子A还是句子B)、Position Embedding
在这里插入图片描述

和其他结构比较
在这里插入图片描述
BERT是双向的Self-Attention,既可以看到前面的token,也可以看到后面的token,BERT的目标与GPT不一样了,GPT是根据前面的词预测后面的词,BERT是根据前后的词预测当前位置的词,类似于完形填空。

为此BERT引入了掩码语言任务(Masked LM),随机mask一个token,然后根据这个token之前及之后的token来预测这个token;mask的token用[MASK]占位符替代,在每个sequence里面随机mask15%的比例的token。但是[MASK]这个token并不在fine-tuning阶段出现,为了缓解预训练和精调之间这种不一致,预训练在mask的时候并不总是用[MASK]这个token代替,80%的概率用[MASK]代替,10%的概率随机选择一个token代替,10%的概率就用原来的token不做替换。
这里mask策略也是调参调出来的
在这里插入图片描述

示意图如下:
在这里插入图片描述
这里最上面是 MLM 的多分类任务,多出的这个线性层矩阵 W ∈ R d i m ∗ V W \in R^{dim*V} WRdimV是和输入的词汇表 embedding 矩阵共享的,就是多了一个偏置 b ∈ R 1 ∗ V b \in R^{1* V} bR1V,也就是此处多了 V V V个模型参数。

很多NLP的任务像问答、推断都是理解两个句子的关系,语言模型不容易直接识别到时哪种任务,为了使模型理解两个句子之间的关系,引入了下一个句子预测任务(Next Sentence Prediction , NSP),构造样本的时候,句子A后面50%的概率是后面接着的句子B(label标记为IsNext),50%的概率从语料库从语料库随机选(label标记为NotNext)
最上面是个二分类任务,有一个线性矩阵 W ∈ R d i m ∗ 2 W \in R^{dim*2} WRdim2 来表示。

fine-tuning细节和GPT一致

实验

实验配置, B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE 为了和GPT对比,和GPT的参数配置几乎完全一样。
B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE L=12,H=768,A=12
B E R T L A R G E \mathrm {BERT_{LARGE}} BERTLARGE L=24,H=1024,A=16

token数量(V)和GPT不一样,其他一致, N = 4 , d = 768 , V = 32000 N=4,d=768,V=32000 N=4d=768V=32000,不算后面fine-tuning阶段线性层的参数
B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE预训练模型大小为(加上每个位置的 embedding 512768、NSP 二分类任务参数 7682、MLM 多分类任务参数 32000(分类任务权重矩阵和词表 embedding 矩阵共享,但是有独立的偏置,参数量32000))
12 ∗ ( ( 4 + 2 ∗ 4 ) ∗ 76 8 2 + ( 5 + 4 ) ∗ 768 ) + 32000 ∗ 768 + 512 ∗ 768 + 768 ∗ 2 + 32000 = 110020352 = 110 M 12*((4+2*4)*768^2+(5+4)*768)+32000*768 + 512*768+768*2 + 32000=110020352=110\mathrm M 12((4+24)7682+(5+4)768)+32000768+512768+7682+32000=110020352=110M
B E R T L A R G E \mathrm {BERT_{LARGE}} BERTLARGE预训练模型大小为
24 ∗ ( ( 4 + 2 ∗ 4 ) ∗ 102 4 2 + ( 5 + 4 ) ∗ 1024 ) + 32000 ∗ 1024 + 512 ∗ 1024 + 1024 ∗ 2 + 32000 = 335537408 = 335 M 24*((4+2*4)*1024^2+(5+4)*1024)+32000*1024 + 512*1024 + 1024*2 + 32000=335537408=335\mathrm M 24((4+24)10242+(5+4)1024)+320001024+5121024+10242+32000=335537408=335M
实验效果
在这里插入图片描述

RoBERTa: A Robustly Optimized BERT Pretraining Approach

BERT的升级优化版本

提出背景

BERT训练不充分,还有很大的空间
提升措施:

  1. 让模型训练的更久、使用更大的batch size,使用更多的数据
  2. 去除下一个句子预测任务NSP
  3. 在更长的sequence序列上面训练
  4. 在训练数据中动态改变mask方式
方案详情

增加语料库

  1. BOOKCORPUS加上英语WIKIPEDIA,这是BERT用的语料库(16GB)
  2. CC-NEWS,这是RoBERTa从CommonCrawl新闻数据集手机的,包含6300万英语新闻文章(2016年至2019年)(76GB)
  3. OPENWEBTEXT开源的WebText语料库,从Reddit上面根据URL抽取的web内容(38GB)
  4. STORIES包含了过滤的CommonCraw数据子集(31GB)

下游任务评估基准
GLUE:The General Language Understanding Evaluation,包含9个数据集来评估自然语言理解。
SQuAD:The Stanford Question Answering Dataset 提供一个上下文的段落及以问题,任务是通过抽取上下文回答问题。
RACE:The ReAding Comprehension from Examinations 大规模的阅读理解数据集,包含28000篇文章和100000个问题,来自中国的中学英文考试题目。

改进BERT
配置和 B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE一样 (L=12, H=768, A=12, 110M参数量)
BERT模型在数据预处理的时候就mask好了,称为静态mask(static masking)数据复制了10份,在40个epoch里面,每份训练数据会相同mask4次。这里采用动态mask(dynamic masking)训练数据每次都是动态mask,保证训练时不会有重复的mask数据。动态masking效果更好,后面的评测均用动态masking。
在这里插入图片描述
原始BERT里面有个NSP任务,预测下一个句子的任务,去掉NSP会影响效果,但是有很多质疑的研究,起作用的主要是MLM,并不是NSP,为此做了一些消融实验来验证。

SEGMENT-PAIR+NSP:原始的BERT的方式,每个输入是一个Segment pair对,每个Segment可以包含多个自然句子,多个句子的总长度不超过512个tokens。
SENTENCE-PAIR+NSP:每个输入是一个自然句子pair对,因为这些句子显著低于512个tokens,因此增大batch size使得batch内总的token数量与SEGMENT-PAIR+NSP相似,也有NSP loss。
FULL-SENTENCES:每个输入是从一个或者多个文档中连续采样得来的,每个输入最多512个tokens,输入可能跨文档,如果跨文档,增加一个额外的分割token在里面,同时去除NSP loss。
DOC-SENTENCES:构造方式和FULL-SENTENCES类似,就是句子不跨文档。那么采样文档末尾的句子的时候,token长度可能小于512个,那就动态增加batch size,使得batch内的token和FULL-SENTENCES相似。

结果如下:
SEGMENT-PAIR+NSP vs SENTENCE-PAIR+NSP 说明使用单个句子模型没法学习到长距离依赖关系。
FULL-SENTENCES vs SEGMENT-PAIR+NSP:说明去除NSP loss会提升下游任务表现
FULL-SENTENCES vs DOC-SENTENCES:限制sequence来自同一个文档有轻微提升,但是batch size是动态的,为了对比方便,后面都使用FULL-SENTENCES这一组。
在这里插入图片描述
更大的batch size
更大的batch size带来更好的效果
在这里插入图片描述
文本编码方式
Byte-Pair Encoding(BPE)是字符级和单词级表示的混合,该编码方案可以处理自然语言语料库中常见的大量词汇。BPE不依赖于完整的单词,而是依赖于子词(sub-word)单元,这些子词单元是通过对训练语料库进行统计分析而提取的,其词表大小通常在 1万到 10万之间。
原始的BERT使用的是字符级的编码,词汇量30K,RoBERTa使用BPE编码,词汇量50K,相对 B E R T B A S E \mathrm {BERT_{BASE}} BERTBASE B E R T L A R G E \mathrm {BERT_{LARGE}} BERTLARGE会多出15M到20M的参数量。

实验效果

在这里插入图片描述

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

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

相关文章

双向带头循环链表

一、概念 何为双向:此链表每一个节点的指针域由两部分组成,一个指针指向下一个节点,另一个指针指向上一个节点,并且两头的节点也是如此,头节点的下一个节点是尾节点,尾节点的上一个节点是头节点&#xff1b…

ubuntu下载Nginx

一、Nginx下载安装(Ubuntu系统) 1.nginx下载 sudo apt-get install nginx2.nginx启动 启动命令 sudo nginx重新编译(每次更改完nginx配置文件后运行): sudo nginx -s reload3.测试nginx是否启动成功 打开浏览器访问本机80端口…

javaweb学习day1《HTML篇》--新浪微博(前端页面的创建思路及其HTML、css代码详解)

一、前言 本篇章为javaweb的开端,也是第一篇综合案例,小编也是看着黑马程序员的视频对里面的知识点进行理解,然后自己找一个新浪微博网页看着做的,主要还是因为懒,不想去领黑马程序员的资料了。 小编任务javaweb和ja…

3102. 最小化曼哈顿距离——leetcode

给你一个下标从 0 开始的数组 points ,它表示二维平面上一些点的整数坐标,其中 points[i] [xi, yi] 。 两点之间的距离定义为它们的曼哈顿距离。 请你恰好移除一个点,返回移除后任意两点之间的 最大 距离可能的 最小 值。 示例&#xff1…

【k8s中安装rabbitmq】k8s中基于安装rabbitmq并搭建镜像集群-pvc版

文章目录 简介一.条件及环境说明4.2.创建configmap配置4.3.创建statefulset和service headless配置4.4.授权配置4.5.创建service配置 五.安装完后的配置六.安装说明 简介 该文搭建的rabbitmq集群是采用rabbitmq_peer_discovery_k8s的形式进行搭建,是通过该插件自动从…

这8个AI工具高效无敌,设计师又轻松了!

人工智能工具在设计领域的广泛应用给艺术界带来了巨大的变化。设计师可以使用各种工具来展示他们的创造力和灵感,而不受时间和空间的限制。这些专业的人工智能绘图工具允许设计师看到每一步的最终结果,从而更高效、更方便地创造和设计灵感。因此&#xf…

什么是业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架,旨在帮助组织高效地进行架构设计和管理。而TOGAF的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 所以今天我们就来聊聊,企业…

水文:CBA业务架构师

首先, 我们来了解一下什么是CBA业务架构师? CBA业务架构师认证是由业务架构师公会(Business Architecture Guild)授予的一种专业认证。标志着证书持有者已经掌握了业务架构的核心技能和知识,能够在实际工作中熟练运用业务架构技术和框架&…

SAP S4 销售组的定义和分配

spro-企业结构-定义-销售与分销-维护销售组 新增一个记录 spro-企业结构-分配-销售与分销-给销售办公室分配销售组

c++多态——virtual关键字,C++11 override 和 final,析构函数的重写。

目录 多态基本概念 virtual关键字 C11 override 和 final 举个栗子 析构函数的重写(基类与派生类析构函数的名字不同) 多态基本概念 概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同…

关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论

目录 问题一:关于string的\0问题讨论 问题二:C标准库中的string内存是分配在堆上面吗? 问题三:string与vector的capacity大小设计的特点 问题四:string的流提取问题 问题五:迭代器失效 问题六&#xf…

filex用户手册中文版解读

filex用户手册 filex的用户手册,看着好头疼呢,主要是没有🖊记录,感觉就是浮在空中,飘在天上,好像懂了,又好像啥也没了解到,哈哈,有点意思。为了解决这个bug,…

哪个牌子开放式耳机质量好?五款全网爆火款式盘点!

开放式耳机是目前最流行的一种无线蓝牙耳机,与TWS耳机一样,拥有小巧轻盈的耳机主体,也有便携的补能收纳充电仓,但不同的是,开放式耳机有更加舒适的佩戴体验。作为资深数码产品测评师,我最近测评了多款产品&…

基于前馈神经网络 FNN 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

原生小程序生成二维码并保存到本地

需求:我要在一个页面中生成一个二维码,并且这个二维码可以长按保存到本地或者发送给好友; 我这里是将生成的canvas二维码转换成图片,利用长按图片进行保存或转发 效果图: 第一步先下载对应的包: npm instal…

Docker部署gitlab私有仓库后查看root默认密码以及修改external_url路径和端口的方法

文章目录 1、docker部署最新版gitlab2、进入gitlab容器3、修改路径地址ip和端口4、检验效果 1、docker部署最新版gitlab #docker安装命令 docker run --detach \--name gitlab \--restart always \-p 1080:80 \-p 10443:443 \-p 1022:22 \-v /gitlab/config:/etc/gitlab \-v …

Apache中使用CGI

Apache24 使用Visual Studio 2022 // CGI2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <stdio.h> #include <stdlib.h>#include <stdio.h>void main() {//设置HTML语言printf("Content-type:text/html\n\n&q…

Redis基本命令源码解析-字符串命令

1. set 用于将kv设置到数据库中 2. mset 批量设置kv mset (msetnx) key1 value1 key2 value2 ... mset:msetCommand msetnx:msetnxCommand msetCommand和msetnxCommand都调用msetGenericCommand 2.1 msetGenericCommand 如果参数个数为偶数,则响应参数错误并返回 如果…

【游戏客户端】大话slg玩法架构(二)背景地图

【游戏客户端】大话slg玩法架构&#xff08;二&#xff09;背景地图 大家好&#xff0c;我是Lampard家杰~~ 今天我们继续给大家分享SLG玩法的实现架构&#xff0c;关于SLG玩法的介绍可以参考这篇上一篇文章&#xff1a;【游戏客户端】制作率土之滨Like玩法 PS&#xff1a;和之前…

hudi数据湖万字全方位教程+应用示例

1、时间轴&#xff08;TimeLine&#xff09; Hudi的核心是维护表上在不同的即时时间&#xff08;instants&#xff09;执行的所有操作的时间轴&#xff08;timeline&#xff09;&#xff0c;这有助于提供表的即时视图 一个instant由以下三个部分组成&#xff1a; 1&#xff09;…