使用随机梯度下降拟合高斯混合模型

机器算法验证 Python 在线算法 高斯混合分布 梯度下降
2022-03-27 22:47:17

我正在研究一个在线类别学习模型,它使用随机梯度下降来拟合高斯混合模型。该模型基于 Toscano & McMurray (2010) 中使用的在线学习模型。

虽然梯度下降似乎可以很好地估计类别的均值和频率/混合概率,但我在估计混合分量的协方差时遇到了问题。我用于梯度下降更新的偏导数来自 Petersen & Pedersen (2008) (p. 44)

从...开始

p(x)=kρkNx(μk,Σk)

Petersen & Pedersen 给出关于协方差矩阵的偏导数Σ作为

δlnp(x)δΣj=ρjNx(μj,Σj)kρkNx(μk,Σk)12[Σj1+Σj1(xμj)(xμj)TΣj1]

每个的梯度下降步骤Σj,因为我已经用 Python 实现了它(这是一个轻微的简化和ΔΣ在执行更新之前计算所有组件):

j.sigma += learning_rate*(G(x)/M(x))*0.5*(-inv(j.sigma) + inv(j.sigma).dot((x-j.mu).dot((x-j.mu).transpose())).dot(inv(j.sigma)))

其中 j 是一个对象,表示j混合物的第 th 分量和 j.sigma 和 j.mu 是该分量的均值和方差。G(x)/M(x) 代表一些计算代码ρjNx(μj,Σj)kρkNx(μk,Σk)

所以,我想知道我的代码是否有问题(很可能),或者这只是在处理超过二维的数据时适合这种模型的一种非常糟糕的方法(参见 Toscano & McMurray 的单变量算法)和绝对有效的双变量数据)。

参考文献:Toscano, JC, & McMurray, B. (2010)。线索与类别整合:使用无监督学习和分布统计对语音中的声学线索进行加权。认知科学,34,434-464。

彼得森和佩德森。Matrix 食谱,版本:2008 年 11 月 14 日

1个回答

假设mus[d]μj,j.sigmaΣj,并且G(x)/M(x)确实计算了分量的后验概率j给定数据x,

p(jx)=ρjNx(μj,Σj)kρkNx(μk,Σk),
渐变本身对我来说似乎是正确的。但这里有一些我注意到的事情可能会帮助你找到你的问题:

  • 我希望对均值、协方差和后验计算的访问都涉及jd,无论哪个变量代表您要在代码中计算梯度的组件。如果您告诉我们什么jd代表什么,我们也许可以告诉您更多信息。
  • 如果G(x)/M(x)访问j.Sigma计算后验,您的代码可能无法计算您认为的结果。最好先计算所有参数的所有梯度,然后执行更新。
  • 随机梯度下降通常不是优化高斯混合的首选。大多数情况下,使用期望最大化(EM)(参见,例如,Bishop,2007)。即使您不使用 EM,您也可能需要scipy.optimize在使用 SGD 之前考虑 BFGS 或 L-BFGS(在 中实现)。即使你坚持使用 SGD,你也应该考虑一次使用多个数据点(“批次”)来估计梯度,或者至少包括一个动量项简单地看一下 Toscano 和 McMurray 的论文,我的猜测是他们选择使用 SGD 是因为他们对以生物学上更合理的方式对语音获取建模感兴趣,而不是获得最佳拟合,并在线进行此操作(即一个数据一次点)。如果你不需要这个,我的建议是使用 EM。

    (我刚刚意识到您专门要求在线学习,因此您唯一可行的选择可能是添加动量项以加快速度。)

  • 您选择计算梯度的方式非常低效,这将进一步减慢学习速度。您可能没有看到合理的结果,因为算法需要很长时间才能收敛到有趣的东西。这是计算梯度的一种稍微好一点的方法:

    sigmaInv = inv(j.sigma)
    dSigma = G(x)/M(x) * 0.5 * (-sigmaInv + numpy.sum(sigmaInv.dot(x - mus[d]) * x))
    

    还有一些方法可以进一步改进梯度的计算。例如,如果我们将梯度乘以一个正定矩阵(例如Σj,这会稍微简化梯度)。如果我们使用不同的协方差参数化(例如Cholesky 因子)并计算它们的梯度,它也可能会更好地工作。