オートエンコーダで画像を潜在ベクトル $\bm{z}$ に圧縮できたとして、その $\bm{z}$ の各次元はいったい何を表しているのでしょうか。多くの場合、「$z_1$ を少し動かすと、顔の向きと同時に明るさも髪の長さも変わってしまう」——つまり複数の意味がごちゃ混ぜになって絡まっています。これでは「向きだけ変えたい」という操作ができません。
もし $z_1$ が「向き」だけ、$z_2$ が「明るさ」だけ、$z_3$ が「髪の長さ」だけ、というように各次元が独立した1つの意味だけを担うように学習できたら——生成を細かく制御でき、表現も解釈でき、無関係な要因を切り離して別タスクに転用できます。この「意味の軸を分離して学ぶ」ことを disentanglement(ディスエンタングルメント、もつれの解消) と呼びます。
驚くべきことに、これを実現する最も有名な手法 β-VAE がやっていることは、通常のVAEの目的関数のうちKL項に係数 $\beta$ を1つ掛けるだけです。たった1つのハイパーパラメータが、なぜ「意味の分離」を促すのか。本記事では、この一見不思議な仕組みを目的関数の導出から情報理論的な解釈まで丁寧に追い、Pythonで「KL項の振る舞い」「分離の度合い」「βのトレードオフ」を実際に確かめます。
この話題は、生成モデルの制御だけでなく、「環境・条件」と「対象の状態」を切り離して扱いたいような表現学習(たとえば操作条件と正常/異常状態の分離)でも基盤になります。本記事はVAEの理論を前提にしますので、ELBOや再パラメータ化トリックが不安な方は先にそちらを参照してください。

図の通り、β-VAEは標準VAEの損失(再構成項+KL項)のKL項に重み $\beta$ を掛けるだけの拡張です。それなのに、$\beta>1$ にすると潜在表現の「分離」が促される——この距離感を、まず「何がうれしいのか」から埋めていきます。
disentangled表現とは何か
まず、目標である「分離した表現」をはっきりさせましょう。世界のデータは、少数の独立した生成因子(generative factors)から作られていると考えられます。たとえば「物体の画像」なら、大きさ・色・位置・向き、といった因子です。これらは互いに独立に変えられます(大きさを変えても色は変わらない)。
良い表現とは、この生成因子の構造を潜在空間にそのまま映したもの——各潜在次元が1つの生成因子に対応し、ある因子を変えるとそれに対応する次元だけが動く表現です。

図の左は 絡まった(entangled)表現です。$z_1$ を動かすと「大きさ」と「色」が同時に変わってしまい、1つの次元が複数の意味を抱えています。右が 分離した(disentangled)表現で、$z_1$ は大きさだけ、$z_2$ は色だけを担い、軸が意味に対応しています。
この違いは、潜在空間を実際に動かしてみると一目瞭然です。

ある1つの潜在次元の値だけを少しずつ変化させ、生成結果がどう変わるかを見る操作を 潜在トラバース(latent traversal) と呼びます。disentangledな表現では、$z_1$ を動かすと大きさだけが、$z_2$ を動かすと位置だけが、きれいに連続変化します。1次元の変化に1つの意味が対応する——これが分離が達成されている証拠です。逆に絡まった表現では、1つの次元を動かすと複数の見た目が同時に変わってしまいます。
なぜこれが嬉しいのかを具体化しておくと、(1) 属性を指定した生成(「向きだけ変える」)が可能になる、(2) 各次元の意味が読めるので表現が解釈可能になる、(3) タスクに無関係な因子を切り離せるので公平性や転移学習に効く——という実利があります。では、この分離をどう学習させるのか。鍵がβです。
β-VAEの目的関数
標準VAEは、対数尤度の下界 ELBO を最大化します(最小化の形では符号を反転)。ELBOは2つの項からなります。
$$ \begin{equation} \mathcal{L}_{\text{VAE}} = \underbrace{\mathbb{E}_{q(z|x)}[\log p(x|z)]}_{\text{再構成項}} – \underbrace{D_{KL}\big(q(z|x)\,\|\,p(z)\big)}_{\text{KL正則化項}} \end{equation} $$
第1項は「潜在 $z$ から $x$ をどれだけ正確に復元できるか」を表す再構成項、第2項は「近似事後分布 $q(z|x)$ を事前分布 $p(z)=\mathcal{N}(\bm{0},\bm{I})$ にどれだけ近づけるか」を表すKL正則化項です。
β-VAEは、このKL項に重み $\beta$ を掛けるだけです。

