DTPなどの概要の調査|版組みの達人を目指す #1

f:id:lib-arts:20201123233433j:plain

ブログの内容はどうしても発散しがちなので、定期的にブログの内容を元に再編したテキストの公開を行っています。が、テキストも数を出すうちにどうしても細かいレイアウトが気になってきたので、版組みを極めようじゃないかということで新規シリーズを作成しました。
#1では、とりあえず概要の調査、把握を行えればと思います。
1. 現状や目標のラフな整理
2. 版組み・DTP(Desktop publishing)の概要
3. まとめ

 

1. 現状や目標のラフな整理
あまり何も考えずに調査しても大変なので、現在メインで作成している形式であるpdf形式とepub形式を中心に版組みの質を向上させることをこのシリーズでの目的とします。
現在版組みのソフトとしてはRe:VIEWを用いており、pdf形式の作成はなかなか整ったものが作成できる一方で、epub形式の作成があまりうまくいっていません。特に、本文中に\displaystyle \frac{1}{2} mv(t)^2 + \frac{1}{2}kx(t)^2 = Const.のように数式を用いる場合の表示のレイアウトが非常に崩れます。

f:id:lib-arts:20201123233656p:plain

具体的には上記のように、本文中の数式が他の文章の中心からずれるという事態が生じています。改行することである程度整えることはできるのですが、(p,x)空間とする際に一々改行していてはかなり読みにくいです。また、数式のフォント、文字のフォントの設定などもなかなか大変です。

f:id:lib-arts:20201123234045p:plain

f:id:lib-arts:20201123234113p:plain

Re:VIEWでpdfを作成する場合は上記のように比較的整った形式で作成できるのですが、Kindleなど向けに作成する場合となると、やはりepub形式ももう少ししっかり作成する必要が生じます。

共著など行うこともあり、ある程度レイアウトはしっかり整えねばならないと思われるため、特に「epub形式における数式の取り扱い」を中心に当シリーズでは知見を得ていきたいと考えています。

大体の目標や現状については整理できたので1節はここまでとします。

 

2. 版組み・DTP(Desktop publishing)の概要
2節では実際に細かい内容の確認に入っていく前段階として、改めて版組みやDTP(Desktop publishing)の概要について確認を行いたいと思います。

組版 - Wikipedia

DTP - Wikipedia

上記のWikipediaの内容を主に参照します。

f:id:lib-arts:20201123235007p:plain
まず、組版(版組み)の概要ですが、上記のように「原稿及びレイアウトの指定に従って、文字・図版・写真などを配置する作業の総称」と理解しておくと良さそうです。

f:id:lib-arts:20201123235219p:plain
上記の記載では近年では「DTP(Desktop publishing)においてもレイアウトソフトを用いて紙面を作ることを指して、版組みと表現する」とあります。あまり深く考えずに、何かしらを印刷や出版する形式に仕上げることを指すと認識しておけば良さそうです。

f:id:lib-arts:20201123235530p:plain

また、DTPは日本語で卓上出版を指し、PC上で版組みを行いプリンターで出力を行うことと認識しておくと良さそうです。

f:id:lib-arts:20201123235736p:plain

DTPのこれまでの経緯としては「PageMaker」を先駆けとして様々なソフトが紹介されています。PCにプリインのワードプロセッサーでも簡単なDTP機能はあるものの、専用のDTPソフトを用いることでより整ったデザインの印刷物が制作できるとあります。

近年ではPCでプリインで入っていたり、HTML・CSSなども一種の版組みと言えるので、「版組み」としてそれほど意識する機会は少ないのかもしれません。

大体の概要についてつかめたので2節はここまでとします。


3. まとめ
#1では現状や目的の整理と版組みやDTPの言葉の整理を行いました。
概要はつかめたので#2では現状製本時に用いているRe:VIEWについて簡単に確認してみようと思います。

Pythonを用いた誤差逆伝播(Backpropagation)の実装|微分をプログラミングする #4

f:id:lib-arts:20201122221644p:plain

当シリーズでは、近年の深層学習の発展に関連するトレンド的に微分のプログラミングの重要度は増していると思われるので、関連文脈の取りまとめを行なっています。
#1、#2、#3では自動微分の概要やSurvey論文の参照や誤差逆伝播と自動微分の関係性の確認を行いました。

