ラプラス分布 完全ガイド — 二重指数分布とL1正則化・ロバスト統計

データの平均を取ると、たった1つの極端な外れ値に結果が大きく引きずられた——統計を扱ったことがある人なら、一度はこの悔しさを味わったことがあるはずです。なぜ平均はこんなに脆いのでしょうか。そして、なぜ中央値はびくともしないのでしょうか。この素朴な疑問の裏には、ラプラス分布(Laplace distribution、別名 二重指数分布) という確率分布が静かに横たわっています。

ラプラス分布は、正規分布のいとこのような存在です。正規分布が「真ん中がなだらかに盛り上がった釣鐘」なら、ラプラス分布は「真ん中がピンと尖り、裾が遠くまで重く伸びるテント」です。この一見地味な違いが、驚くほど広い応用を生みます。たとえば、外れ値に強いロバスト統計(中央値回帰)、機械学習でおなじみのL1正則化(LASSO)、そして個人情報を守りながら統計を公開する差分プライバシーのラプラスメカニズム。これらはすべて、ラプラス分布の「尖り」と「重い裾」という2つの性質から自然に流れ出てくるのです。

本記事の内容

  • ラプラス分布の定義と、なぜ頂点が尖るのかの直感的理解
  • 期待値・分散・モーメント母関数の導出(省略なし)
  • 最尤推定(MLE)が中央値になる理由 — L1損失の最小化として
  • 正規分布との比較 — 尖度と重い裾の意味
  • L1正則化(LASSO)=ラプラス事前分布 というベイズ解釈
  • なぜL1がスパース解(多くの係数が厳密に0)を生むのか
  • 差分プライバシーのラプラスメカニズム
  • Pythonでの実装と、すべての主張の数値検証

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

ラプラス分布とは — 尖った頂点を持つ分布

まずイメージから入りましょう。正規分布のグラフを思い浮かべてください。頂点はなめらかな丘のように丸まっていて、左右になだらかに落ちていきます。ラプラス分布はこの頂点を「ぎゅっと尖らせ」、代わりに裾を遠くまで引き伸ばしたような形をしています。

なぜこんな形になるのでしょうか。正規分布は中心からの距離の 2乗 $(x-\mu)^2$ で減衰するのに対し、ラプラス分布は中心からの距離そのもの、すなわち 絶対値 $|x-\mu|$ で減衰します。2乗は中心付近で平らに($x=\mu$ の近くで $(x-\mu)^2 \approx 0$ が緩やかに増える)なりますが、絶対値は中心で角(かど)を作ります。この「角」が、グラフの尖った頂点の正体です。

別の言い方をすると、ラプラス分布は 2つの指数分布を背中合わせに貼り合わせた 形をしています。中心 $\mu$ から右側は右下がりの指数関数 $e^{-(x-\mu)/b}$、左側は左下がりの指数関数 $e^{(x-\mu)/b}$。だから「二重指数分布(double exponential distribution)」と呼ばれるのです。指数分布が原点で尖っていたのと同じ理屈で、貼り合わせた中心で尖りが生まれます。

ラプラス分布の形状ギャラリー。位置パラメータμと尺度パラメータbを変えると、尖った頂点を保ったまま平行移動・拡大縮小する

この図は、位置 $\mu$ と尺度 $b$ を変えたラプラス分布を並べたものです。3つのことが読み取れます。第一に、すべての曲線が頂点で尖っています(微分不可能な角がある)。第二に、$b$ を小さくすると頂点が高く鋭くなり、$b$ を大きくすると低く広がります。第三に、$\mu$ は単に分布を左右に平行移動させるだけで、形は変えません。$\mu$ が「位置」、$b$ が「広がり」を担っていることが視覚的にわかります。

では、この直感を数式で厳密に書き下しましょう。

ラプラス分布の数学的定義

ラプラス分布の確率密度関数(PDF)は、中心からの距離の絶対値を指数の肩に乗せた形をしています。位置パラメータ $\mu$(中心)と尺度パラメータ $b > 0$(広がり)を使って、次のように定義されます。

$$ \begin{equation} f(x \mid \mu, b) = \frac{1}{2b}\exp\!\left(-\frac{|x – \mu|}{b}\right), \quad -\infty < x < \infty \end{equation} $$

肩に乗っているのが $|x-\mu|$ という絶対値であることが、正規分布の $(x-\mu)^2$ との決定的な違いです。先頭の係数 $\frac{1}{2b}$ は、全区間での積分が1になるように調整する正規化定数です。実際に確かめておきましょう。$x \geq \mu$ と $x < \mu$ で絶対値を場合分けして積分します。

$$ \int_{-\infty}^{\infty} \frac{1}{2b}e^{-|x-\mu|/b}\,dx = \frac{1}{2b}\left(\int_{-\infty}^{\mu} e^{(x-\mu)/b}\,dx + \int_{\mu}^{\infty} e^{-(x-\mu)/b}\,dx\right) $$

ここで右側の積分($x \geq \mu$ の部分)から計算します。$u = (x-\mu)/b$ と置換すると $dx = b\,du$ で、

