Lora模型训练的参数-学习笔记

任何一个lora都会有三重属性,易调用性、泛化性和还原性,任何一个lora只能完美满足其中的两项;

  • **易调用性:**在已调用lora后,还需要多少提示词才能让该lora完全生效;
  • **泛化性:**能不能还原lora训练素材中的局部特征,能不能和其他lora、模型、标签兼容生效;
  • **还原性:**在lora完全生效之后生成图片和训练素材之间的相似度

但具体训练的目标和思路,之后再说,先记录一下对训练参数的认识。

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 虽然我认为训练参数,其实在lora训练中,并不是最重要的。 最重要的还是训练素材,优秀的、符合要求的训练素材,才是炼丹成功的前提和关键。 训练模型,也像是炒菜,训练素材是菜。 至于训练参数,在我看来,不过是炒菜时的佐料。 如果自己的训练素材是一坨屎,那么即使掌握了训练参数,也不过是在屎上雕花... 阿弥陀佛,有点儿粗俗了。 但不懂训练参数也很麻烦,毕竟就算你有一堆昂贵的食材,却在炒菜的时候下料过猛,那也会破坏食材的鲜美。 学习的过程,已经是吃的百家饭,完全记不得到底谁家饭更香.... |

模型保存精度

一个字节(Byte)=8位

一个float32的数值=32位(bit)=4个字节(Byte)=4B

那么一个1000x1000的矩阵=10^6个数值=4*10^6B ≈ 4*10^3KB≈4MB

如果是float16的数值,就表示一个数值只占2B,所以整体的参数占内存就少一半

详解FP16和BF16的区别

batchsize

epoch\iteration\batchsize****之间的关系

一个epoch:表示所有样本都训练过1次

一个iteration:表示一次反向传播,逐层对参数进行迭代

一个batchsize:表示有多少个样本进行前向计算后,再进行的一次反向传播

深度学习中的batch理解:https://blog.csdn.net/Dontla/article/details/104373682

一般来说,假设样本总数是all

  • 如果batchsize=1,表示一个样本经过1次前向计算,就立刻开始1次反向传播,逐层迭代参数
  • 那么一个epoch就会有 all 次iteration
  • 如果batchsize=10,表示一个样本经过1次前向计算,直到10个样本都完成了10次前向计算后,把这10个样本各自更新的值相加后,再开始1次反向传播,逐层迭代参数
  • 如果batchsize=all,表示一个样本经过1次前向计算,直到所有样本都完成了所有的前向计算后,把所有样本各自更新的值相加后,再开始1次反向传播,逐层迭代参数

batchsize=1,所有样本(例如500个样本)就要经过500次的前向计算+500次的反向传播

batchsize=500,500个样本只要经过500次的前向计算+1次的反向传播

虽然看上去,batchsize越大,好像耗时更短。

但实际如果是从训练结果的收敛上看。batchsize=1 反而要比 batchsize=500 的快,为什么呢?。

batchsize=1****的训练过程

这里需要知道,batchsize=1时的计算过程

  • 1次反向传播是要经过逐层的迭代参数计算,所以1次反向传播速度,要比前向传播久
  • 但是,根据统计概率来说,1个样本的值,与另外样本的值变化差距会比较大,也就是说,如果batchsize=1,那么每次的反向传播,参数都会有比较大的改变,这会导致两个影响:
  • 影响1:收敛速度比较快,参数变化大,但经过所有样本的依次迭代,它最终有可能会收敛到某个范围(未必会收敛到极值)
  • 影响2:可能不会收敛,因为每个样本都对参数进行了更新,那么很难收敛到极值(可能会震荡在某个范围)
  • 解决它不能收敛到极值的方式:降低学习率

batchsize=all****的训练过程

