• 深度学习理论知识入门【EM算法、VAE算法、GAN算法】和【RBM算法、MCMC算法、HMC算法】


    深度学习理论知识入门


    首先,让我们了解第一个流程:

    EM(Expectation-Maximization):EM算法是一种迭代优化算法,用于在存在潜在变量的统计模型中进行参数估计。它通过交替的E步骤(Expectation,期望)和M步骤(Maximization,最大化)来最大化似然函数。

    VAE(Variational Autoencoder):VAE是一种生成模型,结合了自动编码器和变分推断的概念。它可以学习数据的潜在表示,并生成与原始数据相似的新样本。

    GAN(Generative Adversarial Networks):GAN是一种生成模型,由生成器和判别器组成。生成器试图生成逼真的样本,而判别器则试图区分生成的样本和真实样本。通过对抗训练,生成器和判别器相互竞争,最终生成器可以生成更逼真的样本。

    现在,让我们看看第二个流程:

    采样:在机器学习中,采样通常指从概率分布中抽取样本。通过采样,我们可以生成符合给定分布的样本。

    RBM(Restricted Boltzmann Machine):RBM是一种基于能量的神经网络模型,用于学习数据的概率分布。它是一种受限制的玻尔兹曼机,其中神经元之间存在限制条件。

    MCMC(Markov Chain Monte Carlo):MCMC是一种采样方法,用于从复杂的概率分布中抽取样本。它利用马尔科夫链的性质,通过迭代过程生成样本。

    HMC(Hamiltonian Monte Carlo):HMC是一种MCMC方法的变体,通过模拟物理系统中的哈密顿动力学来生成样本。它可以更有效地探索高维空间中的分布。


    EM算法

    EM算法(Expectation-Maximization)是一种迭代优化算法,用于在存在潜在变量的统计模型中进行参数估计。它通过交替的E步骤(Expectation,期望)和M步骤(Maximization,最大化)来最大化似然函数。下面我将简要推导EM算法,并提供一个应用的示例。

    假设我们有一组观测数据X和一组对应的未观测的潜在变量Z。我们希望通过最大似然估计来估计模型的参数θ。然而,由于存在未观测的潜在变量Z,直接求解似然函数可能会非常困难。

    EM算法通过引入潜在变量的期望值来简化问题。其基本思想是,在每次迭代中,通过已知的参数值计算出潜在变量的期望值(E步骤),然后用这些期望值来最大化完全数据的似然函数(M步骤)。这个过程不断迭代,直到收敛到一个局部最优解。

    下面是EM算法的推导过程:

    初始化参数θ的值。

    E步骤(Expectation):计算在给定参数θ下,完全数据的潜在变量Z的条件概率分布P(Z|X, θ)。这个步骤计算出每个样本的潜在变量的期望值。

    M步骤(Maximization):最大化完全数据的对数似然函数,得到新的参数估计值θ。这个步骤使用E步骤中计算得到的潜在变量的期望值。

    重复步骤2和步骤3,直到收敛或达到最大迭代次数。

    现在,让我们通过一个简单的高斯混合模型的例子来说明EM算法的应用。

    假设我们观测到一组由两个高斯分布生成的一维数据。我们的目标是使用EM算法来估计这两个高斯分布的均值和方差。

    初始化参数:随机初始化两个高斯分布的均值和方差。

    E步骤(Expectation):对于每个观测数据,计算其属于每个高斯分布的概率。这可以使用贝叶斯定理和当前参数值计算得到。

    M步骤(Maximization):使用E步骤中计算得到的数据点的分配概率,更新高斯分布的均值和方差。

    重复步骤2和步骤3,直到参数收敛或达到最大迭代次数。

    通过迭代E步骤和M步骤,EM算法将逐渐优化均值和方差的估计,使其更好地拟合观测数据。

    这只是EM算法的简单示例,实际应用中可能涉及更复杂的模型和参数。然而,这个例子希望能够帮助您理解EM算法的基本原理和应用过程。


    GMM(高斯混合模型)

    当涉及到使用EM算法的实际例子时,一个经典的案例是高斯混合模型(Gaussian Mixture Model,GMM)。下面是使用Python和PyTorch库实现GMM的示例代码:

    import torch
    from torch.distributions import Normal, Categorical
    
    # 生成一些示例数据
    torch.manual_seed(42)
    num_samples = 1000
    true_means = torch.tensor([-1.0, 1.0])
    true_stddevs = torch.tensor([0.5, 0.8])
    true_weights = torch.tensor([0.4, 0.6])
    true_distribution = Categorical(true_weights)
    true_component_indices = true_distribution.sample((num_samples,))
    samples = torch.stack([
        Normal(true_means[i], true_stddevs[i]).sample()
        for i in true_component_indices
    ])
    
    # 初始化参数
    num_components = 2
    estimated_means = torch.tensor([-0.5, 0.5], requires_grad=True)
    estimated_stddevs = torch.tensor([1.0, 1.0], requires_grad=True)
    estimated_weights = torch.tensor([0.5, 0.5], requires_grad=True)
    
    # 定义EM算法的迭代次数和收敛条件
    num_iterations = 100
    tolerance = 1e-6
    
    # EM算法
    for iteration in range(num_iterations):
        # E步骤(Expectation)
        component_distributions = [
            Normal(estimated_means[i], estimated_stddevs[i])
            for i in range(num_components)
        ]
        component_probs = torch.stack([
            component_distributions[i].log_prob(samples)
            for i in range(num_components)
        ])
        log_likelihoods = torch.logsumexp(torch.log(estimated_weights.unsqueeze(1)) + component_probs, dim=0)
        log_component_probs = torch.log(estimated_weights.unsqueeze(1)) + component_probs
        responsibilities = torch.exp(log_component_probs - log_likelihoods.unsqueeze(0))
    
        # M步骤(Maximization)
        estimated_weights = responsibilities.mean(dim=1)
        for i in range(num_components):
            estimated_means[i] = (responsibilities[i] * samples).sum() / responsibilities[i].sum()
            estimated_stddevs[i] = torch.sqrt((responsibilities[i] * (samples - estimated_means[i])**2).sum() / responsibilities[i].sum())
    
        # 计算对数似然函数值
        current_log_likelihood = log_likelihoods.mean()
    
        # 检查收敛条件
        if iteration > 0 and torch.abs(current_log_likelihood - previous_log_likelihood) < tolerance:
            break
    
        previous_log_likelihood = current_log_likelihood
    
    # 打印估计的参数值
    print("Estimated means:", estimated_means)
    print("Estimated stddevs:", estimated_stddevs)
    print("Estimated weights:", estimated_weights)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
  • 相关阅读:
    [机缘参悟-60]:《兵者,诡道也》-2-孙子兵法解读
    ubuntu下Anaconda环境安装GPU的pytorch(docker镜像)
    ubuntu 18.04 sudo apt-get update 出现:ld.google.com(114.250.65.33) 连接超时
    别再纠结线程池池大小、线程数量了,哪有什么固定公式 | 京东云技术团队
    燕千云知识库,解决你的知识沉淀烦恼
    Python学习笔记(23)-Python框架22-PyQt框架使用(布局简介)
    图像的特征类别
    基于docker+jenkins+nginx实现一套CI/CD流程
    VS编译器常见的错误
    java中集合的List
  • 原文地址:https://blog.csdn.net/qq_24211837/article/details/134255588