$$ \int_{\mu}^{\infty} e^{-(x-\mu)/b}\,dx = b\int_{0}^{\infty} e^{-u}\,du = b\,[-e^{-u}]_0^\infty = b $$

となります。左側の積分も対称性からまったく同じく $b$ になります。よって、

$$ \frac{1}{2b}(b + b) = \frac{2b}{2b} = 1 $$

となり、確かに全積分が1、すなわち正しい確率密度関数であることが確認できました。正規化定数が $\frac{1}{2b}$ である理由(左右それぞれが $b$ を出すので合計 $2b$ で割る必要がある)も、この計算から自然に理解できます。

ここまでで分布の「形」がわかりました。次に、この分布の代表値(期待値)やばらつき(分散)が、パラメータ $\mu, b$ とどう結びつくかを導いていきます。

期待値・分散・モーメント母関数の導出

期待値

ラプラス分布は中心 $\mu$ について左右対称です。対称な分布の期待値は対称軸の位置に一致するので、直感的には $E[X] = \mu$ のはずです。これを積分で確認しましょう。$Y = X – \mu$ とおくと、$Y$ は $\mu=0$ のラプラス分布に従い、

$$ E[X] = \mu + E[Y], \qquad E[Y] = \int_{-\infty}^{\infty} y \cdot \frac{1}{2b}e^{-|y|/b}\,dy $$

となります。被積分関数 $y \cdot e^{-|y|/b}$ は 奇関数($y \to -y$ で符号が反転する)です。奇関数を対称区間 $(-\infty, \infty)$ で積分すると0になるので、$E[Y]=0$、したがって

$$ \boxed{\,E[X] = \mu\,} $$

が得られます。対称性という直感が、そのまま積分の結果と一致しました。

分散

分散は中心からの距離の2乗の期待値です。再び $Y = X – \mu$ として、

$$ V[X] = E[(X-\mu)^2] = E[Y^2] = \int_{-\infty}^{\infty} y^2 \cdot \frac{1}{2b}e^{-|y|/b}\,dy $$

を計算します。被積分関数 $y^2 e^{-|y|/b}$ は 偶関数($y\to -y$ で不変)なので、$[0,\infty)$ の積分を2倍すれば済みます。

$$ V[X] = 2 \cdot \frac{1}{2b}\int_{0}^{\infty} y^2 e^{-y/b}\,dy = \frac{1}{b}\int_{0}^{\infty} y^2 e^{-y/b}\,dy $$

ここで $\int_0^\infty y^2 e^{-y/b}\,dy$ はガンマ積分の形です。一般に $\int_0^\infty y^n e^{-y/b}\,dy = n!\,b^{n+1}$ が成り立ち、$n=2$ では $2!\,b^3 = 2b^3$ となります。これを代入すると、

$$ V[X] = \frac{1}{b}\cdot 2b^3 = 2b^2 $$

すなわち、

$$ \boxed{\,V[X] = 2b^2\,} $$

が得られます。標準偏差は $\sqrt{2}\,b$ です。正規分布の分散が $\sigma^2$ だったのと対比すると、ラプラス分布では尺度 $b$ と分散が $V[X]=2b^2$ で結ばれている、という対応関係を覚えておくと便利です。後で正規分布と公平に比較するとき、この $\sigma^2 = 2b^2$ という「分散をそろえる」条件を使います。

モーメント母関数

分布の素性をさらに知るために、モーメント母関数(MGF)$M_X(t) = E[e^{tX}]$ も導いておきましょう。$Y=X-\mu$ として、$|t| < 1/b$ の範囲で計算します。

$$ M_Y(t) = \int_{-\infty}^{\infty} e^{ty}\frac{1}{2b}e^{-|y|/b}\,dy = \frac{1}{2b}\left(\int_{-\infty}^{0} e^{ty+y/b}\,dy + \int_{0}^{\infty} e^{ty-y/b}\,dy\right) $$

右側の積分($y\geq 0$)は、指数が $-(1/b – t)y$ なので、$|t|<1/b$ なら収束して $\frac{1}{1/b - t}$ になります。左側の積分($y<0$)は指数が $(1/b+t)y$ で、$\frac{1}{1/b+t}$ になります。両者を足すと、

$$ M_Y(t) = \frac{1}{2b}\left(\frac{1}{1/b – t} + \frac{1}{1/b + t}\right) = \frac{1}{2b}\cdot\frac{2/b}{1/b^2 – t^2} = \frac{1}{1 – b^2 t^2} $$

となります。$X = Y + \mu$ なので $M_X(t) = e^{\mu t}M_Y(t)$ を使って、最終的に

$$ \boxed{\,M_X(t) = \frac{e^{\mu t}}{1 – b^2 t^2}, \quad |t| < 1/b\,} $$

が得られます。$M_Y(t)=1/(1-b^2t^2)$ をテイラー展開すると $1 + b^2t^2 + b^4 t^4 + \cdots$ となり、$t^2$ の係数の2倍が $E[Y^2]=2b^2$ を再現することからも、先ほどの分散の値が裏付けられます。