如果是batchsize=all时的计算过程,

  • 每次反向传播时,参数迭代的变化不会太大,即每次收敛速度相对更慢,需要更多轮的epoch迭代,才能达到与batchsize=minibatch时的相同精度:
  • 根据概率统计,每次迭代时,虽然是经过所有样本前向计算后才进行一次反向传播逐层迭代,但因为所有样本的均值差异并不大,这就导致了两次迭代的参数变量不会太大,相当于每次反向传播的迭代收敛比较慢,对于初始的随机参数来说,要收敛到极值就需要比较多次(多次epoch)的反向传播迭代,耗时更长。
  • 但也有个优点,就是可以收敛到极值,在训练集上几乎不会产生震荡,这会对训练数据产生过拟合,泛化能力低
  • 但是如果batchsize太大,一次将十万条数据扔进模型,很可能会造成内存溢出,而无法正常进行训练。

batchsize=minibatch****的训练过程

batchsize=小批量minibach时的计算过程

  • 相对于batchsize=1,minibatch可以降低震荡效果,适当拟合
  • 相对于batchsize=all,minibatch可以适当提高收敛速度,避免过拟合,避免爆显存

在合理范围内,增大batch size的好处

1)内存利用率提高了,大矩阵乘法的并行化效率提高。
2)跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
3)在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
随着 Batch_Size 增大,处理相同数据量的速度越快。
随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。

盲目增大****Batch_Size 有何坏处

1)Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
2)太大的batch size 容易陷入sharp minima,泛化性不好。
3)Batch_Size 太大,收敛太慢,算法在 200 epoch 内不收敛。

如何平衡****batchsize 的大小?

batchsize太大或者太小都不好。所以 batch size 的值越大,梯度也就越稳定,而 batch size 越小,梯度具有越高的随机性,但如果 batch size 太大,对于内存的需求就更高,同时也不利于网络跳出局部极小点。所以,我们需要设置一个合适的batchsize值,在训练速度和内存容量之间寻找到最佳的平衡点。

batchsize****与 epoch 的平衡

①一般在Batchsize增加的同时,我们需要对所有样本的训练次数(也就是后面要讲的epoch)增加(以增加训练次数达到更好的效果)这同样会导致耗时增加,因此需要寻找一个合适的batchsize值,在模型总体效率和内存容量之间做到最好的平衡。

②由于上述两种因素的矛盾,batchsize增大到某个时候,达到时间上的最优。由于最终收敛精度会陷入不同的局部极值,因此batchsize增大到某些时候,达到最终收敛精度上的最优。

batchsize****与 learning_rate 的平衡

大的 batch_size往往建议可以相应取大点 learning_rate, 因为梯度震荡小,大 learning_rate可以加速收敛过程,也可以防止陷入到 局部最小值

