生き抜くぜ21世紀

統計?機械学習?っぽいことを書く

tensorflowでベータ分布に従う乱数を生成する

はじめに

tensorflowでベータ分布に従う乱数を生成したくなるときがあります。(mixupのときとか)

しかし、tf.random_xxxのシリーズにベータ分布は入っていません。(tf.random_gammaはあるのに。。)

それで困っている人のために記事を書きます。

実装方法の紹介とヒストグラムを書いて確認、の2本立てで行きます

実装方法

tf.distributionを使う方法

ファイナルアンサーです

import tensorflow as tf
alpha = 0.2
beta = 0.2
random_beta = tf.distributions.Beta(alpha, beta).sample()

ガンマ分布に従う乱数を使用する方法

ガンマ分布に従う乱数 \displaystyle r1 \sim Gamma(\alpha, 1) \displaystyle r2 \sim Gamma(\beta, 1)を用いると

 \displaystyle \frac {r1} {r1 + r2} \sim Beta(\alpha, \beta)

という性質があるらしいです(下記リンク参考) k11i.biz

これを直接実装してもOKです。前者の方法に比べて、乱数生成アルゴリズムを明示できるのがメリットです。

しかし、ソースコードを読んだところtf.distribution.Beta.sample()内部で同じ実装を取っていたためtf1.9現在ではたぶんパフォーマンスに有意差はないです。したがって今現在この実装を取る必要はおそらくありません

import tensorflow as tf
alpha = 0.2
beta = 0.2
r1 = tf.random_gamma(alpha=alpha, beta=1.0, shape=())
r2 = tf.random_gamma(alpha=beta, beta=1.0, shape=())
random_beta = r1 / (r1 + r2)

確認

ヒストグラムを書いて確認してみました。

alpha, betaともに0.2の乱数を10000回生成したヒストグラムです。

このくらい形が似てるなら安心して使えそうですね(精神論)

numpy.random.beta(比較対象)

f:id:rskmoi:20180817224447p:plain
numpy

tf.distributionを使う方法

f:id:rskmoi:20180817224555p:plain
tensorflow(distribution)

ガンマ分布に従う乱数を使用する方法

f:id:rskmoi:20180817224646p:plain
tensorflow(gamma)