$$ \begin{equation} \mathcal{L}_{\beta\text{-VAE}} = \mathbb{E}_{q(z|x)}[\log p(x|z)] – \beta\, D_{KL}\big(q(z|x)\,\|\,p(z)\big) \end{equation} $$
$\beta=1$ なら通常のVAEに一致します。$\beta>1$ にすると、KL項——つまり「潜在分布を事前分布に近づける圧力」——が強まります。事前分布 $p(z)=\mathcal{N}(\bm{0},\bm{I})$ は各次元が独立な標準正規分布です。したがってKL項を強めることは、近似事後分布 $q(z|x)$ を「各次元が独立」な形に押し込む圧力を強めることに相当します。これが分離を促す直観の出発点です。
なぜ「事前分布に近づける」と「次元が独立になる」のかを、もう一歩だけ式で見ておきましょう。データ全体で平均したKL項は、情報理論的に分解できることが知られています。
$$ \begin{equation} \mathbb{E}_{x}\big[D_{KL}(q(z|x)\,\|\,p(z))\big] = \underbrace{I(x; z)}_{\text{相互情報量}} + \underbrace{D_{KL}\big(q(z)\,\|\,\textstyle\prod_j p(z_j)\big)}_{\text{全相関(分離を促す項)}} + \cdots \end{equation} $$
ここで $q(z)=\mathbb{E}_x[q(z|x)]$ は集約事後分布です。右辺第2項は全相関(total correlation)と呼ばれ、「潜在次元どうしの統計的な依存(絡まり)」を測ります。これがゼロなら各次元は独立、つまり分離されています。$\beta$ を大きくしてKL項全体を強めると、この全相関項も押し下げられ、結果として次元間の独立性=分離が促されるのです。なお、$\beta$ は同時に第1項の相互情報量 $I(x;z)$ も削ってしまう——これが後で見るトレードオフの正体です。
情報ボトルネックとしての解釈
β-VAEのもう1つの見方が 情報ボトルネック です。これが「なぜ分離が起きるのか」の最も直観的な説明を与えてくれます。

KL項は、入力 $x$ から潜在 $z$ へ流れ込む情報量 $I(x;z)$ の上限を与えます(前節の分解の第1項)。$\beta$ を大きくすることは、図のように $z$ という「通路」をわざと狭くすることに相当します。
通路が狭ければ、限られた容量にすべての情報は詰め込めません。そこでモデルは、再構成に最も効く本質的で大きな変動要因(=生成因子)から順に、効率よく情報を通そうとします。データの分散を最もよく説明する独立な方向から優先的に符号化していくため、結果として各次元が異なる主要因子を担うようになる——これがβによる分離のメカニズムです。
逆に $\beta=1$(通路が広い)だと、容量に余裕があるので、モデルは因子をきれいに分ける必要がなく、再構成にさえ役立てば複数の意味を1つの次元に詰め込んでも構いません。だから絡まりやすいわけです。「容量を絞ると、本質だけが残り、整理される」——情報ボトルネックは分離の本質を一言で表しています。
再構成と分離のトレードオフ
ただし、$\beta$ は大きければ大きいほど良い、というものでは決してありません。通路を狭めすぎると、本質的な情報まで通せなくなり、再構成が崩れてしまうからです。

図のように、$\beta$ が小さい(標準VAE)と再構成は良いが潜在が絡まりやすく、$\beta$ が大きいと潜在は分離する方向に向かうが再構成が粗くなります。両者は綱引きの関係にあります。

