<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ベイズ推論による機械学習入門 - まったり勉強ノート</title>
	<atom:link href="https://www.mattari-benkyo-note.com/tag/%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E8%AB%96%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.mattari-benkyo-note.com</link>
	<description>shuの日々の勉強まとめ</description>
	<lastBuildDate>Sun, 27 Feb 2022 23:17:34 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
<site xmlns="com-wordpress:feed-additions:1">189243286</site>	<item>
		<title>[勉強ノート]「ベイズ推論による機械学習入門」5.7 ニューラルネットワークで紹介されたものをPyTorchで実装してみた</title>
		<link>https://www.mattari-benkyo-note.com/2022/02/28/bayes-book-5-7-pytorch/</link>
					<comments>https://www.mattari-benkyo-note.com/2022/02/28/bayes-book-5-7-pytorch/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Sun, 27 Feb 2022 23:17:33 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[pytorch]]></category>
		<category><![CDATA[ベイズ推論]]></category>
		<category><![CDATA[ベイズ推論による機械学習入門]]></category>
		<category><![CDATA[勉強ノート]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=849</guid>

					<description><![CDATA[<p>はじめに 最近ベイズ推論の勉強をしていて機械学習スタートアップシリーズの「ベイズ推論による機械学習入門」を読んでいます。今回はこの本の5.7 のニューラルネットワークの章で紹介されていたモデルをPyTorchで実装したの [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2022/02/28/bayes-book-5-7-pytorch/">[勉強ノート]「ベイズ推論による機械学習入門」5.7 ニューラルネットワークで紹介されたものをPyTorchで実装してみた</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<h1 class="wp-block-heading">はじめに</h1>



<p>最近ベイズ推論の勉強をしていて機械学習スタートアップシリーズの「ベイズ推論による機械学習入門」を読んでいます。今回はこの本の5.7 のニューラルネットワークの章で紹介されていたモデルをPyTorchで実装したので、実装と苦労した点を紹介していきます。</p>



<p>参考にしたJuliaのサンプルコードはこちらです。</p>



<p><a href="https://github.com/sammy-suyama/BayesBook/blob/master/src/demo_BayesNeuralNet.jl">https://github.com/sammy-suyama/BayesBook/blob/master/src/demo_BayesNeuralNet.jl</a></p>



<p>今回はこのサンプルコードをもとにして、PyTorchで実装したものを作り、以下に公開しました。</p>



<p><a href="https://github.com/shu65/blog-bayes-book/blob/main/%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E5%AE%9A%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80%E3%80%805_7_%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF.ipynb" target="_blank" rel="noreferrer noopener" title="ベイズ推定による機械学習入門　5_7_ニューラルネットワーク.ipynb">https://github.com/shu65/blog-bayes-book/blob/main/%E3%83%99%E3%82%A4%E3%82%BA%E6%8E%A8%E5%AE%9A%E3%81%AB%E3%82%88%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E5%85%A5%E9%96%80%E3%80%805_7_%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF.ipynb</a></p>



<p>今回はこのPyTorch実装についての紹介になります。パラメータは少しいじっていますが大体Juliaのサンプルと合わせています。</p>



<p>PyTorchで実装することで、より複雑なモデルを作ることが簡単になるのと、単純作業だけどやるのは大変な偏微分の計算のところをPyTorchの自動微分に任せることができるため、より本質的なことろが理解しやすくなると思ったためです。</p>



<p>それではまず本に書かれているモデルについて簡単に説明して、その後実際のPyTorch実装の説明という流れで説明していきたいと思います。</p>



<h1 class="wp-block-heading">本で紹介されているモデルと変分推論</h1>



<h2 class="wp-block-heading">モデルの定義</h2>



<p>まずは本で紹介されているモデルについて説明していきます。訓練データの入力値と出力値の集合をそれぞれ \( \boldsymbol{X} \)、 \( \boldsymbol{Y} \) と置きます。この集合の要素数を \( N \) とし \( n \in N \) 番目のデータの入力値を \( \boldsymbol{x}_n \in \mathbb{R}^M \) 、出力値を \( \boldsymbol{y}_n \in \mathbb{R}^D \) とするとき、ガウス分布によってモデル化すると以下のようになります。</p>



<p>$$ \begin{align*} <br>p(\boldsymbol{Y}|\boldsymbol{X}, \boldsymbol{W}) <br>=&amp; \prod_{n=1}^N p(\boldsymbol{y}_n|\boldsymbol{x}_n, \boldsymbol{W}) \\<br>=&amp; \prod_{n=1}^N \mathcal{N}(\boldsymbol{y}_n|f(\boldsymbol{W}, \boldsymbol{x}_n), \lambda_y^{-1}\boldsymbol{I}_D) \tag{5.257} <br>\end{align*} $$</p>



<p>ここで、\( \boldsymbol{W} \) は モデルのパラメータの集合、\( \lambda_y^{-1} \) 固定の精度パラメータです。また、非線形関数\(f\)は次のように定義することにします。</p>



<p>$$ \begin{align*}<br>f(\boldsymbol{W}, \boldsymbol{x}_n) = {\boldsymbol{W}^{(2)}}^\mathrm{T} \text{Tanh}({\boldsymbol{W}^{(1)}}^\mathrm{T}\boldsymbol{x}_n) \tag{5.258}<br>\end{align*} $$</p>



<p>ここでモデルパラメータ \( \boldsymbol{W} \) の要素を\( \boldsymbol{W}^{(1)} \) と \( \boldsymbol{W}^{(2)} \)として、\( \boldsymbol{W}^{(1)} \in \mathbb{R}^{M \times K}\) 及び\( \boldsymbol{W}^{(2)} \in \mathbb{R}^{K \times D}\) という行列としています。このモデルパラメータの各要素は次のようなシンプルなガウス事前分布を仮定することにします。</p>



<p>$$ \begin{align*}<br>p (w_{m,k}^{(1)}) = \mathcal{N} (w_{m,k}^{(1)}|0, \lambda_w^{-1}) \tag{5.259} \\<br>p (w_{m,k}^{(2)}) = \mathcal{N} (w_{m,k}^{(2)}|0, \lambda_w^{-1}) \tag{5.259}<br>\end{align*} $$</p>



<p>また \( \text{Tanh}(\cdot) \) は以下のように定義されます。</p>



<p>$$<br>\text{Tanh}(a) = \frac{\text{exp}(a) &#8211; \text{exp}(-a)}{\text{exp}(a) + \text{exp}(-a)} \tag{5.261}<br>$$</p>



<p>以上が本に書かれたモデルの定義になります。</p>



<h2 class="wp-block-heading">変分推論</h2>



<p>ここではニューラルネットワークモデルのパラメータ \( \boldsymbol{W} = \{ \boldsymbol{W}^{(1)}, \boldsymbol{W}^{(2)} \} \) の事後分布を推論する問題を考えます。こちらは本で一つ前に紹介されていたロジスティック回帰のときとほぼ同じように行っていきます。</p>



<p>今回は細かい式の説明は省いていますが、ニューラルネットワークの勾配の計算は5.6ロジスティック回帰と似たような式変形になります。5.6ロジスティック回帰の式の導出はこちらの記事に詳しく書いてあるので参考にしてみてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-まったり勉強ノート wp-block-embed-まったり勉強ノート"><div class="wp-block-embed__wrapper">
<blockquote class="wp-embedded-content" data-secret="jbuQ8qITUF"><a href="https://www.mattari-benkyo-note.com/2022/02/24/bayes-book-5-6/">[勉強ノート]「ベイズ推論による機械学習入門」5.6ロジスティック回帰</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="&#8220;[勉強ノート]「ベイズ推論による機械学習入門」5.6ロジスティック回帰&#8221; &#8212; まったり勉強ノート" src="https://www.mattari-benkyo-note.com/2022/02/24/bayes-book-5-6/embed/#?secret=qxmIOB0tZv#?secret=jbuQ8qITUF" data-secret="jbuQ8qITUF" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</div></figure>



<p>事後分布を推定するために、対角ガウス分布を使った以下のような近似事後分布を利用します。</p>



<p>$$ \begin{align*}<br>q(\boldsymbol{W}^{(1)}; \boldsymbol{\eta}^{(1)}) =&amp; \prod_{m=1}^M \prod_{k=1}^K \mathcal{N}(w_{m,k}|\mu_{m,k}^{(1)},{\sigma_{m,k}^{(1)}}^2) \tag{5.262.1} \\<br>q(\boldsymbol{W}^{(2)}; \boldsymbol{\eta}^{(2)}) =&amp; \prod_{m=1}^M \prod_{k=1}^K \mathcal{N}(w_{m,k}|\mu_{m,k}^{(2)},{\sigma_{m,k}^{(2)}}^2) \tag{5.262.2} \\<br>\end{align*} $$</p>



<p>ここで \( \boldsymbol{\eta} = \{ \boldsymbol{\eta}^{(1)}, \boldsymbol{\eta}^{(2)} \} \) が変分パラメータの集合となります。今回は以下のような近似事後分布と真の事後分布のKLダイバージェンスを最小化するような変分パラメータ&nbsp;\( \boldsymbol{\eta} \)を見つけることを目指します。</p>



<p>$$ \begin{align*}<br>&amp;\text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} <br>&#8211; \langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \qquad &#8211; \sum_{n=1}^N \langle \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} <br>+ \text{const} \tag{5.236}<br>\end{align*} $$</p>



<p>この式 (5.236)の最小化するにあたり、以下のような再パラメータ化トリックを利用して、 \( \boldsymbol{W} \) の各要素 \( w \) (インデックスは省略してます。) を以下のように置きます。</p>



<p>$$ \begin{align*}<br>\tilde{w} = \mu + \sigma \tilde{\epsilon} \tag{5.237} \\<br>\text{ただし} \tilde{\epsilon} \sim \mathcal{N} (\epsilon|0,1) \tag{5.238}<br>\end{align*} $$</p>



<p>これを利用すると以下のような \( g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta})  \) を最小化することになります。</p>



<p><br>$$ \begin{align*}<br>&amp; \text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \\<br>&amp; \ \approx \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta})<br>&#8211; \ln p(\boldsymbol{\tilde{W}}) \\<br>&amp; \qquad &#8211; \sum_{n=1}^N \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) + \text{const} \\<br>&amp; \ = g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta}) \tag{5.239}<br>\end{align*} $$</p>



<p>ただし、本ではすべてのデータで尤度の勾配を計算する方法ではなく、確率的勾配降下法（stochastic gradient descent, SGD）にも触れられているので、この記事ではSGDを使って最適化します。ただ、後ほどまた説明しますが、本で書かれているデータを1つ1つ逐次的に与えて勾配を計算するオンラインのSGDではうまく収束してくれなかったので、ミニバッチを用いるSGDを使います。これは基本的に本で書かれているように式(5.239) の事前分布と近似事後分布の項の影響をデータ数に応じて抑えます。今回はミニバッチを利用するので、ミニバッチ内の訓練データを\( \{\boldsymbol{X}_B, \boldsymbol{Y}_B\}\)とし、 \( b \in B \) 番目のデータの入力値を \( \boldsymbol{x}_b\) 、出力値を \( \boldsymbol{y}_b \)として式 (5.239) を変形した以下の式の勾配を利用します。</p>



<p>$$ \begin{align*}<br>&amp; \text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y}_B,\boldsymbol{X}_B)] \\<br>&amp; \ \approx \frac{B}{N} \lbrace \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta})<br>&#8211; \ln p(\boldsymbol{\tilde{W}}) \rbrace \\<br>&amp; \qquad &#8211; \sum_{b=1}^B \ln p(\boldsymbol{y}_b | \boldsymbol{x}_b, \boldsymbol{\tilde{W}}) + \text{const} \\<br>\tag{5.269.1}<br>\end{align*} $$</p>



<p>本ではこれ以外に勾配を計算するための式変形が細かく書いてありますが、今回はPyTorchの自動微分の機能を使うため、式 (5.269.1)  の値を計算し、この値をlossとして<code>backward()</code> を実行するため、説明はここまでにします。<br></p>



<h1 class="wp-block-heading">実装について</h1>



<p>今回はPyTorchの自動微分の機能を使って変分パラメータの最適化に必要な勾配を計算します。このため、処理の基本的な流れとしては式 (5.269.1) の値を計算し、この値をlossとして<code>backward()</code> を実行するというのを指定した回数繰り返して最適化します。</p>



<h2 class="wp-block-heading">モデル部分の実装</h2>



<p>式 (5.258) をPyTorchで実装します。具体的なものは最初に示したJupyter Notebookの<code> BayeNNModel </code>クラスの実装をご覧ください。ここでは重要な部分だけ示します。まず、式 (5.258)を <code>forward()</code> に実装します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="BayeNNModel_forward" data-lang="Python"><code>    def forward(self, X):
      W1 = self.sample_W(self.mu1, self.rho1)
      h1 = torch.nn.functional.linear(X, W1, bias=None)
      h2 = torch.tanh(h1)
      W2 = self.sample_W(self.mu2, self.rho2)
      Y_est = torch.nn.functional.linear(h2, W2, bias=None)
      return Y_est, W1, W2</code></pre></div>



<p>今回は \( \boldsymbol{\tilde{W}} \) はサンプリングしてくる必要があるので、<code>sample_W() </code>という関数でサンプリングしてそれを<code>torch.nn.functional.linear()</code>に入れるということをしています。</p>



<p>\( \boldsymbol{\tilde{W}} \) はサンプリングしてくる部分は以下のようにします。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="BayeNNModel_sample_W" data-lang="Python"><code>    def sample_W(self, mu, rho):
      eps = torch.randn(mu.shape)
      sigma = self.rho2sigma(rho) + self.approximate_posterior_sigma_eps
      W = mu + sigma * eps
      return W</code></pre></div>



<p>基本的には式(5.237) の実装になります。ただ、後ほど説明する \( \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) \) の計算のところで、ガウス分布に入れる \( \sigma \) が0になってしまいエラーになるケースが発生してしまうため、0にならないようにするための補正 (<code>self.approximate_posterior_sigma_eps</code>) を加算しています。</p>



<h2 class="wp-block-heading">変分推論部分の実装</h2>



<p>勾配を計算するための式(5.269.1) の各項を計算します。これらの項はすべてガウス分布になっているのでPyTorchの <code>torch.distributions.normal.Normal()</code> を使えば簡単に実装できます。</p>



<p>\( \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) \) と\( \ln p(\boldsymbol{\tilde{W}}) \) 、\( \sum_{b=1}^B \ln p(\boldsymbol{y}_b | \boldsymbol{x}_b, \boldsymbol{\tilde{W}}) \)のそれぞれの項は以下の関数で計算するようにしています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="BayeNNModel_log_prob" data-lang="Python"><code>    def _compute_approximate_posterior_log_prob_core(self, W, mu, rho):
      sigma = self.rho2sigma(rho) + self.approximate_posterior_sigma_eps
      W_dist = torch.distributions.normal.Normal(mu, sigma)
      log_prob_W = W_dist.log_prob(W)
      sum_log_prob_W = torch.sum(log_prob_W)
      return sum_log_prob_W

    def _compute_prior_log_prob_core(self, W, sigma_w):
      W_dist = torch.distributions.normal.Normal(0, sigma_w)
      log_prob_W = W_dist.log_prob(W)
      sum_log_prob_W = torch.sum(log_prob_W)
      return sum_log_prob_W

    def compute_approximate_posterior_log_prob(self, W1, W2):
      log_prob_W1 = self._compute_approximate_posterior_log_prob_core(W1, self.mu1, self.rho1)
      log_prob_W2 = self._compute_approximate_posterior_log_prob_core(W2, self.mu2, self.rho2)
      return log_prob_W1 + log_prob_W2

    def compute_prior_log_prob(self, W1, W2):
      log_prob_W1 = self._compute_prior_log_prob_core(W1, self.sigma_w)
      log_prob_W2 = self._compute_prior_log_prob_core(W2, self.sigma_w)
      return log_prob_W1 + log_prob_W2

    def compute_log_prob_p(self, Y, Y_est):
      Y_dist = torch.distributions.normal.Normal(Y_est, self.sigma_y)
      log_p = Y_dist.log_prob(Y)
      return torch.sum(log_p)</code></pre></div>



<p>これらを使ってKLダイバージェンスの勾配に関係する部分だけ計算して、<code>backward()</code>とOptimizerの<code>step()</code>を以下のように呼びます。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="vi_step" data-lang="Python"><code>def vi_step(X, Y, model, optimizer, N, max_grad_norm=1e2):
  model.zero_grad()

  batch_size = X.shape[0]
  Y_est, W1, W2 = model(X)
  prior_log_prob_W = model.compute_prior_log_prob(W1, W2)
  posterior_log_prob_W = model.compute_approximate_posterior_log_prob(W1, W2)
  log_prob_p = model.compute_log_prob_p(Y, Y_est)
  kl_divergence = batch_size/N * (posterior_log_prob_W - prior_log_prob_W) - log_prob_p

  kl_divergence.backward()
  torch.nn.utils.clip_grad_norm_(model.parameters(), max_grad_norm)
  optimizer.step()
  return kl_divergence.item()</code></pre></div>



<p>これらを使ってJuliaのサンプルと同様の訓練データで事後分布の推定を行って本の図5.18と似たような図を以下のように作ってみました。</p>



<div class="wp-block-image"><figure class="aligncenter size-full is-resized"><img fetchpriority="high" decoding="async" src="https://www.mattari-benkyo-note.com/wp-content/uploads/2022/02/BayeNNModel_plot.png" alt="学習後のニューラルネットワークによる予測" class="wp-image-899" width="380" height="248" srcset="https://www.mattari-benkyo-note.com/wp-content/uploads/2022/02/BayeNNModel_plot.png 380w, https://www.mattari-benkyo-note.com/wp-content/uploads/2022/02/BayeNNModel_plot-300x196.png 300w" sizes="(max-width: 380px) 100vw, 380px" /><figcaption>学習後のニューラルネットワークによる予測</figcaption></figure></div>



<p>図を見ると十分な精度がでていると思っています。</p>



<h1 class="wp-block-heading">実装で苦労した点について</h1>



<p>いざ実装してみると以下の点で工夫が必要だったので簡単に紹介します。</p>



<h2 class="wp-block-heading">最初の数イテレーションの勾配が大きすぎてモデルのパラメータがnanになる</h2>



<p>最初の数イテレーションはどうしても勾配が大きくなりがちです。今回は特にバッチサイズが大きいとモデルのパラメータが途中でnanになってしまうという問題が発生しました。この手の問題は深層学習ではよくあるためいくつか対処する手段はありますが、今回はシンプルなgradient clippingを利用しています。具体的には<code> vi_step()</code> で<code>torch.nn.utils.clip_grad_norm_()</code>を呼んでいる部分がそれにあたります。</p>



<h2 class="wp-block-heading">近似事後分布のσが0になる</h2>



<p>バッチサイズや他のパラメータによっても発生したりしなかったりしますが、時々\( \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) \)を計算する部分で \( \sigma \) が計算誤差で0に丸められてしまうとうケースが発生しました。このため、以下のようにして小さい値を加算して0になるのを防ぐ必要がありました。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="W_sampling" data-lang="Python"><code>      sigma = self.rho2sigma(rho) + self.approximate_posterior_sigma_eps
      W_dist = torch.distributions.normal.Normal(mu, sigma)</code></pre></div>



<h1 class="wp-block-heading">終わりに</h1>



<p>「ベイズ推論による機械学習入門」の5.7 ニューラルネットワークのモデルをPyTorchで実装したので、実装についてと苦労した点についての記事を書きました。</p>



<p>実装する前はすぐできるだろうと思っていましたが、苦労した点に書いたような問題が出てきて思ったより時間がかかった印象です。ただ、実際に実装してみてベイズ推論の理解が深まったのでやってよかったです。実はこの本の他の実装もいつくかしてあるので機会があればまたblogの記事にしようと思います。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2022/02/28/bayes-book-5-7-pytorch/">[勉強ノート]「ベイズ推論による機械学習入門」5.7 ニューラルネットワークで紹介されたものをPyTorchで実装してみた</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2022/02/28/bayes-book-5-7-pytorch/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">849</post-id>	</item>
		<item>
		<title>[勉強ノート]「ベイズ推論による機械学習入門」5.6ロジスティック回帰</title>
		<link>https://www.mattari-benkyo-note.com/2022/02/24/bayes-book-5-6/</link>
					<comments>https://www.mattari-benkyo-note.com/2022/02/24/bayes-book-5-6/#respond</comments>
		
		<dc:creator><![CDATA[Shuji Suzuki (shu)]]></dc:creator>
		<pubDate>Wed, 23 Feb 2022 23:01:38 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[ベイズ推論]]></category>
		<category><![CDATA[ベイズ推論による機械学習入門]]></category>
		<category><![CDATA[勉強ノート]]></category>
		<guid isPermaLink="false">https://www.mattari-benkyo-note.com/?p=250</guid>

					<description><![CDATA[<p>最近ベイズ推論の勉強をしていて機械学習スタートアップシリーズの「ベイズ推論による機械学習入門」を読んでいます。 この記事はこの本の「5.6 ロジスティック回帰」の部分で個人的にぱっと式変形がわからなかったところの詳細に関 [&#8230;]</p>
<p>The post <a href="https://www.mattari-benkyo-note.com/2022/02/24/bayes-book-5-6/">[勉強ノート]「ベイズ推論による機械学習入門」5.6ロジスティック回帰</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>最近ベイズ推論の勉強をしていて機械学習スタートアップシリーズの「ベイズ推論による機械学習入門」を読んでいます。</p>



<p>この記事はこの本の「5.6 ロジスティック回帰」の部分で個人的にぱっと式変形がわからなかったところの詳細に関する記事になります。基本的には自分で本を読み返したときに詰まることながいように、今回わからなかったところに関しては細かく書いて説明していくことを目指します。</p>



<h1 class="wp-block-heading" id="ロジスティック回帰のベイズ推論">ロジスティック回帰のベイズ推論</h1>



<h2 class="wp-block-heading" id="モデル">モデル</h2>



<p>まずモデルを定義していきます。データ数を \( N \) として、\( n \in N \) 番目のデータの入力値 \( \boldsymbol{x}_n \) を \(\boldsymbol{x}_n \in \mathbb{R}^M \) という\( M \) 次元のベクトルとし、モデルの出力である\( \boldsymbol{y}_n \) を \( \boldsymbol{y}_n \in \{0,1\}^D \) でかつ \( \sum_{d=1}^D y_{n,d} = 1 \) を満たす\( D \) 次元のベクトルとします。そして行列 \( \boldsymbol{W} \in \mathbb{R}^{M \times D} \) をモデルパラメータとします。これらの変数を使ってロジスティック回帰のモデルを定義すると以下のようになります。<br>$$ \begin{align*} <br>p ( \boldsymbol{Y} |  \boldsymbol{X},  \boldsymbol{W} ) &amp; = \prod_{n=1}^N p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W} )\\ <br>&amp; = \prod_{n=1}^N \text{Cat}(\boldsymbol{y}_n | f(\boldsymbol{W}, \boldsymbol{x}_n)  ) \tag{5.229}<br>\end{align*} $$</p>



<p>次に\( \boldsymbol{W} \) の事前分布です。\( \boldsymbol{W} \) の各要素を \( w_{m,d} \) として、今回は以下のようなガウス分布として定義します。</p>



<p>$$<br>p (\boldsymbol{W}) = \prod_{m=1}^M \prod_{d=1}^D \mathcal{N} (w_{m,d}|0, \lambda^{-1}) \tag{5.230}<br>$$</p>



<p>また、式(5.229) の非線形関数 \( f\) に対して本では以下のように \(D \) 次元のソフトマックス関数を使っています。</p>



<p>$$ <br>f (\boldsymbol{W}, x_n) = \text{SM}(\boldsymbol{W}^\mathrm{T} x_n) \tag{5.231} <br>$$</p>



<p>ソフトマックス関数を用いているので、式(5.231)の各次元\(d\) に関しては以下のように定義されます。</p>



<p>$$ \begin{align*} <br>f_d({\boldsymbol{W}, x_n}) &amp;= \text{SM}_d(\boldsymbol{W}^\mathrm{T} x_n) \\<br>&amp;= \frac{\text{exp}(\boldsymbol{W}^\mathrm{T}_{:,d} x_n))}{\sum_{d^{\prime}=1}^D \text{exp}(\boldsymbol{W}^\mathrm{T}_{:,d^{\prime}} x_n)}　\tag{5.232}<br>\end{align*} $$</p>



<p>以上でモデルの定義を示すことができました。</p>



<h2 class="wp-block-heading" id="ロジスティック回帰の変分推論">ロジスティック回帰の変分推論</h2>



<p>このブログ記事では訓練データとして入力値と出力値 \( \{ \boldsymbol{X}, \boldsymbol{Y} \}\) が与えられた場合の \( \boldsymbol{W} \) の事後分布を推論できるようにするところまでを目指します。本にはその後に新規の入力データ \( \boldsymbol{x}_{*} \) が与えられた時の出力値 \( \boldsymbol{y}_{*} \) を予測するところまで書かれていますが、今回は省略します。</p>



<p>まず、事後分布 \( p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X}) \) はベイズの定理により以下のように変形できます。</p>



<p>$$<br>p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X}) = \frac{p(\boldsymbol{Y}|\boldsymbol{X},\boldsymbol{W})p(\boldsymbol{W})}{p(\boldsymbol{Y}|\boldsymbol{X})} \tag{5.233}<br>$$</p>



<p>本ではこの事後分布をガウス分布によって近似します。近似事後分布として以下のような \( M \times D \) の1次元ガウス分布を仮定します。</p>



<p>$$<br>q(\boldsymbol{W}; \boldsymbol{\eta}) = \prod_{m=1}^M \prod_{d=1}^D \mathcal{N}(w_{m,d}|\mu_{m,d},\sigma^2_{m,d}) \tag{5.234}<br>$$</p>



<p>変分推論では以下のような近似事後分布と真の事後分布のKLダイバージェンスを最小化するような変分パラメータ \(  \boldsymbol{\eta} \) を見つけることを目指します。</p>



