自然语言处理基础和应用
👆说明之前的大模型其实有很多都是基于迁移学习的方法。
attention机制的总结,解决了信息瓶颈的问题。
处理词组时BPE的过程
👆pos表示的是token所在的位置
👆技巧是layer normalization。
prompt
参数高效微调方法
大多数的模型做的都是基座模型、不一定具备对话能力。
一般会通过基座模型,然后微调成对话模型。(难度很大)
大多数自己做的模型,都是根据已经训练成功的对话模型再微调。
👆语言没有sql、因为sql的语言不通用。
数据集分类
👆总结,虽然大模型效果会好,但是到一定程度会有瓶颈。
分词类型描述👆
由于显卡的存储是有限的,所以并行是非常有必要的👇
👆大模型里用的最多的是量化!!!!
8位整数表达64位浮点数,内存空间减少到只有原来的1/8。
浮点数变成整数叫量化、浮点数变成整数叫做反量化。
常见的量化方法
Vim用transformer做图像分类
这个模型完全没用cnn,把内容和位置同时加到一个向量,在第一个向量模仿bert做了一个cls。
文本微调
以上是讲授的微调技术。
在nlp领域的一些基础的预训练模型👆
👆为nlp一些常见的任务![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/04c8a974fec377f488d46b8416eb625f.png)
bert类预训练模型所用的一些微调的方法
GPT刚开始的微调是通过最后的全连接层+一个softmax来实现的![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fe163725ecc0bbe2b7e8f3e4dc31be9d.png)
因为模型太大了微调基本不好实现👆说了一种方法叫做in-context learning 先给几个翻译例子给模型,然后模型对于下面的例子做到的效果就比较好,很玄学。
大模型模型越大效果越好,可使用的范围也会变大。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d439d029065197c0950e91e3826e318d.png)
👆中的调查结果显示现在的1billion以上的大模型的使用率还是很低的。
现在所用的大模型的调试有两种思路
1、通过prompt-learning进行调试
2、用delta tuning 通过 调试一小部分(0.1%或0.01%)来进行全面的微调。
没使用prompt之前,是通过👆预训练模型进行单词的预测,fine-tuning来进行分类的预测,两种方法区别较大。
把预训练模型加词,这样就把两种方法所做的事情联系起来了。👆,通过你prompt所加的词(it‘s 、it can do,it‘s longth is small/big)的不同,就可以把他看作是不同的分类。bert(双向attention)是用来做‘生成’的 ,但用这种token生成的方式也可以做‘分类’,gpt是做‘生成’的,现在也可以这样处理让他做‘理解’。
👆的例子就是用bert做情感分类(bert双向注意力机制刚开始的目的是用来做‘理解’)。
GPT正常是做预测👆
👆bert做理解
通过一些template可以实现一些人类逻辑的理解👆
template
template还可以做一些实体类型词的指定,这样可以更直接的提取信息。
分结构的template👆通过键值对的方式来提醒模型应该是从哪个方面去选择。
在机器学习的时候可能会做很多特征工程,在大模型现在这种状态,可能会做更多的提示工程(prompt engineering)。
👆模型生成什么样的template,还是取决于我们对于处理template的策略。
👆NLU(Natural Language Understanding)
"prompt"是一种用于引导模型生成输出的输入形式,而"data point"是机器学习中的一个基本单位,包含输入和输出。在某些情况下,prompt可以被视为一种特殊类型的数据点。
在上述这篇论文中说一个prompt大概等于50个data point。
prompt-learning: Verbalizer
👆其实是做的对于answer的答案进行分类,Mapping,通过计算给出词的概率,答案类别,可以是一个词或多个词,一个字符串,一个任意长的句子。verbalizer可以人为的去构造也可以自动的去生成。
怎么去用好对于verbalizer的问题是一个很需要研究的问题
prompt的institution是定义把预训练和下游任务之间的gap给弥补回来,通过额外的上下文提示去告诉模型怎么去做。
在预训练模型时加入prompt👆![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6868d536b316f7cae8f8b66f230d5388.png)
在预训练中进行prompt👇
PLM(Pre-trained Language Model)
👆所说的是,通过对一个120B的PLM进行六十个任务训练,训练的是一个auto-regressive的模型,每个任务在给出文本的时候给出问题,然后在问题的回答的时候给出OPTION提示,达到预训练的目的。这样在下一个给出的推理问题的时候,给出提示之后,通过之前训练的范式,也会有很好的理解语义的效果。
👆有一个特别引人深思的现象,80B之前的训练没有很好的效果,但是在80亿参数之后,突然对于这种理解类的效果特别好。
上述任务是通过很多类型的prompt训练模型之后,用一个新的任务,理解也会很好。
👆这个像1750亿级别的GPT3都没法在特定领域训练效果很好,但是如果用prompt-learning可能在较小的模型中针对性训练就可以效果很好。
Delta Tuning
只优化其中很小部分的参数,就能达到很好的效果。
对于fine-tuning可能同时调100多个任务,内存要求极高不可能实现,但是对于Delta tuning可能只需要每个人物抽取一部分Objects,几十兆或几百兆,就能达到不错的效果。但是技术点也有很多,Delta数据怎么选,模型怎么选,怎么进行tuning优化。
为什么Delta Tuning有效(work)呢,因为预训练模型的基础让模型的知识训练量到达了一定程度的规模👇
👆有一个说法非常理解:tuning更多的是去“激发”model学到的知识。
增量式:插入参数。
指定式(替换):哪些可训练,哪些不可训练。
重参数化式:用低秩的矩阵来代替模型完成微调。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/465d0df08a325201e49606997ba639c4.png)
adapter-Tuning
1、增量式![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/77cebfe859356192210409450a964ef4.png)
👆里面在进入transformer的时候加一个adapter 层,到时候训练的时候就只更改adapter层 只用整体变量的很小一部分。0.5%~8%。![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e7bef5a1f70038966cd83f6f2eb6b5d6.png)
由于adapter的正向传播和反馈都得经过各个层变量,所以上述方法提供了一个方法,把adapter提出来做单独的训练,这样显存和内存使用的情况都少了很多,速度也会变快,非常巧妙。
在进transformer之前加一些prefixs,增加变量进行一定的微调训练。👆
2、指定式![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/811b286a20dd434f70a71bb39e975dab.png)
3、重参数化式
在前面已经讲过了,只在输入层加入一些embeddings
把120个任务压缩到一个低维的子空间里进行tuning👆![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4fc14f8eb779a3913fcd852e68804a3c.png)
把模型的矩阵参数认为是低秩的(其实不是)。
prefix-tuning、adapter、LoRA结合起来使用
Delta-tunning的联系👇
把tunning解释成:在离散状态下寻找最优控制器的过程。
其实通过图中可以发现,当模型为XXL时,各种调试方法的结果都会特别好。👆
以上的各种微调的方法,还是在进行人为的选择方法中来进行的,下面说一种可以人为选择的方法,在每个可定义优化的地方加上开关,进行Automatically search the structure。