期待値・分散がわかったところで、いよいよラプラス分布の最も重要な性質——「最尤推定が中央値になる」という事実に踏み込みます。これがロバスト統計やL1正則化の出発点です。

最尤推定が中央値になる — L1損失の最小化

対数尤度を書き下す

$n$ 個の観測値 $x_1, \dots, x_n$ がラプラス分布から得られたとして、位置パラメータ $\mu$ を最尤推定してみましょう(尺度 $b$ は固定とします)。尤度は各データ点の密度の積で、対数尤度は次のようになります。

$$ \log L(\mu) = \sum_{i=1}^{n}\log\!\left(\frac{1}{2b}e^{-|x_i-\mu|/b}\right) = -n\log(2b) – \frac{1}{b}\sum_{i=1}^{n}|x_i – \mu| $$

$\mu$ に依存するのは第2項だけです。対数尤度を 最大化 することは、$\mu$ に関する第2項のマイナスを最大化すること、すなわち

$$ \sum_{i=1}^{n}|x_i – \mu| $$

最小化 することと同じです。この和は L1損失(絶対偏差和、sum of absolute deviations) と呼ばれます。つまり、ラプラス分布の最尤推定は「データ点からの絶対距離の総和を最小にする点を探せ」という問題に帰着します。

L1損失を最小にするのは中央値

では、絶対偏差和 $g(\mu) = \sum_i |x_i – \mu|$ を最小にする $\mu$ は何でしょうか。$\mu$ がどのデータ点とも一致しない点では、$g(\mu)$ は微分可能で、その微分は

$$ \frac{d}{d\mu}\sum_{i=1}^{n}|x_i – \mu| = \sum_{i=1}^{n}\frac{d}{d\mu}|x_i – \mu| = \sum_{i=1}^{n}\big(-\operatorname{sgn}(x_i – \mu)\big) = \sum_{i=1}^{n}\operatorname{sgn}(\mu – x_i) $$

となります。$\operatorname{sgn}$ は符号関数で、$\mu > x_i$ なら $+1$、$\mu < x_i$ なら $-1$ を返します。つまりこの微分は、「$\mu$ より小さいデータ点の個数 − $\mu$ より大きいデータ点の個数」に等しいのです。

この微分が0になる、すなわち最小値を取る条件は、

$$ (\text{$\mu$ より左のデータ点の数}) = (\text{$\mu$ より右のデータ点の数}) $$

です。左右のデータ点の数が釣り合う点——それこそが 中央値(メディアン) の定義そのものです。したがって、

$$ \boxed{\,\hat{\mu}_{\text{MLE}} = \operatorname{median}(x_1, \dots, x_n)\,} $$

が得られます。正規分布のMLEが標本平均(L2損失の最小点)だったのと美しく対比をなしています。

L1損失とL2損失の比較。外れ値8.0を1点加えると、L2損失の最小点である平均は大きく引っ張られるが、L1損失の最小点である中央値はほとんど動かない

この図は、9個の正常なデータに外れ値 8.0 を1点だけ加えたときの2つの損失関数を描いたものです。左のL1損失(絶対偏差和)はV字を折り重ねたような区分線形の形をしていて、その最小点は中央値(約 $-0.34$)にあります。右のL2損失(二乗偏差和)は放物線で、最小点は平均(約 $0.36$)です。注目すべきは、外れ値8.0の影響です。平均は外れ値に引っ張られて右にずれていますが、中央値はほとんど動いていません。L1損失(ラプラス分布のMLE)は外れ値に強いという、ロバスト統計の核心がこの1枚に表れています。

中央値が解になる幾何学的な見方

なぜ「左右の個数が釣り合う点」が解になるのか、もう少し幾何学的に味わってみましょう。各データ点 $x_i$ は、$\mu$ を右に動かすと損失への寄与 $|x_i-\mu|$ の傾きを $+1$($\mu$ がすでに $x_i$ の右にいる場合)または $-1$(左にいる場合)だけ出します。全体の傾きは、これらの $\pm 1$ の総和です。$\mu$ を左端から右へ動かしていくと、データ点を1つ通過するたびに傾きが $+2$ ずつ増えていきます。傾きが負から正に切り替わる瞬間——左右の個数が釣り合う点——が谷底(最小値)です。

中央値が最尤推定になる幾何。数直線上の各データ点が±1の傾きを出し合い、左右の点数が釣り合う点で勾配の和が0になる

この図は、7個のデータ点を数直線上に並べ、中央値の位置を示したものです。中央値より左に3点、右に3点(奇数個なので真ん中の1点が中央値そのもの)あり、左右が釣り合っています。各点が出す $\pm1$ の傾きが打ち消し合うこの点で、勾配 $\sum_i \operatorname{sgn}(c-x_i)$ がちょうど0をまたぎます。データ点で勾配が階段状に変化する様子が、L1損失が「区分線形」であることの幾何学的な根拠です。

中央値が外れ値に強いことがわかりました。次は、この「ラプラス分布 vs 正規分布」の対比を、尖度と裾の重さという観点でもう少し定量的に見ていきます。

正規分布との比較 — 尖度と重い裾

