这个 LoRA 就是 N L O R A Low-rank Adaptation 我原来就很早听过但是我始终就是对于它的这种就是说这种增量的这个具体的细节不是很清楚因为在我看来它没有似乎没有完全去解决这个问题他只是说哎我把这个新的存不去存储它这样我就不会影响旧的但是他没有一个判断说我这个到底是不是我的新任务跟旧任务这个这个判断值我印象中有一种算法就是说把这个新任务的这个它这个输入的这个特征值啊相当于一个数字签名去把它存起来去和这个 LoRA 就是这个这个它的这个德尔塔是强绑定的就是说这个任务进来之后它是要去类似于用一个门控网络去识别这个新的任务如果这个新的任务跟这个就是数字签名跟这匹配了我才去加载这个德尔塔如果不是的话那就走原来的那个旧的这个这个这个矩阵权重就是门控实际上也是用这个权重值或者说是没有那么非黑即白的它有一个系数就 01 之间的这么一个权重加载就是到底这个任务是不是有多大程度因为也是个模糊的匹配也是一种向量匹配就是类似于它的 embedding 就是说它输入的这个 prompt 就比如说有的人说啊这个法国的首都古今不同这句话跟自古以来法国的首都在尼斯但是后来哪个世纪变成 14 世纪以后变成巴黎这两两句话其实差别是看上去挺大但它本意是一样所以你要去判断说这个是新任务还是旧任务这个实际上是只有那种语义理解的这层才能做得到也就是说它需要进行了这种语义分析以后对它语义进行理解了之后在它的 embedding 这层去能够去做一个识别相当于说它能真的识别出来这个问题到底问的是旧的巴黎是首都还是说这个就新的巴黎是首都这种还是说它旧的这个说十四世纪以前它法国首都是这个尼斯等等等等就是相当于说你要理解这个问题或者说用这个它的 embedding 某种特征值用一个门控网络训练出来能够识别出来去加载这个德尔塔当然是有个系数去加载它就说这个 LoRA 它有没有这一个门控网络去识别这个而不是简单的说哦我为了不去修改这原来的这个这个矩阵这权重我就把它放放在外面这个我对它的影响很小这个影响很小很大这个其实不能由你来决定的是不是你是现在是我认为说它还是一种模糊就是和稀泥的办法那你把它放在外面你只是说我对原来的矩阵不修改但是运运算推理过程中它是不是每每次都加载呢是不是
我们之前设想的就是说这个训练过程中去拟合或者说是损失函数,不把它写回到这个原来的这个权重矩阵里面去,而是说把它写在一个额外的一个,这个叫做存储。而是在每次运算过程中,或者说是推理过程中,根据它的这个任务特征,然后去决定是否是用原来的矩阵这个权,这个权重参数,还是说用这个加权的就是额外在外面存储的这个,呃,这个补偿这个,这个就补偿的这个这损失函数的这个值。意思就是说我原本的这个旧的任务我已经训练好了,但是现在加入一个新的任务的时候,我去会有这种潜在的这种灾难性遗忘的危险,那么我又要去兼顾这个新的任务跟旧的任务,最好的办法就是说旧的任务呢,用旧的任务方法,新的任务呢用新的方法,但是新的方法呢,我是实际上是等于是有了一个德尔塔,但这个德尔塔我不是去直接去修改这个原来这个权重矩阵,而是说我去把它存储起起来,在运算过程中动态的去加载这个德尔塔,就相当于说我这个原来这个权重矩阵有了一个就是德尔塔,矩阵运算的时候,我如果判定说这是个新的任务,需要用到这个德尔塔,就是这个损失函数降到 0 的这样一个我是计算出来的,我就把它在运算过程中累加上去,然后如果是旧的任务的话,那我就德尔塔不加,就是用原来的矩阵,这样可以达到一种什么效果呢?就是说我可以最大限度地去减少这个灾难性遗忘,尤其是新的训练数据,如果跟原来的训练数据有冲突的情况下。就比如说有的人说,哎,法国的首都是巴黎,但是又有人说,但是在比如说我随便编的 14 纪、14、14 世纪以前,法国的首都并不是巴黎,比如说是尼斯,那这两个认知是完全冲突的,它等于是在新任务,这个在 14 世纪之前法国的首都是尼斯,那我这个之前的这个认知,这个法国首都就一直是巴黎,这个如果说是没有出现这个新的任务,那我就用旧的法国首都是巴黎,而这个就等于是两个都可以成立。但是呢,在原来的话,这两个肯定要拟合起来是非常困难的,你不能说一个 A 既是 B 又是 C,那就你拟合的最后其实是取一个中间值,或者说是谁覆盖谁,或者说是谁的权重更多更高一点,其实这种拟合是叫做和稀泥式的拟合,就说一件事情虽然不能说是非黑即白,但是你现在有两个矛盾的这种东西的话,所谓拟合只能说是取中间或者是取权重的更加靠哪一边,或者说是就是这个走到极端的就是一个覆盖另外一个,如果都不覆盖的话,那你只能是取权重,说哪一个更靠靠谱一点,但这都不是一个最好的解决办法,而最好的解决办法是说新新人新方法,旧人旧方法,就是新方法用新的矩阵,那旧的方法用旧的矩阵,就两个都是,这个是我们软件工程上也是这样子做的,就是加这个就是相当于动态库一样,动态库有很多的版本,它依赖性就决定了这个,就是 Python 也是这样。那最好的办法是怎么样呢?那就是隔离,但是隔离呢会有大量的冗余的存储,而为了解决冗余的存储,最好是就是有一个,就像一个叫什么指向性的我相同的部分。