96SEO 2026-02-19 16:47 13
。

不知你是否有和我一样的困惑#xff0c;这AI工具好像并不是那么听话#xff1f;
diffusion这个工具呢#xff1f;AI究竟在stable
diffusion真的是横空出世开启了AIGC的元年。
不知你是否有和我一样的困惑这AI工具好像并不是那么听话
diffusion中承担了什么样的角色如何能尽可能快、成本低地得到我们期望的结果
源于这一系列的疑问我开始了漫长的论文解读。
High-Resolution
Models地址https://arxiv.org/abs/2112.10752?spmata.21736010.0.0.7d0b28addsl7xQfile2112.10752
work?地址https://stable-diffusion-art.com/how-stable-diffusion-work/?spmata.21736010.0.0.7d0b28addsl7xQ
Mechanisms。
条件控制如果不能输出我们想要的图片那这就像Monkey
随着深度神经网络的发展生成模型已经有了巨大的发展主流的有以下几种
model)按照像素点生成图像导致计算成本高。
实验效果还不错变分自编码器(Variational
ImageVAE存在生成图像模糊或者细节问题基于流的方法(Glow)生成对抗网络(Generative
network)利用生成器(G)与判别器(D)进行博弈不断让生成的图像与真实的图像在分布上越来越接近。
以一只猫作为案例。
当我们想画一只猫的时候也都是从一个白板开始框架、细节不断完善。
对于AI来说一个纯是noise的image就是一个理想的白板类似下图展示的这样。
image图片。
这个noise取决于Random这个参数。
相同的Random生成的noise
predictor预测这个图里加了多少noise生成一个predicted
predictor怎么控制我们最终能得到一只猫而不是一只狗或者其他的东西
选择一张训练用的图片比如说一张猫生成一个随机的noise图片将noise图叠加到训练用的图片上得到一张有一些noise的图片。
这里可以叠加1~T步noise训练noise
predictor告诉我们加了多少noise。
通过正确的noise答案来调整模型权重。
最终我们能得到一个相对准确的noise-predictor。
这是一个U-Net
model。
在stable-diffusion-model中。
以上noise与noise-predictor的过程均在pixel
space那么就会存在巨大的性能问题。
比如说一张1024x1024x3的RBG图片对应3,145,728个数字需要极大的计算资源。
在这里stable
Space的提出基于一个理论Manifold_hypo***sis
它假设现实世界中许多高维数据集实际上位于该高维空间内的低维Latent
Space就存在很多的难以感知的高频细节而这些都是在Latent
这里有一个因子fH/hW/w通常我们定义比如说stable-diffusion
Space的中间表达则是4x64x64那么我们会有一个decoder
那么VAE该怎么训练呢我们需要一个衡量生成图像与训练图像之间的一个距离指标。
细节就不关心了但这个指标可以用来衡量VAE模型的还原程度。
训练过程与noise
diffusion在FID指标上与其他方法的对比。
下面的表格来自于无条件图片生成。
基本就是比较Latent
其实和人对图片的理解是一样的自然的、优秀的图片都不是随机的他们有高度的规则比如说脸上会有眼睛、鼻子。
一只狗会有4条腿和一个规则的形状。
图像的高维性是人为的而自然的图像可以很容易地压缩为更小的空间中而不丢失任何信息。
可能说我们修改了一张图片的很多难以感知的细节比如说隐藏水印微小的亮度、对比度的修改但修改后还是同样的图像吗我们只能说它表达的东西还是一样的。
并没有丢失任何信息。
representation。
一种中间表达noise-predictor预测这个latent
representation的noise.并生成一个latent
noise重复2~3直到step结束通过VAE的decoder将latent
直到目前为止都还没有条件控制的部分。
按这个过程我们最终只会得到一个随机的图片。
相信你在上面的图片生成的过程中已经感知到一个问题了如果只是从一堆noise中去掉noise那最后得到的为什么是有信息的图片而不是一堆noise呢
noise-predictor在训练的时候其实就是基于已经成像的图片去预测noise那么它预测的noise基本都来自于有图像信息的训练数据。
在这个denoise的过程中noise会被附加上各种各样的图像信息。
怎么控制noise-predictor去选择哪些训练数据去预测noise就是条件控制的核心要素。
从图中可以看到我们的每一个word都会被tokenized。
stable
tokenized将自然语言转成计算机可理解的数字(NLP)它只能将words转成token。
比如说dreambeach会被CLIP模型拆分成dream和beach。
一个word并不意味着一个token。
同时dream与beach也不等同于dream和spacebeachstable
model目前被限制只能使用75个tokens来进行prompt并不等同于75个word。
Embedding是一个768长度的向量。
每一个token都会被转成一个768长度的向量如上案例我们最后会得到一个4x768的矩阵。
比如说我们输入了man但这是不是同时可以意味着gentleman、guy、sportsman、boy。
他们可能说在向量空间中与man的距离由近而远。
而你不一定非要一个完全准确无误的man。
通过embedding的向量我们可以决定究竟取多近的信息来生成图片。
对应stable
scale)CFG。
相当于用一个scale去放大距离因此scale越大对应的能获取的信息越少就会越遵循prompt。
而scale越小则越容易获取到关联小甚至无关的信息。
diffusion无法准确绘制出我们想要的内容。
那么这里我们发现了第一种条件控制的方式textual
将我们想要的token用一个全新的别名定义这个别名对应一个准确的token。
那么就能准确无误地使用对应的embedding生成图片。
这里的embedding可以是新的对象也可以是其他已存在的对象。
比如说我们用一个玩具猫训练到CLIP模型中并定义其Tokenizer对应的word同时微调stable
具体cross-attention是什么我也不是很清楚。
但这里有一个案例可以说明
这样就能保证生成一个蓝色眼睛的男人。
而不是一个蓝色袜子或者其他蓝色信息的男人。
感觉更像是存在blue、eyes然后有一个集合同时满足blue和eye。
去取这个交叉的集合。
问题对应的embedding是不是不一样的该如何区分blue
matrix。
这个由Random决定如果Random不变则这个latent
matrix不变。
通过noise-predictor将noisy
noise不断重复2~3执行step次。
比如说step20最终通过VAE的decoder将latent
左上角的定义为一张RGB像素空间的图。
经过的变化生成这个latent
而这个过程则是img2img的input。
如果是img2img那么初始的noise
representation一种中间表达。
而与将经过cross-attention
具体的细节说实话没看懂而这一部分在controlnet中也有解释打算从controlnet的部分进行理解。
图中cross-attention的部分可以很清晰的看到是一个由大到小又由小到大的过程在controlnet的图中有解释
64x64的过程具体为啥得等我撕完controlnet的论文。
回到过程图中我们可以看到denoising
结合上面的图看基本还是比较清晰的不过这个:和代表了啥就不是很清楚了。
结合python代码看流程更清晰~删掉了部分代码只留下了关键的调用。
StableDiffusionPipeline.from_pretrained(CompVis/stable-diffusion-v1-4,
AutoencoderKL.from_pretrained(CompVis/stable-diffusion-v1-4,
CLIPTokenizer.from_pretrained(openai/clip-vit-large-patch14)
CLIPTextModel.from_pretrained(openai/clip-vit-large-patch14)
UNet2DConditionModel.from_pretrained(CompVis/stable-diffusion-v1-4,
LMSDiscreteScheduler.from_pretrained(CompVis/stable-diffusion-v1-4,
tokenizer(prompt,paddingmax_length,max_lengthtokenizer.model_max_length,truncationTrue,return_tensorspt,
torch.no_grad():text_embeddings
text_encoder(text_input.input_ids.to(torch_device))[0]
torch.no_grad():uncond_embeddings
text_encoder(uncond_input.input_ids.to(torch_device))[0]
scheduler.set_timesteps(num_inference_steps)
tqdm(scheduler.timesteps):latent_model_input
scheduler.scale_model_input(latent_model_input,
encoder_hidden_statestext_embeddings).samplenoise_pred_uncond,
还是很贴合图中流程的。
在代码中有一个Scheduler其实就是noising的执行器它主要控制每一步noising的强度。
由Scheduler不断加噪然后noise
Guide地址https://stable-diffusion-art.com/samplers/
representation往里面加noise总共加T个noisenoise的强度由Denoising
strength控制。
noise其实没有循环加的过程就是不断叠同一个noise
基于上面的原理Inpainting就很简单了noise只加到inpaint的部分。
其他和Img2Img一样。
相当于只生成inpaint的部分。
所以我们也经常发现inpaint的边缘经常无法非常平滑~如果能接受图片的细微变化可以调低Denoising
strength将inpaint的结果再进行一次img2img
v2开始CLIP的部分用了OpenClip。
导致生成的控制变得非常的难。
OpenAI的CLIP虽然训练集更小参数也更少。
(OpenClip是ViT-L/14
CLIP的5倍大小)。
但似乎ViT-L/14的训练集更好一些有更多针对艺术和名人照片的部分所以输出的结果通常会更好。
导致v2基本没用起来。
不过现在没事了SDXL横空出世。
model负责生成而Refiner则负责加细节完善。
可以只运行Base
model。
但类似人脸眼睛模糊之类的问题还是需要Refiner解决。
encoder组合了OpenClip和ViT-G/14。
毕竟OpenClip是可训练的。
训练用的图片可以小于256x256增加了39%的训练集U-Net的部分比v1.5大了3倍默认输出就是1024x1024
从目前来看有朝一日SDXL迟早替代v1.5。
从效果来说v2.1确实被时代淘汰了。
这个看起来是一个无解的问题。
Andrew给出的建议是加prompt比如说beautiful
fingers期望其中有部分图片满足要求。
或者用inpaint。
反复重新生成手部。
这个时候可以用相同的prompt。
我们是淘天集团-场景智能技术团队作为一支专注于通过AI和3D技术驱动商业创新的技术团队,
为淘宝打造围绕家的场景的第一消费入口。
我们不断探索并实践新的技术,
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback