输入“/”快速插入内容

训练SD模型原理

🙃
不要被下面图片吓到了,其实说的很简单的
什么是训练AI模型
AI模型其实就是一个用来拟合特定功能的函数,比如我们有只蚂蚁🐜,以固定的速度
不断往前爬,那么我们就能用一个公式
来算出在确定时间
上(输入),蚂蚁运动的距离
(输出)
假如我们现在不知道蚂蚁的速度,但是通过观察得到了不同时间
输入)时运动的距离
输出)的一堆数据点,那么就能拟合出一条直线代表蚂蚁的运动公式(等价求解
参数),这样就能大概求解出在不同时间上,蚂蚁运动的距离了。这就是称为模型训练,模型训练就是在已知输入输出的情况下求解AI模型中的参数的过程。
Stable Diffusion也一样是个AI模型,不同的只是它的参数比较多。Stable Diffusion的输入有两个:
文字
图片
输出只有一个:图片
所以,训练Stable Diffusion可以看成从输入图片、文字和输出图片求解模型内参数的过程。
什么是过拟合
我们知道函数阶数越高(也就是参数变多)就有更多的参数学习额外的信息,所以能更好地拟合复杂数据集
比如下面这幅图,蓝色的一阶函数只能拟合直线会漏了很多信息,而红色的二阶函数能拟合抛物线就能更好地描述数据点
随着模型变量越来越多,能学到的东西就越来越多,就能更让函数贴合数据点。但是数据点(训练集)肯定是有限的(离散的),所以当参数过多时,就会出现模型为了尽可能拟合数据点而导致函数只记住了数据点的位置,却破坏了函数真正应该有的样子
比如下面从抛物线采集到的数据点因为采样误差可能出现一些偏移,如果用二阶函数(就是抛物线)来拟合才是最正确的,但是如果用高阶函数来拟合,就会尽可能贴合每个数据点而不像一个抛物线。
这样在数据点上或者附近时效果还行,但是一旦远离了数据点,就会因为没有还原出函数真正的样子而预测失败。比如下图在横轴大于2时,本应该越来越大(如左图所示),但是右边这个图在大于2时却越来越小了
像上面这种在数据点上(训练集)表现好,而在远离数据点的地方(测试集或者现实场景)效果反而更不好的现象,就叫过拟合。
在Stable Diffusion里的现象就可以描述为:
1.
生成出来的图片爆了,质量太差
2.
因为训练集太少,或者训练迭代次数太多,导致过于记住了训练集的样子,失去了泛化能力,所以画出来的画都差不多(比如只能一个角度画人,其他角度画不了)或者只能在一些特定场景使用,而在其他场景下表现不好
💡
出现过拟合时可以适当调低迭代次数增加数据集样本量
迭代步数和学习率是什么
现在AI训练都会采用一个叫“随机梯度下降”的算法,其实这个算法很简单,就是沿着让函数损失最小的方向不断逼近,在Stable Diffusion训练中就是让生成出来的图片不断朝着我们给的目标图片靠近。
在机器学习中,我们把这样衡量损失大小的东西叫损失函数,损失越小,就是和目标越靠近,比如我们可以用个抛物线来表达损失函数,一开始我们损失在最左边图的红点上,我们就会往“谷底”不断下降,所以这个算法叫“梯度下降”