GPT的应用:辅助写作,代码生成(GitHub Copilot)
GPT一代
:
摘要:
在自然语言理解里面,有很多不一样的任务,虽然有很多大量没有标注的文本,但是标注好的文本文件还是太少了,这就使得要去从标注好的数据上训练出分辨模型的话,会比较难,因为数据太少了,作者提出解决方法,在未标注的数据里面训练一个语言模型,然后再在标注好的模型上面寻训练微调出一个分辨的微调模型,(与视觉方向不同的的是:使用未标注好的数据进行训练,然后再用标注好的数据进行微调)区别:之前的工作是在微调时候构造与任务相关的输入,从而使得只需要很少的架构就行,最早的词嵌入只是对词上面的一个学习。这里我们只需要改变一个输入的形式就行。
引言:
怎么应用无监督的文本,在当是最成功的模型是词嵌入模型。没有标号的文本使用起来有困难,第一个困难不知道使用什么样的目标函数,第二个是怎么样将学习到的文本表示传递到下游的子任务中。
GPT3主要提出了一个半监督的方法
3.1在没有标号的文本做与训练:
假设有个没有标号的文本U,然后使用标准语言模型的标准函数来最大化下面的最大似然函数
语言模型就是要预测第i个词出现的概率,第i个词即为ui,把ui前面的k个词,(k未上下文窗口)
就是说每次拿k个连续的词,然后预测k个词后面的词,就是模型的参数,i就是从0到最后,把后面词都加起来就得到目标函数 即为L1,为什么要从加,是因为前面取了log的缘故,如果还原为指数的话,那就是所有这些词出现的概率相乘,也就是联合概率。要训练一个模型,要让它最大输出跟我的文本一样的文章,是模型参数,k就是窗口的大小,从神经网络角度而言,k就是输入序列的长度;模型使用transformer的解码器。其中,transformer有两个东西一个是编码器,一个是解码器,他们之间最大的不同在于,编码器来自于序列进来,他对第i个元素抽去特征的时候,它能够看到整个序列的所有元素,所以他在第i个元素抽取特征的时候,它只会看到当前元素和之前的元素,后面的东西通过一个掩码,使得在计算注意力机制的时候变成0,所以它是不看后面的东西的,这个地方我们使用的是标准的语言模型,所以只对前预测,预测第i个值不会看到前面的词,transforner块不会改变输入和输出的形状。
如果要预测U这个词的,那么把这个词前的词拿出来记作一个大U,
然后在做一个词嵌入的投影,再加上一个位置信息的编码:
得到第一层的输入,如果要得到n层,每一层把上一层的输出拿出来得到输出,最后拿到最后一个transforner块的输出,然后再用softmax就会得到它的概率分布了;
GPT与BERT的区别:
Bert用的不是标准的语言模型,用的是带掩码的语言模型,就是完型填空,就是说给一个句子,把中间的词挖掉,然后让你预测中间的词,就是说在预测的时候又能看到前面的词也能看到后面的词,所以用的到是transform的编码器(transform的编码器能够看到所有,而解码器不是);
最主要的区别是目标函数的选取,GPT用的是更难的预测,就是根据当前的词预测未来的词,比如说给当前和之前的股票信息,预测明天的股价;所以GPT训练效果要比Bert差很多;
3.2 怎么做微调的?
在微调任务里面是有标号的序列的,具体来说就是给定一个长为m的标号的序列,然后这个序列对应的标号为y,每次要预测y的概率,把整个序列放到训练好的GPT的序列里面,然后拿到transformer块的最后一层的输出,他对应的hlm的输出再乘以输出层再经过softmax
在微调的时候有两个目标函数,第一个就是说给定这些序列,然后预测序列的下一个词,和给你一个完整的词,让你预测序列对应的标号,这两个一起训练效果是最佳的。
transformer核心QKV的理解参考博客:
【精选】transformer中QKV的通俗理解(渣男与备胎的故事)-CSDN博客
3.3如何将NLP中的不一样的子任务表示为我们想要的形式
NLP四大常见应用:
1.分类
2、蕴含:给定一段话,和一个假设,判断是否这个段话是否包含这个假设(支持假设,否定假设,既不支持也不否定),其中这些词符号必须是特殊字符,以防止与序列文本混淆。
3、相似:判断两个文档是不是相似
4、多选题:就是问一个问题,给多个答案,选择合适的答案
实验:
1.实验是在一个 BooksCorpus上进行训练得到的,其中有7000篇没有发表的文章.
2、模型:
用到2层的一个transformer的解码器,然后每一层的维度是768,在结果上比之前的方法效果好
和bert进行对比,bert用的12层的编码器,维度也是768,编码器在同样的层数和维度大小的时候,其实要比解码器简单一点点,因为少一块带掩码的那部分。
GPT二代
主要工作:1构建一个比bert训练用的更大的数据集,百万级别的WebText,1.5B(15亿)的模型
2、zero-shot
导言:
方法:
不同点:
之前在做gpt的时候是在自然的语言上面进行训练,但是在做下游的任务的时候,需要对他的输入进行了构造,特别是说加入了开始符号,中间符,结束符,这些符号模型之前是没有看过的,但是有微调环节,所以模型会去认识这鞋符号,比如给一些训练样本,去让模型去认识这些符号,但是如果要做zero-shot,那么问题是在做下游任务时候,模型不能调整了,所以在下游任务中不能再构建模型没有见过 的输入了。
例子:比如机器翻译,英语翻译成法语,可以表达成这样的句子:翻译成法语,给你英语的那个文本,接下来是英语对应的法语的文本。
GPT3
GPT3模型有175B的参数 ,做下游任务不做任何的微调,
引言:
提出三个问题:
1、建立大的数据集需要标号,这是很大的问题
2、当一个样本没有出现在这个数据分布里面,那么泛化性不见得要比小模型要好,不一定说预训练泛化性就很好
3、人类不需要一个很大的数据集进行任务
解决方案:
few-shot zero-shot
作者取名为meta-learnning(元学习),强调不更新权重,
第二章:模型
微调
few-shot就是对one-shot的拓展,给定一些序列样本,可以做更长,但不一定有用,
GPT3的局限性:
1、生成文本的局限性,直观来讲就是无法写小说;
2、结构上和算法上的局限性,GPT3是用的语言模型,使用的transformer的解码器,只能往前看,
3,语言模型去预测下一个词语,所以每一词都是很均匀的预测下一个词,没有那个词重要那个词并不重要
4、没有涉及video,图像等工作任务
5、训练起来贵