7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

『ベイズ深層学習』勉強会資料 4章の2.1~2.4

Last updated at Posted at 2019-11-03

記事の概要

『ベイズ深層学習』の輪読会で使用する資料です。
記事では『ベイズ深層学習』を持っていることを前提として、一部の数式や説明を省略しています。同書を持っている人が自習する時の参考になることを目的としています。

記事中の誤りは全て私の理解不足に起因し、輪読会参加者および本の著者、引用記事の作成者とは無関係になります。
誤りや不明点がございましたら、コメント欄などでご指摘いただけると助かります。

変分推論法

変分推論法とは何か

周辺尤度$p(\mathbf{X}) = \int p(\mathbf{X},\mathbf{Z})d\mathbf{Z}$を積分計算するのは困難なので、近似計算をする必要がある。
そのための手段の1つが以下に示す変分推論法である。

  1. エビデンス下界 $\mathcal{L}(\mathbf{\xi})$ を考える

\begin{eqnarray}
\ln p(\mathbf{X}) \geq \mathcal{L}(\mathbf{\xi})
\end{eqnarray}
```
具体的にはKLダイバージェンスを用いて$\ln p(\mathbf{X})$を以下のように分解する。

 ```math

\begin{eqnarray}
\ln p(\mathbf{X}) &=& \mathcal{L}(\mathbf{\xi}) + D_{KL}[q(\mathbf{Z};\mathbf{\xi})|p(\mathbf{Z}|\mathbf{X})]
\end{eqnarray}
```

ここで$D_{KL}[q(\mathbf{Z};\mathbf{\xi})|p(\mathbf{Z}|\mathbf{X})]$は以下のように定義する。

 ```math