#4では自動微分誤差逆伝播を実際にPythonで実装してみます。
以下、目次になります。
1. 自動微分Python実装
2. 誤差逆伝播Python実装
3. まとめ


1. 自動微分Python実装
1節では自動微分Python実装について取り扱います。

f:id:lib-arts:20201121152206p:plain

例としては#2で取り扱った上記の「トップダウン型自動微分」について取り扱います。

import numpy as np

class GraphComputation:
    def __init__(self, x1, x2):
        self.v_1 = x1
        self.v0 = x2
        self.v1 = np.log(self.v_1)
        self.v2 = self.v_1*self.v0
        self.v3 = np.sin(self.v0)
        self.v4 = self.v1 + self.v2
        self.v5 = - self.v3 + self.v4

    def calc_derivative(self):
        self.rev_d_v5 = 1
        self.rev_d_v4 = self.rev_d_v5*1
        self.rev_d_v3 = self.rev_d_v5*(-1)
        self.rev_d_v2 = self.rev_d_v4*1
        self.rev_d_v1 = self.rev_d_v4*1
        self.rev_d_v0 = self.rev_d_v3*np.cos(self.v0)
        self.rev_d_v_1 = self.rev_d_v2*self.v0
        self.rev_x2 = self.rev_d_v0 + self.rev_d_v2*self.v_1
        self.rev_x1 = self.rev_d_v_1 + self.rev_d_v1/self.v_1

関連の処理を上記の計算グラフとして実装しました。クラスでの記述としたのは関数とすると返り値の受取りなどの記述が複雑になると思われたためです。これを用いて、まずはFowardの値の計算を行いますが、これは__init__で計算ができます。

func_graph = GraphComputation(2, 5)
print(func_graph.v5)

f:id:lib-arts:20201123181128p:plain

ここで得られた"func_graph.v5"は、#2で取り扱った結果と一致していることが確認できます。また、この際のx_1x_2に関する偏微分も計算してみましょう。calc_derivativeメソッドを実行することで、こちらについては結果を得ることができます。

func_graph.calc_derivative()
print(func_graph.rev_x1)
print(func_graph.rev_x2)

f:id:lib-arts:20201123181610p:plain

上記で得られた結果も#2の図に計算結果における偏微分の結果と一致していることが確認できます。

自動微分Python実装について取り扱えたので1節はここまでとします。

 

2. 誤差逆伝播Python実装
2節では誤差逆伝播Python実装について取り扱います。

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.arange(-2, 5, 0.1)
v_in = 2*x - 1
v_out = np.maximum(0, v_in)
t = 5*v_out + 1

plt.scatter(x, v_in)
plt.scatter(x, v_out, color="green")
plt.scatter(x, t, color="red")
plt.show()

f:id:lib-arts:20201123194821p:plain

まず、問題設定ですが、上記を扱うものとします。図において、赤が予測する関数、青が活性化関数への入力、緑が活性化関数の出力を表しています。

class CalcGraph:
    def __init__(self, x, t, eta):
        self.x = x
        self.t = t
        self.eta = eta
        self.w1 = 1
        self.b1 = 1
        self.w2 = 1
        self.b2 = 1

    def forward(self):
        self.v_in = self.w1 * self.x + self.b1
        self.relu_mask = 1.0*(self.v_in >= 0.0)
        self.v_out = np.maximum(0, self.v_in)
        self.y = self.w2 * self.v_out + self.b2
        self.loss = np.sum((self.t-self.y)**2)

    def backprop(self): self.y_grad = -2*(self.t-self.y)
        self.w2 = self.w2 - self.eta*np.sum(self.y_grad*self.v_out)/self.x.shape[0]
        self.b2 = self.b2 - self.eta*np.sum(self.y_grad)/self.x.shape[0]
        self.w1 = self.w1 - self.eta*self.w2*np.sum(self.y_grad*self.relu_mask*self.x)/self.x.shape[0]
        self.b1 = self.b1 - self.eta*self.w2*np.sum(self.y_grad*self.relu_mask)/self.x.shape[0]

これをニューラルネットワークと同様の計算とみなし、順伝播と逆伝播の実装を行うと上記になります。

