生成式预训练语言模型
一、图灵测试到自然语言处理( Natural Language Processing, NLP)发展简史
1.1 语言模型的引入
语言是信息的载体
通信模型
NLP
语言模型的定义:
计算和预测自然语言序列概率分布的模型
分析语言数据来推断和预测语言现象
可以判断一个语言序列是否是正常句子
可以根据给定的上下文,预测接下来会出现的单词
1.2语言模型的进化
起源图灵测试
——
基于规则(太过复杂,容错率低)
——
基于统计(判断哪个更像句子——判断哪个句子的概率大。是“写了”“本书”的概率高,哈斯hi“写了”“学生”的概率高)
——
深度学习大数据驱动
贾利尼克的假设:一个句子是否合理,取决于出现在自然语言种的可能性的大小
1.2.1 基于统计的语言模型
句子出现的可能性——每个词按照特定顺序出现的可能性
条件概率
1.2.2 基于深度学习的语言模型
2003年,Bengio团队发表论文“A Neural Probabilistic language Model”首次提出了将神经网络应用于语言模型的概念
1.2.3 语言模型发展的里程碑
1948 N-gram model:基于钱n-1个词来预测序列的下一个词
1954 Bag-of-words 词袋模型,统计词频,转换为概率问题
2003 Probabilistic language Model
2013 word2vec简单高效的分布式单词表示方法
2018 pre-trained language model 预训练模型
1.3 预训练模型
1.3.1预训练的类型
目前所用的
编码器家族
——都是基于BERT的模型
BERT:Bi-direction Encoder Representation Transformer——双向编码表示transformer
其他都是BERT的改装
解码器家族
——GPT
generative pretrain transformer——生成(单向)预训练transformer
对比
(1) BERT:填空,一段话中一部分打码,所以可以从前后文两方面来推断。masked
(2)GPT:接龙,只根据前文猜后文
1.3.2从GPT到ChatGPT
GPT-1:基于transformer架构,无监督
…
GPT3模型参数已经到达一千倍
InstructGPT——衍生chatgpt
gpt4:按人类的指令语气
1.3.3 大模型的使用模式:
a) pretrain+fine-tuning
在现有的模型上进行预训练+微调
网站:Hagging Face (教怎么微调)
b) Prompt/instruct
知识和问题已经拥有,如何优化好的问题得到好的答案
二、语言模型的早期形式 N-gram
2.1 语言模型
估计文本概率分布
关注上下文单词的相关性
2.2 N_gram
N-gram:基于统计,基于前N-1个词
gram可以是“词”也可以是“字”
需要运用语料库分词器:
没见过or拼写错误的英文词——拆分成子词
2.3 创建一个bigram字符预测模型
1) 构建语料库
2)定义一个分词函数
3)计算bigram词频
前缀prefix 有N-1,bigram中N=2
目标token
4)根据词频计算bigram概率
5)定义生成下一个词的函数
6)生成连续文本
优点:计算简单
缺点:无法捕捉长距离的词汇关系
三、词的向量如何习得:Word2Vec
必须先把词转换为向量输入机器学习
3.1 计算机如何表示词
给词贴上标签,在计算机里唯一
方法
独热编码
分布式表示:表示成较短的向量。Word2vec
3.2 One-Hot编码
缺点:高维、稀疏、缺乏语义信息、无法处理未知词汇
3.3 分布式表示
表示学习:表示成浓稠、低维的实值。——就是捕捉不同特征(维度),每个维度就都是低维的了。该特征相同表示为该维度上为一个点
3.4 词向量的定义
文档相似度
词向量≈词嵌入
优点:降维、泛化性
3.5 Word2vec的思想
文本——one-hot——词向量
word2vec是一种算法(神经网络):一个词的含义可以从周围词(上下文)推出来
3.5.1 word2vec的两种主要实现方式
CBOW:通过上下文词,预测中心词(高频词)
skip-gram:通过中心词,预测上下文(罕见词)
3.5.2 word2vec的模型结构
浅层神经网络
通过两个线性层学习
输入词——one-hot编码——线性层(这个W最重要)——词向量(产品)——输出层(线性,解码)——激活函数
3.6 Skip-Gram词向量模型
1)语料库
2)skip-gram数据 相近的词联系再一起,中心词和上下文词
3)独热编码
4)定义skip-gram模型
5)训练模型
显示习得的词向量
3.7 word2vec总结
先学习分布式词表示
局限性:静态的,学好了之后是固定的
四、神经概率语言模型NPLM
4.1神经概率语言模型:NPLM
输入层:单词映射到连续的词向量空间
隐藏层:通过非线性激活函数学习单词间的复杂关系(词向量的维度)
输出层:通过softmax层产生下一个单词的概率分布(词典的维度)
为什么输出层没有softmax?
因为在损失函数中用交叉熵损失,包含了softmax
4.2 NPLM模型实践
1)语料库
2)生成数据:需要词嵌入维度(和前面几个上文词)
3)构建NPLM网络:线性层 激活层 线性层
4)实例化NPLM网络
5)训练NPLM网络
6)用NPLM网络预测下一个此:可以直接max,选取概率最高的索引
4.3 NPLM模型的增强与改进
深度神经网络DNN
循环神经网络:RNN LSTM GRU
神经网络在长序列问题上面临挑战:长距离的依赖关系
局限:NPLM本身是一种浅层神经网络,机试引入RNN、LSTM,这种简单的结构仍然无法捕捉复杂的依赖关系和语义结构
4.3.1 RNN
1)按序列循环进行
2)增加隐藏状态(有记忆)
五、Transformer的基于架构-序列到系列Seq2Seq
编码器——解码器
5.1 Seq2Seq架构
[1] Sequence to sequence learning with neural networks. NIPS,3104-3112.llya sutskever, Oriol Vinyals, and Quoc V.Le.2014. https://papers.nips.cc/paper/2014/file/a14ac55a4f27472c5d894ec1c3c743d2-Paper.pdf
RNN网络,
优势
端到端学习
处理可变长度序列
信息的压缩和抽象表示:编码器输入序列编码成上下文向量,解码器则从这个上下文向量生成输出序列
可扩展性:可以很容易与其他神经网络组件(如卷积神经网络、循环神经网络等)结合
解码器输入(?):之前时间步的输出是当前的输入
SOS start of seq
EOS end of seq
注意,为什么解码器也要输入:能够在编码器输入预测错误的情况下,解码器输入正确的信息
适合处理:一段问题
不适合处理:分类,标注
5.2 Seq2Seq模型实现机器翻译任务
1)语料库:包含三部分(元语言、sos+目标语言+目标语言+eos)
2)生成训练数据
3)定义编码器解码器
4)定义Seq2Seq模型
5)训练Seq2Seq模型
6)用NPLM网络预测下一个此:可以直接max,选取概率最高的索引
5.3 Seq2Seq局限
长序列
顺序处理
梯度消失和梯度爆炸
六、Transformer的核心机制——注意力attention
6.1 Seq2Seq局限即attention如和解决局限
长距离依赖——动态选择输入关键部分
顺序处理
对齐问题:源序列和目标序列可能不对成
6.2 注意力机制的拆解
6.2.1 点积注意力
两个序列的不同特征的相关程度,X1X2^H.
得到注意力分数(原始权重),归一化, 与X2相乘计算加权和
得到有对X2注意的X1
6.2.2 缩放点积注意力
特征维度大,要压缩,
对原始权重继续宁缩放,缩放因子是特征维度值得平方根,然后再进行归一化
6.2.3 编码器-解码器注意力
X1是解码器
X2是编码器
因为是在解码的时候注意编码输入的上下文信息
1)创建Attention类,计算注意力权重
2)在decoder中增加attetion层(初始化和前向传播)
3)更新seq2seq类的前向传播,将编码器输出传递给解码器
Q:Query查询
K:Key 键
V:Value值
Q就是正在处理的X1,希望输出的
K和V是上下文的X2,希望X1中包含这部分信息,因此给出了K、V等于是查询的内容。(那为什么要给两个参数呢?)
6.2.4 自注意力和多头注意力
自注意力,QKV都是X1的线性变化
多头注意力:对QKV进行多次线性变换,从而获得不同的头head,而进行计算
其实是把信息的特征分割了,比如总共有四个特征,现在用两个头并行计算,则一个头只要计算2个特征
6.3 注意力中的掩码
padding 填充符 使得所有序列达到相同的长度,以便能够批量处理,在处理时,,不希望将其作为有效输入,因此需要指示模型忽略这个符号,这就是掩码
如何执行——是的该位置的权重为无穷大inf
七、transformer
[2] Vaswani, A., et al.(2017).Attention Is All You Need.In Proceedings of the 31st
Conference on Neural Information Processing Systems (NIPS 2017) (pp.6000-6010).
7.1 transformer的引入
引入注意力机制之后的Seq2Aeq
解决了:
a)长距离序列的依赖问题
b)信息压缩过程中的损失问题(多头)
仍然存在问题:
a)忽略了原序列和目标序列本身内部的注意力
b)复杂度和计算成本:每个时间处理整个序列(仍然是RNN结构,无法并行)
7.2 transformer架构
7.2.1 架构概述
编码器-解码器架构
自注意力机制
多头注意力
位置编码(因为不再是rnn顺序处理了,所以要加上定位)
7.2.2 缩放点积注意力与多头注意力
掩码给-1e9无穷小的值
多头注意力:并行
引入了残差机制
输出:上下文、注意力权重(?)
过程:
QKV
掩码
点积
缩放
归一化
加权
输出
7.2.3 逐位置前向传播与正弦位置编码
1、逐位置前向传播网络
先升维,再降维(通过升维丰富特征)
2、正弦位置编码表
为什么要用正弦来表示——周期性(可以更好地捕捉循环和重复出现的自然语言,比如语法结构)
不同的维度特征,有不同的周期,因此显示了不同频率的正弦函数
(?)
7.2.4 填充位置掩码
1、填充padding
2、词向量=0
3、布尔运算(0->1,其他->1)
4、1->-1e9
7.2.5 编码器与解码器
后续位置掩码:后续位置信息应该是未知的,但是由于transformer不是像rnn这样的顺序运行,所以要手动欠佳后续掩码,以防止解码器在当前未知时过度依赖未来的信息
解码器:
输出:解码器输出,解码器自注意力(解码器中的QKV)和解码器-编码器注意力权重(解码器中的Q,和编码器中的KV)
7.3 基于Transformer的机器翻译(?)
8、GPT
8.1 为什么GPT只要decoder
BERT:编码
GPT:解码
8.2 GPT模型架构
实际上比transformer简单,因为拿掉了编码器
核心:自注意力+位置编码+并行
缩放点积注意力
多头注意力
逐位置前向传播网络 1*1卷积 保证每一个位置独立
正弦位置编码表
填充位置掩码
后续位置掩码
8.3 wiki-GPT实例(?)
贪心解码:每一个下一个词都是局部最优
集束解码:所有后面的词的联合概率是最优
九、chatgpt
9.2 chatgpt训练方法
http://github.com/Hannibal046/Awesome-LLM
很多大模型
预训练
指令调优
对齐
RLHF训练:RL强化学习,HF人工反馈
总结
输入输出