AI 文摘

揭秘人工智能大模型,打造属于你的ChatGPT(一)





作者: 万象新说 来源: 万象新说

点击上方蓝字关注万象新说

现在什么概念最火?一定是人工智能。不说国外的进展,国内现在已经是“百模大战”,据不完全统计,现在已有约100个公司或组织在训练和发布自己的大模型;

未来的时代,大模型也许会深刻地改变我们的生活,下面是一些科技圈大佬对大模型的评价:

我们最开始以为这是互联网十年不遇的机会,但是越想越觉得这是几百年不遇的、类似发明电的工业革命一样的机遇,所以我们觉得(AI)非常重要

马化腾

我们正处在全新起点,这是一个以大模型为核心的人工智能新时代,大模型改变了人工智能,大模型即将改变世界

李彦宏

未来可能不是百模大战,而是万模群舞,无论是To B、To G还是SaaS化的企业都有很多机会

周鸿祎

笔者也判断,大模型的未来会是无处不在,无孔不入的一个存在,可能我们每个人都有属于自己的专属人工智能大模型,帮助我们生活与工作。

因此,理解人工特智能大模型的原理还是比较重要的。

打造大模型,其实和把大象放冰箱一样,简单理解一共有三步:

  • 第一步:海量语料训练基座模型

  • 第二步:对基座模型做SFT微调

  • 第三步:对上述模型做RLHF对齐

对第一步,预训练模型其实已经有几年了,模型结构基本上没有变化,只是规模变大很多。想了解详情的话,可以参考笔者前面的文章,从代码层面讲清楚了训练基座模型的原理:

深入探秘:百川7B大模型的训练代码解析,揭秘巨无霸语言模型背后的奥秘

今天,我们主要讲第二步:也就是对基座模型微调:这里面用到的一个重要的技术就是Lora,我们可以先看下,Lora是什么,它可以干什么?

Lora可以生成漂亮的小姐姐!

滑动查看更多小姐姐

但Lora作用不止于此,它本来是为了大语言模型设计的,但不小心开发了画小姐姐这一功能,技能树点歪了,但也确实说明了Lora这个模型的强大。

今天,我们暂时先不讲Lora是怎么用来画小姐姐的,我们正经一点,说一下它本来的用途:

微调大语言模型

为什么要微调大语言模型呢?比如,我们有一个基座模型,它有个很大的问题在于,它像是一个修炼了很多顶级内功的高手,但不会招式,打架的话很不占优势。

举个例子吧,我们来问下Baichuan-7B这个没有经过微调的基座模型一些简单的问题,相当于“出招”。它这时是不太会接招的,或者说,它的回答就是知识性的回答,回答问题的方式不符合人类的交谈标准。不像现在的ChatGPT一样,什么回答都写个1,2,3之类的。

同时附上了ChatGpt的结果,明显更像一个“好学生”:

那就需要教它“做人”了,现在比较流行的方法就是微调(finetune),也就是SFT是的FT,那S是什么呢?S是supervised,也就是有监督的,连起来的意思就是,现在我有一份经过我检验和审核的(有监督的)训练样本,它们就是关于怎么说人话的,大模型你去学一下,学会了你就会有招式了,会说人话了。

一说到大模型还要学习,那就不是普通人能做的了,一般都是专业的团队才能做到的; 可以看下大模型需要的参数,动不动百亿,能训练起的都是啥家庭啊?

但现在,人工智能必定是全民运动了,大家都会有想试一试的冲动,所以,训练不动所有的模型,那我训练一部分参数可以吗?所以就有了一些方法、技巧,可以在大模型的基础上只训练一部分参数,从而达到和整体微调接近的效果;

这就很友好了,现在流行的就是LORA,它的中文名字叫做“大语言模型的低阶适应 ”,可以理解为一种插件,在一个大模型的整体框架下,增加一些可训练的参数,然后在训练原来的模型时, 可以冻结原来模型的上百亿参数,只训练新增的几个亿的参数,这样成本就大大降低了;

