ベイズ深層学習の自学コード
TensorFlow Probability (以下tfp)を利用しての、深層ベイズ学習の実装方法を整理する。
以下のように import
しておく。
import tensorflow_probability as tfp
tfp では、 tfp.distributions
の中に、様々な基本的な確率分布を表現するクラスが実装されている。
主なメソッド
sample(sample_shape=(), seed=None, name='sample', **kwargs)
分布に従う乱数を取得prob(value, name='prob', **kwargs)
尤度log_prob(value, name='log_prob', **kwargs)
対数尤度
tfpでは、tfp.distributions.JointDistribution
を継承した3つのクラスを利用する実装方法がある。[1]
JointDistributionSequence
- keras の
Sequence
のようにlist
で実装する - 注意点は、逆順に引数に渡されること。
sample()
メソッドの戻り値も、list
- keras の
JointDistributionNamed
dict
として、変数と分布をペアにして設定するsample()
メソッドの戻り値もdict
形式となる
JointDistributionCoroutine
- コルーチンの
yield
を利用して実装する sample()
の戻り値は、tuple
- コルーチンの
tfp.layers
に実装されているレイヤーが tf.keras
で利用することができるベイズ用のレイヤー
Flipout をクラス名に含んでいるクラス (例: DenseFlipout
) は、ミニバッチ内の各サンプルに異なる重みを利用する手法。[2]
再パラメータ化より、およそ2倍計算量があるが、varianceが小さくなる。
- [1] D. Piponi et al., "Joint Distributions for TensorFlow Probability",arXiv cs.PL 2001.11819 (2020) https://arxiv.org/abs/2001.11819
- [2] Y. Wen et al., "Flipout: Efficient Pseudo-Independent Weight Perturbations on Mini-Batches", arXiv cs.LG 1803.04386 (2018) https://arxiv.org/abs/1803.04386