跳到主要内容Transformer、Stable Diffusion 与 LLM 模型对比及实现 | 极客日志PythonAI算法
Transformer、Stable Diffusion 与 LLM 模型对比及实现
综述由AI生成Transformer 作为基础架构支撑现代 AI,LLM 专注于文本序列生成,Stable Diffusion 则基于扩散模型处理图像。两者在核心任务、技术基础及生成逻辑上存在显著差异。文章通过对比表格梳理关键区别,并深入解析了 DDPM 模型的 Python 实现,涵盖参数配置、训练循环中的梯度裁剪与学习率调度,以及反向去噪的采样流程,为理解生成式 AI 落地提供实践参考。
链路追踪14 浏览 Transformer、Stable Diffusion 与 LLM 模型对比及实现
三种模型的核心差异
Transformer 是现代 AI 的基础架构,而 LLM(大语言模型)和 Stable Diffusion 则是基于不同技术路线的典型应用。简单来说,LLM 擅长处理语言,Stable Diffusion 专注于图像生成。
详细对比表
| 维度 | LLM | Stable Diffusion |
|---|
| 核心任务 | 理解和生成人类语言文本,如对话、协作、翻译、代码生成 | 生成和编辑图像,根据文本描述生成图片,或对现有图片进行修改 |
| 技术基础 | 主要基于 Transformer 架构的解码器部分(如 GPT 系列),或者编码器 - 解码器部分 | 基于扩散模型架构,结合了 Transformer 用于理解文本提示,和 U-Net 用于去噪生成图像 |
| 处理对象 | 离散的符号序列 | 连续的图像数据,像素矩阵 |
| 工作原理 | 根据上下文预测下一个最可能的 token,自回归生成文本 | 从纯随机噪声开始,通过多步去噪过程,逐步将其塑造成符合文本描述的清晰图像 |
| 代表性模型 | GPT 系列,LLaMA 系列,ChatGLM,通义千问,文心一言 | Stable Diffusion 系列及其变体,SDXL, SD1.5 等,DALL-E2/3, Midjourney |
| 输入输出 | 输入:文本提示;输出:文本 | 输入:文本提示 + 可选参数;输出:图像 |
关键差异点
- 架构不同:LLM 的核心是 Transformer;Stable Diffusion 的核心是扩散模型,只是借用 Transformer 作为其文本理解器。
- 数据模态不同:一个处理文本,一个处理图像。
- 生成逻辑不同:LLM 是从左到右的序列预测;Stable Diffusion 是从噪声到清晰图的迭代去噪。
开源生态的影响
开源是这些模型发展的重要催化剂,但程度和方式有所不同。
- Transformer:论文《Attention Is All You Need》彻底开源,代码实现被广泛公开,已成为行业标准。
- Stable Diffusion:由 StabilityAI 主动开源,这一举动引爆了 AI 绘画革命,社区可以自由使用、修改、微调模型,催生了海量工具和生态。
- LLM:情况更复杂。闭源代表如 OpenAI 的 GPT-4、Google 的 Gemini Advanced,仅提供 API;开源代表如 Meta 的 LLaMA 系列、MistralAI 的 Mistral/Mixtral,以及国产的 ChatGLM、Qwen、Baichuan 等,公开权重和架构,允许本地部署和研究。
开源极大地降低了应用门槛,促进了安全性研究、垂直领域适配、成本下降和技术民主化。
Stable Diffusion 实战:DDPM 模型实现
接下来我们看看具体的代码实现。这里以 DDPM(Denoising Diffusion Probabilistic Models)为例,展示如何配置训练参数并启动流程。
主程序入口
这个脚本负责配置所有训练或评估所需的超参数,并根据模式调用相应的函数。
from Diffusion.Train import train, eval
def main(model_config=None):
modelConfig = {
"state": "train",
"epoch": 200,
"batch_size": 80,
"lr": 1e-4,
"multiplier": 2,
"grad_clip": 1,
"T": 1000,
"beta_1": 1e-4,
"beta_T": 0.02,
"channel": 128,
"channel_mult": [1, 2, 3, 4],
"attn": [2],
"num_res_blocks": 2,
"dropout": 0.15,
"img_size": 32,
"device": "cuda:0",
"training_load_weight": None,
"save_weight_dir": "./Checkpoints/",
"test_load_weight": "ckpt_199_.pt",
"sampled_dir": "./SampledImgs/",
"sampledNoisyImgName": "NoisyNoGuidenceImgs.png",
"sampledImgName": "SampledNoGuidenceImgs.png",
"nrow": 8
}
if model_config is not None:
modelConfig.update(model_config)
if modelConfig["state"] == "train":
train(modelConfig)
else:
eval(modelConfig)
if __name__ == '__main__':
main()
训练与评估代码解析
训练模块封装了 DDPM 的前向扩散过程和反向去噪过程。核心思想是通过神经网络学习从噪声中恢复原始图像。
训练流程
训练的目标是最小化预测噪声和真实噪声之间的 MSE 损失。以下是训练函数的关键逻辑:
import os
from typing import Dict
import torch
import torch.optim as optim
from tqdm import tqdm
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.datasets import CIFAR10
from torchvision.utils import save_image
from Diffusion import GaussianDiffusionSampler, GaussianDiffusionTrainer
from Diffusion.Model import UNet
from Scheduler import GradualWarmupScheduler
def train(modelConfig: Dict):
device = torch.device(modelConfig["device"])
dataset = CIFAR10(
root='./CIFAR10',
train=True,
download=True,
transform=transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
])
)
dataloader = DataLoader(
dataset,
batch_size=modelConfig["batch_size"],
shuffle=True,
num_workers=4,
drop_last=True,
pin_memory=True
)
net_model = UNet(
T=modelConfig["T"],
ch=modelConfig["channel"],
ch_mult=modelConfig["channel_mult"],
attn=modelConfig["attn"],
num_res_blocks=modelConfig["num_res_blocks"],
dropout=modelConfig["dropout"]
).to(device)
if modelConfig["training_load_weight"] is not None:
net_model.load_state_dict(torch.load(os.path.join(modelConfig["save_weight_dir"], modelConfig["training_load_weight"]), map_location=device))
optimizer = torch.optim.AdamW(net_model.parameters(), lr=modelConfig["lr"], weight_decay=1e-4)
cosineScheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer=optimizer, T_max=modelConfig["epoch"], eta_min=0)
warmUpScheduler = GradualWarmupScheduler(
optimizer=optimizer,
multiplier=modelConfig["multiplier"],
warm_epoch=modelConfig["epoch"] // 10,
after_scheduler=cosineScheduler
)
trainer = GaussianDiffusionTrainer(
net_model,
modelConfig["beta_1"],
modelConfig["beta_T"],
modelConfig["T"]
).to(device)
for e in range(modelConfig["epoch"]):
with tqdm(dataloader, dynamic_ncols=True) as tqdmDataLoader:
for images, labels in tqdmDataLoader:
optimizer.zero_grad()
x_0 = images.to(device)
loss = trainer(x_0).sum() / 1000.0
loss.backward()
torch.nn.utils.clip_grad_norm_(net_model.parameters(), modelConfig["grad_clip"])
optimizer.step()
tqdmDataLoader.set_postfix({"epoch": e, "loss": loss.item(), "img shape": x_0.shape, "LR": optimizer.state_dict()['param_groups'][0]["lr"]})
warmUpScheduler.step()
torch.save(net_model.state_dict(), os.path.join(modelConfig["save_weight_dir"], 'ckpt_' + str(e) + ".pt"))
评估与采样
评估阶段实际上是生成新图像的过程。我们从标准高斯分布采样初始噪声,然后逐步去噪。
def eval(modelConfig: Dict):
with torch.no_grad():
device = torch.device(modelConfig["device"])
model = UNet(
T=modelConfig["T"],
ch=modelConfig["channel"],
ch_mult=modelConfig["channel_mult"],
attn=modelConfig["attn"],
num_res_blocks=modelConfig["num_res_blocks"],
dropout=0
).to(device)
ckpt = torch.load(os.path.join(modelConfig["save_weight_dir"], modelConfig["test_load_weight"]), map_location=device)
model.load_state_dict(ckpt)
print("model load weight done.")
model.eval()
sampler = GaussianDiffusionSampler(
model,
modelConfig["beta_1"],
modelConfig["beta_T"],
modelConfig["T"]
).to(device)
noisyImage = torch.randn(size=[modelConfig["batch_size"], 3, 32, 32], device=device)
saveNoisy = torch.clamp(noisyImage * 0.5 + 0.5, 0, 1)
save_image(saveNoisy, os.path.join(modelConfig["sampled_dir"], modelConfig["sampledNoisyImgName"]), nrow=modelConfig["nrow"])
print("Starting sampling process...")
sampledImgs = sampler(noisyImage)
sampledImgs = sampledImgs * 0.5 + 0.5
save_image(sampledImgs, os.path.join(modelConfig["sampled_dir"], modelConfig["sampledImgName"]), nrow=modelConfig["nrow"])
print(f"Sampling completed! Images saved to {modelConfig['sampled_dir']}")
通过这段代码,我们可以清晰地看到从数据加载、模型构建、训练循环到最终采样的完整链路。实际运行时,建议确保 GPU 资源充足,因为 DDPM 训练对计算要求较高。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online