大模型知识点

大模型git项目:

首页 · 魔搭社区 (modelscope.cn)

Hugging Face – The AI community building the future.

GitHub - LC1332/Luotuo-Chinese-LLM: 骆驼(Luotuo): Open Sourced Chinese Language Models. Developed by 陈启源 @ 华中师范大学 & 李鲁鲁 @ 商汤科技 & 冷子昂 @ 商汤科技

GitHub - taishan1994/ChatGLM-LoRA-Tuning: 使用LoRA对ChatGLM进行微调。

GitHub - liucongg/ChatGLM-Finetuning: 基于ChatGLM-6B模型,进行下游具体任务微调,涉及Freeze、Lora、P-tuning等

西西嘛呦 - 博客园 (cnblogs.com)

Installation — transformers 4.4.2 documentation (huggingface.co)

参数有效化微调(Parameter Efficient Fine Tuning,PEFT)

精度:

fp64:双精度   fp32:单精度  fp16:半精度  Int8是个很极端的数据类型,它最多只能表示-128~127的数字,并且完全没有精度。

其次,考虑模型需要的RAM大致分三个部分:

  • 模型参数
  • 梯度
  • 优化器参数

模型参数:等于参数量*每个参数所需内存。

对于fp32,LLaMA-6B需要6B*4 bytes = 24GB内存

对于int8,LLaMA-6B需要6B*1 byte = 6GB

梯度:同上,等于参数量*每个梯度参数所需内存。

优化器参数:不同的优化器所储存的参数量不同。

对于常用的AdamW来说,需要储存两倍的模型参数(用来储存一阶和二阶momentum)。

fp32的LLaMA-6B,AdamW需要6B*8 bytes = 48 GB

int8的LLaMA-6B,AdamW需要6B*2 bytes = 12 GB

如何缓解复读机问题?

解码方式里增加不确定性,既然容易复读那我们就增加随机性,开启do_sample选项,调高temperature。

如果学的太烂,do_sample也不顶用呢?加重复惩罚,设置repetition_penalty,注意别设置太大了。不然你会发现连标点符号都不会输出了。



参数高效微调(PEFT)技术

在面对特定的下游任务时,如果进行Full FineTuning(即对预训练模型中的所有参数都进行微调),太过低效;而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果。

PEFT技术旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。因此,PEFT技术可以在提高模型效果的同时,大大缩短模型训练时间和计算成本,让更多人能够参与到深度学习研究中来。

  • Prefix Tuning:与full fine-tuning更新所有参数的方式不同,该方法是在输入token之前构造一段任务相关的virtual tokens作为Prefix,然后训练的时候只更新Prefix部分的参数,而Transformer中的其他部分参数固定。该方法其实和构造Prompt类似,只是Prompt是人为构造的“显式”的提示,并且无法更新参数,而Prefix则是可以学习的“隐式”的提示。 同时,为了防止直接更新Prefix的参数导致训练不稳定的情况,他们在Prefix层前面加了MLP结构(相当于将Prefix分解为更小维度的Input与MLP的组合后输出的结果),训练完成后,只保留Prefix的参数。
  • Prompt Tuning:该方法可以看作是Prefix Tuning的简化版本,只在输入层加入prompt tokens,并不需要加入MLP进行调整来解决难训练的问题。随着预训练模型参数量的增加,Prompt Tuning的方法会逼近fine-tuning的结果。
  • P-Tuning:该方法的提出主要是为了解决这样一个问题:大模型的Prompt构造方式严重影响下游任务的效果。P-Tuning将Prompt转换为可以学习的Embedding层,并用MLP+LSTM的方式来对prompt embedding进行一层处理。
  • P-Tuning v2:让Prompt Tuning能够在不同参数规模的预训练模型、针对不同下游任务的结果上都达到匹敌Fine-tuning的结果。相比Prompt Tuning和P-tuning的方法,P-Tuning v2方法在多层加入了Prompts tokens作为输入,带来两个方面的好处:
  1. 带来更多可学习的参数(从P-tuning和Prompt Tuning的0.1%增加到0.1%-3%),同时也足够参数高效。
  2. 加入到更深层结构中的Prompt能给模型预测带来更直接的影响。
  • Adapter Tuning:该方法设计了Adapter结构(首先是一个down-project层将高维度特征映射到低维特征,然后过一个非线形层之后,再用一个up-project结构将低维特征映射回原来的高维特征;同时也设计了skip-connection结构,确保了在最差的情况下能够退化为identity),并将其嵌入Transformer的结构里面,在训练时,固定住原来预训练模型的参数不变,只对新增的Adapter结构进行微调。同时为了保证训练的高效性(也就是尽可能少的引入更多参数)。
  • LoRA:在涉及到矩阵相乘的模块,引入A、B这样两个低秩矩阵模块去模拟full fine-tuning的过程,相当于只对语言模型中起关键作用的低秩本质维度进行更新。

典型应用

  1. ChatGLM-Tuning :一种平价的chatgpt实现方案,基于清华的 ChatGLM-6B + LoRA 进行finetune。
  2. Alpaca-Lora:使用低秩自适应(LoRA)复现斯坦福羊驼的结果。Stanford Alpaca 是在 LLaMA 整个模型上微调,而 Alpaca-Lora 则是利用 Lora 技术,在冻结原模型 LLaMA 参数的情况下,通过往模型中加入额外的网络层,并只训练这些新增的网络层参数。由于这些新增参数数量较少,这样不仅微调的成本显著下降,还能获得和全模型微调类似的效果。
  3. BLOOM-LORA:由于LLaMA的限制,我们尝试使用Alpaca-Lora重新实现BLOOM-LoRA。

PEFT实现

  1. PEFT:Huggingface推出的PEFT库。
  2. unify-parameter-efficient-tuning:一个参数高效迁移学习的统一框架。

参数有效化微调大致可以分为三个方法:Adapter、Prompt、LoRA

 

LORA:

LoRA的思想也很简单,在自注意力层的四个权重矩阵Wq, Wk, Wv, Wo的所有或者部分旁边增加一个旁路(如文中表示在GPT3上只有Wq和Wv加了旁路),做一个降维再升维的操作,来模拟所谓的 intrinsic rank(文中表示把LoRA应用在前馈神经网络层或者RNN等结构的研究留给后续研究工作) 。训练的时候固定PLM的参数,只训练降维矩阵A与升维矩阵B。而模型的输入输出维度不变,输出时将BA与PLM的输出叠加。用随机高斯分布初始化A,用0矩阵初始化B,保证训练的开始此旁路矩阵依然是0矩阵。这种思想有点类似于残差连接,同时使用这个旁路的更新来模拟full fine-tuning的过程。并且,full fine-tuning可以被看做是LoRA的特例(当r等于k时)。实验结果表明基于LoRA的方法效果不亚于甚至能超过微调。

总结,基于大模型的内在低秩特性,增加旁路矩阵来模拟全模型参数微调,LoRA通过简单有效的方案来达成轻量微调的目的。GPT的本质是对训练数据的有效压缩,从而发现数据内部的逻辑与联系,LoRA的思想与之有相通之处,原模型虽大,但起核心作用的参数是低秩的,通过增加旁路,达到四两拨千斤的效果。

posted @ 2023-05-17 17:48  15375357604  阅读(545)  评论(0编辑  收藏  举报