所以它是怎么做到的呢?

看上面这张图就够了,它就是LORA的全部

左边是训练的流程,我们先从训练开始:这里给一个公式:

*h = Wx + BAx *

第一步:W是原来大模型的参数,可以看到这个参数的维度是很高的,d*d, 它的参数是冻结的,不参与训练;这一步可以保证微调的效率

第二步:然后,我们再加两个可训练的A,B矩阵,这两个矩阵的是d * r维的矩阵,然后A 和B 相乘,d * r * r * d 又变成了 d * d 维的矩阵。

最后:两者结果相加,* h = Wx + BAx*

挺简单的,我们看下代码吧,看经典的Huggingface的PEFT库吧.

在NLP的很多任务都是基于huggingface的transformer库做的(感谢开源!)所以PEFT也可以支持大部分的市面上大模型的微调,我们看下官方例子:

就一句’get_peft_model()’就可以把预训练的model转成可训练的peft模型,同时也可以计算出需要微调的参数数量

所以,我们看下它是怎么做的?先去github把PEFT上的源码下载下来

https://github.com/huggingface/peft

第一步:get_peft_model(), 因为PEFT可以微调很多种模型,所以先选择对应的模型,比如我们是搞的LLM模型,就选下面的:

**每二步,进到对应的模型里看具体的实现: **

PeftModelForCausalLM会调用下基类的init函数,因此我们重点看基类

基类同样能过一个类的map映射,到对应的类中处理

第三步, 这一步是关键的一步,具体的为目标层增加可训练参数,也就上上面的公式里说的从 *h = Wx *变成 h = Wx + BAx

可以看到,在add_adapter里,会有一个find_and_replace函数,用来找到目标的模块,并增加一些可训练参数替换它,接下来,可以看具体怎么替换的,在_create_new_module里,会新建一个Linear类,它是Pytorch的nn.Linear类的子类,通过重写forward方法,把本来很简单的 h = Wx 变成 h = Wx + BAx

详情就是下面的代码写的,这段代码比较重要,我把源码贴上来了,标红的部分,第一部分是计算原来的冻结参数,第二部分是将 A * B的结果加到原来的result上,也就对应了上面的图


def forward(self, x: torch.Tensor):
    previous_dtype = x.dtype
    if self.active_adapter not in self.lora_A.keys():
        return F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias)
    if self.disable_adapters:
        if self.r[self.active_adapter] > 0 and self.merged:
            self.unmerge()
        result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias)
    elif self.r[self.active_adapter] > 0 and not self.merged:
        # result 就是待输出的隐层h, self.weight 是W,这句就是  h = Wx;
        result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias)
  

        x = x.to(self.lora_A[self.active_adapter].weight.dtype)
        # 
        result += (
            # 隐层h在这里增加了 B * A * x 的结果,就是 h = Wx + BAx
            self.lora_B[self.active_adapter](
                self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x))
            )
            * self.scaling[self.active_adapter]
        )
    else:
        result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias)
  

    result = result.to(previous_dtype)
  

    return result

最后给大家讲下推理 ,首先就有个疑问,Lora这种方法,总归是增加了一些参数,推理会不会慢呢?理论上是会的,但是,我们可以把经过Lora微调的大模型,和原来的模型合并起来, 也就是把上面的公式变换一下,把W 和 BA 的结果 merge起来,这样就可以保持和原来模型一样的推理效率了。

原公式 :*h = Wx + BAx *

新公式:*h = (W + BA)x *

这个就是利用Lora微调大模型的原理了,后面计划讲下RLHF的原理,这个比SFT要难理解一点,可能要分几篇来讲

最后,感谢阅读!Lora生成的小姐姐真的好看!再贴几张,请滑动欣赏~

滑动查看更多小姐姐

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具