1. LoRA论文解读
这里先不解读了,直接看Microsoft的代码
2. LoRA代码解析
lora代码最初由微软GitHub提供,我对代码进行了精简,可以在这里下载lora,此代码主要为了学习使用,方便理解lora的整个流程。
这里以NLG任务中的e2e数据集为例
2.1 对数据的预处理
如下图所示,e2e任务是给定一些独立词汇组成一个句子,input中的x为独立词,y为组成的句子,0为填充,将所有的token填充到512个。对于Target由next token prediction策略,只需要将所有token向右移动一位即可,这样是511个token,然后在后面补0即可。Mask是一个标记,仅标记y所在位置。
2.2 Tokenization处理
再输入到transformer中,我们首先对其进行向量化处理,如图所示,我们从词表中wte(50257, 1024找到每个token对应的词向量,同时从wpe(1024, 1024)中找到每个token对应的位置向量,然后将两个向量相加,得到最终的输入向量
2.3 Transformer与LoRA
接下来是代码中最重要的部分,在GPT-2中,这里的模型有24个transformer block,head=16,hidden=1024,其中这里绘制了两个图,其中上面的图是正常的transformer中的attention操作:LN-Attn,由于上面的部分非常熟悉了,这里就不做介绍了,只对下面的加入lora的部分进行介绍。
其中GPT-2中的lora只作用在attention里生成qkv的部分,当输入通过LN之后,之前的方法是通过一个Linear层,但是微调这一层代价太大(如果只微调一个linear层还好,但是一共有24个layer,就需要微调24个linear,代价太大),因此我们冻住Linear层,在上面加入一个LoRA残差网络,如图所示LoRA中有一些超参数,例如r是秩,这里设为了4。此外我们只对QV进行lora更新,并不更新k,这是因为实验发现微调QV的效果更好,因此经过LoRA微调后,我们只需要更新Lora_A和Lora_B这两个参数即可,大大降低了优化的难度
经过attention之后,我们通过一个ffn层即可,这个很简单不做赘述
2.4 GPT-2Head输出
最终我们通过一个linear层进行输出,由于我们的嵌入词表的大小为50257,因此我们的linear层输出也是50257。