世界を動かす技術を、日本語で。

小さなボルツマンマシン

2025年5月15日原文(eoinmurray.info)

概要

  • Boltzmann Machineの 学習アルゴリズム であるContrastive Divergence(CD)について解説
  • エネルギー関数 と確率分布の定式化を示し、勾配計算の流れを説明
  • 重み・バイアスの更新規則 を導出し、CDによる近似手法を紹介
  • Gibbsサンプリング を用いたモデル期待値の近似方法を解説
  • 学習手順の 正負フェーズ とパラメータ更新式をまとめて確認

Contrastive DivergenceによるBoltzmann Machineの学習

Boltzmann Machineの基本構造

  • 可視層(visible layer) v と隠れ層(hidden layer) h を持つことを前提とする
  • 重み行列 W で可視層と隠れ層を接続
  • バイアスベクトル b (可視層用)と c (隠れ層用)を用意
  • エネルギー関数(行列表現)を以下のように定義
    • $E(v, h) = -\sum_{i=1}^{m} \sum_{j=1}^{n} w_{ij} v_i h_j - \sum_{i=1}^{m} b_i v_i - \sum_{j=1}^{n} c_j h_j$
    • 定式化の確認

確率分布と目的関数

  • 同時分布 :$P(v, h) = \frac{1}{Z} e^{-E(v, h)}$
    • $Z$は分配関数(正規化定数)で全状態に対して和を取ることにより定義
  • 周辺尤度 :$P(v) = \sum_{h} P(v, h)$
  • 対数尤度 :$\log P(v) = \log \sum_{h} e^{-E(v,h)} - \log(Z)$
    • 学習データの尤度最大化を目的とすること

勾配とパラメータ更新則

  • 重み$w_{ij}$に関する 勾配
    • $\frac{\partial \log P(v)}{\partial w_{ij}} = \langle v_i h_j \rangle_{data} - \langle v_i h_j \rangle_{model}$
    • $\langle \cdot \rangle_{data}$:データ分布での期待値
    • $\langle \cdot \rangle_{model}$:モデル分布での期待値
  • バイアス$b_i$と$c_j$も同様の形で導出
  • パラメータ更新則 (学習率$\eta$を用いる)
    • $\Delta w_{ij} = \eta (\langle v_i h_j \rangle_{data} - \langle v_i h_j \rangle_{model})$
    • $\Delta b_i = \eta (\langle v_i \rangle_{data} - \langle v_i \rangle_{model})$
    • $\Delta c_j = \eta (\langle h_j \rangle_{data} - \langle h_j \rangle_{model})$
    • 更新則の確認

モデル期待値の近似とGibbsサンプリング

  • モデル期待値 の計算は厳密には困難
  • Gibbsサンプリング により近似することが一般的
    • 正フェーズ :$h^{(0)} \sim P(h | v^{(0)} = \text{data})$をサンプリング
    • 負フェーズ :$k$ステップGibbsサンプリング($v^{(t+1)} \sim P(v | h^{(t)})$と$h^{(t+1)} \sim P(h | v^{(t)})$を交互に繰り返す)
  • $k=1$のときが Contrastive Divergence-1(CD-1) と呼ばれる
    • 計算コストと近似精度のバランス

Contrastive Divergenceによる学習手順

  • 正フェーズ :データから隠れ層をサンプリングし期待値を計算
  • 負フェーズ :Gibbsサンプリングで生成データを得て期待値を計算
  • パラメータ更新
    • 上述の差分(データ期待値とモデル期待値)で重み・バイアスを更新すること
  • 反復処理 :全データで繰り返し学習を進めること

このように、Contrastive Divergenceは Boltzmann MachineRestricted Boltzmann Machine(RBM) の学習において、現実的な計算コストで近似的にパラメータを更新するための代表的な手法であることを理解することが重要です。

Hackerたちの意見

いい説明だね!ちょっとお知らせだけど、マウススクロールがなぜかすごく敏感なんだよね(モバイルではちゃんとスワイプできると思うけど、確認してない)。そのせいで、スクロールしようとすると最初から最後の「ページ」までジャンプしちゃう。幸い、キーボード入力はうまくいったから、全体を読むことができたよ。

