LoRA数学编程任务不敌全量微调

大数据巨头Databricks与哥伦比亚大学最新研究发现, 在数学和编程任务上,LoRA干不过全量微调

具体来说,在这两种任务中,LoRA模型的精确度只有后者的八到九成左右。

不过,作者也发现,LoRA虽然学得少,但是“记忆力”却更好, 遗忘现象要比全量微调少 得多。

究其原因,作者认为是数学和代码任务的特性与LoRA的低秩“八字不合”,遗忘更少也与 相关。

但LoRA的一个公认的优势是 训练成本更低 ;而且相比全量微调,能够 更好地保持原有模型性能

于是,网友们的看法也自然地分成了两派:

一波人认为,单纯考虑降低成本用LoRA,表现却显著降低,这是不可接受的。

更具针对性的,有人指出,对于数学和代码这样对精度要求高的任务,一定要最大程度地保证性能,哪怕牺牲一些训练成本。

另一波机器学习工程师则认为,作者的一些实验参数设置不当,造成这种现象的原因不一定是LoRA本身。

质疑的具体理由我们放到后面详细讲解,先来看看作者的研究都有哪些发现。

学的更少,但忘的也少

实验中,作者使用7B参数的Llama2作为基础模型,在 持续预训练 监督微调 两种模式下分别应用LoRA和全量微调,并比较了它们的表现,使用的数据集如下表:

持续预训练实验中,作者在2.5-200亿token之间共选择了8个点进行了测试;监督微调实验则是在训练1、2、4、8、16个epochs时取样;LoRA的rank取值为16和256,适配对象包括Attention、MLP和All。

结果不难看出,无论是持续预训练还是监督微调, LoRA在编程上的表现从未追上过全量微调 ,而且在持续预训练中,随着token数量的增加,差距越来越悬殊。

而在数学任务上的持续预训练实验中,LoRA起初表现略胜于全量微调,但也是随着token数量的增加,这种优势逐渐被反超。

这一系列结果表明,LoRA在让模型学习新知识的工作中,表现不及全量微调。

不过尽管在性能上比不过全量微调,但LoRA的 遗忘现象更少 ,更有利于保持原有模型的能力。

换言之,如果把原始模型比作刚毕业的小学生,那么用LoRA能学到的初中知识更少,但之前的小学知识忘得也更少。

对应到应用当中,则主要在语言理解、尝试推理等基础能力中体现。

作者使用了相同的实验配置,把测试数据集更换成了HellaSwag、ARC-Challenge和Winogrande,分别测试经过代码和数学微调后的Llama2在基础任务上的表现。

结果,用代码来微调造成的“遗忘”现象更加严重,LoRA从整体上看更接近基础模型,即遗忘现象更轻。

秩是模型表现关键

作者分析了这些现象背后的原因,结果发现, 在其中扮演了重要的角色。

在线性代数中,一个矩阵的秩是指其线性无关的行或列的最大数量, 秩越高,所能表示的变换或关系就越复杂

同理,在深度学习中,模型的权重矩阵可以看作是将输入信息转换为输出信息的一种映射关系,这些矩阵的秩反映了 模型在学习时所需的自由度或复杂度

对于LoRA来说,其学习的矩阵秩较小,对原始权重矩阵的影响也就越小,因此在适应新任务时 更易保留原有知识

而在作者的实验中,低秩矩阵的特性还体现为了更强的正则化能力和生成多样性。

至于为什么LoRA在学习新知识上表现不如全量微调,原因同样和秩相关。

作者对在Llama2上用StarCoder-Python数据集进行持续预训练过程中各个阶段的权重矩阵进行了奇异值分解。

结果发现,即使在训练的早期阶段,全面微调学到的权重扰动矩阵的秩就是LoRA常用秩的10-100倍,这表明在编程任务上,全面微调 需要学习高秩的权重扰动以适应目标领域 ;而且随着训练的进行,权重扰动矩阵的秩还会持续增长。

也就是说,此类任务的 高秩 需求,注定无法与LoRA的低秩特性相匹配,表现不佳也就不是什么意外之事了。

实验中的另一个现象是,虽然同样比不过全量微调,但数学任务中两者的差距相比代码任务更小,作者推测可能有两方面原因:

ML工程师提出质疑

不过对作者的实验,有人指出了实验的参数设置存在不合理之处。

首先提出质疑的,是模型微调和训练平台UnslothAI创始人、前英伟达ML工程师Daniel Han。

Daniel首先指出,论文中的LoRA实验只适配了QKVO、up和down矩阵,没有适配gate_proj矩阵。

如果LoRA没有对gate_proj进行适配,那么FFN模块的大部分权重实际上没有被优化,这可能限制了LoRA在编程任务上的表现。

至于数学能力好一些而在编程任务上表现不佳的原因,可能是lm_head和embed_tokens层没有进行适配训练,因此领域转移没有被很好地建模。

