目录
深度学习理论知识入门
首先,让我们了解第一个流程:
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的示例代码:
python3
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)