懐かしいなぁ。1990年、C言語で「ニューロン」の配列からボルツマンマシンやパーセプトロンを作ってた頃を思い出す。あの頃、AIを何に使ってたっけ?MIDIメロディの次の音を予測したり、5x9のドットグリッド上でスコアの音符(ミニム、クロチェット、クエイバー)の形を認識したりしてた。85%の精度が「十分良い」って言われてたよ。

出力は音楽っぽかった?

5 x 9のドットグリッド上でスコアされた音符、ミニム、クロシェ、クエイバーの形を認識する 音楽を線のあるページから読むのは面白いプロジェクトになりそうだね、特に3Blue1BrownのNNの例みたいにゼロからやるのは。[1] チャック[2]みたいなものと組み合わせれば、今日の技術で完全にクライアントサイドのアプリケーションが作れるよ。[1] - https://www.3blue1brown.com/lessons/neural-networks [2] - https://chuck.stanford.edu/

あ、これは面白いデモだね。15年前に大学でGeoff Hintonのニューラルネットワークの講義を受けたんだけど、ボルツマンマシンについてもいくつかの講義で説明してた。> 制限付きボルツマンマシンは、可視ニューロンと隠れニューロンが互いに接続されていない特別なケースだよ。この表現は間違ってるね;可視ニューロンが隠れニューロンに接続されていないことを示唆してる。正しい表現はこうだ:可視ニューロン同士は接続されていなくて、隠れニューロン同士も接続されていない。あるいは:可視ニューロンと隠れニューロンはそれぞれのタイプ内で内部接続を持たない。

あるいは:可視ニューロンと隠れニューロンはそれぞれのタイプ内で内部接続を持たない。これがただのMLPじゃない理由がちょっとわからないな。ボルツマンマシンの何が違うの?編集:あ、気にしないで、イントロの概要に行くためにスクロールする必要があるって気づかなかった。0xTJの[フラグ付き][死んだ]コメントが、スクロールをハイジャックしたり再発明しようとするのは望ましくないって言ってるのはその通りだね。

デイビッド・アクリーについての面白い記事だよ https://news.unm.edu/news/24-nobel-prize-in-physics-cited-gr... 彼のT2タイルプロジェクトもチェックしてみてね。

重要なポイントは、これらのブレイクスルーを作るのにたくさんの人が関わっているってことだね。大学院生の価値はしばしば見落とされがちだけど、彼らはすごく貢献して、その後さらに研究を進めるんだ。アメリカが研究を無駄だと見なすのはどうしてなんだろう、これまでにすごく進んできたのに?

もし理解できていれば、今日のニューラルネットワークで使っている勾配ベースの前方と後方のパスの代わりに、重みの更新を計算するためにギブスサンプリングが必要なんだよね。これがどうしてそうなのか、誰か理解してる?

専門家ではないけど、ベイズ系のトレーニングを少し受けたことがあって、似たような問題を扱ってるんだ。通常、Gibbsサンプリングは、直接的な勾配がないとき(またはポイント推定ではなく分布そのものを再現したいとき)に使われるけど、サンプリングが簡単な周辺/条件付き尤度がある場合には使えるよ。各可視ノードは各隠れノードに依存していて、各隠れノードは全ての可視ノードに影響を与えるから、勾配がすごく複雑になっちゃうんだ。だから、周辺尤度に基づいて調整するためにGibbsサンプリングを使う方がずっと簡単なんだよね。

もしかしたら間違ってるかもしれないけど、これはRBMの無向構造が原因の一部だと思うから、フィードフォワードネットワークのように計算グラフを構築できないんだよね。

ここでもちょっと意見を言わせてもらうね。ギブスサンプリングはモデル分布の期待値を近似するために使われてると思う。この値は対数尤度の勾配を計算するのに必要だけど、分布を積分するのは難しいんだ。これは、VAEから代表的なサンプルを引くためにMCMCを使うのと似た方法で行われるよ。深層学習の神経ネットワークの定式化では、勾配は明示的にモデル化された確率分布ではなく、データセットのバッチに対して推定されるんだ。

Hacker Newsで議論の続きを見る