このトレードオフを概念的に描いたのが上図です。$\beta$ を上げると分離度は増えていきますが、ある点を超えると再構成誤差が急増します。実用上は、分離と再構成が両立する中間のβ(図の緑帯)を、検証しながら選ぶことになります。$\beta$ を上げすぎると、極端には全次元が事前分布に潰れて潜在が何の情報も持たなくなる 事後崩壊(posterior collapse) が起きます(後の実験で実際にKLがほぼ0になる様子を確認します)。「分離のために絞る、しかし絞りすぎない」——この匙加減がβ-VAEの肝です。
ここまでが理論です。ここからは、これらの主張をPythonで1つずつ確かめます。
Pythonで確かめる①:KL項とβの効き方
まず、KL項そのものと、$\beta$ がそれをどう再重み付けするかを最小コードで確認します。$q(z|x)=\mathcal{N}(\bm{\mu},\mathrm{diag}(\bm{\sigma}^2))$ と $p(z)=\mathcal{N}(\bm{0},\bm{I})$ のKLダイバージェンスは、閉じた形で書けます。
$$ \begin{equation} D_{KL}\big(q\,\|\,p\big) = -\frac{1}{2}\sum_{j}\big(1 + \log\sigma_j^2 – \mu_j^2 – \sigma_j^2\big) \end{equation} $$
import numpy as np
def kl_std_normal(mu, logvar):
"""q(z|x)=N(mu, exp(logvar)) と p(z)=N(0,I) のKL(バッチ和)"""
return -0.5 * np.sum(1 + logvar - mu**2 - np.exp(logvar))
rng = np.random.default_rng(0)
mu = rng.normal(0, 1, size=(4, 3)) # 4サンプル×3次元の潜在平均
logvar = rng.normal(0, 0.5, size=(4, 3)) # 同 対数分散
recon = 2.0 # 再構成項(ここでは固定値とする)
kl = kl_std_normal(mu, logvar) / mu.shape[0] # 1サンプルあたりKL
for beta in [1, 4]:
total = recon + beta * kl
print(f"beta={beta}: 再構成={recon:.3f} KL={kl:.3f} 合計損失={total:.3f}")
出力は次の通りです。
beta=1: 再構成=2.000 KL=0.907 合計損失=2.907
beta=4: 再構成=2.000 KL=0.907 合計損失=5.626
再構成項とKL項そのものは同じ値(2.000 と 0.907)ですが、$\beta$ を1から4にすると合計損失におけるKL項の寄与が $0.907 \to 4\times0.907=3.626$ へと4倍になり、合計が 2.907 から 5.626 へ増えています。学習はこの合計を最小化するので、$\beta$ が大きいほど「KLを小さくする(=事前分布に近づける)」方向の圧力が強くなる、というのが式と数値の両方で確認できました。
Pythonで確かめる②:分離度をどう測るか
次に、「分離している/絡まっている」を数値で測ってみます。真の生成因子 $s_1, s_2$ を独立に生成し、(a) 因子をほぼそのまま使った分離表現と、(b) 因子を45°回転させて混ぜた絡まり表現の2つを作り、それぞれと真の因子との相関を比べます。
import numpy as np
rng = np.random.default_rng(0)
N = 2000
s1 = rng.uniform(-1, 1, N)
s2 = rng.uniform(-1, 1, N)
S = np.stack([s1, s2], 1) # 真の生成因子
noise = rng.normal(0, 0.05, (N, 2))
z_dis = S + noise # 分離表現:軸=因子
theta = np.pi / 4
R = np.array([[np.cos(theta), -np.sin(theta)],
[np.sin(theta), np.cos(theta)]])
z_ent = S @ R.T + noise # 絡まり表現:45°回転で混合
def corr_matrix(Z, S):
"""各潜在次元(行) と 各真因子(列) の |相関| 行列"""
return np.abs(np.corrcoef(np.hstack([Z, S]).T)[:2, 2:])
print("分離表現 |corr| (行=z, 列=因子):\n", np.round(corr_matrix(z_dis, S), 3))
print("絡まり表現 |corr|:\n", np.round(corr_matrix(z_ent, S), 3))
出力は次の通りです。
分離表現 |corr| (行=z, 列=因子):
[[0.996 0.009]
[0.008 0.996]]
絡まり表現 |corr|:
[[0.708 0.694]
[0.714 0.701]]
分離表現では相関行列が対角に近い($z_1$ は $s_1$ とだけ 0.996、$s_2$ とはほぼ0)——各次元が1つの因子だけに対応しています。一方、絡まり表現では行列のすべての成分が 0.7 前後で非対角にも大きな値が出ており、各次元が両方の因子を混ぜて抱えていることがわかります。disentanglementとは、まさにこの相関行列を対角行列に近づけること、と数値的に言い換えられるわけです。