<p>$$<br>\boldsymbol{\eta}_{\text{opt}}=\underset{{\boldsymbol{\eta}}}{\text{argmin}} \ \text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \tag{5.235}<br>$$</p>



<p>この本では最小化するために勾配法を用います。勾配法では式(5.235) を変分パラメータ \(  \boldsymbol{\eta} \) の各パラメータ \( \mu_{m,d} \) と \( \sigma_{m,d} \)で偏微分して変分パラメータの勾配を計算し、その勾配を用いて変分パラメータを更新していきます。</p>



<p>この勾配を求める前準備として式(5.235)を期待値の形で表現する形に式変形していきます。本では以下のように式変形されています。</p>



<p>$$ \begin{align*}<br>&amp;\text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} <br>&#8211; \langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \qquad &#8211; \sum_{n=1}^N \langle \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} <br>+ \text{const} \tag{5.236}<br>\end{align*} $$</p>



<p>式(5.236)の式も少し省略されていて、初見ではぱっと式変形がわからなかったので、この部分をまずは詳しく書いていきます。</p>



<h3 class="wp-block-heading" id="式-5-236-klダイバージェンスを期待値表現にする">式(5.236) KLダイバージェンスを期待値表現にする </h3>



<p>KLダイバージェンスの定義が(2.13)に書かれています。これをもう少し丁寧に式変形すると以下の通りになります。</p>



<p>$$ \begin{align*}<br>\text{KL} [q(\boldsymbol{x})||p(\boldsymbol{x})] <br>&amp;= &#8211; \int q(\boldsymbol{x}) \ln \frac{p(\boldsymbol{x})}{q(\boldsymbol{x})} dx \\<br>&amp;=  &#8211; \int q(\boldsymbol{x}) \ln p(\boldsymbol{x}) + \int q(\boldsymbol{x}) \ln q(\boldsymbol{x}) \tag{2.13.1}<br>\end{align*} $$ </p>



<p>また、確率分布 \( p(\boldsymbol{x}) \) に対してある関数 \( f(\boldsymbol{x}) \) の期待値 \( \langle f(\boldsymbol{x}) \rangle _{p(\boldsymbol{x})} \) の定義は以下の通りです。</p>



<p>$$<br>\langle f(\boldsymbol{x}) \rangle _{p(\boldsymbol{x})} = \int f(\boldsymbol{x})p(\boldsymbol{x})dx \tag{2.1}<br>$$</p>



<p>この期待値の定義を利用して 式(2.13.1)の式を書き換えると以下の通りです。</p>



<p>$$ \begin{align*}<br>\text{KL} [q(\boldsymbol{x})||p(\boldsymbol{x})] <br>&amp;=  &#8211; \int q(\boldsymbol{x}) \ln p(\boldsymbol{x}) + \int q(\boldsymbol{x}) \ln q(\boldsymbol{x}) \\<br>&amp;= &#8211; \langle \ln p(\boldsymbol{x}) \rangle _{q(\boldsymbol{x})} + \langle \ln q(\boldsymbol{x}) \rangle _{q(\boldsymbol{x})} \tag{2.13.2}<br>\end{align*} $$ </p>



<p>このため \( \text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \) は期待値表現で書き下すと以下のようになります。(5.236に合わせて項の順番は変えています。)</p>



<p>$$ \begin{align*}<br>\text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] <br>=&amp; \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp;- \langle \ln p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})}  \tag{5.236.1}<br>\end{align*} $$</p>



<p>次に5.236.1の2項目の \( \ln p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X}) \) の部分を式変形していきます。式(5.233)より</p>



<p>$$ \begin{align*}<br>\ln p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X}) =&amp; \ln \frac{p(\boldsymbol{Y}|\boldsymbol{X},\boldsymbol{W})p(\boldsymbol{W})}{p(\boldsymbol{Y}|\boldsymbol{X})} \\<br>=&amp; \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W}) \\<br>&amp;+ \ln p (\boldsymbol{W}) &#8211; \ln p(\boldsymbol{Y}| \boldsymbol{X}) \tag{2.236.2}<br>\end{align*} $$</p>



<p>3項目の \( \ln p(\boldsymbol{Y}| \boldsymbol{X}) \) は 変分パラメータに依存しないため定数となります。この式(2.236.2)を使って式(2.236.1)を式変形してきます。</p>



<p>$$ \begin{align*}<br>&amp; \text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} &#8211; \langle \ln p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \qquad &#8211; \langle \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W})<br>+ \ln p (\boldsymbol{W}) + \text{const}\rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \tag{2.236.3}<br>\end{align*} $$</p>



<p>ここで2項目の部分で、期待値は線形性が成り立つため、以下のように変形できます。</p>



<p>$$ \begin{align*}<br>&amp; \langle \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W})<br>+ \ln p (\boldsymbol{W}) + \text{const} \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \ = \langle \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})}<br>+ \langle \ln p (\boldsymbol{W}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} + \text{const}\tag{2.236.4}<br>\end{align*} $$</p>



<p>このため、式(2.236.3)に式(2.236.4)を代入すると以下のようになります。<br>$$ \begin{align*}<br>&amp; \text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})}<br>&#8211; \langle \ln p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \qquad  &#8211; \langle \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W})<br>+ \ln p (\boldsymbol{W}) + \text{const}\rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \  = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\ <br>&amp; \qquad  &#8211; \langle \ln p (\boldsymbol{W}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \qquad  &#8211; \langle \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} + \text{const}<br>\tag{2.236.5}<br>\end{align*}$$</p>



<p>項の順番は式(2.236)に合わせて順番を変えています。<br>次に3項目の \( \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W}) \) ついて考えます。この式は式(5.229)から以下のようになります</p>



<p>$$ \begin{align*}<br>\ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W}) &amp;=  \ln (\prod_{n=1}^N p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W} ) ) \\<br>&amp;= \sum_{n=1}^N \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W} ) \tag{2.236.6}<br>\end{align*} $$</p>



<p>期待値は線形性がなりたつため式(2.236.5)の3項目の \( \langle \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \)は以下のようになります</p>



<p>$$ \begin{align*}<br>\langle \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} &amp;= \langle \sum_{n=1}^N \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W} )\rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp;= \sum_{n=1}^N \langle \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \tag{2.236.7}<br>\end{align*} $$</p>



<p>最後に式(2.236.5)にこの式(2.236.7)を代入すると以下のようになります。<br>$$ \begin{align*}<br>&amp; \text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})}<br>&#8211; \langle \ln p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\ <br>&amp; \qquad &#8211; \langle \ln p (\boldsymbol{W}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \qquad &#8211; \langle \ln p (\boldsymbol{Y} | \boldsymbol{X}, \boldsymbol{W}) \rangle_{q(\boldsymbol{W};\boldsymbol{\eta})} + \text{const} \\<br>&amp; \ = \langle \ln q(\boldsymbol{W};\boldsymbol{\eta}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} <br>&#8211; \langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \\<br>&amp; \qquad- \sum_{n=1}^N \langle \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} <br>+ \text{const}<br>\tag{2.236.8}<br>\end{align*}$$</p>



<p>これで式 (2.236) が導出できました。</p>



<h3 class="wp-block-heading" id="再パラメータ化トリックを使った近似された勾配を導出する">再パラメータ化トリックを使った近似された勾配を導出する</h3>



<p>次に再パラメータ化トリック (re-parameterization trick) を使って式 (5.236) から勾配の近似を求めると本に書かれていますが、再パラメータ化トリックについてちゃんと書かれていなかったので、ここでは詳しく書きます。式 (2.236)の2項目 \( \langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \) がシンプルなものなので、これを使って説明していきます。本にも書かれていますが、まずは再パラメータ化トリックがなぜ必要なのか？を整理します。 \( \langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \) を計算するうえで必要なこととしては以下の通りです。</p>



<ol class="wp-block-list"><li>期待値を何等かの形で近似できる</li><li>期待値を近似した値が変分パラメータ \( \boldsymbol{\eta} \) の関数となっていて、勾配が計算できる</li></ol>



<p>これらを満たす手法として再パラメータ化トリックがあります。</p>



<p>再パラメータ化トリックはサンプリング部分を決定的な関数に変換する手法です。具体的に式で説明していきます。本にならって \( \boldsymbol{W} \) の要素をインデックスを省略して \( w = w_{m,d}\) と表記し、\( w \) に対応する変分パラメータ \(\boldsymbol{\eta}\) の中身の\( \mu \)、\( \sigma \) もインデックスを省略して表記します。式 (5.230) で \( w \) はガウス事前分布を仮定していました。ガウス分布のサンプル値を再パラメータ化トリックを使って表現すると以下のようになります。</p>



<p>$$ \begin{align*}<br>\tilde{w} = \mu + \sigma \tilde{\epsilon} \tag{5.237} \\<br>\text{ただし} \tilde{\epsilon} \sim \mathcal{N} (\epsilon|0,1) \tag{5.238}<br>\end{align*} $$</p>



