任何一个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无法收敛越来越大
什么是正则化?
刚做完正则化训练的课,有个很惊奇的发现,之后有时间了,再抽空去梳理吧