背景
在生成式AI兴起之前,市场上的AI产品主要是分析式AI。
从功能上看,过去的分析式AI的应用主要是帮助人们进行预测,进而提升决策效率。尽管如此,这类AI可以独立完成的任务并不多,也不能生成新的内容,在大多数时候,它充其量只能充当一个辅助角色。
而生成式AI则不同,除了拥有和分析式AI类似的预测功能外,它们还能根据决策独立作出判断、生成内容。
因此,它们的应用潜力和经济影响要比分析式AI大得多。
昨晚看东方卫视,已经用虚拟新闻主播担任主持人。
生成式AI的几个模型
目前,生成式AI主要有这五大模型:vaes、GANs、Diffusion、Transformers、NeRFs。
1、VAEs
使用编码器-解码器架构来生成新数据,通常用于图像和视频生成,例如生成用于隐私保护的合成人脸。
2、GANs
使用生成器和鉴别器来生成新数据,通常用于视频游戏开发中以创建逼真的游戏角色。
3、Diffusion
添加然后消除噪声以生成具有高细节水平的高质量图像,从而创建近乎逼真的自然场景图像。
4、Transformers
可以有效地并行处理顺序数据,以进行机器翻译、文本摘要和图像创建。
5、NeRFs
提供了一种使用神经表示的3D场景重建的新方法。
实际场景中,经常会将以上结合使用。比如OpenAI Sora就集成了Diffusion模型和Transformer模型。
什么是Stable Diffusion?
Stable Diffusion是一种潜在扩散模型,2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如内补绘制、外补绘制,以及在提示词指导下产生图生图的转变。
源代码和模型权重已分别公开发布在GitHub和Hugging Face,可以在我们有GPU的电脑硬件上本地运行。
以前的专有文生图模型(如DALL-E和Midjourney)只能通过云计算服务访问。
它是一种使用扩散过程逐步细化噪声源来生成合成数据的方法。该方法涉及将潜在噪声向量迭代地转换为目标信号。
由3个部分组成:变分自编码器(VAE)、U-Net和一个文本编码器。
Stable Diffusion建议在10GB以上的显存(GDDR或HBM)下运行。
扩散模型所用的去噪过程如下所示:
什么是GAN?
生成对抗网络(Generative Adversarial Network)是非监督式学习的一种方法,通过两个神经网络相互博弈的方式进行学习。
该方法由伊恩·古德费洛等人于2014年提出。GAN背后的基本思想是它们涉及两个神经网络:生成器和判别器。
生成网络从潜在空间(latentspace)中随机取样作为输入,其输出结果需要尽量模仿训练集中的真实样本。
判别网络的输入则为真实样本或生成网络的输出,其目的是将生成网络的输出从真实样本中尽可能分辨出来。
而生成网络则要尽可能地欺骗判别网络。
两个网络相互对抗、不断调整参数,最终目的是使判别网络无法判断生成网络的输出结果是否真实。
GAN 工作原理如下图所示:
Diffusion与GAN的不同点
虽然Stable Diffusion和GAN之间有一些相似之处,例如它们都专注于生成合成数据,但也存在一些关键差异,使这两种方法彼此不同。
1、稳定扩散是一种自监督方法,可以从自身的迭代细化过程中学习,而GAN则涉及生成器和判别器。
2、稳定扩散被设计为在连续的潜在空间中运行,而GAN在离散的像素空间中运行。
Diffusion试用
from diffusers import DiffusionPipeline
import torch
#加载base&refiner
base = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True
)
base.to("cuda")
refiner = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-refiner-1.0",
text_encoder_2=base.text_encoder_2,
vae=base.vae,
torch_dtype=torch.float16,
use_safetensors=True,
variant="fp16",
)
refiner.to("cuda")
#定义步骤数和百分比(80/20)
n_steps = 40
high_noise_frac = 0.8
# 生成一个梵高风格的西安钟楼照片
prompt = "Generate a photo of the Xi'an Bell Tower in the style of Van Gogh"
# 运行
image = base(
prompt=prompt,
num_inference_steps=n_steps,
denoising_end=high_noise_frac,
output_type="latent",
).images
image = refiner(
prompt=prompt,
num_inference_steps=n_steps,
denoising_start=high_noise_frac,
image=image,
).images[0]