<p>これにより、パラメータのないガウス分布からサンプリングされた値 \( \tilde{\epsilon} \)と変分パラメータの\( \mu \)、\( \sigma \)を使って決定的な関数により \( \tilde{w} \) を計算できます。次にこの\( \tilde{w} \) を使って式 (2.236)の2項目 \( \langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \) をどう近似するか？を考えます。</p>



<p>これは以下の式(2.14) のサンプリングによる期待値の近似を使います。</p>



<p>$$ \begin{align*}<br>\langle f(\boldsymbol{x})\rangle_{p(\boldsymbol{x})}  \approx \frac{1}{L} \sum_{l=1}^{L}f(\boldsymbol{x^{(l)}}) \tag{2.14} \\<br>\text{ただし} \boldsymbol{x^{(l)}} \sim p(\boldsymbol{x})<br>\end{align*} $$</p>



<p>この式 (2.14)を使うと\( \langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \) の式を近似していきます。まず、式 (2.14)の \( p(\boldsymbol{x}) \) から \( \boldsymbol{x^{(l)}} \) をサンプリングする部分に相当する \( q(\boldsymbol{W};\boldsymbol{\eta}) \)からのサンプリングですが再パラメータ化トリックにより以下のようになります。<br>$$ \begin{align*}<br>\tilde{w}^{(l)} = \mu + \sigma \tilde{\epsilon}^{(l)} \tag{5.239.1} \\<br>\text{ただし} \tilde{\epsilon}^{(l)} \sim \mathcal{N} (\epsilon|0,1)<br>\end{align*} $$</p>



<p>この式 (5.239.1) と式(2.14)を使って\( \langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \) を近似すると以下のようになります。</p>



<p>$$<br>\langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} \approx \sum_{l=1}^L \ln p(\boldsymbol{\tilde{W}^{(l)}}) \tag{5.239.2}<br>$$</p>



<p>この式 (5.239.2) の \( L \) を大きくすると精度よく近似ができるのですが、この本では \( L=1\) としています。このため、式(5.239.2)は以下のように変形できます。<br>$$ \begin{align*}<br>\langle \ln p(\boldsymbol{W}) \rangle _{q(\boldsymbol{W};\boldsymbol{\eta})} <br>\approx &amp; \sum_{l=1}^L \ln p(\boldsymbol{\tilde{W}^{(l)}}) \\<br>=&amp; \ln p(\boldsymbol{\tilde{W}^{(1)}}) = \ln p(\boldsymbol{\tilde{W}})<br>\end{align*} $$<br>同様にして式(5.236) の他の期待値の項も式(5.239.1) と式(2.14) 、期待値の近似の際\( L=1\)をとして計算すると以下の式(5.239) が出てきます。</p>



<p>$$ \begin{align*}<br>&amp; \text{KL} [q(\boldsymbol{W};\boldsymbol{\eta})||p(\boldsymbol{W}|\boldsymbol{Y},\boldsymbol{X})] \\<br>&amp; \ \approx \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta})<br>&#8211; \ln p(\boldsymbol{\tilde{W}}) \\<br>&amp; \qquad &#8211; \sum_{n=1}^N \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) + \text{const} \\<br>&amp; \ = g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta}) \tag{5.239}<br>\end{align*} $$</p>



<p>この式(5.239) の \( g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta}) \) を変分パラメータ \( \mu \)、 \( \sigma \) で偏微分すれば各変分パラメータの更新の時に必要な近似勾配を得ることができます。\( \mu \)のほうはそのまま以下の通りです。</p>



<p>$$<br>\Delta_\mu = \frac{\partial g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta})}{\partial \mu} \tag{5.240}<br>$$</p>



<p>一方、\( \sigma \)のほうはガウス分布の制約上\( \sigma \)が正になっている必要があります。このため\( \sigma \)を \( \rho \) という変数を導入して以下のように計算されるものとします。</p>



<p>$$<br>\sigma = \ln (1 + \exp(\rho)) \tag{5.241.1}<br>$$</p>



<p>これにより \( \sigma \) ではなく、制約のない\( \rho \) を新たな変分パラメータとして使えるようになり\( \rho \) のほうを更新していけばよいことになりました。このため、\( \rho \) の更新に必要な勾配の近似を\( g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta}) \) を\(\rho\) の偏微分することで得ます。これは以下のようになります。</p>



<p>$$ \begin{align*}<br>\Delta_\rho &amp;= \frac{\partial g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta})}{\partial \rho}\\<br>&amp;= \frac{\partial g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta})}{\partial \sigma} \frac{\partial \sigma}{\partial \rho} \tag{5.241}<br>\end{align*} $$</p>



<p>1行目から2行目の変換では合成関数の偏微分を活用してます。これにより、それぞれの変分パラメータに必要な勾配の近似が計算できます。</p>



<p>ここから式(5.240)、(5.241)に出てくる偏微分を具体的に計算していきます。この変形も自分はぱっと導出できなかったので詳しく書きます。まず、本では以下のように書かれています。</p>



<p>$$ \begin{align*}<br>\frac{\partial g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta})}{\partial \mu} = &amp; \frac{\partial}{\partial \mu} \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) <br>&#8211; \frac{\partial}{\partial \mu} \ln p(\boldsymbol{\tilde{W}}) \\<br>&amp; &#8211;  \sum_{n=1}^N \frac{\partial}{\partial \mu} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \tag{5.244}<br>\end{align*} $$</p>



<p>$$ \begin{align*}<br>\frac{\partial g(\boldsymbol{\tilde{W}}, \boldsymbol{\eta})}{\partial \sigma} = &amp; \frac{\partial}{\partial \sigma} \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) <br>&#8211; \frac{\partial}{\partial \sigma} \ln p(\boldsymbol{\tilde{W}}) \\<br>&amp; &#8211;  \sum_{n=1}^N \frac{\partial}{\partial \sigma} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \boldsymbol{\tilde{\epsilon}} \tag{5.245}<br>\end{align*} $$</p>



<p>$$<br>\frac{\partial \sigma}{\partial \rho} = \frac{1}{1 + \text{exp}(-\rho)} \tag{5.246}<br>$$</p>



<p>ここで登場する\( \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) \) と \( \ln p(\boldsymbol{\tilde{W}}) \) に対する各偏微分は以下のようになると本にはあります。</p>



<p>$$ \begin{align*}<br>\frac{\partial}{\partial \mu} \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) &amp; = 0 \tag{5.247} \\<br>\frac{\partial}{\partial \mu} \ln p(\boldsymbol{\tilde{W}}) &amp;= &#8211; \lambda \tilde{w} \tag{5.248} \\<br>\frac{\partial}{\partial \sigma} \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) &amp; = &#8211; \frac{1}{\sigma} \tag{5.249} \\<br>\frac{\partial}{\partial \sigma} \ln p(\boldsymbol{\tilde{W}}) &amp;= &#8211; \lambda \tilde{w} \tilde{\epsilon} \tag{5.250}<br>\end{align*} $$</p>



<p>これが本の説明でした。ここからは本で省略されているこの式の導出までの流れを詳しく書いていきます。まず、式(5.244)、式(5.245) の3項目の導出がわかりにくかったので、詳しく書きます。3項目の \( \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \) は \( \boldsymbol{\tilde{W}} \) の関数です。\( \boldsymbol{\tilde{W}} \) は再パラメータ化トリックによっての\( \mu \) から計算される値になっています。このため\( \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \) を\( \mu \)で偏微分する際には合成関数の偏微分を利用します。これは以下のようになります。<br>$$<br>\frac{\partial}{\partial \mu} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) = \frac{\partial}{\partial \tilde{w}} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \frac{\partial \tilde{w}}{\partial \mu} \tag{5.244.1}<br>$$<br>ここで\( \frac{\partial \tilde{w}}{\partial \mu} \) の部分は式(5.237) の再パラメータ化トリックの時の式より、以下のようになります。<br>$$\begin{align*}<br>\frac{\partial \tilde{w}}{\partial \mu} = &amp; \frac{\partial }{\partial \mu}\left( \mu + \sigma \tilde{\epsilon} \right) \\<br>= &amp; 1 \tag{5.244.2}<br>\end{align*}$$<br>式(5.244.1)と式(5.244.2) の結果から \(\ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \) の \( \mu \) による偏微分は以下のようになります。</p>