eta = 0.0002
g_calc = CalcGraph(x, t, eta)
for i in range(2000):
    g_calc.forward()
    g_calc.backprop()
    if i%500==0:
        print(g_calc.loss)

print(g_calc.w1, g_calc.w2, g_calc.b1, g_calc.b2)

f:id:lib-arts:20201123195648p:plain

上記のように実行することで学習を行うことができます。

f:id:lib-arts:20201123195727p:plain

また、上記では初期値による関数(緑)、学習後(青)、実測値(緑)の比較を行っています。学習後の青が緑に近づいていることが確認できます。


3. まとめ
#4では誤差逆伝播Python実装について取り扱いました。
#5では今回の実装を少し洗練させて多層パーセプトロン(MLP; Multi Layer Perceptron)について取り扱います。

誤差逆伝播(Backpropagation)と自動微分|微分をプログラミングする #3

f:id:lib-arts:20201122221644p:plain

当シリーズでは、近年の深層学習の発展に関連するトレンド的に微分のプログラミングの重要度は増していると思われるので、関連文脈の取りまとめを行なっています。
#1、#2では自動微分の概要やSurvey論文の参照を行いました。

#2の"Reverse mode AD"で誤差逆伝播(Backpropagation)に近しい話題となりましたので、#3ではトップダウン自動微分(Reverse mode AD)と誤差逆伝播について確認していきます。
以下、目次になります。
1. 誤差逆伝播(Backpropagation)の概要
2. 自動微分として見る誤差逆伝播
3. まとめ