而小 batch_size 用小 learning_rate 迭代,防止错过最优点,一直上下震荡没法收敛(这也是一个小 trick

++(++ ++batchsize++ ++和++ ++learningrate++ ++这块,有专家说,没有超过几十倍的++ ++batchsize++ ++,不需要调学习率)++

补充认识:学习率

图片简单(特征明显相近),把学习率低一些,因为开高了容易无法收敛,容易震荡。

图片复杂,把学习率开高一些,因为学习路程比较大,要加速(如果学习率很低,那就需要更多次的参数迭代,才能收敛到某个区域的精度)

问题 5 :文本编码器 TE 对学习率的敏感度,要远高于噪声预测器 UNET

补充认识潜在扩散模型****LDM

正如前文所述,扩散模型主要用来生成高质量的图像。稳定扩散模型(StableDiffusion)可以视为一种特殊的扩散模型,学术上叫做潜在扩散模型(Latent Diffusion model),相关概念来自于论文《 High-Resolution Image Synthesis with Latent Diffusion Models》。简单来说,原始的扩散模型通常会消耗更多的内存,因此创建了潜在扩散模型,可以在被称为潜在低维度特征空间进行扩散过程。更进一步,扩散模型是机器学习模型,它被训练来在带有高斯噪声的图像上逐步进行去噪,以获得高质量图像。而潜在扩散模型被训练成在低纬度的特征空间上进行同样的过程。

一般来说,潜在扩散模型LDM含有三个组件:

  • text encoder 文本编码器,这里主要指基于CLIP的文本编码器
  • autoencoder 自编码器,这里主要指Variational Auto Encoder,也被简称为VAE
  • Unet 扩散模型

本文先从最基础的text encoder讲起,主要介绍其在扩散过程中的用途。

CLIP Text Encoder****作用

补充认识****CLIP

SD使用的是OpenAi的CLIP预训练模型,即别人训练好的拿来就用。CLIP的训练 用到了Text-Image配对的数据集,大概4亿张,主要是通过网络爬取图片以及相应的标签。

CLIP的作用,就是将文本转换为语言信息并使其与图像信息在UNet中采用Attention更好的偶合到一起,成为了文本和图像之间的连接通道。

++(简单来说:++ ++CLIP++ ++是一个已经被训练好的模型,文本和图像已经训练出一一对应的关系)++

补充认识****SD 中是如何应用 CLIP

CLIP的网络结构由两部分组成:图像 Image Encoder + 文字 Text Encoder。

其中Text Encoder用来提取文本特征, Image Encoder用来提取图像特征。

++在++ ++Stable Diffusion++ ++中只用到了++ ++Text Encoder++ ++模块。++

CLIP Text Encoder模型将输入的文本Prompt进行编码,转换成Text Embeddings(文本的语义信息),作为UNet网络的Context输入,并在UNet网络中的CrossAttention模块中,结合提取特征F对生成图像的内容进行一定程度的控制与引导;

(我们需要给出提示词Prompt, 然后利用CLIP模型将文本转换成嵌入表示Context,作为UNet的一个输入。)

CLIP text Encoder 以文本作为输入,并在潜在特征空间中生成文本嵌入(text embeddings);我们也可以通过CLIP模型对图像进行特征编码一样。

补充认识****UNET&&Text_encoder

UNet模型是一种用于图像分割的深度学习模型,它基于卷积神经网络(CNN)构建。UNet模型的特点是采用编码器-解码器结构,编码器用于提取图像特征,解码器则用于将特征图恢复到与原始图像相同的尺寸,从而进行像素级的分类。此外,UNet模型还引入了跳跃连接,将编码器的特征图与解码器的特征图进行拼接,以提高分割的精度

通常来说一个U-Net包含两个输入:

‒ Noisy latent/Noise : 该Noisy latent主要是由VAE编码器产生并在其基础上添加了噪声;

(或者如果我们想仅根据文本描述来创建随机的新图像,则可以采用纯噪声作为输入。)

‒ Text embeddings: 基于CLIP的将文本输入提示转化为文本语义嵌入(embedding)

https://zhuanlan.zhihu.com/p/521151393

所以大模型本身的CLIP已经能够对准备用来训练lora的素材:图片和提示词,大模型已经可以产生一个对应关系了。

但现在lora要自己再专门去做这个(图片和提示词)素材的一一对应训练,然后把自己训练出来的参数,更新到大模型里边。

lora训练的提示词参数(即上述的文本向量)和图片特征的参数(即上述的图片向量)是分别需要进行迭代训练的。

这里边的训练效果,我猜测:

  • (整体对应)把共性的图像特征,一一对应所有图片的相同触发词。
  • (局部对应)把相似的图像特征,再一一对应符合该特征图片提示词。

就好像中国人:符合全体中国人民。

但汉族:对应的是中国人中的汉族人民

于是在训练过程中,同时迭代提示词的参数向量,这个提示词的参数向量不仅仅是受到大模型的影响,同时会收到lora模型的影响。

那因为大模型本身就有标签(即提示词)跟图像的对应关系,比如1horse=一只马的图片。

但如果在lora训练中,加强了1horse和一只鹿图片的对应训练。

那么SD在用lora生成图片的时候,就需要考虑这个horse,到底是受大模型影响比较严重,还是受lora模型影响比较严重。【很想测试一下,训练一只鹿的图片,但标签都是马horse,试试指鹿为马】

那么就要考虑一个问题:怎样提高lora对提示词的敏感程度?

什么意思呢?

其实就是,这个提示词要怎么跟lora关系更大?

是不是让lora的提示词参数向量,训练的拟合程度更高一些??比如降低文本编码器的学习率,同时降低Unet编码器的学习率,提高batchsize,然后增多它们的迭代步数。

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |

这样是不是就可以拟合程度更高?

哦?所以其实拟合程度高,是指的提示词受lora影响比较大,受模型影响比较小?

那至于上边的text_encoder_lr,和unet_lr,它们之间是没有关系的。

text_encode_lr其实是用来调节提示词的向量参数,unet_lr是用来图片特征向量的?我不太确定

这是一篇,我认为写的肥肠适合入门观看的理解入门,太棒了!!!:https://jishuzhan.net/article/1777179120795389953

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | | |

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |

Unet为什么要加噪再去噪,有什么意义?

加噪再去噪,本质上其实是用多重高斯分布去拟合真实的图像分布,然后用拟合好的多重高斯分布,去重新生成一张新的图片。

Unet去噪的过程,跟text encoder生成的文本向量有什么关系呢?

又是一篇惊喜好文!!!!讲解非常详细的Unethttps://zhuanlan.zhihu.com/p/696562930

Text embbeding在Unet的去噪的过程,参与进来了。

虽然不确定会怎么影响,但问题不大,至少知道是参与进来了。

问题6:优化器是干嘛用的 ?(不考虑,默认用)

  • 问题7:学习率调度器是干嘛用的?

其实就是学习率的改变函数,之前基础的学习率都是固定的。

但在训练过程中,我们一般更倾向于让学习率在训练初期能够比较大,加快前期的训练速度。然后在临近拟合或者是到训练后期能让学习率逐渐变小,避免训练结果出现震荡,难以拟合达到局部最优。

另外学习率的合理设置,比如余弦退火学习器啥的,可以避免训练陷入局部最优点。

所以提供了很多种学习率随训练过程产生变化的函数,就叫做学习率调度器。

问题8:什么是学习率周期。-不重要,不管他

NetworkRank**(维度)和** Alpha

问题9:NetworkRank(维度)和NetworkAlpha有什么用?

NetworkRank(维度):抽取出来训练的行列,直接影响lora模型的大小

如果设置为128,lora模型的大小约为144M(标准)

最小值如果是8,炼出来的lora模型只有不到10M

如果图片简单,那么rank太高,容易出现过拟合(AI会学习到很多无关紧要的细节和画风等等)

【跟B站花了钱的某个博主说的不一致】

|----------------------------------------------------------------------------|----------------------------------------------------------------------------|
| | |

其实NetworkRank越大,用于训练的画面信息、lora训练中会改变更多的大模型参数就会越多,所以lora影响力越大,大模型因为被lora改变了,所以大模型对生成的图片影响力更小,这就导致lora会更容易出现过拟合!

如果NetworkRank越小,用于训练的画面信息,更新大模型的参数就越小,那么大模型影响就更多一些,一定程度上可以避免lora过拟合。

不同的Lora类型,对rank是有限制的,洛哈哈Loha&locon可以简单了解一下

NetworkAlpha:调节Lora对原大模型影响作用的参数。

Alpha和Rank的比值等于使用Lora时的"减弱权重"程度

(什么是减弱权重程度)

因为Lora是整个神经网络训练过程中比较小的一部分,如果它变得太小,机器就学不到东西,看不到明显效果。

所以一开始就固定设置Lora训练的部分,权重值很大

但Lora在学习过程中,权重是恒定速率减弱的,会让原本固定的Lora权重值渐渐变小。

那这个NetworkAlpha就是用来调节它在训练过程中的减弱率。------有待商榷

Rank表示Lora抽取出来学习的数据维度(参数)(在一定程度上与数据量的大小成正相关,表示数据量大小)

Rank越大,那lora权重就会更大。

(因为你学习的数据量大,那lora改变大模型的参数量就会比较大,导致lora更拟合。所以换个说法,就会让lora权重大)

Alpha越大,那Lora权重就会越小,因为Alpha是。

所以Alpha/Rank→意味着lora权重的改变程度。

类似于一种整体的学习率。

  • 那如果scaling = Alpha/Rank,scaling越大,表示权重变化程度比较大,这种情况下训练速度比较快,同时也比较容易出现震荡,难以收敛。
  • 这就需要将学习率learning_rate降低,才可以避免震荡,实现一个比较好的收敛效果。
  • 那如果scaling = Alpha/Rank,scaling越小,表示权重变化程度比较小,这种情况下训练速度比较慢,有可能难以实现拟合(欠拟合)。
  • 这就需要将学习率learning_rate提高,才可以加快学习速度,实现适当的拟合。【这也是为什么秋叶的炼丹炉在alpha旁给出的提醒:使用较小的alpha,需要提升学习率】

单张重复次数

单张重复次数,到底有什么用?

我可否认为是单张图片重复多次,相当于是一个文件夹里有10张这个图片。

【姑且这么认为吧】

一般来说,要求泛化能力强的文件夹,重复次数不宜过多。

但要求拟合能力强的文件夹,重复次数可以多一些。

关于学习速率的参数:

混合精度-fp16\fp32,浮点数

默认fp16,差别不大,但速度更快

缓存潜变量****Cache Latents 和缓存潜变量到磁盘

潜变量:潜变量就是被VAE转化为向量的数据

缓存潜变量

开启缓存潜变量,就会先一次性转换后缓存到显存里,

如果不开启,就会每训练一次,就转换一次(拖慢训练速度)

缓存潜变量到磁盘

开启缓存潜变量到磁盘,可以保存到本地,进行连续训练(它会在单次训练里稍微降速,因为需要读取本地磁盘)

开启****xformers

交叉注意力cross attention:xformers,降低显存需求并显著提高速度

内存高效注意率:压缩显存使用,低配用户可以考虑降低爆显存风险(但效果比xformers差一些)

VRAM是什么?显存吗?

控制台参数认识:生成速度、训练速度

1.6 it/s,每秒可以跑多少步数,或多少迭代数iteration/second

34 s/it,每步或每次迭代需要多少秒。

BatchSize和Rank都会影响生成或训练速度。

avr_loss=0.134,平均损失函数数值

loss越低,AI拟合越高

训练过程loss应该是逐渐降低,但如果loss只在小数点3、4位进行小范围变动,大概率就是过拟合了

如果loss在训练过程中忽高忽低,就是欠拟合

【不同训练集的loss值标准不同,重点关注loss的变化过程】

但有时候Loss值丢失NaN,因为有些参数过于极端,导致爆显存

  • 比如text_encoder_lr,如果设置的太高,就会出现梯度爆炸的情况,Loss无法收敛越来越大

什么是正则化?

刚做完正则化训练的课,有个很惊奇的发现,之后有时间了,再抽空去梳理吧

相关推荐
z2014z17 分钟前
系统架构设计师教程 第5章 5.2需求工程 笔记
笔记·系统架构
菜的不敢吱声44 分钟前
假期学习-- iOS 通知详解
学习·ios·cocoa
内心如初1 小时前
安全政策与安全意识(下)
笔记·等保测评·蓝队·安全政策与安全意识
拾荒李1 小时前
python学习11-Pytorch张量与数据处理1
pytorch·python·学习
limengshi1383921 小时前
通信工程学习:什么是SDH同步数字体系
网络·学习·信息与通信
hyk今天写算法了吗1 小时前
凸优化学习(2)——梯度类方法求解(gradient descent)
人工智能·深度学习·学习·梯度下降·凸优化
可惜已不在2 小时前
学习通、智慧职教刷课脚本
学习
LilKevinRay2 小时前
【JAVA基础】实现Tomcat基本功能
java·开发语言·笔记·tomcat
夜清寒风2 小时前
opencv学习:calcHist 函数绘制图像直方图及代码实现
人工智能·opencv·学习·算法·计算机视觉
Petrichorzncu2 小时前
计算机网络八股总结
笔记·计算机网络