当前位置: 首页 > article >正文

【机器学习】机器学习的基本分类-自监督学习-生成式方法(Generative Methods)

生成式方法是一类机器学习方法,其目标是对数据的生成过程建模,学习数据的概率分布,并能够生成与原始数据相似的新样本。生成式方法与判别式方法不同,它不仅关心样本的类别,还学习样本的特征分布。


核心思想

生成式模型的基本目标是估计数据分布 p(x),或条件分布 p(x|y)。通过这个分布,我们可以:

  1. 生成新样本:从学习到的分布中采样,生成类似的样本。
  2. 分类:通过 p(y|x) 使用贝叶斯法则进行推断。

生成式方法通常采用显式或隐式方式建模数据分布。


生成式方法的分类

1. 显式模型(Explicit Models)

显式地定义概率分布 p(x),并通过参数估计或最大化对数似然训练模型。

  • 参数化显式模型:假设数据分布属于某种形式(如高斯分布)。

    • 高斯混合模型(GMM)
    • 隐马尔可夫模型(HMM)
  • 非参数化显式模型:通过复杂函数近似分布。

    • 自回归模型(Autoregressive Models)
    • 正交投影模型(Flow-based Models)
2. 隐式模型(Implicit Models)

直接学习数据生成过程,而不显式定义p(x)。

  • 生成对抗网络(GANs)
  • 变分自编码器(VAEs)
  • 扩散模型(Diffusion Models)

典型生成式方法

1. 生成对抗网络(GANs)

GANs 由生成器(Generator)和判别器(Discriminator)组成,二者互相博弈。

  • 生成器:从随机噪声中生成假样本。
  • 判别器:判断样本是真实的还是生成的。
  • 目标:生成器尽可能欺骗判别器,判别器尽可能区分真假样本。

GAN的目标函数为:

\min_G \max_D \mathbb{E}_{x \sim p_{data}} [\log D(x)] + \mathbb{E}_{z \sim p_z} [\log (1 - D(G(z)))]

2. 变分自编码器(VAEs)

VAEs 是一种生成式模型,通过学习潜在变量的分布生成样本。

  • 编码器:将输入数据编码为潜在变量分布 q(z|x)。
  • 解码器:从潜在变量 z 重构样本。
  • 目标:最大化数据的证据下界(ELBO)。

目标函数为:

\mathcal{L} = \mathbb{E}_{q(z|x)}[\log p(x|z)] - \text{KL}(q(z|x) \| p(z))

3. 自回归模型

通过条件概率建模联合分布:

p(x) = \prod_{i=1}^N p(x_i | x_{<i})

  • 典型模型:PixelCNN、WaveNet。
4. 正交投影模型(Flow-based Models)

使用可逆变换将复杂分布映射到简单分布,如高斯分布。

  • 目标:通过变换函数 fff 计算数据的概率分布:

                                                      p(x) = p_z(f(x)) \left| \det \frac{\partial f}{\partial x} \right|
  • 典型模型:RealNVP、Glow。
5. 扩散模型(Diffusion Models)

通过逐步添加噪声破坏数据分布,再通过逆过程去噪重建数据。

  • 目标:学习正向扩散过程和逆向去噪过程。
  • 典型模型:DDPM(Denoising Diffusion Probabilistic Models)。

应用场景

  1. 数据生成
    • 图像生成:GAN、扩散模型
    • 文本生成:GPT(基于自回归思想)
    • 音频生成:WaveNet
  2. 数据增强
    • 在小样本场景下生成新的样本,增强模型泛化能力。
  3. 领域适配
    • 通过生成样本适配不同领域的数据分布。
  4. 降噪与修复
    • 图像去噪、补全或修复。

示例代码:GAN

以下是一个简单的 GAN 示例代码,用于生成手写数字:

import tensorflow as tf
from tensorflow.keras import layers, models

# 生成器
def build_generator():
    model = models.Sequential([
        layers.Dense(128, activation='relu', input_dim=100),
        layers.BatchNormalization(),
        layers.LeakyReLU(alpha=0.2),
        layers.Dense(784, activation='tanh')
    ])
    return model