同じことを散布図で見たのが上図です。左の絡まった潜在は因子が斜めに混ざって座標軸に意味がありませんが、右の分離した潜在は座標軸そのものが生成因子に対応しています。「軸が意味を持つ」のが良い潜在空間です。
Pythonで確かめる③:βによる再構成–分離のトレードオフ
最後に、実際に小さなβ-VAEを学習させ、$\beta$ を変えると再構成とKL(=潜在に通す情報量)がどう動くかを実測します。2つの独立な因子から8次元の非線形な観測を作り、2次元の潜在を持つVAEを $\beta=1,2,3,4$ で学習します(学習は数百エポックと軽量)。
import numpy as np, torch, torch.nn as nn
N = 3000
np.random.seed(0)
s1 = np.random.uniform(-1, 1, N); s2 = np.random.uniform(-1, 1, N)
X = np.stack([s1, s2, s1*s2, np.sin(2*s1), np.cos(2*s2),
s1**2-0.3, s2**2-0.3, 0.5*(s1+s2)], 1) # 2因子→8次元の非線形観測
X = (X - X.mean(0)) / X.std(0)
Xt = torch.tensor(X, dtype=torch.float32)
class VAE(nn.Module):
def __init__(self, d=8, h=32, z=2):
super().__init__()
self.enc = nn.Sequential(nn.Linear(d, h), nn.ReLU(), nn.Linear(h, h), nn.ReLU())
self.mu = nn.Linear(h, z); self.lv = nn.Linear(h, z)
self.dec = nn.Sequential(nn.Linear(z, h), nn.ReLU(),
nn.Linear(h, h), nn.ReLU(), nn.Linear(h, d))
def forward(self, x):
he = self.enc(x); mu = self.mu(he); lv = self.lv(he)
z = mu + torch.exp(0.5*lv) * torch.randn_like(mu) # 再パラメータ化
return self.dec(z), mu, lv
def train(beta, epochs=400):
torch.manual_seed(0)
m = VAE(); opt = torch.optim.Adam(m.parameters(), lr=2e-3)
for _ in range(epochs):
xr, mu, lv = m(Xt)
recon = ((xr - Xt)**2).sum(1).mean()
kl = (-0.5*(1 + lv - mu**2 - lv.exp()).sum(1)).mean()
(recon + beta*kl).backward(); opt.step(); opt.zero_grad()
with torch.no_grad():
xr, mu, lv = m(Xt)
recon = ((xr - Xt)**2).sum(1).mean().item()
kl = (-0.5*(1 + lv - mu**2 - lv.exp()).sum(1)).mean().item()
return recon, kl
for beta in [1, 2, 3, 4]:
recon, kl = train(beta)
print(f"beta={beta}: 再構成誤差={recon:.3f} KL(潜在の情報量)={kl:.3f}")
出力は次の通りです。
beta=1: 再構成誤差=1.550 KL(潜在の情報量)=2.430
beta=2: 再構成誤差=3.179 KL(潜在の情報量)=1.429
beta=3: 再構成誤差=4.725 KL(潜在の情報量)=0.828
beta=4: 再構成誤差=6.503 KL(潜在の情報量)=0.319
$\beta$ を 1→4 と上げるにつれ、KL(潜在に通す情報量)が $2.43 \to 0.32$ と単調に減り、それと引き換えに再構成誤差が $1.55 \to 6.50$ と単調に増えています。これが前節で述べた情報ボトルネックとトレードオフの実測です。$\beta$ が大きいほど通路が狭まり潜在の情報が絞られる(KL減)が、その代償として復元が粗くなる(再構成誤差増)。さらに $\beta=4$ ではKLが 0.32 まで落ちており、もう少し上げれば潜在がほぼ無情報になる事後崩壊に至ります。実際にこの後 $\beta$ を6まで上げるとKLは0近くまで潰れました。「分離のために絞るが、絞りすぎると崩壊する」という匙加減が、数値としてはっきり現れています。
分離の度合いをどう数値化するか
「②で相関行列を見た」のは直観的でしたが、研究では分離の度合いを1つのスコアにまとめて比較したい場面が多くあります。代表的な指標が MIG(Mutual Information Gap、相互情報量ギャップ) です。
考え方はシンプルです。各生成因子 $s_k$ について、それと最も強く結びつく潜在次元と、2番目に強く結びつく潜在次元の「結びつきの差(ギャップ)」を測ります。結びつきは相互情報量 $I(z_j; s_k)$ で測ります。
$$ \begin{equation} \text{MIG} = \frac{1}{K}\sum_{k=1}^{K}\frac{1}{H(s_k)}\Big( \max_{j} I(z_j; s_k) – \mathop{\text{2nd-}\max}_{j} I(z_j; s_k)\Big) \end{equation} $$
ここで $H(s_k)$ は因子 $s_k$ のエントロピー(正規化のため)です。1つの因子が1つの潜在次元だけに強く対応していれば、最大と2番目の差が大きくなりMIGは1に近づきます。逆に、ある因子が複数の次元に分散して符号化されている(絡まっている)と、最大と2番目の差が小さくなりMIGは0に近づきます。
②で見た相関行列で言えば、分離表現は各列(因子)で「最大0.996・2番目0.009」とギャップが極めて大きく、絡まり表現は「0.71・0.69」とほとんど差がない——これがそのままMIGの大小に対応します。MIG以外にも、因子を予測する分類器の精度を使う FactorVAE スコア、再構成への寄与で測る SAP など複数の指標があり、分離を多面的に評価するのが定石です。指標があることで初めて「βをいくつにすると分離が最大になるか」を定量的に探索できるようになります。
発展:条件と状態を分離する表現へ
β-VAEの「独立な因子を別々の軸に分ける」という発想は、生成画像の属性制御にとどまりません。たとえば、データに含まれる 「操作条件・環境(どんな状況で観測したか)」と「対象の状態(正常か異常か)」を別々の潜在に切り分けたい、という場面でも同じ原理が効きます。

