#背景
Deep Learning では計算精度をある程度落としても推論精度に大きく影響を与えることなく動作することが知られており、各種小ビットでの実験が行われています。特に "Convolutional Neural Networks using Logarithmic Data Representation" では、重みやアクティベーションを5ビットの対数で表現し、FP32とさほど変わらない推論精度を達成しています。
対数を用いた場合、乗算を加算で置き換えられる利点があり、これは計算回路上に乗算器を必要としないことを意味します。
対数ベースで考えた場合、積和演算で考えなければならないなのは乗算よりもむしろ加算であり、つまり$\log(a+b)$ をどう計算するか、です。対数の性質として、指数法則より
$$\log ab = \log a +\log b$$
が成り立つことは広く知られていますが、
$$\log(a+b)$$
の効果的な計算方法はあまり知られていません。
Miyashitaらは上記論文中 3.3. Accumulation in log domain (以下、CNNLDR 3.3)において下記図のような近似的計算方法を提案していますが、対数の計算に詳しい者でないと理解は難しいと思いました。(少なくとも私は苦労しましたw)この文章ではその計算方法について詳しく解説します。
#解説
##前提
まず、
a+b = a\times (1+\frac{b}{a}) \tag{1}\\
ただし 0 < b \le a
とする。すると $ 1 < n $ について
\begin{align}
\log_n(a+b) &=\log_n(a \times (1+\frac{b}{a})) \\
&=\log_n a + \log_n(1+\frac{b}{a}) \\
&=\log_n a + \log_n(1+n^{\log_n b - \log_n a}) \tag{2}\\
\end{align}
底が $2$ かつ $ 0 \leq X \leq 1 $ のとき
\log_2(1+X)\simeq X \tag{3} \\
と近似できる。(下記グラフを参照)
また、$(1)$ の条件より
0 < \frac{b}{a} = n^{\log_n b - \log_n a} \leq 1\\
よって $(2)$, $(3)$ より
\begin{align}
\log_2 (a+b)
&\simeq \log_2 a + 2^{\log_2 b - \log_2 a} \tag{4}\\
\end{align}
##近似式の導出
CNNLDR 3.3 における定義より
\begin{align}
\tilde{s}_2 &= \log_2(s_2) \\
&= \log_2(w_1x_1 + w_2x_2) \\
&= \log_2(2^{\log_2 w_1 + \log_2 x_1}+2^{\log_2 w_2 + \log_2 x_2}) \tag{5}\\
&= \log_2(2^{{\tilde{w}_1}+{\tilde{x}_1}}+2^{{\tilde{w}_2}+{\tilde{x}_2}}) \\
&= \log_2(2^{\tilde{p}_1} + 2^{\tilde{p}_2}) \\
\end{align}
となり、$(4)$ より
\tilde{s}_2 \simeq \tilde{p}_1 + 2^{{\tilde{p}_2}-{\tilde{p}_1}}
と近似できる。これはコンピュータ上では
\mathrm{max}({\tilde{p}_1}, {\tilde{p}_2}) + \mathrm{Bitshift}(1, -|{\tilde{p}_2} - {\tilde{p}_1}|)
と計算できる。解説終わり。
底が $ \sqrt{2} $ のとき、$(3)$は
\log_\sqrt{2}(1+X) \simeq 2X \tag{3'}
近似式:
\mathrm{Bitshift}\bigl(\mathrm{max}(\tilde{p}_1, \tilde{p}_2) + \mathrm{Bitshift}(1, -|\tilde{p}_2 - \tilde{p}_1|), 1 \bigr)