同じ分散でそろえて比べる

ラプラス分布と正規分布を公平に比べるには、ばらつきの尺度をそろえる必要があります。先ほど導いたように、ラプラス分布の分散は $2b^2$、正規分布の分散は $\sigma^2$ です。両者の分散を1にそろえるには、$\sigma = 1$、$2b^2 = 1$ すなわち $b = 1/\sqrt{2}$ とすればよいわけです。

分散をそろえた正規分布とラプラス分布の比較。左は通常スケールでラプラスの中心が高く尖る様子、右は対数スケールでラプラスの裾が直線的に重く伸びる様子を示す

この図は、分散を1にそろえた両分布を比較しています。左のパネル(通常スケール)から、ラプラス分布は中心が高く尖り、正規分布より中央付近に確率が集中していることがわかります。右のパネル(縦軸が対数)が決定的です。正規分布の対数密度は $-x^2/2$ なので下に凸の放物線として落ちていきますが、ラプラス分布の対数密度は $-|x|/b$ なので 直線的 に落ちます。グラフの端(裾の領域)では、ラプラス分布のほうが正規分布よりずっと上にいます。つまり、中心から離れた極端な値が、ラプラス分布のほうがはるかに起こりやすいのです。

尖度(とがり具合)

「中心が尖り、裾が重い」という性質を1つの数値で表すのが 尖度(kurtosis) です。正規分布の尖度は3(超過尖度0)と定義されますが、ラプラス分布の尖度は6(超過尖度3)です。尖度が大きいほど「尖って裾が重い(leptokurtic、レプト尖的)」分布であり、ラプラス分布はその代表例です。この6という値は、4次のモーメント $E[(X-\mu)^4]$ をMGFから計算すれば導けます。

重い裾が意味すること

ラプラス分布と正規分布の裾の超過確率の比較。対数軸で見ると、しきい値を大きくするほどラプラス分布のほうが高い超過確率を維持し、外れ値が出やすいことがわかる

この図は、同じ分散の両分布から大量にサンプリングし、$P(|X| > t)$(しきい値 $t$ を超える確率)を対数軸でプロットしたものです。$t$ を大きくしていくと、正規分布の超過確率は急速に($t^2$ のオーダーで)落ちていきますが、ラプラス分布はずっと緩やかに($t$ に比例して指数的に)落ちます。つまり、ラプラス分布のもとでは「めったにない大きな値」が正規分布よりもずっと頻繁に観測されます。

これがロバスト統計でラプラス分布を使う動機です。現実のデータには、測定ミスや異常なイベントによる外れ値がしばしば混ざります。正規分布を仮定すると、こうした外れ値は「あり得ないほど低確率」とみなされ、モデルが無理にそれを説明しようとして大きく歪みます。一方ラプラス分布は「外れ値はそこそこ起こりうる」と最初から認めているので、外れ値に振り回されにくいのです。

ここまでは、ラプラス分布を「データを生成する分布」として見てきました。視点を変えて、ラプラス分布を「パラメータに対する事前の信念」として使うと、まったく別の世界——L1正則化とスパース性の世界——が開けます。

L1正則化のベイズ解釈 — ラプラス事前分布

正則化とは何だったか

回帰モデルで係数 $\bm{w}$ を推定するとき、データに過剰に適合する(過学習する)のを防ぐために、係数が大きくなりすぎないようペナルティを課すのが 正則化 です。最小二乗誤差にペナルティ項を足した目的関数を最小化します。

  • Ridge回帰(L2正則化): ペナルティ $\lambda\sum_j w_j^2$ を足す
  • LASSO(L1正則化): ペナルティ $\lambda\sum_j |w_j|$ を足す

L1正則化はペナルティに絶対値を使う点が特徴です。ここで「絶対値」というキーワードに、ラプラス分布の影が見えてきます。

MAP推定として書き直す

ベイズの立場では、係数 $\bm{w}$ に 事前分布 $p(\bm{w})$ を置き、データ $\mathcal{D}$ を観測した後の 事後分布 $p(\bm{w}\mid\mathcal{D}) \propto p(\mathcal{D}\mid\bm{w})\,p(\bm{w})$ を考えます。事後確率を最大にする点を選ぶのが MAP推定(最大事後確率推定) です。対数を取ると、

$$ \hat{\bm{w}}_{\text{MAP}} = \arg\max_{\bm{w}}\Big[\log p(\mathcal{D}\mid\bm{w}) + \log p(\bm{w})\Big] $$

となります。第1項(対数尤度)は、観測ノイズが正規分布なら $-\frac{1}{2\sigma^2}\sum_i (y_i – \bm{w}^\top \bm{x}_i)^2$ という二乗誤差の形になります。問題は第2項、すなわち事前分布の対数です。

ここで、各係数 $w_j$ に独立な ラプラス事前分布 を置いてみましょう。

$$ p(\bm{w}) = \prod_{j}\frac{1}{2\tau}\exp\!\left(-\frac{|w_j|}{\tau}\right) $$

この対数を取ると、