図のように、入力を「条件を表す潜在」と「状態を表す潜在」に分離できれば、条件が変わっても状態の判定がぶれない、条件の影響を取り除いた状態だけを評価できる、といった扱いが可能になります。これはβ-VAEの分離の発想に、条件付きVAEの「条件で生成を制御する」発想を組み合わせた拡張にあたり、異常検知などで「環境変動に頑健な状態表現」を得るための有力なアプローチになっています。

このほかにも、disentangled表現は (1) 属性を指定した生成、(2) 各次元の意味が読める解釈可能性、(3) タスクに無関係な因子を切り離す公平性・転移、と幅広く応用されます。「意味の軸を分けて持つ」ことが、制御・理解・転用のすべての土台になるわけです。
βの選び方と注意点
最後に、実務でβ-VAEを使うときの勘所をまとめます。
- βは1から少しずつ上げる:いきなり大きなβは事後崩壊を招きます。$\beta=1$(標準VAE)から始め、再構成が許容範囲を保つ範囲で徐々に上げ、分離が改善する点を探します。
- 再構成とKLの両方を監視する:学習中に再構成誤差とKLを記録し、KLがほぼ0に張り付いたら絞りすぎ(崩壊)のサインです。
- データに独立な因子がある前提:β-VAEが分離できるのは、データの背後に独立な生成因子が実在する場合です。因子が本質的に絡み合っているデータでは、無理に分離しても意味のある軸は得られません。
- 完全な教師なし分離には限界がある:理論的に、追加情報なしの完全な分離は保証されないことが知られています。少量のラベルや弱い監督(条件付け)を併用すると、分離はより安定します。
- βアニーリング:学習初期はβを小さく(まず再構成を学ばせ)、徐々に上げる手法も、崩壊を避けつつ分離を促すのに有効です。
β-VAEは「KL項に係数を1つ足す」という最小の変更で、表現学習に「分離」という強力な性質を持ち込みました。その背後には、情報ボトルネックと全相関という明快な理屈があります。$\beta$ という1つのつまみで、再構成の忠実さと表現の整理しやすさを調整できる——このシンプルさと奥深さが、β-VAEが広く使われ続ける理由です。
まとめ
β-VAEとdisentangled表現を、理論から実装まで解説しました。
- disentangled表現とは、各潜在次元が独立した1つの生成因子(大きさ・色・位置など)に対応する表現で、潜在トラバースで1次元を動かすと1つの意味だけが変わる。
- β-VAEは、VAEの目的関数のKL項に重み $\beta$ を掛けるだけの拡張。$\beta>1$ でKL項を強めると、近似事後分布が「各次元独立」な事前分布に押し込まれ、全相関が下がって分離が促される。
- 情報ボトルネックの観点では、$\beta$ は潜在に通す情報量 $I(x;z)$ を絞るつまみ。通路を狭めると本質的な因子から順に符号化され、整理(分離)が進む。
- トレードオフとして、$\beta$ を上げると分離は進むが再構成が粗くなり、上げすぎると事後崩壊が起きる。実測でも $\beta$ 増加にともないKLが単調減・再構成誤差が単調増となった。
- 「条件と状態の分離」など、環境変動に頑健な表現を得る応用の基盤になる。
次のステップとして、分離を数値評価する指標(MIG など)や、全相関を直接罰する β-TCVAE、教師信号を併用する手法へ進むと、disentanglementの理解がさらに深まります。