<p>$$ \begin{align*}<br>\frac{\partial}{\partial \mu} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) = &amp; \frac{\partial}{\partial \tilde{w}} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \frac{\partial \tilde{w}}{\partial \mu} \\<br>= &amp; \frac{\partial}{\partial \tilde{w}} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \tag{5.244.3}<br>\end{align*}$$<br>これで式(5.244) の3項目の部分の導出ができました。次に式(5.245) の3項目の部分も導出します。流れは式(5.244)のときとほぼ同様ですので、違う部分だけ書きます。\( \tilde{w} \) を \( \sigma\) で偏微分すると以下のようになります。<br>$$\begin{align*}<br>\frac{\partial \tilde{w}}{\partial \sigma} = &amp; \frac{\partial }{\partial \sigma}\left( \mu + \sigma \tilde{\epsilon} \right) \\<br>= &amp; \tilde{\epsilon}  \tag{5.245.1}<br>\end{align*}$$</p>



<p>式(5.245.1)の結果を使うと以下のようになります。<br>$$ \begin{align*}<br>\frac{\partial}{\partial \sigma} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) = &amp; \frac{\partial}{\partial \tilde{w}} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \frac{\partial \tilde{w}}{\partial \sigma} \\<br>= &amp; \frac{\partial}{\partial \tilde{w}} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \tilde{\epsilon} \tag{5.245.2}<br>\end{align*}$$</p>



<p>これで式(5.245)の3項目が導出できました。<br>次に式 (5.247) から(5.250) も導出していきます。まず、式 (5.247)を導出します。\( \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) \) は再パラメータ化トリックが使われています。これは式(5.234) を使うと以下のようになります。</p>



<p>$$ \begin{align*}<br>\ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) = &amp; \ln \prod_{m=1}^M \prod_{d=1}^D \mathcal{N}(\tilde{w}_{m,d}|\mu_{m,d},\sigma_{m,d}^2) \\<br>= &amp; \sum_{m=1}^M \sum_{d=1}^D \ln \mathcal{N}(\tilde{w}_{m,d}|\mu_{m,d},\sigma_{m,d}^2) \tag{5.247.1}<br>\end{align*} $$<br><br>次に\( \ln \mathcal{N}(\tilde{w}_{m,d}|\mu_{m,d},\sigma_{m,d}^2) \) に注目して変形します。本にガウス分布で対数を取った式 (2.65)が載っています。<br>$$<br>\ln \mathcal{N}(x | \mu, \sigma^2) = &#8211; \frac{1}{2}\{ \frac{(x-\mu)^2}{\sigma^2} + \ln \sigma^2 + \ln 2\pi \} \tag{2.65}<br>$$<br>この式(2.65) を使って\( \ln \mathcal{N}(\tilde{w}_{m,d}|\mu_{m,d},\sigma_{m,d}^2) \)を式変形します。 ここでは要素のインデックスは省略します。<br>$$<br>\ln \mathcal{N}(\tilde{w} | \mu, \sigma^2) = &#8211; \frac{1}{2}\{ \frac{(\tilde{w}-\mu)^2}{\sigma^2} + \ln \sigma^2 + \ln 2\pi \} \tag{5.247.2}<br>$$<br>次に 式(5.237) を使って\( \tilde{w} \) を置き換えて式を整理すると以下のようになります。<br>$$ \begin{align*}<br>\ln \mathcal{N}(\tilde{w} | \mu, \sigma^2) = &amp;  &#8211; \frac{1}{2}\{ \frac{(\mu + \sigma\tilde{\epsilon}-\mu)^2}{\sigma^2} + \ln \sigma^2 + \ln 2\pi \} \\<br> = &amp;- \frac{1}{2}\left( \tilde{\epsilon}^2 + \ln \sigma^2 + \ln 2\pi \right) \tag{5.247.3} \end{align*} $$</p>



<p>式(5.247.1) と式(5.247.3) を使って \( \frac{\partial}{\partial \mu} \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) \) の式変形をしてみます。ここでは分かりやすさ重視でインデクスを付けます。</p>



<p>$$ \begin{align*}<br>\frac{\partial}{\partial \mu_{m,d}} \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) &amp;= \frac{\partial}{\partial \mu_{m,d}} \sum_{m=1}^M \sum_{d=1}^D \ln \mathcal{N}(\tilde{w}_{m,d}|\mu_{m,d},\sigma_{m,d}^2) \\<br>&amp;= \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \mu_{m,d}} \ln \mathcal{N}(\tilde{w}_{m,d}|\mu_{m,d},\sigma_{m,d}^2) \\<br>&amp;=  \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \mu_{m,d}} \{- \frac{1}{2}\left( \tilde{\epsilon}^2 + \ln \sigma_{m,d}^2 + \ln 2\pi \right) \} \\<br>&amp;= -\frac{1}{2} \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \mu_{m,d}} \left( \tilde{\epsilon}^2 + \ln \sigma_{m,d}^2 + \ln 2\pi \right) \\<br>&amp;= 0 \tag{5.247.4}<br>\end{align*} $$</p>



<p>これで式 (5.247)が導出されました。式(5.249) も式(5.247.1) と式(5.247.3)を使って同様の流れで導出できます。<br>$$ \begin{align*}<br>\frac{\partial}{\partial \sigma_{m,d}} \ln q(\boldsymbol{\tilde{W}};\boldsymbol{\eta}) &amp;= \frac{\partial}{\partial \sigma_{m,d}} \sum_{m=1}^M \sum_{d=1}^D \ln \mathcal{N}(\tilde{w}_{m,d}|\mu_{m,d},\sigma_{m,d}^2) \\<br>&amp;= \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \sigma_{m,d}} \ln \mathcal{N}(\tilde{w}_{m,d}|\mu_{m,d},\sigma_{m,d}^2) \\<br>&amp;=  \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \sigma_{m,d}} \{- \frac{1}{2}\left( \tilde{\epsilon}^2 + \ln \sigma_{m,d}^2 + \ln 2\pi \right) \} \\<br>&amp;= -\frac{1}{2} \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \sigma_{m,d}} \left( \tilde{\epsilon}^2 + \ln \sigma_{m,d}^2 + \ln 2\pi \right) \\<br>&amp;= -\frac{1}{2} \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \sigma_{m,d}} \ln \sigma_{m,d}^2 \\<br>&amp;= -\frac{1}{2} \frac{2}{\sigma_{m,d}} \\<br>&amp;= &#8211; \frac{1}{\sigma_{m,d}} \tag{5.249}<br>\end{align*} $$</p>



<p>これで式 (5.249)も導出できました。次に(5.248)の導出を行います。まずは \( \ln p(\boldsymbol{\tilde{W}}) \) を 式 (5.230) を使って式変形します。<br>$$ \begin{align*}<br>\ln p(\boldsymbol{\tilde{W}}) = &amp; \ln \prod_{m=1}^M \prod_{d=1}^D \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \\<br>= &amp; \sum_{m=1}^M \sum_{d=1}^D \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \tag{5.248.1}<br>\end{align*} $$</p>



<p>式(5.248.1)を使って\( \frac{\partial}{\partial \mu} \ln p(\boldsymbol{\tilde{W}}) \) を式変形していきます。</p>



<p>$$ \begin{align*}<br>\frac{\partial}{\partial \mu_{m,d}} \ln p(\boldsymbol{\tilde{W}}) = &amp; \frac{\partial}{\partial \mu_{m,d}} \sum_{m=1}^M \sum_{d=1}^D \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \\<br>= &amp; \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \mu_{m,d}} \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \tag{5.248.2}<br>\end{align*} $$</p>



<p>ここで式 (5.237) より、\( \tilde{w}_{m,d} \) は \( \mu_{m,d} \) の式なので合成関数の偏微分を使います。式 (5.244.2) も利用すると式 (5.248.2) は以下のように式変形できます。</p>



<p>$$ \begin{align*}<br>\frac{\partial}{\partial \mu_{m,d}} \ln p(\boldsymbol{\tilde{W}}) = &amp;  \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \mu_{m,d}} \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \\<br>= &amp; \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \tilde{w}_{m,d}} \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \frac{\partial \tilde{w}_{m,d} }{\partial \mu_{m,d}} \\<br>= &amp; \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \tilde{w}_{m,d}} \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) <br>\tag{5.248.3}<br>\end{align*} $$</p>



<p>次にガウス分布で対数を取った式 (2.65)を使って\( \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \)の部分を式変形すると以下のようになります。</p>



<p>$$ \begin{align*}<br>\ln \mathcal{N}(\tilde{w} | 0, \lambda^{-1}) =&amp; &#8211; \frac{1}{2}\left( \frac{\tilde{w}^2}{\lambda^{-1}} + \ln \lambda^{-1} + \ln 2\pi \right) \\<br>=&amp; &#8211; \frac{1}{2}\left( \lambda \tilde{w}^2 &#8211; \ln \lambda + \ln 2\pi \right) \tag{5.248.2}<br>\end{align*} $$</p>



<p>インデックスは省略しています。これを使って式 (5.248.3) の式変形をすると以下のようになります。</p>