1. 誤差逆伝播(Backpropagation)の概要
1節では誤差逆伝播の概要について確認します。日本語版のWikipediaを参照しようと考えたのですが、あまり良い記載ではなかったので英語版を参照します(https://en.wikipedia.org/wiki/Backpropagation)。

f:id:lib-arts:20201122221748p:plain

上記に概要が記載されており、ニューラルネットワークの学習においてバックプロパゲーションを用いることで「誤差関数(loss function)のパラメータ(weights)における勾配(gradient)計算を効率的に行う」と記載されています。これにより、勾配法を用いて多層のニューラルネットワークを学習させることができるとされています。

f:id:lib-arts:20201122222537p:plain

f:id:lib-arts:20201122222649p:plain

具体的な例における最小二乗誤差を考えているのが上記です。y = w_1 x_1 + w_2 x_2として予測した結果と実測のtの比較として二乗誤差関数が定義されています。このように定義した誤差関数をトップダウン自動微分の要領でそれぞれのw_iにおける勾配を計算していくのが誤差逆伝播法です。


2. 自動微分として見る誤差逆伝播
1節では具体的な計算はあまり確認しませんでしたが、理由としては主に#2で取り扱ったトップダウン型自動微分の要領で勾配の導出ができることがわかるからです。
誤差逆伝播の解説は少々ややこしい記載が多いので、自動微分を理解した上で計算グラフを構築し、トップダウン型自動微分の要領で勾配を計算するとだけ理解する方がスムーズだと思います。

f:id:lib-arts:20201121152206p:plain

#2では"Reverse mode AD"として上記について確認しましたが、こちらと同じような要領でw_iについて微分の値を求めているとだけ理解しておけば十分そうです。

f:id:lib-arts:20201122224028p:plain

冒頭部の第二パラグラフでは上記のように、バックプロパゲーション(Backpropagation)は自動微分(Automatic differentiation)の特殊なケースであると記載されています。


3. まとめ
#3は分量自体は少なくなりましたが、自動微分の文脈で誤差逆伝播を考えると非常にシンプルになるということがご理解いただけたのではないかと思います。
#4以降では自動微分バックプロパゲーションについて、実際にプログラミングしてみることで具体的なイメージをつかんでいけたらと思います。

メトロポリスヘイスティングス法における詳細釣り合い条件について|平衡(equilibrium)について理解する #2

f:id:lib-arts:20201121221930p:plain

当シリーズは確率過程や化学反応など、様々な場面で出てくる平衡(equilibrium)について理解することを目的とし、作成しています。
初回の#1では比較的取り扱いやすいと思われた化学平衡(Chemical equilibrium)について取り扱いました。

#2ではメトロポリスヘイスティングス法における詳細釣り合い(detailed balance)条件について確認を行います。
1. メトロポリスヘイスティングス法について
2. 詳細釣り合い条件について
3. まとめ


1. メトロポリスヘイスティングス法について
1節ではメトロポリスヘイスティングス法[1970]について簡単に確認します。ある程度簡略に記述を行いたいのでメトロポリス法[1953]についてはある程度既知であるものとして話を進めていきます。以下、Wikipediaの内容を中心に確認します(https://ja.wikipedia.org/wiki/メトロポリスヘイスティングス法)。

f:id:lib-arts:20201121222043p:plain

まず、簡単にだけメトロポリス法について確認します。上記のようにx_nを中心とした提案分布のQを考え、これに基づきサンプリングした値をx_{n+1}として採択するかしないかを考えるのがメトロポリス法です。

f:id:lib-arts:20201121222735p:plain

一方で、メトロポリスヘイスティングス法は採択率の計算において、上記のように提案分布Qに関する比率を考えています。メトロポリス法の解説と文字の置き方は異なっていますが、ここでxx_nと考えた際にx'x_{n+1}の候補として検討していることを理解しておきましょう。なので、提案分布のQに関する比率は、x'xxx'で割っているということです。こちらについては2節で詳しく確認します。

その他は基本的にメトロポリス法と同様なため、1節はここまでとします。


2. 詳細釣り合い条件について
2節ではメトロポリスヘイスティングス法における詳細釣り合い条件について考えます。

f:id:lib-arts:20201121223505p:plain

まず前提の認識として、P(x)に従ったサンプルの生成を行うにあたって、定常分布\pi(x)に収束するマルコフ連鎖を用いることを考えるとしています。この際に、「1.定常分布の存在」と「2. 定常分布の一意性」の二つの条件が満たされるとき、マルコフ連鎖は定常分布に収束するとされています。詳細釣り合い条件は「1. 定常分布の存在」について議論した条件です。#1における詳細釣り合い条件は「順反応と逆反応が起こる数が等しい」でしたが、ここではxx'の遷移確率がx'xの遷移確率と等しいことと対応しています。\pi(x)P(x'|x) = \pi(x')P(x|x')が#1で「順反応と逆反応の反応速度が等しい」としたことと対応しています。

f:id:lib-arts:20201121224512p:plain

これをメトロポリスヘイスティングス法における採択率の計算に反映させたのが上記の解説です。この話の解釈としては、「提案分布が左右対称でないときには採択率に補正をかけることで詳細釣り合い条件を実現する」と抑えておけば良いかと思います。


3. まとめ
#2ではメトロポリスヘイスティングス法における詳細釣り合い条件について取り扱いました。「詳細釣り合い」と聞くと難しそうに聞こえますが、単に「平衡状態における量的な変化をなくす」というのが大元にあると把握しておけば良いかと思います。
引き続き#3ではハミルトニアンモンテカルロ法における詳細釣り合い条件について取り扱います。

線形回帰処理のパフォーマンス比較②(勾配法による数値解)|Pythonにおける処理高速化をラフに考える #6

f:id:lib-arts:20201113203327j:plain

このシリーズではPythonの処理高速化についてラフに取り扱っています。
#5では単回帰分析の解析解の計算にあたってのパフォーマンス比較を行いました。

#6では単回帰分析の勾配法を用いた数値解のパフォーマンス比較を行います。
以下、目次になります。
1. 問題設定&NumPyを用いた勾配法の実装
2. DeepLearningフレームワークを用いた実装
3. まとめ


1. 問題設定&NumPyを用いた勾配法の実装
1節では問題設定とNumPyを用いた勾配法の実装について取り扱います。簡易化のため、問題設定は#5を引き継ぐものとします。

f:id:lib-arts:20201120182432p:plain

上記の問題における勾配法の実装をサンプル数を変えつつ実行してみます。

まず、誤差関数として最小二乗誤差を用いたとすると、E = \sum(y_i - ax_i -b)^2となるので、パラメータのabに関する偏微分は下記のようになります。

\displaystyle \frac{\partial E}{\partial a} = -2 \sum(y_i - ax_i -b) x_i

\displaystyle \frac{\partial E}{\partial b} = -2 \sum(y_i - ax_i -b)

上記が0になるとして、abについて解いたのが#5で用いた正規方程式ですが、勾配法は上記で計算した勾配のみを用いて繰り返し演算によって結果を求めます。

%%time

a, b = 0, 0
eta = 0.01
for i in range(1000):
    a = a - eta*np.sum(-2*(y-a*x-b)*x)/x.shape[0]
    b = b - eta*np.sum(-2*(y-a*x-b))/x.shape[0]

print(x.shape[0])
print(a)
print(b)

abの初期値をそれぞれ0にした上で、勾配法による繰り返しに基づいたパラメータ計算を実装したのが上記になります。

f:id:lib-arts:20201121173506p:plain

実行結果は上記になり、概ね元にした数式であるy=2x+1に収束していることが確認できます。また、勾配をサンプル数で割っているのはサンプル数に応じて勾配が大きくなるためです。学習率で調整するという方法もありますが、ミニバッチ法とは異なり今回はサンプル数に応じたバッチを作成し比較するため、実装の簡易化のためにもこのような実装としました。さて、100サンプルでの実行について確認できたので、以下サンプル数を増やして実験してみます。

f:id:lib-arts:20201121173919p:plain

f:id:lib-arts:20201121173950p:plain

上記はサンプル数1,000と10,000で実行した結果になります。多少実行時間が伸びているものの、それほど大きくはなっていないことが確認できます。

f:id:lib-arts:20201121174138p:plain

f:id:lib-arts:20201121174203p:plain

次に上記はサンプル数100,000と1,000,000で試した結果になります。100,000サンプル周辺から、サンプル数の増加にある程度比例して処理時間がかかっていることが確認できます。

一通りの問題設定とNumPyによる勾配法の実装について確認できたので、1節はここまでとします。

 

2. DeepLearningフレームワークを用いた実装
2節ではDeepLearningフレームワークとの比較として、PyTorchで実行を行ってみます。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import torch
import torch.nn as nn
%matplotlib inline

np.random.seed(0)

x = np.arange(-1, 9, 0.1)
x_ = torch.tensor(x.reshape(x.shape[0],1).astype("float32"))
y = x*2 + 1 + np.random.normal(0, 0.1, x.shape[0])
y_ = torch.tensor(y.reshape(y.shape[0],1).astype("float32"))

plt.scatter(x,y)
plt.show()

f:id:lib-arts:20201121211155p:plain

まずは問題設定ですが、PyTorchの形式にxとyを変換するにあたって、x_とy_のところだけ書き換えています。

class SimpleReg(nn.Module):

    def __init__(self, input_size, output_size):
        super(SimpleReg, self).__init__()
        self.linear = nn.Linear(input_size, output_size)

    def forward(self, x):
        out = self.linear(x)
        return out

reg_model = SimpleReg(1, 1)
loss_func = nn.MSELoss()
optimizer = torch.optim.SGD(reg_model.parameters(), lr=0.01)

また、学習の設定は上記のように行います。誤差関数はMSELossということで最小二乗誤差、最適化はSGDということで勾配法を用いています。

%%time

for i in range(1000):

    out = reg_model(x_)
    loss = loss_func(out, y_)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (i + 1) % 100 == 0:
        print('Epoch{}: , Loss: {:.3f}'.format(i+1, loss.item()))

print(reg_model.linear.weight)
print(reg_model.linear.bias)

f:id:lib-arts:20201121211334p:plain

学習の実行は上記のように行っています。lossが徐々に小さくなっていく過程が確認できます。途中経過の分、遅くなる可能性を考慮した上で、以下途中経過の出力を消去した上でサンプル数を増やし実行を行います。

f:id:lib-arts:20201121211708p:plain

f:id:lib-arts:20201121211727p:plain

サンプルが100と1,000での実行結果が上記です。それぞれ0.1秒〜1秒ほどの実行時間であり、NumPyの実行よりも1桁程度時間がかかっています。もう少しサンプルを増やして確認してみます。

f:id:lib-arts:20201121211932p:plain

f:id:lib-arts:20201121211954p:plain

サンプルが10,000と100,000での実行結果が上記です。1秒〜5秒程度の時間で、こちらも今回の実験においてはNumPyの方が速いという結果になりました。


3. まとめ
#6では回帰分析における勾配法の実行速度の確認を行いました。今回はNumPyベースの結果の方がPyTorchベースよりも速いという結果になりましたが、他の例も含めて色々と確認していければと思います。
#7では、もう少し複雑な例で確認するということでMLP(Multi Layer Perceptron)の誤差逆伝播について確認してみたいと思います。

自動微分(Automatic differentiation)のSurvey論文の参照|微分をプログラミングする #2

f:id:lib-arts:20201121144954p:plain

当シリーズでは、近年の深層学習の発展に関連するトレンド的に微分のプログラミングの重要度は増していると思われるので、関連文脈の取りまとめを行なっています。
#1では誤差逆伝播などにも用いられている「自動微分(Automatic differentiation)」の概要について確認しました。

#2では引き続き自動微分について、下記のSurvey論文を参照しながら確認していきます。

[1502.05767] Automatic differentiation in machine learning: a survey

以下、目次になります。
1. 論文の例で自動微分について再確認する
1-1. Forward mode AD(ボトムアップ型自動微分
1-2. Reverse mode AD(トップダウン型自動微分
1-3. ロジスティック写像(logistic map)の例の確認
2. 自動微分機械学習
3. まとめ


1. 論文の例で自動微分について再確認する

[1502.05767] Automatic differentiation in machine learning: a survey

1節では上記のSurvey論文の例を元に#1の内容を振り返りつつ、自動微分について再度確認を行っていきます。以下、論文のSection2の"What AD Is Not"とSection3の"AD and Its Main Modes"を中心に確認します。

 

1-1. Forward mode AD(ボトムアップ型自動微分
1-1節ではSection3-1の"Forward Mode"について確認します。これは#1で確認したボトムアップ型の自動微分の内容と同様です。

f:id:lib-arts:20201121145451p:plain

式の定義に関しては基本的に上記で、関数f(x_1,x_2)に対して、中間変数(intermediate variable)のv_iを定義して、v_ix_1に関する偏微分\displaystyle \dot{v}_i = \frac{\partial v_i}{\partial x_1}と定義しています。この定義がForward mode AD(ボトムアップ型自動微分)において中核的な役割を果たします。

f:id:lib-arts:20201121150021p:plain

関数f(x_1,x_2)に関する自動微分については上記のように、行うことができます。左のPrimal Traceは値を追っており、右のTangent Traceは微分の値を追っています。それぞれ、文字での計算に加えて、具体的な値も代入していることも確認できます。x_1 = 2x_2 = 5をそれぞれに値として与えており、かつ、x_1偏微分であるので、\dot{x}_1=1\dot{x}_2=0を与えています。

f:id:lib-arts:20201121150541p:plain

また、ここでの関数のf(x_1,x_2)は上記のような計算グラフ(Computational graph)で表現できることも抑えておきましょう。


1-2. Reverse mode AD(トップダウン型自動微分
1-2節ではSection3-2の"Reverse Mode"について確認します。これはトップダウン型の自動微分の内容と同様です。

f:id:lib-arts:20201121150541p:plain

1-1節のFoward mode ADと同様に上記のf(x_1,x_2)について取り扱っていきます。

f:id:lib-arts:20201121152549p:plain
式の定義に関しては基本的に上記のように、偏微分\bar{v}_iを定義しています。中間変数のv_iを入力のx_1に対して偏微分を行っていたForward Modeに対して、Reverse Modeでは出力のy_jv_i微分することを考えています。この考え方は一般的な逆伝播(backpropagation)のアルゴリズムに一致しています。

f:id:lib-arts:20201121152206p:plain

偏微分\bar{v}_iを元に計算を行った結果が上記のようになります。これはニューラルネットワーク の学習の際に用いる誤差逆伝播と同様なイメージで理解すれば良さそうです。


1-3. ロジスティック写像(logistic map)の例の確認
f(x_1,x_2)以外の例についても簡単に確認しておければということで、1-3節ではSection2で紹介されているロジスティック写像の例の確認を行います。

f:id:lib-arts:20201121153605p:plain

上記のようにロジスティック写像の例において、Foward Mode的な記載が紹介されています。


2. 自動微分機械学習
2節では参照のSuveryのSection4の"AD and Machine Learning"の内容を取り扱います。

f:id:lib-arts:20201121154047p:plain

上記が冒頭部の記載ですが、勾配を用いた最適化(Gradient-Based Optimization)やbackpropagationについて言及されています。

f:id:lib-arts:20201121154600p:plain
パフォーマンス比較としては、上記のようにReverse Modeの効率が良いと記載されています。

あまり詳しい解説がなかったので、ここでは軽く流し、#3でトップダウン自動微分(Reverse mode AD)と誤差逆伝播について詳しく取り扱えればと思います。


3. まとめ
#2では自動微分について、Survey論文を参照しながら確認を行いました。
#3では、トップダウン自動微分(Reverse mode AD)と誤差逆伝播について詳しく確認を行います。

 

化学平衡と詳細釣り合い条件について|平衡(equilibrium)について理解する #1

f:id:lib-arts:20201120210344p:plain

MCMCを用いたサンプリング関連の手法を確認していると、メトロポリスヘイスティングスハミルトニアンモンテカルロ法のように詳細釣り合い(detailed balance)条件の話題が出てくることがあります。「過程と逆過程の頻度が等しい」ことが詳細釣り合い条件ですが、平衡や均衡(equilibrium)といった意味合いで様々な文脈で登場します。
そのため、こちらのシリーズでは様々な文脈を踏まえながら平衡(equilibrium)についていければと思います。
#1では比較的取っ付きやすいと思われる化学平衡(chemical equilibrium)について取り扱います。
以下、目次になります。
1. 化学平衡の概要について
2. 平衡定数について
3. まとめ


1. 化学平衡の概要について
1節では化学平衡の概要について取り扱います。一般的な内容がつかめれば十分なため、主にWikipediaを参照していきます(https://ja.wikipedia.org/wiki/化学平衡)。

f:id:lib-arts:20201120210418p:plain
まず、化学平衡(Chemical equilibrium)の概要としては上記のように「可逆反応(行ったり来たりが可能な反応)」において、順方向と逆方向との反応速度が釣り合って、組成比が巨視的に変化しないことを指すとされています。A→Bしかない場合は「非可逆」と呼び、この際B→Aは起こりえないものと考えます。

f:id:lib-arts:20201120211039p:plain
具体的な可逆反応の例としては、上記のような「酢酸の解離」がWikipediaでは紹介されています。この際の反応式を下記のようにも書きます。

f:id:lib-arts:20201120211252p:plain

化学平衡とは上記の反応式において、「左から右への変化」と「右から左への変化」が釣り合っている状態のことを指します。

化学平衡について大体のイメージがついたので1節はここまでとし、2節でこれを元に平衡定数や反応速度定数について確認していきます。


2. 平衡定数について
2節では化学平衡について平衡定数や反応速度定数を元に、簡単な数式を用いて確認していきます。

f:id:lib-arts:20201120211743p:plain

まず、1節で確認した「酢酸の解離」の例だと、平衡定数のK_cは上記のようにモル濃度を用いて表します。平衡定数のざっくりとしたイメージとしては、左から右の反応(順反応)が右から左への反応(逆反応)に比べてどのくらい起きやすいのかの度合いを示していると理解すれば良いです。

ここでどのくらい起きやすいかを考えるにあたって「反応速度」なども考えると便利です。

f:id:lib-arts:20201120212616p:plain

上記では「反応速度」や「反応速度定数」、「平衡定数」の関係性について記載されています。正反応(順反応)も逆反応のどちらの「反応速度」も、それぞれの物質の濃度に「反応速度定数」をかけて表現しています。ここで、「平衡状態」においては反応速度が等しくなる(v_1=v_2)ことから、\displaystyle K_c = \frac{k_1}{k_2}が両辺のモル濃度の比に一致し、これを平衡定数(濃度平衡定数)として呼んでいます。

ここで注意したいのが、左→右と右→左の起こりやすさが違っても、平衡状態では順反応と逆反応の速度は一致するということです。反応自体の速度が一致する代わりに、それぞれの濃度が異なることで均衡となります。もう少しわかりやすくするなら、A→Bが起こりやすくてB→Aが起こりにくい場合、k_1k_2に比べて大きくなり、Bの濃度がAの濃度よりも大きくなります。

このような状態のことを詳細釣り合い(detailed balance)として表します。


3. まとめ
#1では化学平衡を題材に詳細釣り合い(detailed balance)について確認を行いました。
#2では、#1の内容を踏まえてメトロポリスヘイスティングス法における詳細釣り合いについて確認します。