AIGC图像困局
算法技术的历史,是"用小资源干大事"的心酸历。
在写深度学习优化器算法巧思速览之前其实本来计划是先写现在这篇的,只是那个时候手上热乎的思路还是优化器相关,所以这篇博文就延后到今天才写。
这个标题起得很大,真写起来,篇幅真的太长了,所以只能想到哪写到哪。
2012年,Alex Krizhevsky的AlexNet在ImageNet上达到的精度震惊了世界,而那个时候也只做了一件事就是在224x224的分辨率下识别一千类物体。
而十年后的今天,真的变化太大了,现在AI的发展真的是日新月异,但我们仍在为如何让模型输出高质量的1024×1024图片视频而绞尽脑汁。
这不是技术进步太慢,而是这其中的涉及到的技术难处比想象中更甚。
引言
刚入行时候,博主第一个图像任务是语义分割,也就是俗话说的抠图。
这个在博主其他文章也可能看到相关信息。
从那个时候起,就有一个毒瘤或者是技术顽疾让人深恶痛绝。
它就是分辨率,由于技术的局限性,也因为算力的局限性,我们只能在小分辨率的图像里进行训练,而当你想要适配高分辨率的时候,对不起,重训或者外挂传统算法去打补丁。
如果在抠图领域,最经典的问题就是抠发丝,因为如果分辨率过低,你是看不见头发的,更别谈抠发丝是一种苦哈哈的细活。
但是如果采用高分辨率,是看见发丝了,计算量却暴涨了。对于很多场景需要的"实时"抠图,只能跪了,因为单是训练的算力就不能接受了,更别提最终使用。
但是仍然存在一些所谓传统算法,可以为我们铺路,例如利用导向滤波进行后处理。因为既然我们有大分辨率的图片信息,那直接利用起来就好了,细节我们从大分辨率图片里找回来就是了。也可以作为一种先验辅助训练。
那个时期 resnet, unet 百家争鸣。
后来gan的出现,迎来了图像生成的大爆发。
而图像生成这个事,跟抠图,抠发丝是不一样的,因为它是完全生成新的图片,或者生成局部再贴回原图,几乎没有任何原始信息可以合理地补充,毕竟生成的那个区域已经面目全非了。
而gan带来两层挑战,它需要几乎同时或者交替训练两个模型,一个负责生成,一个负责鉴别。这里的计算量就已经不小了,如果还要支持更大的分辨率,显存就岌岌可危了,当然gan在早期提出的时候本身训练也是不稳定的,后来为了稳定训练才提出来很多正则化惩罚以及归一化的思路。
那个时期,你不gan不行。
而当年最重要的事情就是transformer的提出。
[1706.03762] Attention Is All You Need
一直到了2022年Stable Diffusion彻底引暴了图像生成。
也就是新冠三年疫情的最后一年末。
所以一切便从Stable Diffusion开始说起。
关于Stable Diffusion的技术原理补充,可移步大话AI绘画技术原理与算法优化 一览。
分辨率是AIGC的阵痛
1.1 算力的三次方诅咒
分辨率对计算资源的吞噬是非线性的:
- 像素维度:分辨率×2 → 像素数×4
- Attention维度:序列长度×4 → 计算量×16(O(N²))
- 内存维度:激活值×4 → 显存占用×4(中间状态爆炸)
综合效应:分辨率×2 → 总成本×64。
这意味着512×512到1024×1024不是"两倍工作量",而是64倍。
1.2 数据的沙漠
LAION-5B的统计真相:
- 短边<512像素的图像:87%
- 短边<1024像素的图像:98%
- 短边>2048像素的图像:0.3%
高分辨率图像不仅少,而且分布偏移。4K照片的拍摄设备、构图习惯、后期处理流程与手机快照完全不同。模型在512×512上学习到的"世界知识",在4K上可能完全失效。
1.3 频率的牢笼
奈奎斯特采样定理在深度学习中的残酷映射:
训练分辨率决定了模型能学习的最高频率。
512×512的模型,其latent空间通常是64×64。这意味着任何小于8像素的细节都无法被表达 ------不是模糊,是根本不存在。模型从未见过更细的纹理,它不知道"毛孔"应该长什么样。
1.4 第一个核心困局
训练分辨率是模型认知的"光速上限",推理分辨率是用户需求的"超光速幻想"。
所有架构演化,都是在这个物理限制下的工程妥协。
SD1.5:U-Net的困境,只能打补丁了。(2022)
"第一次把扩散模型带到可用的工业级质量"
2.1 架构的先天残疾
SD1.5的U-Net架构有三个致命设计:
Receptive Field的硬边界
U-Net的encoder-decoder结构,下采样到8×8时,每个特征点理论上能看到64×64的原始区域。但对于2048×2048的图像,64×64只是3%的画面。模型根本看不见全局,只能凭统计规律猜测。
Latent的密度陷阱
KL-VAE将512×512压缩到64×64×4,每个latent向量负责8×8像素的重建。这意味着:
- 纹理:可学习(重复模式)
- 结构:可学习(大尺度形状)
- 精确几何:不可学习(亚像素级定位)
Attention的局部性
U-Net的self-attention只在同分辨率特征图内进行,跨尺度的信息融合依赖skip connection的通道拼接。这种层次化而非全局化的设计,让SD1.5擅长"画得像",不擅长"画得对"。
2.2 推理端的绝望补救
面对用户的4K需求,SD1.5只能诉事后工程:
方案A:插值------数学的暴力
双三次插值将64×64 latent拉到256×256再解码。新像素完全由卷积核权重决定,零语义理解。
结果:建筑线条弯曲,文字无法辨认,人脸变成橡皮泥。
方案B:超分网络------幻觉的代价
ESRGAN作为后置处理器,用对抗学习"编造"高频细节。
结果:砖墙纹理逼真但重复,皮肤毛孔存在但位置错误,统计上合理,物理上荒谬。
方案C:Tiled生成------一致性的献祭
将4K画布切成16个512×512 tiles独立生成,切片堆叠。
结果:每个tile质量完美,拼接处光照突变,人物长出四个耳朵。
2.3 SD1.5的本质 verdict
SD1.5从未"理解"过高分辨率,它只是用低分辨率的认知,通过工程技巧伪装成高分辨率。
这种伪装在:
- 自然风景(低频主导):可接受
- 人脸特写(结构敏感):崩坏
- 文字排版(精确几何):灾难
新困局产生:U-Net的局部性无法突破,必须换架构。VAE的一致性也是崩坏的。
所以 SD1.5 的高分辨率不是"生成",而是"插值 + 幻觉"。
SDXL:分工的艺术(2023)
补上了 SD1.5 在"高频细节"和"结构一致性"上的缺口
3.1 架构层面的第一次革命
SDXL没有抛弃U-Net,但做了结构性分工:
更密的Latent空间
从64×64提升到更精细的表征(实际实现为更高效的VAE压缩),每个latent向量负责的像素区域减小,频率上限提升约40%。
这不是简单的"放大latent",而是重新训练VAE,让编码器学习更高效的语义压缩------用同样的比特数表达更多信息。
Base + Refiner的双阶段流水线
核心洞察:结构和纹理是不同频率的现象,应该用不同模型处理。
- Base模型(U-Net):在相对低分辨率下运行,负责构图、语义、大尺度结构
- Refiner模型(另一个U-Net):接收Base的输出作为条件,负责高频细节、纹理、局部对比度
这类似于传统图像处理中的拉普拉斯金字塔:Base处理低频,Refiner处理高频残差。
原生1024与可外推性
SDXL的训练分辨率达到1024×1024,且通过改进的位置编码(插值型),可以外推到2048×2048仍保持可用质量。
3.2 为什么分工有效?
从信号处理视角,SDXL的分解是频率解耦:
图像 = 低频结构(可压缩)+ 高频细节(可预测)
↓ ↓
Base模型 Refiner模型
(全局理解) (局部生成)
Base只需要"知道"画面有张脸,Refiner负责"画"出毛孔。这种解耦让:
- Base的attention负担减轻(分辨率固定)
- Refiner的生成空间受限(已有结构指导),幻觉减少
3.3 SDXL的新边界
仍然无法突破的墙:
- U-Net的receptive field问题依旧,只是被Refiner部分缓解
- 两阶段串行,推理时间×2
- 外推到4K时,Refiner的局部性导致细节与结构脱节(如头发丝漂浮在空中)
新困局产生:U-Net的局部性是天生的,必须彻底换架构。
FLUX:Transformer的全局视野(2024)
补上了 U-Net 架构无法突破的"全局视野"缺口
4.1 为什么必须是DiT?
FLUX的架构切换(U-Net → DiT)不是追热点,而是物理必然:
Attention的全局性
DiT的self-attention是全连接 的:每个patch能看见所有其他patch。对于2048×2048的图像(256×256 patches),这意味着任意两点间的信息传递只需一层。
对比U-Net:信息从左上角传到右下角需要经过4次下采样-上采样循环,每次都有信息损失。
Scaling的友好性
Transformer的性能随计算量可预测提升(scaling law)。U-Net的卷积结构在达到一定深度后收益递减,而DiT可以通过增加层数、头数、维度持续改进。
位置编码的外推性
FLUX采用RoPE(旋转位置编码),其设计本质是相对位置编码。这使得:
- 训练时:模型学习的是"距离为k的 patches 如何交互"
- 推理时:任意距离的交互都遵循同一函数,自然外推
4.2 FLUX的三重突破
更密的Latent
相比SDXL,FLUX的latent空间进一步压缩效率提升,在同等计算预算下能表达更高频率。
单阶段端到端
不再需要SDXL的Base+Refiner分工,单个DiT同时处理结构和细节。这得益于attention的全局性------模型自己学会了在需要时关注全局,在需要时聚焦局部。
Tiled生成的质变
FLUX的tiled效果远超SDXL,因为:
- 边界patch的attention可以看到相邻tile的上下文(若实现为 overlapping attention)
- 光照、风格的统计特性由全局attention隐式约束,无需显式同步
4.3 FLUX的物理极限
Attention²的诅咒依旧
DiT解决了U-Net的局部性,但没有解决计算复杂度。2048×2048的图像在latent空间为256×256,attention矩阵大小为65536×65536,单精度存储需16GB,计算不可行。
单尺度的频率天花板
FLUX仍然是单尺度latent。虽然比SDXL更密,但固定的压缩比意味着频率上限固定。想要真正的4K细节,必须接受更大的latent,进而触发显存爆炸。
新困局产生 :全局性有了,但算力不够;想要更密latent,但内存不够。需要更高效的注意力 或多尺度架构。
Z-Image:轻量与多尺度的平衡(2024-2025)
"成本、速度、落地"
5.1 阿里的工程判断
Z-Image的设计哲学与FLUX不同:
不是"更大更强",而是"刚好够用,极致高效"。
这是基于阿里云的产品场景:
- 淘宝商品图:需要1024-2048,但要求结构稳定 (不能变形)、推理快速(实时生成)
- 钉钉文档插图:需要轻量部署
- 通义APP:需要低功耗
5.2 架构层面的创新
轻量DiT
比FLUX更少的层数、更小的维度:
- 浅层:宽attention,捕获全局
- 深层:窄attention+MLP,细化局部
这种异构设计让同样计算量下,有效receptive field更大。
多尺度特征融合(核心创新)
Z-Image不依赖单尺度latent,而是在DiT内部显式维护多分辨率特征:
输入图像 → 多尺度编码(1×, 1/2×, 1/4×, 1/8×)
↓
跨尺度attention(每个尺度能看到其他尺度)
↓
渐进式上采样 + 特征融合
↓
输出
这类似于传统计算机视觉中的图像金字塔,但完全可学习、端到端训练。
效果:
- 高频:从1×尺度获取
- 结构:从1/8×尺度获取
- 一致性:跨尺度attention保证
高效注意力变体
采用局部-全局混合attention:
- 局部窗口:计算密集型,但O(N)复杂度
- 全局token:可学习的"汇总"token,数量固定(如64个),与图像尺寸无关
这让Z-Image的显存占用与分辨率线性相关,而非平方相关。
5.3 Z-Image的定位
| 维度 | Z-Image | FLUX | SDXL |
|---|---|---|---|
| 设计目标 | 产品落地 | 质量极限 | 工业稳定 |
| 架构 | 轻量异构DiT | 标准DiT | U-Net分工 |
| 多尺度 | 显式融合 | 隐式单尺度 | 两阶段分工 |
| Attention | 局部-全局混合 | 标准全局 | 局部层次 |
| 外推能力 | 强(2K-4K) | 很强(4K+) | 弱(<2K) |
| 推理速度 | 最快 | 中等 | 最慢(双阶段) |
| 工程成本 | 最低 | 高 | 中 |
| 适用场景 | 实时生成 | 专业创作 | 传统工业 |
5.4 Z-Image的妥协
为了效率牺牲的质量:
- 极端复杂场景(如拥挤街道)的全局一致性弱于FLUX
- 最高频率细节(如毛发、织物纹理)不如FLUX真实
- 艺术性、创造力略逊于大规模DiT
但这是正确的工程选择:
对于90%的商业场景,"90分质量、100分速度"比"100分质量、50分速度"更有价值。
位置编码演化的总览
除了主要架构的变化之外,还有语义模块位置编码的演化。
因为
位置编码的演化,就是 AIGC 模型空间认知能力的演化。
SD1.5 靠卷积"猜位置",SDXL 开始显式编码位置,FLUX 建立了可外推的全局坐标系,而 Z-Image 则在工程成本下构建了多尺度的高效位置体系。
高分辨率生成的突破,不仅来自更大的模型或更强的 attention,更来自"模型终于知道自己在画布的哪里"。
| 代际 | 架构 | 空间位置编码 | 时间位置编码 | 文本位置编码 | 特点 |
|---|---|---|---|---|---|
| SD1.5 | U-Net | 无显式 2D PE(卷积隐式) | sin-cos | CLIP 1D | 局部性强,无法外推 |
| SDXL | U-Net++ | 显式 2D sin-cos | sin-cos++ | 双编码器 1D | 多尺度增强,但仍局部主导 |
| FLUX | DiT | 2D RoPE(可外推) | RoPE/sin-cos | Transformer 1D | 真正的全局坐标系 |
| Z-Image | 轻量 DiT | 多尺度 + 局部相对 + 全局抽象 | sin-cos | Transformer 1D | 工程最优,线性成本 |
回顾四代架构:
- SD1.5(U-Net):证明了扩散模型可行,但暴露了局部性局限
- SDXL(U-Net+分工):用工程分工绕过局限,但复杂度爆炸
- FLUX(DiT):用Transformer解决局部性,但算力瓶颈显现
- Z-Image(轻量DiT+多尺度):用效率优化平衡质量与成本
每一步都不是"更好"的简单替代,而是在约束条件下的当前最优。
-
SD1.5:低算力时代的最优
-
SDXL:高频细节的最优
-
FLUX:全局一致性的最优
-
Z-Image:成本与落地性的最优
这或许是AI工程化的终极真理:
没有最好的架构,只有最合适的架构。
博主为了把推理性能压榨到极限,干了不少辛酸事,
特别是把移植到TF,然后用TF写个猥琐发育的Chunked Flash Attention in Keras 写这个的时候,Flash Attention 还没发布,
而开源的这个版本也是整理之后开源出来的,毕竟我已经抛弃TensorFlow/Keras转投PyTorch了。
SD1.5 时代,为了压榨推理性能,博主做了很多"苦活":
TO C:
-
权重预计算(减少重复计算)
-
Flash Attention(降低 attention 显存)
-
FP16/INT8 量化(端侧可运行)
-
跨框架迁移(TF ↔ Torch ↔ ONNX ↔ TFLite)
-
端侧蒸馏 Encoder,实现 1 秒级推理
-
多模型并行部署,显存复用
后来回到广东,给某个游戏大厂做了大量游戏场景定制化LoRa,热情拥抱PyTorch。
TO B:
-
超高分辨率 压榨显存,挤一挤总是有的
-
干净的脏 他们对素材的细节要求真的很高
-
高保真生成 必须保证设定的一致性
-
语义可控 数据集虽然少,但是泛化性不能丢,解决小数据的过拟合
但来来回回,问题都一样:
算法研发,就是用小资源干大事。
在这之间有些算法做出来了,但没开源。
后来大厂开源了他们的版本,打法粗暴,一地鸡毛。
但无可厚非,毕竟这些年博主从开源项目中也学到了不少。
只是在那时就意识到:
-
不跟大厂硬钢 → 拿不到资源
-
跟在大厂后面 → 肉汤喝不到,锅还被砸
也是下了决心,选择了裸辞。
不再关注战场发生什么,只问自己:
我想做什么,想达成什么。
现在回头一看,发现两年前的一个技术方案,至今没有看到后来者。
倍感心安,但还得继续推进~
以上,仅以此文共勉之。
若有各种其他问题可以通过以下方式联系博主交流学习。
微信: Dbgmonks
QQ: 200759103
邮箱: gaozhihan@vip.qq.com
注: 不注明来意者一律拒绝。