<p>$$ \begin{align*}<br>\frac{\partial}{\partial \mu_{m,d}} \ln p(\boldsymbol{\tilde{W}}) <br>= &amp; \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \tilde{w}_{m,d}} \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \\<br>=&amp; \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \tilde{w}_{m,d}} \{ &#8211; \frac{1}{2}\left( \lambda \tilde{w}_{m,d}^2 &#8211; \ln \lambda + \ln 2\pi \right) \} \\<br>=&amp; &#8211; \frac{1}{2} \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \tilde{w}_{m,d}} \left( \lambda \tilde{w}_{m,d}^2 &#8211; \ln \lambda + \ln 2\pi \right) \\<br>=&amp; &#8211; \frac{1}{2}  \left( 2 \lambda \tilde{w}_{m,d} \right) \\<br>=&amp; &#8211; \lambda \tilde{w}_{m,d} \tag{5.248.5}<br>\end{align*} $$</p>



<p>これで式 (5.248) が導出できました。式(5.250)の導出もほぼ同じです。\( \frac{\partial}{\partial \sigma} \ln p(\boldsymbol{\tilde{W}}) \) を式 (5.248.1)、(5.248.2)、(5.245.1) を使って式変形していきます。</p>



<p>$$ \begin{align*}<br>\frac{\partial}{\partial \sigma_{m,d}} \ln p(\boldsymbol{\tilde{W}}) = &amp;<br>\frac{\partial}{\partial \sigma_{m,d}} \sum_{m=1}^M \sum_{d=1}^D \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \\<br>= &amp; \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial \sigma_{m,d}} \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \\<br>=&amp; \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial  \tilde{w}_{m,d}} \{ \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \} \frac{\tilde{w}_{m,d}}{\partial \sigma_{m,d}} \\<br>=&amp; \sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial  \tilde{w}_{m,d}} \{ \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \} \tilde{\epsilon} \tag{5.250.1}<br>\end{align*} $$</p>



<p>式(5.250.1) から式(5.248.5)のときと同様の式変形を行うと以下のようになります。<br>$$ \begin{align*}<br>\frac{\partial}{\partial \sigma_{m,d}} \ln p(\boldsymbol{\tilde{W}}) = &amp;<br>\sum_{m=1}^M \sum_{d=1}^D \frac{\partial}{\partial  \tilde{w}_{m,d}} \{ \ln \mathcal{N} (\tilde{w}_{m,d}|0, \lambda^{-1}) \} \tilde{\epsilon} \\ <br>=&amp; (- \lambda \tilde{w}_{m,d}) \tilde{\epsilon} \\<br>=&amp; &#8211; \lambda \tilde{w}_{m,d} \tilde{\epsilon}<br>\tag{5.250.2}<br>\end{align*} $$</p>



<p>これで式(5.250) の式も導出できました。</p>



<p>それでは式(5.244)と(5.245) の3項目に出てくる \( \frac{\partial}{\partial \sigma} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{\tilde{W}}) \) の部分を具体的に計算していきます。まず、本と同じように以下のように誤差関数 \( E_n \) を定義します。</p>



<p>$$<br>E_n = &#8211; \ln p ( \boldsymbol{y}_n | \boldsymbol{x}_n, \boldsymbol{W} ) \tag {5.251}<br>$$</p>



<p>この\( E_n \) を使うと以下のようになります。</p>



<p>$$<br>\frac{\partial}{\partial \tilde{w}} \ln p ( \boldsymbol{y}_n |  \boldsymbol{x}_n,  \boldsymbol{W} ) = &#8211; \frac{\partial}{\partial \tilde{w}} E_n \tag{5.252}<br>$$</p>



<p>この後ソフトマックス関数に関する微分公式 (A.33) が使われているので、先に解説します。<br>入力 \( \boldsymbol{a} \in \mathbb{R}^D \) としたとき、ソフトマックス関数の\( d \) 次元目の出力は以下のようになります。<br>$$<br>\text{SM}_d(\boldsymbol{a}) = \frac{\exp(a_{d})}{\sum_{d^{\prime}=1}^{D} \exp(a_{d^{\prime}})}<br>$$<br>インデックスは本とは違いロジスティック回帰のものに合わせています。</p>



<p>このソフトマックス関数の \( \boldsymbol{a} \) の\( d \) 次元目の偏微分は以下のようになります。<br>$$<br>\frac{\partial}{\partial a_{d}} SM_d(\boldsymbol{a}) = \begin{cases} <br>\text{SM}_d(\boldsymbol{a})(1 &#8211; \text{SM}_d(\boldsymbol{a}))  &amp; \text{if \( d^{\prime} = d \)} \\<br>-\text{SM}_d(\boldsymbol{a})\text{SM}_{d^{\prime}}(\boldsymbol{a}) &amp; \text{otherwise} \\ <br>\end{cases} \tag{A.33}<br>$$<br><br>どの次元の偏微分かによって結果が違うので注意してください。このソフトマックス関数の偏微分の公式を使うと次の式のようになると本にはあります。</p>



<p>$$<br>\frac{\partial}{\partial \tilde{w}_{m,d}} E_n = \lbrace \text{SM}_d (\boldsymbol{\tilde{W}}^\mathrm{T} \boldsymbol{x}_n) &#8211; y_{n,d} \rbrace x_{n,m} \tag{5.253}<br>$$ </p>



<p>この式(5.253) の導出も初見では分からなかったので詳しく書いていきます。</p>



<p>まず、\( \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \tilde{\boldsymbol{W}} ) \) を具体的にしていきます。これはカテゴリ分布が使われているのでカテゴリ分布の定義を確認していきます。\( \boldsymbol{s} \) を \( \boldsymbol{s} \in \{0,1\}^K \) でかつ \( \sum_{k=1}^K s_k = 1 \) のベクトルとし、カテゴリ分布のパラメータ \( \pi \) を \( \pi \in (0, 1)^K \) でかつ \( \sum_{k=1}^K \pi_k = 1 \)とします。このときカテゴリ分布は以下のように定義されます。<br>$$<br>\text{Cat}(\boldsymbol{s}|\boldsymbol{\pi}) = \prod_{k=1}^K \pi_k^{s_k} \tag{2.29}<br>$$</p>