# 判别器
def build_discriminator():
    model = models.Sequential([
        layers.Dense(128, activation='relu', input_dim=784),
        layers.LeakyReLU(alpha=0.2),
        layers.Dense(1, activation='sigmoid')
    ])
    return model

# 构建 GAN
def build_gan(generator, discriminator):
    discriminator.trainable = False
    model = models.Sequential([generator, discriminator])
    return model

# 数据准备
(X_train, _), _ = tf.keras.datasets.mnist.load_data()
X_train = X_train.reshape(-1, 784) / 127.5 - 1.0

# 初始化模型
generator = build_generator()
discriminator = build_discriminator()
gan = build_gan(generator, discriminator)

# 编译模型
discriminator.compile(optimizer='adam', loss='binary_crossentropy')
gan.compile(optimizer='adam', loss='binary_crossentropy')

# 训练
batch_size = 64
epochs = 10000
for epoch in range(epochs):
    # 生成真实和假样本
    idx = tf.random.uniform([batch_size], 0, X_train.shape[0], dtype=tf.int32)
    real_samples = X_train[idx]
    noise = tf.random.normal([batch_size, 100])
    fake_samples = generator.predict(noise)
    
    # 训练判别器
    d_loss_real = discriminator.train_on_batch(real_samples, tf.ones((batch_size, 1)))
    d_loss_fake = discriminator.train_on_batch(fake_samples, tf.zeros((batch_size, 1)))
    d_loss = 0.5 * (d_loss_real + d_loss_fake)
    
    # 训练生成器
    noise = tf.random.normal([batch_size, 100])
    g_loss = gan.train_on_batch(noise, tf.ones((batch_size, 1)))
    
    if epoch % 1000 == 0:
        print(f"Epoch {epoch}, D Loss: {d_loss}, G Loss: {g_loss}")

输出结果:

2/2 [==============================] - 0s 997us/step
Epoch 0, D Loss: 1.6730859279632568, G Loss: 0.8603016138076782
2/2 [==============================] - 0s 3ms/step
2/2 [==============================] - 0s 4ms/step
2/2 [==============================] - 0s 997us/step
2/2 [==============================] - 0s 997us/step
2/2 [==============================] - 0s 997us/step
2/2 [==============================] - 0s 998us/step
2/2 [==============================] - 0s 2ms/step
......


总结

生成式方法是深度学习的重要领域,具有广泛的应用和发展潜力。从经典的统计模型到现代的深度学习模型,生成式方法在图像、文本、语音等多个领域提供了强大的解决方案。


http://www.kler.cn/a/464716.html

相关文章:

  • Android GameActivity(NativeActivity)读写文件
  • 安卓入门十一 常用网络协议四
  • 声音是如何产生的
  • 麒麟服务器安装kafka--亲测
  • 下载word报表
  • ETCD渗透利用指南
  • 七款领先的网络准入控制解决方案分享:智能准入,安全无忧
  • (NDSS2024)论文阅读——仅低质量的训练数据?用于检测加密恶意网络流量的稳健框架
  • Apache Dubbo反序列化漏洞
  • JDK的运作原理
  • 做一套手机UI自动化测试的全套系统,支持对Android、ios进行UI自动化测试,使用什么样的后端、前端、UI自动化框架、持续集成和部署方案
  • vue.js 非父子通信-事件总线
  • 动态规划解决不同的二叉搜索树问题
  • 游戏社交趋势下,游戏语音再升级!
  • Springboot的自动配置原理?
  • LeetCode题解:2625. 扁平化嵌套数组,递归
  • 解决chatgpt(mac app登陆)出现报错:获取您的 SSO 信息时出错
  • 如何利用动态IP采集数据?
  • 方正畅享全媒体新闻采编系统imageProxy存在任意文件读取漏洞
  • Java毕设项目:基于Springboot电影院在线选座订票系统设计与实现开题报告
  • 可扩展性设计架构模式——事件驱动架构
  • 前端页面有那三层?分别是什么?作用是 什么?
  • 计算机网络期末复习之网络层
  • 代码随想录算法【Day8】
  • CentOS7 解决ping:www.baidu.com 未知的名称或服务
  • el-table行列转换简单版,仅限单行数据