$$ \log p(\bm{w}) = -\frac{1}{\tau}\sum_j |w_j| + \text{const} $$

となります。マイナス符号に注意すると、MAP推定の目的関数(最大化)は、符号を反転した最小化問題

$$ \hat{\bm{w}}_{\text{MAP}} = \arg\min_{\bm{w}}\left[\frac{1}{2\sigma^2}\sum_i (y_i – \bm{w}^\top\bm{x}_i)^2 + \frac{1}{\tau}\sum_j |w_j|\right] $$

になります。これはまさに LASSO の目的関数です。$\lambda = \sigma^2/\tau$ と置けば、おなじみの「二乗誤差 + $\lambda\sum_j|w_j|$」の形になります。つまり、

$$ \boxed{\,\text{L1正則化(LASSO)} = \text{ラプラス事前分布のもとでのMAP推定}\,} $$

という美しい対応が成り立ちます。同様に、ガウス事前分布を置けばペナルティが $\sum_j w_j^2$ になり、Ridge回帰に対応します。正則化の「お気持ち」としての説明だった「係数が大きくなりすぎないように」が、ベイズでは「係数の事前分布」という明確な確率的意味を持つのです。

ラプラス事前とガウス事前の比較。左は事前密度で、ラプラスは原点に質量が集中する。右はペナルティの形で、L1は原点に角がありw=0へ押し出す

この図の左パネルは、ラプラス事前とガウス事前の密度を比較しています。ラプラス事前は原点 $w=0$ で鋭く尖っており、係数が0に近い値を強く好むことがわかります。右パネルは負の対数事前(=ペナルティの形)です。L1ペナルティ $|w|$ は原点で角を持つV字、L2ペナルティ $w^2$ は原点でなめらかな放物線です。この 原点での角の有無 が、次に見るスパース性の決定的な違いを生みます。

なぜラプラス事前だと係数が「ちょうど0」になるのか。これがLASSO最大の魅力である「スパース性」です。次のセクションでその仕組みを解き明かします。

スパース性の誘導 — なぜL1は係数を0にするのか

スパース性とは

スパース(疎) とは、係数ベクトル $\bm{w}$ の多くの成分が 厳密に0 になることを指します。これは特徴選択(feature selection)として極めて有用です。0になった係数に対応する説明変数は「モデルから消える」ので、「どの変数が本当に効いているのか」が自動的に選ばれます。説明変数が数千・数万あるような高次元データで、LASSOが重宝される理由がここにあります。

注意したいのは、Ridge回帰(L2)は係数を0に 近づけ はするものの、厳密に0にはしないという点です。LASSO(L1)だけが、多くの係数を ぴったり0 にします。この違いはどこから来るのでしょうか。

制約領域の幾何で理解する

正則化は、「ペナルティをある値以下に抑える」という制約のもとで二乗誤差を最小化する問題と等価です(ラグランジュ双対)。L1なら $\sum_j |w_j| \leq t$、L2なら $\sum_j w_j^2 \leq t$ という制約です。2次元(係数2つ)で考えると、L1の制約領域は 菱形(ひし形)、L2の制約領域は になります。

最適解は、二乗誤差の等高線(楕円)が制約領域に最初に触れる点です。ここに本質があります。菱形は 角(かど) が座標軸上にあります。楕円が菱形に触れるとき、角で触れる可能性が高く、角ではどちらかの座標が 0 です。一方、円には角がなく、楕円はなめらかな円周上の一般の点で触れるので、両方の座標が非ゼロになりがちです。

L1とL2の制約領域の比較。L1の菱形は角で楕円に触れて片方の係数が0になり、L2の円はなめらかに触れて両係数とも非ゼロになる

