確率的勾配降下法を使用した混合ガウスモデルの近似


8

私は、確率的勾配降下法を使用してガウス混合モデルに適合するオンラインカテゴリ学習モデルに取り組んでいます。このモデルは、Toscano&McMurray(2010)で使用されているオンライン学習モデルに基づいています。

勾配降下法はカテゴリーの平均と頻度/混合確率を推定するのにかなりうまく機能しているようですが、混合成分の共分散の推定に問題があります。勾配降下法の更新に使用してきた偏微分は、Petersen&Pedersen(2008)(p。

で始まります

pバツ=ΣkρkNバツμkΣk

ピーターセン&ペダーセンは、共分散行列に関して偏微分を与えるとしてΣ

δlnpバツδΣj=ρjNバツμjΣjΣkρkNバツμkΣk12[Σj1+Σj1バツμjバツμjTΣj1]

Pythonで実装しているので、各の勾配降下ステップは次のです(これはわずかな簡略化であり、すべてのコンポーネントのは更新を実行する前に計算されます)。 Δ ΣΣjΔΣ

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.sigmaとj.muはその成分の平均と分散です。G(x)/ M(x)は、を計算するいくつかのコードのρ jのNは、 xはμ JΣ jはjρjNバツμjΣjΣkρkNバツμkΣk

だから、私のコードに何か問題があるのではないか(非常に可能性が高い)、またはこれが3次元を超えるデータを処理するときにこの種のモデルに当てはまる本当に悪い方法であるのかと思います(単変量のアルゴリズムについてはToscano&McMurrayを参照)間違いなく機能する2変量データ)。

参考文献:Toscano、JC、&McMurray、B.(2010)。カテゴリとのキューの統合:教師なし学習と分布統計を使用して、音声の音響キューに重みを付けます。認知科学、34、434-464。

ピーターセンとペダーソン。マトリックスクックブック、バージョン:2008年11月14日

回答:


3

mus[d]μjj.sigmaΣjG(x)/M(x)jバツ

pj|バツ=ρjNバツμjΣjΣkρkNバツμkΣk
  • 平均へのアクセス、共分散、および事後の計算には、コードで勾配を計算するコンポーネントを表す変数のいずれかjまたはが含まれると予想dします。あなたが私たちに何を言ってjd立つのかを教えてくれれば、私たちはあなたにもっと話すことができるかもしれません。
  • 事後を計算するためにG(x)/M(x)アクセスj.Sigmaする場合、コードはあなたが考えていることを計算しないかもしれません。最初にすべてのパラメーターのすべての勾配を計算てから、更新を実行することをお勧めします。
  • 確率的勾配降下法は、通常、ガウス混合を最適化するための最初の選択肢ではありません。ほとんどの場合、期待値最大化(EM)が使用されます(たとえば、Bishop、2007を参照)。EMを使用しない場合でも、scipy.optimizeSGDを使用する前に、BFGSまたはL-BFGS(で実装)を検討することをお勧めします。また、SGDを使用する場合でも、一度に複数のデータポイント(「バッチ」)を使用して勾配を推定するか、少なくとも運動量項を含めることを検討する必要があります。ToscanoとMcMurrayの論文を簡単に見ると、彼らはSGDを使用することを選択したのは、彼らが可能な限り最良の適合を取得してこれをオンラインで行うのではなく、生物学的により妥当な方法で音声の取得をモデリングすることに興味を持っていたためだと思います(つまり、1つのデータ)一度に)。これが必要ない場合は、EMを使用することをお勧めします。

    オンライン学習を具体的に求めていることに気付いたので、少し加速するために勢いの項を追加するしかありません。)

  • 勾配を計算するために選択した方法は非常に効率が悪いため、学習がさらに遅くなります。アルゴリズムが興味深いものに収束するまでには時間がかかるため、妥当な結果が得られなかった可能性があります。勾配を計算する少し良い方法は次のとおりです。

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

    Σj


@Lucasの提案に感謝します。少し不明瞭なコードでごめんなさい。それは私が書き直したより大きな関数の一部なので、それ自体でもう少し理にかなっています。SigmaInvは1回だけ計算され、すべての勾配は更新前に計算されます。これは、私がやっていることのオンラインモデルである必要があるため、EMを使用できません。シグマのコレスキー分解を使用する少し異なるバージョンを試しましたが、少し奇妙に動作しました。
phased_chirp 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.