目錄
1?變分自編碼器(VAE)?
1.1 概念
1.2 訓練損失
1.3 VAE 的實現
2?生成對抗網絡(GAN)?
2.1 概念
2.2 訓練損失
a. 判別器的損失函數
b. 生成器的損失函數
c. 對抗訓練的動態過程
2.3 GAN 的實現
3?自回歸模型(AR)
3.1 概念
3.2 訓練過程
a.核心思想: 用歷史預測未來
b. Transformer 的損失計算:交叉熵監督預測
c. 損失計算的具體步驟
3.2?代碼實現(Transformer-AR)?
4?流模型(Flow)?
4.1 概念
4.2 訓練過程
4.2 代碼實現(Flow)
5?擴散模型(Diffusion)?
5.1 概念
5.2 訓練過程
5.2?代碼實現(Diffusion)
6 小結
隨著Sora、diffusion、GPT等模型的大火,深度生成模型又成為了大家的焦點。
深度生成模型是一類強大的機器學習工具,它可以從輸入數據學習其潛在的分布,進而生成與訓練數據相似的新的樣本數據,它在計算機視覺、密度估計、自然語言和語音識別等領域得到成功應用, 并給無監督學習提供了良好的范式。
本文匯總了常用的深度學習模型,深入介紹其原理及應用:VAE(變分自編碼器)、GAN(生成對抗網絡)、AR(自回歸模型 如 Transformer)、Flow(流模型)和 Diffusion(擴散模型)
模型 | 核心目標 | 原理 | 優點 | 缺點 | 應用場景 | |
---|---|---|---|---|---|---|
?VAE | 學習潛在空間分布,編碼器-解碼器生成與訓練數據相似的樣本 | 基于變分推斷,將輸入數據映射到潛在空間的正態分布,解碼器重構數據,優化重構誤差與KL散度 | 訓練穩定,支持潛在空間插值;生成樣本多樣化 | 生成圖像模糊;KL散度約束可能導致信息丟失 | 數據填充、特征提取、圖像修復 | |
?GAN | 通過生成器與判別器的對抗訓練,生成與真實數據難分的樣本 | 生成器從噪聲生成假數據,判別器區分真假;兩者通過零和博弈優化,最終達到納什均衡 | 生成圖像細節豐富;單步推理速度快 | 訓練不穩定;生成多樣性不足;需精細調參 | 藝術創作、風格遷移、圖像超分辨率 | |
?AR | 自回歸地生成序列數據,逐個預測下一個元素的概率分布 | 基于條件概率分解(如Transformer),自注意力機制捕捉長程依賴,逐像素/逐token生成數據 | 建模能力強,支持長序列生成;訓練穩定 | 生成速度慢 (逐步采樣);高維數據計算成本高 | 文本生成、時序預測、圖像生成 | |
?Flow | 可逆變換將簡單分布轉為復雜數據分布,實現精確概率密度估計 | 設計可逆神經網絡層,利用變量變換公式計算數據對數似然,優化雅可比行列式。 | 支持精確密度估計;生成與重建可逆 | 高維數據下變換設計復雜;計算雅可比行列式開銷大 | 語音合成、密度估計、圖像生成 | |
?Diffusion | 通過逐步去噪過程從高斯噪聲重建數據分布,生成高質量樣本 | 正向擴散(逐步加噪)與逆向擴散(學習去噪)結合,基于馬爾可夫鏈建模條件概率 | 生成質量最高;訓練穩定 | 推理速度慢;顯存占用高 | 高清圖像生成、多模態/視頻生成 |
1?變分自編碼器(VAE)?
1.1 概念
VAE是在自編碼器(Auto-Encoder)的基礎上,結合變分推斷(Variational Inference)和貝葉斯理論提出的一種深度生成模型。VAE的目標是學習一個能夠生成與訓練數據相似樣本的模型。它假設隱變量服從某種先驗分布(如標準正態分布),并通過編碼器將輸入數據映射到隱變量的后驗分布,再通過解碼器將隱變量還原成生成樣本。
補充
1. 先驗分布的概念
假設我們要通過身高預測體重,貝葉斯理論會要求我們先對體重有一個 "初始認知"(比如平均體重 60kg,波動范圍 ±10kg)。這個初始認知就是先驗分布,它反映了我們在看到具體數據前對某個變量的信念
2. VAE 中的先驗設計
在 VAE 中,隱變量(latent variable)z 被假設服從某種簡單分布(通常是標準正態分布 N (0,1))。這就像我們在做圖像生成任務時,先假設所有圖像的潛在特征(比如形狀、顏色)都符合 "常見特征分布"
1.2 訓練損失
VAE的訓練損失函數包括?重構損失(如均方誤差)和?KL散度(衡量潛在分布與標準正態分布的差異)
損失函數:
- 重構項:衡量解碼器重建輸入數據的能力(如均方誤差或交叉熵)
- KL散度項:約束潛在分布?q(z∣x)?與先驗分布?p(z)(通常為標準正態分布)的相似性,平衡參數為?β(如 β-VAE)
優化目標:最大化證據下界(ELBO),同時保證潛在空間的結構化和連續性
補充
1. 損失函數的兩大核心目標
VAE 的損失函數像一個 “雙面裁判”,同時監督兩個目標:
- 重建能力:"你生成的圖片要和原圖差不多!"(重構損失)
- 規則意識:"你不能亂想!生成規則要符合常識!"(KL 散度)
2. 重構損失:像照鏡子的誤差
- 作用:確保解碼器能把隱變量 z 還原成接近原圖的樣子。
- 數學形式:
- 圖像任務常用均方誤差(MSE):計算每個像素點的誤差平方和。
- 文本任務常用交叉熵:衡量生成分布與真實分布的差異。
3. KL 散度:用規則約束想象力
- 作用:強制隱變量 z 的分布接近先驗(如正態分布)。
- 數學意義:
KL 散度 = 0 時,后驗分布 q (z|x) 和先驗 p (z) 完全一致;數值越大,說明模型越 "不守規矩"。4. β-VAE:用旋鈕調節規則強度
- β 參數:像音量旋鈕一樣調節 KL 散度的權重。
- β=0 時:完全不管規則,可能生成奇形怪狀的樣本(如貓的耳朵長在尾巴上)。
- β 很大時:過于遵守規則,生成樣本千篇一律(所有貓都長一個樣)。
5. ELBO:為什么要同時優化這兩個目標?
- ELBO 公式:
ELBO = 重構損失 - KL 散度
(更準確的數學表達需要結合概率模型,但這里簡化理解)- 核心邏輯:
模型需要同時做到:
- 記住訓練數據的特征(重構損失小)
- 把這些特征壓縮到 "常識空間"(KL 散度小)
這就像學習繪畫時,既要準確臨摹(重構),又要符合透視、比例等規則(KL 約束)。詳細介紹:
【VAE學習筆記】全面通透地理解VAE(Variational Auto Encoder)_vae架構-CSDN博客
1.3 VAE 的實現
import torch
import torch.nn as nn
import torch.nn.functional as Fclass VAE(nn.Module):def __init__(self, input_dim=784, hidden_dim=400, latent_dim=20):super(VAE, self).__init__()# 編碼器:輸入 → 隱藏層 → 均值和方差self.encoder = nn.Sequential(nn.Linear(input_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, latent_dim * 2) # 輸出均值和對數方差)# 解碼器:潛在變量 → 隱藏層 → 重構輸入self.decoder = nn.Sequential(nn.Linear(latent_dim, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, input_dim),nn.Sigmoid() # 輸出像素值在[0,1]區間)def reparameterize(self, mu, log_var):"""重參數化技巧:從N(μ, σ2)采樣潛在變量z"""std = torch.exp(0.5 * log_var) # 計算標準差eps = torch.randn_like(std) # 生成隨機噪聲return mu + eps * std # 返回采樣結果def forward(self, x):# 編碼:x → μ和logσ2h = self.encoder(x)mu, log_var = torch.chunk(h, 2, dim=1) # 分割為均值和方差# 采樣潛在變量zz = self.reparameterize(mu, log_var)# 解碼:z → 重構xx_recon = self.decoder(z)return x_recon, mu, log_var# 損失函數:重構損失 + KL散度
def loss_function(x_recon, x, mu, log_var):recon_loss = F.binary_cross_entropy(x_recon, x, reduction='sum') # 重構損失(交叉熵)kl_div = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp()) # KL散度return recon_loss + kl_div
2?生成對抗網絡(GAN)?
2.1 概念
GAN由兩部分組成:生成器(Generator)和 判別器(Discriminator)
- 生成器的任務是生成盡可能接近真實數據的假數據
- 判別器的任務是區分輸入數據是真實數據還是生成器生成的假數據
- 二者通過相互競爭與對抗,共同進化,最終生成器能夠生成非常接近真實數據的樣本
訓練過程:
-
判別器接受真實數據和生成器生成的假數據,進行二分類訓練,優化其判斷真實或生成數據的能力
-
生成器根據判別器的反饋,嘗試生成更加真實的假數據以欺騙判別器
-
交替訓練判別器和生成器,直到判別器無法區分真實和生成數據,或達到預設的訓練輪數
2.2 訓練損失
a. 判別器的損失函數
- 判別器的目標是最大化正確判斷的概率:
- 真實樣本:輸出 1(正確識別為真)。
- 生成樣本:輸出 0(正確識別為假)。
- 數學表達:
- 直觀解釋: 判別器的損失是兩部分交叉熵的總和:
- 對真實樣本判斷錯誤的懲罰(希望 log D (x) 盡可能大,所以取負號)。
- 對生成樣本判斷錯誤的懲罰(希望 log (1-D (G (z))) 盡可能大,同樣取負號)。
b. 生成器的損失函數
- 生成器的目標是讓判別器誤判生成樣本為真:
- 生成樣本:讓判別器輸出 1(即讓 D (G (z)) 趨近于 1)。
- 數學表達:
- 直觀解釋: 生成器的損失是判別器誤判生成樣本的懲罰(希望 log D (G (z)) 盡可能大,所以取負號)。
c. 對抗訓練的動態過程
-
第一輪訓練:
- 生成器隨機生成低質量樣本(如模糊的人臉)。
- 判別器輕松識別真偽,損失很低(因為正確判斷了大部分樣本)。
- 生成器的損失很高(因為判別器幾乎都識別為假)。
-
第二輪訓練:
- 生成器改進造假技術(如生成更清晰的人臉)。
- 判別器被 “迷惑”,損失上升(因為部分生成樣本被誤判為真)。
- 生成器的損失下降(因為判別器誤判增多)。
-
最終平衡:
- 生成器能生成足以以假亂真的樣本。
- 判別器無法準確區分真偽,損失趨近于理論下限(交叉熵為 log (0.5))。
為什么使用交叉熵作為損失?
- 交叉熵的特性:
它衡量兩個概率分布的差異。當判別器對真實樣本輸出 1、生成樣本輸出 0 時,交叉熵為 0(理想狀態)。- 對抗的本質:
生成器希望讓判別器的輸出分布與 “全 1” 分布更接近(對生成樣本),而判別器希望讓輸出分布與 “真實標簽分布” 更接近(對真實樣本為 1,生成樣本為 0)。
2.3 GAN 的實現
class Generator(nn.Module):"""生成器:從噪聲生成圖像"""def __init__(self, noise_dim=100, output_dim=784):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(noise_dim, 256),nn.ReLU(),nn.Linear(256, 512),nn.ReLU(),nn.Linear(512, output_dim),nn.Tanh() # 輸出范圍[-1,1],需在數據預處理時歸一化)def forward(self, z):return self.model(z).view(-1, 1, 28, 28) # 輸出形狀為(B, 1, 28, 28)class Discriminator(nn.Module):"""判別器:區分真實圖像與生成圖像"""def __init__(self, input_dim=784):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 512),nn.LeakyReLU(0.2),nn.Linear(512, 256),nn.LeakyReLU(0.2),nn.Linear(256, 1),nn.Sigmoid() # 輸出概率值)def forward(self, x):x = x.view(-1, 784) # 展平輸入return self.model(x)# 訓練循環示例(簡化版)
def train_gan():G = Generator()D = Discriminator()criterion = nn.BCELoss()# 交替優化生成器和判別器for real_images, _ in dataloader:# 訓練判別器real_labels = torch.ones(real_images.size(0), 1)fake_labels = torch.zeros(real_images.size(0), 1)# 判別器對真實圖像的損失real_loss = criterion(D(real_images), real_labels)# 生成假圖像并計算判別器損失z = torch.randn(real_images.size(0), 100)fake_images = G(z)fake_loss = criterion(D(fake_images.detach()), fake_labels)d_loss = real_loss + fake_loss# 反向傳播更新判別器d_loss.backward()optimizer_D.step()# 訓練生成器g_loss = criterion(D(fake_images), real_labels) # 欺騙判別器g_loss.backward()optimizer_G.step()
3?自回歸模型(AR)
3.1 概念
算法原理:自回歸模型是一種基于序列數據的生成模型,它通過預測序列中下一個元素的值來生成數據。給定一個序列(x_1, x_2, ..., x_n),自回歸模型試圖學習條件概率分布(P(x_t | x_{t-1}, ..., x_1)),其中(t)表示序列的當前位置。AR模型可以通過循環神經網絡(RNN)或 Transformer 等結構實現。
如下以 Transformer 為例解析。
在深度學習的早期階段,卷積神經網絡(CNN)在圖像識別和自然語言處理領域取得了顯著的成功。然而,隨著任務復雜度的增加,序列到序列(Seq2Seq)模型和循環神經網絡(RNN)成為處理序列數據的常用方法。盡管RNN及其變體在某些任務上表現良好,但它們在處理長序列時容易遇到梯度消失和模型退化問題。為了解決這些問題,Transformer模型被提出。而后的GPT、Bert等大模型都是基于Transformer實現了卓越的性能!
3.2 訓練過程
a.核心思想: 用歷史預測未來
自回歸模型的核心是根據過去的輸出預測未來的輸出。例如:
- 語言模型:根據 “今天天氣” 預測下一個詞 “很” 或 “熱”。
- 時間序列預測:根據過去 10 天的股價預測第 11 天的股價。
Transformer 作為自回歸模型: 它通過注意力機制捕捉序列中每個位置與之前所有位置的依賴關系,最終輸出每個位置的預測概率分布。
b. Transformer 的損失計算:交叉熵監督預測
-
輸入與輸出的關系
- 輸入序列:例如句子 “我喜歡”。
- 目標序列:將輸入右移一位,得到 “喜歡天”(假設任務是補全句子)。
- 模型目標:對每個位置,預測下一個詞的概率分布。
-
損失函數的數學表達
- 直觀解釋: 交叉熵損失衡量模型預測的概率分布與真實標簽的差異。 例如:若真實詞是 “天”,而模型預測 “天” 的概率為 0.8,則貢獻的損失是?\(-\log(0.8) \approx 0.223\)。
c. 損失計算的具體步驟
-
(1) 嵌入與位置編碼
- 將輸入詞(如 “我”“喜”“歡”)轉換為向量,并添加位置信息。
-
(2) 因果掩碼(Causal Masking)
- 在自注意力計算時,屏蔽未來信息。例如:預測 “歡” 時,只能看到 “我” 和 “喜”,看不到 “天”。
- (3) 多頭注意力與前饋網絡
- 通過注意力機制整合歷史信息,生成每個位置的預測向量。
-
(4) 輸出層與概率分布
- 將預測向量映射到詞表的概率分布(如 10000 個詞的 softmax 輸出)。
-
(5) 計算損失
- 對比每個位置的預測概率與真實詞的 one-hot 編碼,累加交叉熵。
為什么使用交叉熵?
- 分類問題的天然選擇:每個位置的預測是多分類任務(選擇詞表中的一個詞)
直觀案例:生成句子 “我喜歡晴天”
- 輸入序列:["我", "喜", "歡"]
- 目標序列:["喜", "歡", "晴"]
- 損失計算:
- 預測第一個位置(“我”)的下一個詞 “喜”,若正確則損失低
- 預測第二個位置(“喜”)的下一個詞 “歡”,若正確則繼續
- 預測第三個位置(“歡”)的下一個詞 “晴”,若錯誤則貢獻高損失
訓練中的優化技巧
- 掩碼填充(Padding Mask):忽略輸入中的無效填充符號(如 “<pad>”)
- 學習率調度:使用 warm-up 策略避免初始訓練時的不穩定
- 梯度裁剪:防止長序列反向傳播時的梯度爆炸
與 VAE/GAN 損失的對比
模型 損失類型 監督方式 VAE 重構損失 + KL 散度 無監督(僅輸入數據) GAN 對抗損失(交叉熵 / 其他) 無監督(僅輸入數據) Transformer 交叉熵(自回歸監督) 有監督(需目標序列)
詳細解讀: 注意力機制 → Transformer+位置編碼(掩碼softmax - 查詢-鍵-值(Query-Key-Value,QKV)模式的理解)-CSDN博客
3.2?代碼實現(Transformer-AR)?
class TransformerAR(nn.Module):"""基于Transformer的自回歸圖像生成模型(Pixel Transformer)"""def __init__(self, vocab_size=256, embed_dim=128, num_heads=4, num_layers=3):super(TransformerAR, self).__init__()# 輸入:圖像展平為序列(如28x28 → 784像素)self.embedding = nn.Embedding(vocab_size, embed_dim)self.positional_enc = nn.Parameter(torch.randn(784, embed_dim)) # 位置編碼# Transformer編碼器(僅解碼模式)encoder_layer = nn.TransformerEncoderLayer(d_model=embed_dim, nhead=num_heads, dim_feedforward=512)self.transformer = nn.TransformerEncoder(encoder_layer, num_layers)# 輸出層:預測每個像素的概率分布self.fc = nn.Linear(embed_dim, vocab_size)def forward(self, x):# x形狀:(B, seq_len) 每個位置是像素值(0-255)x = self.embedding(x) + self.positional_enc # 嵌入 + 位置編碼# 自注意力掩碼(防止看到未來信息)mask = torch.triu(torch.ones(784, 784), diagonal=1).bool()# Transformer處理out = self.transformer(x, mask=mask)# 預測每個像素的分布logits = self.fc(out)return logits# 生成示例(逐像素生成)
def generate(self, start_token, max_len=784):generated = start_tokenfor _ in range(max_len):logits = self(generated)next_pixel = torch.multinomial(F.softmax(logits[:, -1, :], dim=-1), 1)generated = torch.cat([generated, next_pixel], dim=1)return generated
4?流模型(Flow)?
4.1 概念
算法原理:流模型是一種基于可逆變換的深度生成模型。它通過一系列可逆的變換,將簡單分布(如均勻分布或正態分布)轉換為復雜的數據分布。
核心思想:用 “可逆魔法” 轉換分布 流模型就像一個 “數據變形大師”,它的核心是可逆變換。想象你有一團標準形狀的橡皮泥(簡單分布,如正態分布),通過一系列可逆向操作的手法(比如拉伸、折疊,但隨時能恢復原狀),把它捏成跟真實數據(如圖像、語音)分布一樣復雜的形狀。這種 “既能變形,又能變回去” 的特性,就是流模型的關鍵 —— 通過可逆函數,讓簡單分布 “流動” 成復雜數據分布。
生成過程類比:假設真實數據是 “貓咪圖片” 的分布,流模型先從簡單的正態分布中采樣一個向量z(像隨機選一塊標準形狀的橡皮泥),然后通過生成器G的一系列可逆變換(比如調整顏色、輪廓等操作),把z變成一張貓咪圖片x。因為變換可逆,未來也能通過反向操作,從貓咪圖片還原出最初的z。
4.2 訓練過程
這里直接放豆包對圖中損失函數的解讀
4.2 代碼實現(Flow)
class FlowModel(nn.Module):"""基于RealNVP的可逆流模型"""def __init__(self, input_dim=784, hidden_dim=512):super(FlowModel, self).__init__()# 定義可逆變換的參數網絡self.scale_net = nn.Sequential(nn.Linear(input_dim//2, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, input_dim//2))self.shift_net = nn.Sequential(nn.Linear(input_dim//2, hidden_dim),nn.ReLU(),nn.Linear(hidden_dim, input_dim//2))def forward(self, x):# 分割輸入為兩部分(x1和x2)x1, x2 = x.chunk(2, dim=1)# 計算縮放和偏移參數s = self.scale_net(x1)t = self.shift_net(x1)# 變換x2z2 = x2 * torch.exp(s) + t# 合并結果并計算對數行列式z = torch.cat([x1, z2], dim=1)log_det = s.sum(dim=1) # 行列式的對數return z, log_detdef inverse(self, z):# 逆變換:從潛在變量恢復輸入z1, z2 = z.chunk(2, dim=1)s = self.scale_net(z1)t = self.shift_net(z1)x2 = (z2 - t) * torch.exp(-s)x = torch.cat([z1, x2], dim=1)return x# 損失函數:負對數似然
def flow_loss(z, log_det):prior_logprob = -0.5 * (z ?** 2).sum(dim=1) # 標準高斯先驗return (-prior_logprob - log_det).mean()
5?擴散模型(Diffusion)?
5.1 概念
Diffusion Model(擴散模型)是一類深度生成模型,它的靈感來源于物理學中的擴散過程。與傳統的生成模型(如VAE、GAN)不同,Diffusion Model通過模擬數據從隨機噪聲逐漸擴散到目標數據的過程來生成數據。這種模型在圖像生成、文本生成和音頻生成等領域都有出色的表現。
a. 核心思想:模擬 “破壞 - 修復” 的物理過程
- 擴散模型的靈感來自物理擴散現象,比如墨水滴入水中逐漸擴散
- 它把這個過程用在數據生成里,分兩個階段:
- 正向擴散(破壞):給干凈數據(如圖像)逐步加噪聲,讓數據從清晰變模糊,最后接近純噪聲(類似照片被雨水慢慢沖毀)
- 反向擴散(修復):從純噪聲出發,一步步去除噪聲,恢復成清晰數據(類似修復老照片)通過學習這個過程,模型就能掌握數據的生成規律
b. 與其他模型的區別
- 傳統生成模型(如 VAE、GAN)直接學習生成數據,而擴散模型像 “數據偵探”,通過拆解 “數據如何被噪聲破壞” 的過程,反向學會 “如何從噪聲還原數據”,生成的內容往往更細膩真實
5.2 訓練過程
聲。
圖中損失函數的核心是衡量 “預測噪聲” 與 “真實噪聲” 的差距,常用均方誤差(MSE):
- 邏輯:在正向擴散中,模型知道每個時間步加了多少真實噪聲。訓練時,U-net 根據帶噪樣本預測噪聲,損失函數要求預測值盡可能接近真實噪聲。就像教孩子 “找不同”,每次對比預測結果和真實答案,錯得越多,損失越大,模型就會調整參數減少錯誤。
- 作用:通過最小化損失,U-net 學會分析帶噪數據的特征,最終在反向擴散時,能用預測的噪聲逐步還原出清晰數據。
?詳細介紹:
超詳細的擴散模型(Diffusion Models)原理+代碼 - 知乎
5.2?代碼實現(Diffusion)
class DiffusionModel(nn.Module):"""基于UNet的擴散模型"""def __init__(self, image_size=28, channels=1):super(DiffusionModel, self).__init__()# 定義噪聲預測網絡(簡化版UNet)self.net = nn.Sequential(nn.Conv2d(channels, 64, 3, padding=1),nn.ReLU(),nn.Conv2d(64, 64, 3, padding=1),nn.ReLU(),nn.Conv2d(64, channels, 3, padding=1))# 噪聲調度參數self.num_steps = 1000self.betas = torch.linspace(1e-4, 0.02, self.num_steps)self.alphas = 1 - self.betasself.alpha_bars = torch.cumprod(self.alphas, dim=0)def forward(self, x, t):"""預測噪聲ε"""return self.net(x)def train_step(self, x0):# 隨機選擇時間步tt = torch.randint(0, self.num_steps, (x0.size(0),))# 計算加噪后的xtsqrt_alpha_bar = torch.sqrt(self.alpha_bars[t]).view(-1, 1, 1, 1)sqrt_one_minus_alpha_bar = torch.sqrt(1 - self.alpha_bars[t]).view(-1, 1, 1, 1)epsilon = torch.randn_like(x0)xt = sqrt_alpha_bar * x0 + sqrt_one_minus_alpha_bar * epsilon# 預測噪聲并計算損失epsilon_pred = self(xt, t)loss = F.mse_loss(epsilon_pred, epsilon)return lossdef sample(self, num_samples=16):"""從噪聲逐步生成圖像"""xt = torch.randn(num_samples, 1, 28, 28)for t in reversed(range(self.num_steps)):# 逐步去噪epsilon_pred = self(xt, t)xt = (xt - self.betas[t] * epsilon_pred) / torch.sqrt(self.alphas[t])if t > 0:xt += torch.sqrt(self.betas[t]) * torch.randn_like(xt)return xt
6 小結
最后,簡單回顧一下已經簡單介紹過的5種常見的深度學習模型:
VAE(變分自編碼器)、GAN(生成對抗網絡)、AR(自回歸模型 如 Transformer)、Flow(流模型)和 Diffusion(擴散模型)
我們可以看到不同模型的優缺點和適用場景:
- VAE和GAN是兩種常用的深度生成模型,分別基于貝葉斯概率理論和對抗訓練來生成樣本
- AR模型則適用于處理具有時序依賴關系的數據,如序列數據
- Flow模型和Diffusion模型在生成樣本上具有較好的穩定性和多樣性,但需要較高的計算成本
最后提供一些潛在的問題和方法:
研究方向 | ?核心問題 | ?技術路徑 | ?典型應用場景 |
---|---|---|---|
?混合架構融合 | 單一模型難以兼顧生成質量與推理速度 | ? Diffusion-GAN混合(擴散模型生成質量+GAN推理速度) ? VAE-Transformer(壓縮編碼+序列建模) ? 流模型與自回歸模型聯立訓練 | ? 高保真圖像實時生成 ? 長視頻時序一致性優化 |
?輕量化 | 大模型部署資源消耗過高 | ? 知識蒸餾(教師-學生模型遷移) ? 隱式神經表示(INR參數化生成) ? 稀疏注意力機制與量化壓縮 | ? 移動端AI繪圖APP ? 邊緣計算設備實時生成 |
?物理約束嵌入 | 生成內容違反現實物理規律 | ? 剛體動力學方程約束(牛頓力學+生成器) ? 流體力學PDE求解器集成 ? 符號邏輯引導的潛在空間優化 | ? 科學模擬(氣象/材料) ? 機器人訓練環境生成 |
部分參考:
數據派THU:必知!5大深度生成模型!