<p>このカテゴリ分布の定義と式(5.229)、 (5.231)、(5.232)から以下のようになります。<br>$$ \begin{align*}<br> \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \tilde{\boldsymbol{W}} ) =&amp; \ln \text{Cat}(\boldsymbol{y}_n | f(\tilde{\boldsymbol{W}}, \boldsymbol{x}_n) \\<br>=&amp; \ln \prod_{d=1}^D f_d(\tilde{\boldsymbol{W}}, \boldsymbol{x}_n)^{y_d} \\<br>=&amp; \sum_{d=1}^D \ln f_d(\tilde{\boldsymbol{W}}, \boldsymbol{x}_n)^{y_d} \\<br>=&amp; \sum_{d=1}^D y_d\ln f_d(\tilde{\boldsymbol{W}}, \boldsymbol{x}_n) \\<br>=&amp; \sum_{d=1}^D y_d\ln \text{SM}_d(\tilde{\boldsymbol{W}}^\mathrm{T} \boldsymbol{x}_n) <br>\tag{5.253.1}<br>\end{align*} $$<br>次に\( E_n \) を \( \tilde{w}_{m,d} \) で偏微分をする前に以下のような\( \boldsymbol{a}_{n} \) を定義します。また、後ほど使う\( \boldsymbol{a}_{n} \)の\( d \) 次元目 (\( a_{n,d} \))を\( \tilde{w}_{m,d} \) で偏微分した式も合わせて示します。<br>$$\begin{align*}<br>\boldsymbol{a}_{n} =&amp; \tilde{\boldsymbol{W}}^\mathrm{T} \boldsymbol{x}_n　\tag{5.253.2} \\<br>\frac{\partial}{\partial \tilde{w}_{m,d}} a_{n,d} =&amp; \frac{\partial}{\partial \tilde{w}_{m,d}} \tilde{\boldsymbol{W}_{:,d}}^\mathrm{T} \boldsymbol{x}_n \\<br>=&amp;  x_{n,m}<br>\tag{5.253.3}<br>\end{align*} $$<br>この式(5.253.1)、(5.253.2)、(5.253.3)を使って\( E_n \) を \( \tilde{w}_{m,d} \) で偏微分の式変形をしていくと以下のようになります。<br>$$\begin{align*}<br>\frac{\partial}{\partial \tilde{w}_{m,d}} E_n =&amp; \frac{\partial}{\partial \tilde{w}_{m,d}} (- \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \tilde{\boldsymbol{W}} ) ) \\<br>=&amp; &#8211; \frac{\partial}{\partial \tilde{w}_{m,d}} \ln p(\boldsymbol{y}_n | \boldsymbol{x}_n, \tilde{\boldsymbol{W}} )  \\<br>=&amp; &#8211; \frac{\partial}{\partial \tilde{w}_{m,d}} \sum_{d^{\prime}=1}^D y_{d^{\prime}} \ln \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \\<br>=&amp; &#8211; \frac{\partial}{\partial  a_{n,d}} \lbrace \sum_{d^{\prime}=1}^D y_{d^{\prime}} \ln \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \rbrace  \frac{\partial  a_{n,d}}{\partial \tilde{w}_{m,d}} \\<br>=&amp; &#8211; \frac{\partial}{\partial  a_{n,d}} \lbrace \sum_{d^{\prime}=1}^D y_{d^{\prime}} \ln \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \rbrace  x_{n,m} \\<br>=&amp; &#8211; \lbrace \sum_{d^{\prime}=1}^D y_{d^{\prime}} \frac{\partial}{\partial  a_{n,d}} \ln \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \rbrace  x_{n,m} \\<br>=&amp; &#8211; \lbrace \sum_{d^{\prime}=1}^D y_{d^{\prime}} \frac{1}{\text{SM}_{d^{\prime}}(\boldsymbol{a}_n)} \frac{\partial}{\partial  a_{n,d}} \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \rbrace  x_{n,m} \\ <br>=&amp; &#8211; \lbrace \sum_{d^{\prime}=1}^D \frac{y_{d^{\prime}}}{\text{SM}_{d^{\prime}}(\boldsymbol{a}_n)} \frac{\partial}{\partial  a_{n,d}} \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \rbrace  x_{n,m}<br>\tag{5.253.4}<br>\end{align*}$$<br>実は式 (5.253.4) の途中の式変形からディープラーニングでお馴染みのソフトマックス関数とクロスエントロピーの偏微分の形と同じ形になります。なので、これ以降の式変形がわからなければソフトマックス関数とクロスエントロピーの偏微分で調べるとよいかもしれません。<br>ここで、ソフトマックス関数の偏微分公式 (A.33) を使います。ソフトマックス関数の偏微分は\( d\) 次元目とそれ以外で分岐しています。このため、\( d\) 次元目だけsumの外に一時的に出して偏微分し、またsumでまとめるということをします。ここからは式 (5.253.4) のsumの部分だけ式変形していきます。<br>$$\begin{align*}<br>&amp; \sum_{d^{\prime}=1}^D \frac{y_{d^{\prime}}}{\text{SM}_{d^{\prime}}(\boldsymbol{a}_n)} \frac{\partial}{\partial  a_{n,d}} \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \\<br>&amp; \ = \frac{y_{d}}{\text{SM}_{d}(\boldsymbol{a}_n)} \frac{\partial}{\partial  a_{n,d}} \text{SM}_{d}(\boldsymbol{a}_n) \\<br>&amp; \qquad + \sum_{d^{\prime}=1, d^{\prime} \neq d}^D \frac{y_{d^{\prime}}}{\text{SM}_{d^{\prime}}(\boldsymbol{a}_n)} \frac{\partial}{\partial  a_{n,d}} \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \\<br>&amp; \ = \frac{y_{d}}{\text{SM}_{d}(\boldsymbol{a}_n)} \text{SM}_d(\boldsymbol{a}_n)(1 &#8211; \text{SM}_d(\boldsymbol{a}_n)) \\<br>&amp; \qquad + \sum_{d^{\prime}=1, d^{\prime} \neq d}^D \frac{y_{d^{\prime}}}{\text{SM}_{d^{\prime}}(\boldsymbol{a}_n)} \lbrace -\text{SM}_d(\boldsymbol{a})\text{SM}_{d^{\prime}}(\boldsymbol{a}) \rbrace \\<br>&amp; \ = y_{d}(1 &#8211; \text{SM}_d(\boldsymbol{a}_n)) &#8211; \sum_{d^{\prime}=1, d^{\prime} \neq d}^D y_{d^{\prime}}\text{SM}_d(\boldsymbol{a})\\<br>&amp; \ = y_{d} &#8211; y_{d}\text{SM}_d(\boldsymbol{a}_n) &#8211; \sum_{d^{\prime}=1, d^{\prime} \neq d}^D y_{d^{\prime}}\text{SM}_d(\boldsymbol{a})\\<br>&amp; \ = y_{d} &#8211; \sum_{d^{\prime}=1}^D y_{d^{\prime}}\text{SM}_d(\boldsymbol{a}) \\<br>&amp; \ = y_{d} &#8211; \text{SM}_d(\boldsymbol{a}) \sum_{d^{\prime}=1}^D y_{n,d^{\prime}}<br>\tag{5.253.5} \\<br>\end{align*} $$<br>ここで\( \sum_{d=1}^D y_{n,d} = 1 \) を使うと以下のようになります。<br>$$\begin{align*}<br>\sum_{d^{\prime}=1}^D \frac{y_{d^{\prime}}}{\text{SM}_{d^{\prime}}(\boldsymbol{a}_n)} \frac{\partial}{\partial  a_{n,d}} \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) =&amp; y_{d} &#8211; \text{SM}_d(\boldsymbol{a}) \sum_{d^{\prime}=1}^D y_{n,d^{\prime}} \\<br>=&amp; y_{n,d} &#8211; \text{SM}_d(\boldsymbol{a}) \tag{5.253.6}<br>\end{align*} $$</p>



<p id="式-5-253-4-5-253-6-の結果から以下のようになります-begin-align-frac-partial-partial-tilde-w-m-d-e-n-lbrace-sum-d-prime-1-d-frac-y-d-prime-text-sm-d-prime-boldsymbol-a-n-frac-partial-partial-a-n-d-text-sm-d-prime-boldsymbol-a-n-rbrace-x-n-m-lbrace-y-n-d-text-sm-d-boldsymbol-a-rbrace-x-n-m-lbrace-text-sm-d-boldsymbol-a-y-n-d-rbrace-x-n-m-tag-5-253-7-end-align-これで式-5-253-が導出できました-これで式-5-240-5-241-が具体的に計算できるようになりました-式-5-240-5-241-が計算できれば学習率を-gamma-0-とすると以下のようにすれば変分パラメータの更新が行えます-begin-align-mu-leftarrow-mu-gamma-delta-mu-tag-5-242-rho-leftarrow-rho-gamma-delta-rho-tag-5-243-end-align-これで無事にロジスティック回帰の部分の式は導出できました-終わりに">式(5.253.4), (5.253.6)の結果から以下のようになります。<br>$$\begin{align*}<br>\frac{\partial}{\partial \tilde{w}_{m,d}} E_n =&amp; &#8211; \lbrace \sum_{d^{\prime}=1}^D \frac{y_{d^{\prime}}}{\text{SM}_{d^{\prime}}(\boldsymbol{a}_n)} \frac{\partial}{\partial  a_{n,d}} \text{SM}_{d^{\prime}}(\boldsymbol{a}_n) \rbrace  x_{n,m} \\<br>=&amp; &#8211; \lbrace y_{n,d} &#8211; \text{SM}_d(\boldsymbol{a}) \rbrace x_{n,m} \\<br>=&amp; \lbrace \text{SM}_d(\boldsymbol{a}) &#8211; y_{n,d} \rbrace x_{n,m}<br>\tag{5.253.7}\\<br>\end{align*} $$<br>これで式(5.253) が導出できました。これで式(5.240)、(5.241)が具体的に計算できるようになりました。式(5.240)、(5.241)が計算できれば学習率を \( \gamma &gt; 0 \) とすると以下のようにすれば変分パラメータの更新が行えます。<br> $$\begin{align*}<br>\mu \leftarrow \mu &#8211; \gamma \Delta_\mu \tag{5.242} \\<br>\rho \leftarrow \rho &#8211; \gamma \Delta_\rho \tag{5.243} \\<br>\end{align*} $$<br>これで無事に本のロジスティック回帰の変分推論の部分の式は導出できました。</p>



<h1 class="wp-block-heading" id="最後に">最後に</h1>



<p>今回、「ベイズ推論による機械学習入門」5.6ロジスティック回帰の式の導出を真面目にやったのでいい機会なのでblogにするかと軽い気持ちで書き始めましたが、いざ書き始めると自分の理解が不十分なところが多くあることに気が付き、理解を深める良い機会になりました。また、私自身、教科書で分からないときは他の方の式導出のblog記事が大変参考になったので、今後、また機会があれば私もこのような記事を書いていこうと思います。ただ、この手の記事を書く際、mathjaxによる式の打ち込みにすごい時間がかかることがわかったので、mathjaxによる式の打ち込み速度を上げる工夫も合わせて考えていきたいと思います。</p><p>The post <a href="https://www.mattari-benkyo-note.com/2022/02/24/bayes-book-5-6/">[勉強ノート]「ベイズ推論による機械学習入門」5.6ロジスティック回帰</a> first appeared on <a href="https://www.mattari-benkyo-note.com">まったり勉強ノート</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.mattari-benkyo-note.com/2022/02/24/bayes-book-5-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">250</post-id>	</item>
	</channel>
</rss>