\begin{eqnarray}
D_{KL}[q(\mathbf{Z};\mathbf{\xi})|p(\mathbf{Z}|\mathbf{X})]
&=& \int q(\mathbf{Z};\mathbf{\xi}) \ln \frac{q(\mathbf{Z};\mathbf{\xi})}{p(\mathbf{X} | \mathbf{Z})} d \mathbf{Z}\
&=& - \int q(\mathbf{Z};\mathbf{\xi}) \ln \frac{p(\mathbf{X} | \mathbf{Z})}{q(\mathbf{Z};\mathbf{\xi})}d \mathbf{Z}
\end{eqnarray}
```

  1. $\mathcal{L}(\mathbf{\xi})$ を $\mathbf{\xi}$ について最大化する。最大化された$\mathcal{L}$は$\ln p(\mathbf{X})$の近似解とみなせる。
    $\ln p(\mathbf{X})$は定数であることから、$D_{KL}[q(\mathbf{Z};\mathbf{\xi})|p(\mathbf{Z}|\mathbf{X})]$を $\mathbf{\xi}$ について最小化すれば、$\mathcal{L}(\mathbf{\xi})$が最大化されたことになる。

パラメータ$\mathbf{\xi}$ の関数を最小化するようにパラメータを調整するのは、降下勾配法などを使う。
こうして数値最適化の技法で、効率的に$p(\mathbf{X})$の近似計算が行える。

$p(x)$を求めるのに、下界の同時分布の計算は難しいが、$D_{KL}$は既知の予測分布と事後分布から計算できる。$D_{KL}$の最小化を行えば難しい下界の計算を行わずに$p(x)$の近似解が求まる。

分解式の証明

\begin{eqnarray}
\mathcal{L}(\mathbf{\xi}) 
&=& \int q(\mathbf{Z};\mathbf{\xi}) \ln \frac{p(\mathbf{X}, \mathbf{Z})}{q(\mathbf{Z};\mathbf{\xi})} d \mathbf{Z} \\
&=& \int q(\mathbf{Z};\mathbf{\xi}) \ln \frac{p(\mathbf{X} | \mathbf{Z}) p(\mathbf{X}) }{q(\mathbf{Z};\mathbf{\xi})} d \mathbf{Z} \\
&=& \int q(\mathbf{Z};\mathbf{\xi}) \Biggl( \ln \frac{p(\mathbf{X} | \mathbf{Z})}{q(\mathbf{Z};\mathbf{\xi})}  + \ln p(\mathbf{X}) \Biggl) d \mathbf{Z} \\
&=& \int q(\mathbf{Z};\mathbf{\xi}) \ln \frac{p(\mathbf{X} | \mathbf{Z})}{q(\mathbf{Z};\mathbf{\xi})}  d \mathbf{Z}
+ \ln p(\mathbf{X}) \int q(\mathbf{Z};\mathbf{\xi}) d \mathbf{Z} \\
&=& - D_{KL}[q(\mathbf{Z};\mathbf{\xi})|p(\mathbf{Z}|\mathbf{X})]  + \ln p(\mathbf{X})
\end{eqnarray}

平均場近似

潜在変数の集合$\mathbf{Z}$をM個の部分集合$\mathbf{Z}= { \mathbf{Z}_1, \mathbf{Z}_2, \cdots, \mathbf{Z}_M }$に分割する。
各集合のた事後分布は互いに独立として近似計算する。これを平均場近似と呼ぶ。

\begin{eqnarray}
q(\mathbf{Z}) &=& \prod_{i=1}^M q(\mathbf{Z}_i)
\end{eqnarray}

線形次元削減法

仮定

  • 仮定1

観測データ$\mathbf{X}$ は入力の潜在変数 $\mathbf{Z}$ の線形結合とノイズ$\sigma_x^2$で決まる。($\mathbf{W}$は行列パラメータ)

\begin{eqnarray}
p(\mathbf{X} | \mathbf{Z},\mathbf{W}) &=& \prod_{n=1}^M p(\mathbf{x}_n | \mathbf{z}_n,\mathbf{W}) \\
&=&  \prod_{n=1}^M \mathcal{N}(\mathbf{x}_n | \mathbf{W} \mathbf{z}_n, \sigma_x^2 \mathbf{I}) 
\end{eqnarray}
  • 仮定2

潜在変数 $\mathbf{Z}$ は以下のガウス分布に従う

\begin{eqnarray}
p(\mathbf{Z}) 
&=&  \prod_{n=1}^M \mathcal{N}(\mathbf{z}_n | \mathbf{0} ,  \mathbf{I}) 
\end{eqnarray}
  • 仮定3

行列パラメータ $\mathbf{W}$ は以下のガウス分布に従う

\begin{eqnarray}
p(\mathbf{W}) 
&=&  \prod_{n=1}^M \mathcal{N}(w_{i,j} | 0 , \sigma_{\omega}^2) 
\end{eqnarray}

下界の作成

事後分布$p$を近似分布$q$で分解する

\begin{eqnarray}
p(\mathbf{Z},\mathbf{W} | \mathbf{X}) 
&\approx &  q(\mathbf{Z}) q(\mathbf{W}) 
\end{eqnarray}

周辺尤度$\int p(\mathbf{X},\mathbf{Z},\mathbf{W})$ の対数の下界$\mathcal{L}$に代入する。

\begin{eqnarray}
\mathcal{L}
&=& \int q(\mathbf{Z}) q(\mathbf{W}) \ln \frac{p(\mathbf{X},\mathbf{Z},\mathbf{W})}{q(\mathbf{Z}) q(\mathbf{W})} d \mathbf{Z} d \mathbf{W} \\

&=& \int q(\mathbf{Z}) q(\mathbf{W}) \ln p(\mathbf{X}|\mathbf{Z},\mathbf{W}) d \mathbf{Z} d \mathbf{W} \\
&& + \int q(\mathbf{Z}) q(\mathbf{W}) \ln \frac{p(\mathbf{Z}) p(\mathbf{W})}{q(\mathbf{Z}) q(\mathbf{W})} d \mathbf{Z} d \mathbf{W} \\

&=& \int q(\mathbf{Z}) q(\mathbf{W}) \ln p(\mathbf{X}|\mathbf{Z},\mathbf{W}) d \mathbf{Z} d \mathbf{W} \\
&& + \int q(\mathbf{Z}) q(\mathbf{W}) (\ln p(\mathbf{Z}) + \ln p(\mathbf{W}) - \ln q(\mathbf{Z}) - \ln q(\mathbf{W})) d \mathbf{Z} d \mathbf{W}  d \mathbf{Z} d \mathbf{W} \\


&=& \int q(\mathbf{Z}) q(\mathbf{W}) \ln p(\mathbf{X}|\mathbf{Z},\mathbf{W}) d \mathbf{Z} d \mathbf{W} \\
&& + \int q(\mathbf{Z}) \ln \frac{p(\mathbf{Z})}{q(\mathbf{Z}) } d \mathbf{Z} \int  q(\mathbf{W}) d \mathbf{W} \\
&& + \int q(\mathbf{Z}) d q(\mathbf{Z}) \int q(\mathbf{W}) \ln \frac{p(\mathbf{W})}{q(\mathbf{W})}  d \mathbf{W} \\


&=& \int q(\mathbf{Z}) q(\mathbf{W}) \ln p(\mathbf{X}|\mathbf{Z},\mathbf{W}) d \mathbf{Z} d \mathbf{W} \\
&& - \int q(\mathbf{Z}) \ln \frac{q(\mathbf{Z})}{p(\mathbf{Z}) } d \mathbf{Z}   \\
&& -  \int q(\mathbf{W}) \ln \frac{q(\mathbf{W})}{p(\mathbf{W})}  d \mathbf{W} \\

&=& \mathbb{E}_{q(\mathbf{Z}) q(\mathbf{W})} [\ln p(\mathbf{X}|\mathbf{Z},\mathbf{W})] 
- D_{KL}[q(\mathbf{Z})|p(\mathbf{Z})]
- D_{KL}[q(\mathbf{W})|p(\mathbf{W})]
\end{eqnarray}

ここで$p(\mathbf{X},\mathbf{Z},\mathbf{W}) = p(\mathbf{X}|\mathbf{Z},\mathbf{W})p(\mathbf{Z},\mathbf{W}) = p(\mathbf{X}|\mathbf{Z},\mathbf{W}) p(\mathbf{Z}) p(\mathbf{W})$を用いた。

更新フェーズ

最初に適当な近似分布$q_0(\mathbf{Z})$と$q_0(\mathbf{W})$を作り、更新ステップを繰り返して下界$\mathcal{L}$を最大化する近似分布$q_n(\mathbf{Z})$と$q_n(\mathbf{W})$を求める。

i回の更新で$q_i(\mathbf{Z})$と$q_i(\mathbf{W})$が得られている時に、i+1回目の更新を行う手順を以下に示す。

変分Mステップ

$q_i(\mathbf{Z})$を固定化して$q_{i+1}(\mathbf{W})$についての下界を計算する。$D_{KL}[q(\mathbf{Z})|p(\mathbf{Z})]$は定数項になるので

\begin{eqnarray}
\mathcal{L}
&=& \mathbb{E}_{q_i(\mathbf{Z}) q_{i+1}(\mathbf{W})} [\ln p(\mathbf{X}|\mathbf{Z},\mathbf{W})] 
- D_{KL}[q_{i+1}(\mathbf{W})|p(\mathbf{W})] 
+ const
\\

&=& \int q_{i}(\mathbf{Z}) q_{i+1}(\mathbf{W}) \ln p(\mathbf{X}|\mathbf{Z},\mathbf{W}) d \mathbf{Z} d \mathbf{W} \\
&& -  \int q_{i+1}(\mathbf{W}) \ln \frac{q_{i+1}(\mathbf{W})}{p(\mathbf{W})}  d \mathbf{W}  
+ const
\\

&=& \int q_{i+1}(\mathbf{W}) \ln \frac{ \exp \Bigl(\int q_{i}(\mathbf{Z})  \ln p(\mathbf{X}|\mathbf{Z},\mathbf{W}) d \mathbf{Z} 
 \Bigl) p(\mathbf{W}) }{q_{i+1}(\mathbf{W})} d \mathbf{W}
 + const
\\ 

&=& 
- D_{KL}[q_{i+1}(\mathbf{W})|r_i(\mathbf{W})] 
+ const
\end{eqnarray}

ここで以下のように定義した

\begin{eqnarray}
r_i(\mathbf{W}) &\propto&
\exp \Bigl(\int q_{i}(\mathbf{Z})  \ln p(\mathbf{X}|\mathbf{Z},\mathbf{W}) d \mathbf{Z} 
 \Bigl) p(\mathbf{W})
\end{eqnarray}

ここで比例定数を調整して、以下のように正規化できるとする。

\begin{eqnarray}
\int r_i(\mathbf{W}) d\mathbf{W} = 1
\end{eqnarray}

$p=q$のとき$D_{KL}(p|q)=0$になるので、上式が最大値になるのは$D_{KL}[q_{i+1}(\mathbf{W})|r_i(\mathbf{W})]$が0になる以下の場合である。

\begin{eqnarray}
q_{i+1}(\mathbf{W}) &=& r_i(\mathbf{W})
\end{eqnarray}

変分Eステップ

$q_{i+1}(\mathbf{W})$を固定化して$q_{i+1}(\mathbf{q})$についての下界を計算する。$D_{KL}[q(\mathbf{W})|p(\mathbf{W})]$は定数項になり、変分Mステップの$Z$と$W$を入れ替えるだけなので、下界を最大化する条件は以下になる。

\begin{eqnarray}
q_{i+1}(\mathbf{Z}) &=& r_{i+1}(\mathbf{Z})
\end{eqnarray}
\begin{eqnarray}
r_{i+1}(\mathbf{Z}) &\propto&
\exp \Bigl(\int q_{i}(\mathbf{W})  \ln p(\mathbf{X}|\mathbf{Z},\mathbf{W}) d \mathbf{W} 
 \Bigl) p(\mathbf{Z})
\end{eqnarray}

ここで比例定数を調整して、以下のように正規化できるとする。

\begin{eqnarray}
\int r_{i+1}(\mathbf{Z}) d\mathbf{Z} = 1
\end{eqnarray}

こうして新しい$q_{i+1}(\mathbf{Z})$と$q_{i+1}(\mathbf{W})$が求まった。この更新を何回も繰り返して、近似の精度を高めていくことになる。

欠点

$Z_i$と$Z_j$が独立試行でない場合は良い近似にはならない。

複雑なモデルに対しては更新を多数回繰り返しても近似精度に限界がある。
この問題に対応する手法として正規化流などがある。

例:

要調査:具体的な計算事例が見つからない

具体的な計算例として同著者の「ベイズ推論による機械学習入門」が参照に挙げられていた。
5章の1を読んでみたが本書の最適化の手法を使用しているように見えなかった。
両者の数式を1対1対応できるほど理解できていないせいか、全く違う更新方法に見えてしまう。

なお、線形次元削減を具体的に計算した以下のサイトにおいて、更新を繰り返すごとに復元画像の精度がよくなっていく過程が見れる。
[ベイズ推論による機械学習入門]numpyだけで線形次元削減を実装してみた。

混合ガウス分布

要調査:具体的な計算事例が見つからない
離散的な潜在変数$\mathbf{S}$について、K個の異なるガウス分布、混合ガウス分布から生成される確率モデルを考える。
数式は連続的な潜在変数の場合と同じで、こちらも具体的な計算例が見つけられていない。

ラプラス近似

ラプラス近似とは、事後分布を以下のガウス分布で近似する推論手法である。

\begin{eqnarray}
p(\mathbf{Z} | \mathbf{X}) &\approx& \mathcal{N}(\mathbf{Z} | \mathbf{Z}_{MAP}, \{  \Lambda(\mathbf{Z}_{MAP}) \}^{-1})
\end{eqnarray}
\begin{eqnarray}
\Lambda(\mathbf{Z}) \equiv - \nabla_{\mathbf{Z}}^2 \ln p(\mathbf{Z} | \mathbf{X})
\end{eqnarray}

ここで$p(\mathbf{Z} | \mathbf{X})$の値が最大となる点を$\mathbf{Z}_{MAP}$としている。

要調査:計算手法を別の本で勉強する
本書では計算の詳細にまでは立ち入っておらず、他の本で勉強をする必要がある

モーメントマッチング

目標分布$p(\mathbf{z})$があったとして、これの近似分布として以下の指数型分布族を考える。

\begin{eqnarray}
q(\mathbf{z} ; \mathbf{\eta}) &=& h(\mathbf{z}) \exp(\mathbf{\eta}^T \mathbf{t}(\mathbf{z}) - a(\mathbf{\eta}) )
\end{eqnarray}
\begin{eqnarray}
a(\mathbf{\eta}) &=& \ln \int h(\mathbf{z})   \exp (\mathbf{\eta}^T \mathbf{t}(\mathbf{z})) d \mathbf{z}
\end{eqnarray}

目標分布と近似分布によるKLダイバージェンスを$\mathbf{\eta}$について最小化する。

\begin{eqnarray}
D_{KL}[p(\mathbf{z}) | q(\mathbf{z} ; \mathbf{\eta})] 

&=& - \int  p(\mathbf{z}) \ln q(\mathbf{z} ; \mathbf{\eta})   d \mathbf{z}
    + \int  p(\mathbf{z}) \ln p(\mathbf{z})   d \mathbf{z}
\\

&=& - \int  p(\mathbf{z}) \ln \Bigl(h(\mathbf{z}) \exp(\mathbf{\eta}^T \mathbf{t}(\mathbf{z}) - a(\mathbf{\eta}) ) \Bigl)   d \mathbf{z}
    + \int  p(\mathbf{z}) \ln p(\mathbf{z})   d \mathbf{z}
\\

&=& - \int  p(\mathbf{z}) \ln h(\mathbf{z}) d \mathbf{z}
    - \mathbf{\eta}^T  \int  p(\mathbf{z}) \mathbf{t}(\mathbf{z})   d \mathbf{z}
    + a(\mathbf{\eta})  \int  p(\mathbf{z})  d \mathbf{z}
    + \int  p(\mathbf{z}) \ln p(\mathbf{z})   d \mathbf{z}
\\

&=& - \mathbf{\eta}^T  \int  p(\mathbf{z}) \mathbf{t}(\mathbf{z}) d \mathbf{z}
    + a(\mathbf{\eta}) 
    + const
\end{eqnarray}

これを$\mathbf{\eta}$について微分を取ると以下を得る。

\begin{eqnarray}
\int  p(\mathbf{z}) \mathbf{t}(\mathbf{z}) d \mathbf{z}
&=& 
\nabla_{\mathbf{\eta}} a(\mathbf{\eta})
\end{eqnarray}
\begin{eqnarray}
\nabla_{\mathbf{\eta}} a(\mathbf{\eta})

&=& 
\nabla_{\mathbf{\eta}} \ln \int h(\mathbf{z})   \exp (\mathbf{\eta}^T \mathbf{t}(\mathbf{z})) d \mathbf{z}
\\

&=& 
\frac{\nabla_{\mathbf{\eta}} \int h(\mathbf{z})   \exp (\mathbf{\eta}^T \mathbf{t}(\mathbf{z})) d \mathbf{z}}
{\int h(\mathbf{z})   \exp (\mathbf{\eta}^T \mathbf{t}(\mathbf{z})) d \mathbf{z}}
\\

&=& 
\frac{ \int \mathbf{t}(\mathbf{z}) h(\mathbf{z}) \exp (\mathbf{\eta}^T \mathbf{t}(\mathbf{z})) d \mathbf{z}}
{\int h(\mathbf{z})   \exp (\mathbf{\eta}^T \mathbf{t}(\mathbf{z})) d \mathbf{z}}
\\

&=& 
\int \mathbf{t}(\mathbf{z}) h(\mathbf{z}) \exp (\mathbf{\eta}^T \mathbf{t}(\mathbf{z}) - a(\mathbf{\eta})) d \mathbf{z}
\\

&=&
\int  q(\mathbf{z}) \mathbf{t}(\mathbf{z}) d \mathbf{z}

\end{eqnarray}

よって以下が求まる。

\begin{eqnarray}
\int  p(\mathbf{z}) \mathbf{t}(\mathbf{z}) d \mathbf{z}
&=&
\int  q(\mathbf{z}) \mathbf{t}(\mathbf{z}) d \mathbf{z}

\end{eqnarray}

$p(\mathbf{z})$の期待値(モーメント)を計算すれば、上式より指数分布族型のパラメータ$\mathbf{\eta}$が求まり、近似分布を計算できる。

仮定密度フィルタリング

データ集合 $D_1$、パラメータ$\mathbf{\theta}$の事後分布$p(\mathbf{\theta} | D_1)$に対する近似分布$q_1$を考える。

\begin{eqnarray}
q_1(\mathbf{\theta})

&\approx&
r_1(\mathbf{\theta})

=
\frac{1}{Z_1}  p(D_1 | \mathbf{\theta}) p(\mathbf{\theta})

\\

Z_1 &\equiv& \int p(D_1 | \mathbf{\theta}) p(\mathbf{\theta}) d \mathbf{\theta}
\end{eqnarray}

$q_i$が分かっている時の$q_{i+1}$は以下で近似できる。

\begin{eqnarray}
q_{i+1}(\mathbf{\theta})

&\approx&
r_{i+1}(\mathbf{\theta})

=
\frac{1}{Z_{i+1}}  p(D_{i+1} | \mathbf{\theta}) q_i(\mathbf{\theta})
\end{eqnarray}

ガウス分布の場合

1次元のガウス分布による近似分布$q_i$を考える。

\begin{eqnarray}
q_{i}(\mathbf{\theta})

&=&
\mathcal{N} (\mathbf{\theta}| \mu_i, \nu_i)
\end{eqnarray}

$\mu_i$と$\nu_i$が分かっている場合に$\mu_{i+1}$と$\nu_{i+1}$を求める過程では、以下の計算を行っている。

正規化定数の対数を取って$\mu_i$で微分する。

\begin{eqnarray}
\frac{\partial}{\partial \mu_i} \ln Z_{i+1}

&=&
\frac{\partial}{\partial Z_{i+1}} \ln Z_{i+1} \frac{\partial Z_{i+1}}{\partial \mu_i}
\\

&=&
\frac{1}{Z_{i+1}} 
\int f_{i+1}(\theta) \frac{1}{\sqrt{2 \pi \nu_i}}
 \frac{\theta - \mu_i}{\nu_i} 
\exp \biggl( - \frac{(\theta - \mu_i)^2}{2 \nu_i} \biggl)
d \theta
\\

&=&
\frac{1}{Z_{i+1}} 
\int f_{i+1}(\theta) \mathcal{N}(\theta | \mu_i, \nu_i)
\frac{\theta - \mu_i}{\nu_i}
d \theta
\\

&=&
\frac{1}{Z_{i+1}} 
\frac{\mathbb{E}_{r_{i+1}}[\theta] - \mu_i}{\nu_i}
\end{eqnarray}

同様に正規化定数の対数を取って$\nu_i$で微分する。

\begin{eqnarray}
\frac{\partial}{\partial \nu_i} \ln Z_{i+1}

&=&
\frac{\partial}{\partial Z_{i+1}} \ln Z_{i+1} \frac{\partial Z_{i+1}}{\partial \nu_i}
\\

&=&
\frac{1}{Z_{i+1}} 
\int f_{i+1}(\theta) \frac{\partial }{\partial \nu_i} \biggl(  \frac{1}{\sqrt{2 \pi \nu_i}} \biggl)
\exp \biggl( - \frac{(\theta - \mu_i)^2}{2 \nu_i} \biggl)
d \theta \\
&&
 + \int f_{i+1}(\theta)  \biggl(  \frac{1}{\sqrt{2 \pi \nu_i}} \biggl)
\frac{\partial }{\partial \nu_i} \exp \biggl( - \frac{(\theta - \mu_i)^2}{2 \nu_i} \biggl)
d \theta
\\

&=&
\frac{1}{Z_{i+1}} 
\int f_{i+1}(\theta) \frac{1}{\sqrt{2 \pi \nu_i}} 
\biggl(  - \frac{1}{2 \nu_i} + \frac{(\theta - \mu_i)^2}{2 \nu_i^2}  \biggl)
\exp \biggl( - \frac{(\theta - \mu_i)^2}{2 \nu_i} \biggl)
d \theta 
\\

&=&
- \frac{(\theta - \mu_i)^2}{2 \nu_i}
+ \frac{1}{2 \nu_i^2} (\mathbb{E}_{r_{i+1}}[\theta^2] -2 \mu_i \mathbb{E}_{r_{i+1}}[\theta] + \mu_i^2)
\end{eqnarray}

今後の予定

平均場近似については、実際の問題に適用して、具体的な計算を行う必要を感じた。
期待値伝播法については、理解が不十分と感じPRMLの10.7を読むことにした。
自習した内容については別途整理したい。

関連記事

『ベイズ深層学習』勉強会資料 4章の1
期待値伝播法
『ベイズ深層学習』勉強会資料 5章の1

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?