lm_head和embed_tokens层分别对应了语言模型的输出和输入嵌入,它们与具体领域的词汇和表达密切相关。如果这两个层没有被LoRA适配,那么模型在新领域的词汇和表达习惯上的适应能力就会受限。

另一方面,Daniel认为编程任务的超参数设置也有问题,比如秩为256时α值设得太小了,导致适配矩阵的值可能难以得到有效更新。

总结一下就是,LoRA在这些任务上的表现不如全量微调的原因,可能不是出在LoRA本身。

同时Daniel还表示,有论文指出LoftQ和PiSSA使用奇异值分解(SVD)来初始化LoRA矩阵,据称可以使LoRA达到与全面微调相当的性能。

另一名ML工程师附和了Daniel的观点,同时还针对LoRA的应用给出了一些具体建议:

总之,虽然出现了论文中的结果,但LoRA仍然是一项重要的技术,而且能够显著降低训练成本,所以做好性能和资源的权衡,该用还是得用。

关于LoRA,你还有什么看法或经验,欢迎评论区交流。

论文地址:https://arxiv.org/abs/2405.09673参考链接:[1]https://x.com/danielhanchen/status/1791900967472140583[2]https://x.com/Prince_Canuma/status/1791908092919091232


软件编程中根据什么判断用全局变量或者数据库保存数据?

这个要根据具体的情境,全局变量,局部变量这个是根据变量的生命周期来定的,全局变量的生命周期到你这个方法的结束一直存在,也就是从你开始执行这个方法这个变量就存在,而局部变量是例如你写个if(){ int i},这里面的i到if结束就回收了。 用数据库保存数据就是指你的方法执行后,或者这么说,当你的程序关闭后,下次再打开这个程序的时候你还能得到你上次关闭程序的时候的值。 举个例子,你上淘宝,看中一个商品,然后加入购物车了。 你退出帐号再登陆的时候,这个东西还在,就是把东西保存到数据库了,你登陆帐号的时候这些信息都会从数据库读出来传给你。

matlab中ones是什么意思

matlab中ones函数的作用是生成全1阵。 ones的使用方法B=ones(n):生成n×n全1阵。 B=ones(m,n):生成m×n全1阵。 B=ones([m n]):生成m×n全1阵。 B=ones(d1,d2,d3……):生成d1×d2×d3×……全1阵或数组。 B=ones([d1 d2 d3……]):生成d1×d2×d3×……全1阵或数组。 B=ones(size(A)):生成与矩阵A相同大小的全1阵。 扩展资料MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多。 并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。 在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。 优势特点1) 高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来;2) 具有完备的图形处理功能,实现计算结果和编程的可视化;3) 友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握;4) 功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等) ,为用户提供了大量方便实用的处理工具。 参考资料来源:网络百科—MATLAB

如果一个函数经常被调用,而里面有1个临时局部变量,是否最好采用全局变量?

首先,局部变量的内存不只会分配,还会释放的。 用全局变量确实可以避免多次局部变量内存分配。 但是,如果你在担心内存分配的花销、内存分配释放过程带来的效率问题,那么其实是在考虑一个事实上不存在的问题…因为内存分配带来的空间和时间花费是微忽其微的,并且以现在的计算机硬件。 你想到”问题了之后,要去证明这个问题真的存在,至少先得看到这个问题的现象吧。 大多数程序,最重要的不是它的执行速度。 对于用户来说,是它的正确性。 用户要的是对他有用的软件,不是要你为他省几KB计算机内存 ; 对程序员来说,是可读性,可修改性等。 简单说下,用全局变量的问题: 0. 不知道你说的是什么编程语言中的,要知道,在c家族语言(c,c++,java,c#等)中,函数形式参数、函数内定义的变量、代码块中的等都是局部变量,那你得弄多少全局变量? 最后,肯定编译都过不了。 1.程序不好甚至无法理解。 全局变量使读程序者难以跟踪程序状态,这对人的记忆是一个挑战。 而且,一个全局变量无法表达不同的概念,这就更增加了阅读程序的难读性。 2.如果函数依赖于全局变量,那么这种函数其实是不能被复用的。 举个例子,难道你使用fun3前,还要初始化它所使用全局变量?再想,你无法把这种某个函数从一个文件移到另一个文件中,如果要移,你得把它依赖的全局变量也给移过去,但是这些全局变量原来又被别的函数依赖着,那你得把这些函数都移过去,移过去后。 你又发现名字冲突了…如此痛苦。 也许你读不懂上面的,有些编程经验后就可以明白的。 补充: 上面说的不好。 相对的,局部变量有很多好处,主要有: 0,减少名字冲突,局部就是名字空间。 1,根据记忆的七正负二原理,人不善于记忆多个东西,而局部变量让你在一个地方用它,在另一个地方去不必记起和在意它。 完全集中注意力再解决另一个问题。

  • 声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
  • 本文地址:https://www.srwj168.com.cn/caijing/9032.html
大宅门 再登台 话剧 常演常新11载
文脉弦歌丨 殷墟我向往已久