この図は、二乗誤差の等高線(楕円)と制約領域の接触を描いています。左のL1(菱形)では、楕円が菱形の上の角に触れており、その点では $w_1 = 0$ になっています。右のL2(円)では、楕円が円周のなめらかな点に触れ、両方の係数が非ゼロです。菱形の尖った角がスパース性を生む という、LASSOの幾何学的な核心がこの1枚に凝縮されています。これは事前分布の図(https://disassemble-channel.com/wp-content/uploads/2026/06/figs05-29.png)で見た「原点の角」と同じものです。

正則化を強めると係数が次々と0になる

LASSO係数パス。正則化強度λを対数軸で増やしていくと、真値が0の係数はずっと0付近にとどまり、非ゼロの係数も最終的に完全に0へ収束していく

この図は、正則化強度 $\lambda$ を変えながらLASSOで推定した8個の係数の軌跡(係数パス)です。真の係数は最初の3つだけが非ゼロ($3.0, -2.0, 1.5$)で、残り5つは0という設定です。$\lambda$ が小さい左側では全係数が推定されていますが、$\lambda$ を大きくしていくと、真値が0の係数はすぐに0付近に張り付き、やがて非ゼロの係数も1つずつ厳密に0へ落ちていきます。係数が「徐々に小さくなる」のではなく「ある時点でぱたっと0になる」のがLASSOの特徴で、これが特徴選択として働きます。

L1正則化は機械学習の文脈で語られることが多いですが、ラプラス分布の応用はそれだけではありません。プライバシー保護という、まったく別の分野でもラプラス分布は主役を務めます。

差分プライバシーのラプラスメカニズム

プライバシーを守りながら統計を公開する

ある病院が「糖尿病の患者数」を公開したいとします。しかし、もし1人の患者がデータベースに含まれるか否かで公開値がはっきり変わってしまうと、その個人が糖尿病かどうかが漏れてしまうかもしれません。差分プライバシー(differential privacy) は、「1人のデータの有無で公開結果がほとんど変わらない」ことを数学的に保証する枠組みです。

具体的には、真の集計値 $f(\mathcal{D})$ にノイズを加えて公開します。$\varepsilon$-差分プライバシーを満たすには、ラプラス分布のノイズ を加えるのが最も基本的な方法で、これを ラプラスメカニズム と呼びます。

なぜラプラス分布なのか

加えるノイズの尺度は、$b = \Delta f / \varepsilon$ と決めます。ここで $\Delta f$ は 感度(sensitivity) で、「1人のデータが変わったときに $f$ が最大どれだけ変化するか」を表します(カウントクエリなら $\Delta f = 1$)。$\varepsilon$ は プライバシー予算 で、小さいほど強いプライバシー保護を意味します。

ラプラス分布が選ばれる理由は、その密度が指数の肩に絶対値 $|x|$ を持つことにあります。隣接するデータベース $\mathcal{D}, \mathcal{D}’$(1人だけ違う)に対する出力密度の比を取ると、

$$ \frac{p(\text{出力} = z \mid \mathcal{D})}{p(\text{出力} = z \mid \mathcal{D}’)} = \frac{\exp(-|z – f(\mathcal{D})|/b)}{\exp(-|z – f(\mathcal{D}’)|/b)} = \exp\!\left(\frac{|z – f(\mathcal{D}’)| – |z – f(\mathcal{D})|}{b}\right) $$

となります。三角不等式 $\big||z-f(\mathcal{D}’)| – |z-f(\mathcal{D})|\big| \leq |f(\mathcal{D}) – f(\mathcal{D}’)| \leq \Delta f$ を使うと、この比は $\exp(\Delta f / b) = \exp(\varepsilon)$ で上から抑えられます。これがまさに $\varepsilon$-差分プライバシーの定義です。ラプラス分布の「絶対値の指数」という形が、三角不等式とぴったりかみ合って、きれいに $e^\varepsilon$ の保証を生み出すのです。

差分プライバシーのラプラスメカニズム。左はεを変えたノイズの分布で、εが小さいほどノイズが大きい。右は隣接データベースの出力分布がほぼ重なり、個人の有無を識別しにくいことを示す

この図の左パネルは、$\varepsilon$ を変えたときに加えるラプラスノイズの分布です。$\varepsilon = 0.1$(強いプライバシー)では尺度 $b = 1/\varepsilon = 10$ と大きく、ノイズが広く広がります。逆に $\varepsilon = 2.0$ ではノイズが小さくなります。プライバシーと正確さのトレードオフが見て取れます。右パネルは、1人だけ違う2つのデータベースの出力分布です。両者がほぼ完全に重なっているため、公開された値から「その個人がいたかどうか」を識別するのは困難です。これが差分プライバシーの守りの正体です。

理論を一通り見てきました。最後に、これまでの主張——分散の式、MLEが中央値になること、LASSOのスパース性、ラプラスメカニズム——をすべてPythonで実装し、数値で確かめましょう。

Pythonでの実装

ラプラス分布の基本量を確認する

まず、定義した密度・期待値・分散が正しいかを、サンプリングと数値積分で検証します。

import numpy as np
from scipy import stats

rng = np.random.default_rng(0)

def laplace_pdf(x, mu, b):
    """ラプラス分布の確率密度関数"""
    return np.exp(-np.abs(x - mu) / b) / (2.0 * b)

mu, b = 1.5, 2.0

# 数値積分で全積分が1か確認
xs = np.linspace(-50, 50, 200001)
integral = np.trapezoid(laplace_pdf(xs, mu, b), xs)

# 大量サンプリングで期待値・分散を確認
samples = rng.laplace(mu, b, size=2_000_000)
print(f"全積分           : {integral:.6f}  (理論値 1)")
print(f"標本平均         : {samples.mean():.4f}  (理論値 mu={mu})")
print(f"標本分散         : {samples.var():.4f}  (理論値 2b^2={2*b**2})")
print(f"標本尖度(超過)   : {stats.kurtosis(samples):.4f}  (理論値 3)")

このコードを実行すると、全積分は1.000000、標本平均は約 1.50(理論値 $\mu=1.5$)、標本分散は約 8.0(理論値 $2b^2 = 8$)、超過尖度は約 3.0(理論値3)になります。導出した期待値 $\mu$・分散 $2b^2$・尖度6(超過尖度3)が、すべて数値実験と一致することが確認できました。理論の積分計算が正しかったわけです。

MLEが中央値になることを確認する

次に、ラプラス分布から生成したデータに対して、位置パラメータのMLE(L1損失の最小点)が本当に中央値に一致するかを確かめます。

import numpy as np
from scipy.optimize import minimize_scalar

rng = np.random.default_rng(1)
data = rng.laplace(loc=3.0, scale=1.0, size=999)  # 真の mu=3.0

# L1損失(絶対偏差和)を最小化
def l1_loss(c):
    return np.sum(np.abs(data - c))

res = minimize_scalar(l1_loss, bounds=(data.min(), data.max()),
                      method="bounded")
print(f"L1損失最小化の解 : {res.x:.6f}")
print(f"中央値           : {np.median(data):.6f}")
print(f"標本平均         : {np.mean(data):.6f}")

実行すると、L1損失を最小化した解と中央値が小数点以下まで一致します(どちらも約3.0付近)。一方、標本平均は中央値とわずかにずれます。これは「ラプラス分布の位置パラメータのMLEは中央値である」という導出結果を、最適化ソルバーが独立に再発見したことを意味します。

外れ値に対するロバスト性を比べる

中央値(L1)と平均(L2)が外れ値にどれだけ振り回されるかを、定量的に比較してみましょう。

import numpy as np

rng = np.random.default_rng(2)
clean = rng.normal(0.0, 1.0, size=100)

# 外れ値を1点ずつ増やしながら、平均と中央値の変化を追う
outlier_values = [0, 10, 50, 100, 500]
print(f"{'外れ値':>8} | {'平均':>10} | {'中央値':>10}")
for ov in outlier_values:
    data = np.append(clean, ov) if ov != 0 else clean
    print(f"{ov:>8} | {np.mean(data):>10.4f} | {np.median(data):>10.4f}")

この出力を見ると、外れ値を $0 \to 500$ と大きくしていくにつれて、平均は $0$ から $5$ 近くまでどんどん引っ張られていきます。一方、中央値はほとんど $0$ 付近にとどまります。たった1個の極端な値が平均を壊す一方で、中央値(=ラプラス分布のMLE)はびくともしない——これがロバスト統計でラプラス的な損失(L1)を使う実利です。

LASSOのスパース性を実装で確かめる

L1正則化が本当に係数を厳密に0にするのか、座標降下法でLASSOをスクラッチ実装して確認します。座標降下法では、各係数を1つずつ更新する際に ソフト閾値関数(soft-thresholding) を使います。これがL1ペナルティから自然に出てくる「小さい値を0に潰す」操作です。

import numpy as np

def soft_threshold(z, gamma):
    """ソフト閾値関数: |z|<=gamma なら0、それ以外は gamma だけ原点に寄せる"""
    return np.sign(z) * np.maximum(np.abs(z) - gamma, 0.0)

def lasso_coordinate_descent(X, y, lam, n_iter=500):
    """座標降下法によるLASSO"""
    n, p = X.shape
    w = np.zeros(p)
    col_sq = (X ** 2).sum(axis=0)
    for _ in range(n_iter):
        for j in range(p):
            # j番目を除いた残差
            r = y - X @ w + X[:, j] * w[j]
            rho = X[:, j] @ r
            w[j] = soft_threshold(rho, lam) / col_sq[j]  # ソフト閾値で更新
    return w

ソフト閾値関数 soft_threshold が、$|z| \leq \gamma$ の範囲を問答無用で0に潰すのがポイントです。L2正則化(Ridge)では係数を一定割合で縮めるだけで0にはしませんが、L1ではこの「閾値以下は0」という操作がスパース性を直接生み出します。実データで動かしてみましょう。

import numpy as np

rng = np.random.default_rng(7)
n, p = 80, 8
X = rng.normal(0, 1, (n, p))
X = (X - X.mean(0)) / X.std(0)                       # 標準化
true_w = np.array([3.0, -2.0, 1.5, 0, 0, 0, 0, 0])   # 後半5つは真値0
y = X @ true_w + rng.normal(0, 1.0, n)
y = y - y.mean()

for lam in [0.1, 5.0, 30.0]:
    w = lasso_coordinate_descent(X, y, lam)
    n_zero = np.sum(np.abs(w) < 1e-8)
    print(f"lam={lam:>5} -> 0になった係数の数: {n_zero} / {p}")
    print(f"          係数: {np.round(w, 3)}")

実行すると、正則化強度 lam を大きくするほど、0になる係数の数が増えていきます。lam=0.1 ではほとんどの係数が非ゼロですが、lam=30.0 では真値が0だった後半の係数を中心に多くが厳密に0になります。重要なのは、係数が「0.001」のような小さな値ではなく ぴったり 0 になっている点です。これがRidge回帰には真似できない、LASSO(=ラプラス事前)固有のスパース性です。

ラプラスメカニズムで差分プライバシーを実装する

最後に、差分プライバシーのラプラスメカニズムを実装し、隣接データベースの出力がほぼ区別できないことを確かめます。

import numpy as np

rng = np.random.default_rng(3)

def laplace_mechanism(true_value, sensitivity, epsilon, size=1):
    """ラプラスメカニズム: 真の集計値にラプラスノイズを加える"""
    b = sensitivity / epsilon
    return true_value + rng.laplace(0.0, b, size=size)

sensitivity = 1.0   # カウントクエリの感度
epsilon = 0.5

# 隣接データベース: 1人分だけ違う(100人 vs 101人)
out_D  = laplace_mechanism(100.0, sensitivity, epsilon, size=200_000)
out_D2 = laplace_mechanism(101.0, sensitivity, epsilon, size=200_000)

# プライバシー保証: 出力密度の比が exp(epsilon) を超えないはず
b = sensitivity / epsilon
z = 100.5  # ある観測値での密度比
ratio = np.exp(-abs(z - 100.0) / b) / np.exp(-abs(z - 101.0) / b)
print(f"出力密度の比          : {ratio:.4f}")
print(f"exp(epsilon)          : {np.exp(epsilon):.4f}  (上限)")
print(f"D  の出力平均         : {out_D.mean():.3f}")
print(f"D' の出力平均         : {out_D2.mean():.3f}")

このコードを実行すると、ある観測値での出力密度の比が $e^{\varepsilon} = e^{0.5} \approx 1.649$ を超えないことが確認できます(理論で導いた三角不等式による上限です)。また、2つのデータベース(100人と101人)の出力平均はノイズで覆い隠され、どちらがどちらか判別しにくくなっています。ラプラス分布の「絶対値の指数」という形が、プライバシー保証 $e^\varepsilon$ をぴったり実現していることが実装でも確かめられました。

ベイジアンLASSOの事後分布

最後に、ラプラス事前×尤度から事後分布がどう作られ、MAP推定(=LASSO解)が原点へ引き寄せられる様子を可視化します。

import numpy as np
from scipy import stats

w = np.linspace(-4, 4, 1000)
prior = np.exp(-np.abs(w) / 0.7) / (2 * 0.7)   # ラプラス事前
like = stats.norm(2.0, 0.8).pdf(w)             # 最小二乗解が2.0付近の尤度
post = prior * like
post /= np.trapezoid(post, w)                  # 規格化

map_w = w[np.argmax(post)]                     # MAP推定 = LASSO解
ml_w = w[np.argmax(like)]                      # 最尤推定
print(f"最尤推定 (尤度のピーク)      : {ml_w:.3f}")
print(f"MAP推定  (事後のピーク=LASSO) : {map_w:.3f}")

実行すると、最尤推定(尤度のピーク)が約2.0なのに対し、MAP推定(事後のピーク)は約1.1まで原点側に引き寄せられます。ラプラス事前が「係数は0に近いはずだ」という信念を表しており、その信念がデータの証拠(尤度)と合わさって、推定値を原点方向へ収縮(シュリンク)させているのです。

ベイジアンLASSOの事後分布。ラプラス事前と尤度を掛けた事後は、最尤推定よりも原点側に収縮したピークを持つ

この図は、ラプラス事前(破線)、尤度(点線)、そして両者を掛けた事後分布(実線)を重ねたものです。尤度は2.0付近にピークを持ちますが、原点に質量を集中させるラプラス事前と掛け合わされた結果、事後分布のピーク(MAP推定=LASSO解)は約1.1まで原点側に引き寄せられています。これが「L1正則化はラプラス事前のもとでのMAP推定である」という対応の、目に見える形での確認です。

まとめ

本記事では、ラプラス分布(二重指数分布)を、定義から応用まで一気通貫で解説しました。

  • 定義と性質: $f(x)=\frac{1}{2b}e^{-|x-\mu|/b}$。中心からの距離の 絶対値 で減衰するため頂点が尖り、裾が重い。期待値 $E[X]=\mu$、分散 $V[X]=2b^2$、MGF $M_X(t)=e^{\mu t}/(1-b^2t^2)$。
  • MLE=中央値: 位置パラメータの最尤推定はL1損失 $\sum_i|x_i-\mu|$ の最小化であり、左右の点数が釣り合う中央値に一致する。外れ値に強い(ロバスト)。
  • 正規分布との比較: 同じ分散でも、ラプラス分布は中心が尖り(超過尖度3)、対数軸で裾が直線的に重く伸びる。極端な値が起こりやすい。
  • L1正則化=ラプラス事前: 係数にラプラス事前を置いたMAP推定がLASSO、ガウス事前ならRidge。正則化のベイズ的な意味が明確になる。
  • スパース性: L1の制約領域は菱形で、その角が座標軸上にあるため、最適解が「ちょうど0」の係数を多数生む。これが自動的な特徴選択として働く。
  • 差分プライバシー: 真の集計値に尺度 $b=\Delta f/\varepsilon$ のラプラスノイズを加えると、絶対値の指数と三角不等式の相性から、$\varepsilon$-差分プライバシーがきれいに保証される。

ラプラス分布は、「絶対値(L1)」というキーワードを軸に、ロバスト統計・スパース推定・プライバシー保護という一見無関係な分野を貫いています。「真ん中が尖って裾が重い」というシンプルな形が、これほど豊かな応用を生むことに、確率分布の奥深さを感じてもらえれば幸いです。

次のステップとして、以下の記事も参考にしてください。