Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tensorflow
GitHub Repository: tensorflow/docs-l10n
Path: blob/master/site/ko/probability/examples/Learnable_Distributions_Zoo.ipynb
25118 views
Kernel: Python 3

Licensed under the Apache License, Version 2.0 (the "License");

#@title Licensed under the Apache License, Version 2.0 (the "License"); { display-mode: "form" } # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License.

이 colab에서는 학습 가능한('훈련 가능한') 분포를 빌드하는 다양한 예를 보여줍니다. 분포를 설명하려고 하기보다는 분포를 빌드하는 방법을 보여주기 위해 노력합니다.

import numpy as np import tensorflow.compat.v2 as tf import tensorflow_probability as tfp from tensorflow_probability.python.internal import prefer_static tfb = tfp.bijectors tfd = tfp.distributions tf.enable_v2_behavior()
event_size = 4 num_components = 3

chol(Cov)에 대한 scaled ID를 사용하는 학습 가능한 다변량 정규 분포

learnable_mvn_scaled_identity = tfd.Independent( tfd.Normal( loc=tf.Variable(tf.zeros(event_size), name='loc'), scale=tfp.util.TransformedVariable( tf.ones([1]), bijector=tfb.Exp(), name='scale')), reinterpreted_batch_ndims=1, name='learnable_mvn_scaled_identity') print(learnable_mvn_scaled_identity) print(learnable_mvn_scaled_identity.trainable_variables)
tfp.distributions.Independent("learnable_mvn_scaled_identity", batch_shape=[], event_shape=[4], dtype=float32) (<tf.Variable 'loc:0' shape=(4,) dtype=float32, numpy=array([0., 0., 0., 0.], dtype=float32)>, <tf.Variable 'scale:0' shape=(1,) dtype=float32, numpy=array([0.], dtype=float32)>)

chol(Cov)에 대해 학습 가능한 대각선 다변량 정규 분포

learnable_mvndiag = tfd.Independent( tfd.Normal( loc=tf.Variable(tf.zeros(event_size), name='loc'), scale=tfp.util.TransformedVariable( tf.ones(event_size), bijector=tfb.Softplus(), # Use Softplus...cuz why not? name='scale')), reinterpreted_batch_ndims=1, name='learnable_mvn_diag') print(learnable_mvndiag) print(learnable_mvndiag.trainable_variables)
tfp.distributions.Independent("learnable_mvn_diag", batch_shape=[], event_shape=[4], dtype=float32) (<tf.Variable 'loc:0' shape=(4,) dtype=float32, numpy=array([0., 0., 0., 0.], dtype=float32)>, <tf.Variable 'scale:0' shape=(4,) dtype=float32, numpy=array([0.54132485, 0.54132485, 0.54132485, 0.54132485], dtype=float32)>)

다변량 정규 분포(구형)의 혼합

learnable_mix_mvn_scaled_identity = tfd.MixtureSameFamily( mixture_distribution=tfd.Categorical( logits=tf.Variable( # Changing the `1.` intializes with a geometric decay. -tf.math.log(1.) * tf.range(num_components, dtype=tf.float32), name='logits')), components_distribution=tfd.Independent( tfd.Normal( loc=tf.Variable( tf.random.normal([num_components, event_size]), name='loc'), scale=tfp.util.TransformedVariable( 10. * tf.ones([num_components, 1]), bijector=tfb.Softplus(), # Use Softplus...cuz why not? name='scale')), reinterpreted_batch_ndims=1), name='learnable_mix_mvn_scaled_identity') print(learnable_mix_mvn_scaled_identity) print(learnable_mix_mvn_scaled_identity.trainable_variables)
tfp.distributions.MixtureSameFamily("learnable_mix_mvn_scaled_identity", batch_shape=[], event_shape=[4], dtype=float32) (<tf.Variable 'logits:0' shape=(3,) dtype=float32, numpy=array([-0., -0., -0.], dtype=float32)>, <tf.Variable 'loc:0' shape=(3, 4) dtype=float32, numpy= array([[ 0.21316044, 0.18825649, 1.3055958 , -1.4072137 ], [-1.6604203 , -0.9415946 , -1.1349488 , -0.4928658 ], [-0.9672405 , 0.45094398, -2.615817 , 3.7891428 ]], dtype=float32)>, <tf.Variable 'scale:0' shape=(3, 1) dtype=float32, numpy= array([[9.999954], [9.999954], [9.999954]], dtype=float32)>)

학습 불가능한 첫 번째 혼합 가중치가 있는 다변량 정규 분포(구형)의 혼합

learnable_mix_mvndiag_first_fixed = tfd.MixtureSameFamily( mixture_distribution=tfd.Categorical( logits=tfp.util.TransformedVariable( # Initialize logits as geometric decay. -tf.math.log(1.5) * tf.range(num_components, dtype=tf.float32), tfb.Pad(paddings=[[1, 0]], constant_values=0)), name='logits'), components_distribution=tfd.Independent( tfd.Normal( loc=tf.Variable( # Use Rademacher...cuz why not? tfp.random.rademacher([num_components, event_size]), name='loc'), scale=tfp.util.TransformedVariable( 10. * tf.ones([num_components, 1]), bijector=tfb.Softplus(), # Use Softplus...cuz why not? name='scale')), reinterpreted_batch_ndims=1), name='learnable_mix_mvndiag_first_fixed') print(learnable_mix_mvndiag_first_fixed) print(learnable_mix_mvndiag_first_fixed.trainable_variables)
tfp.distributions.MixtureSameFamily("learnable_mix_mvndiag_first_fixed", batch_shape=[], event_shape=[4], dtype=float32) (<tf.Variable 'Variable:0' shape=(2,) dtype=float32, numpy=array([-0.4054651, -0.8109302], dtype=float32)>, <tf.Variable 'loc:0' shape=(3, 4) dtype=float32, numpy= array([[ 1., 1., -1., -1.], [ 1., -1., 1., 1.], [-1., 1., -1., -1.]], dtype=float32)>, <tf.Variable 'scale:0' shape=(3, 1) dtype=float32, numpy= array([[9.999954], [9.999954], [9.999954]], dtype=float32)>)

다변량 정규 분포의 혼합(전체 Cov)

learnable_mix_mvntril = tfd.MixtureSameFamily( mixture_distribution=tfd.Categorical( logits=tf.Variable( # Changing the `1.` intializes with a geometric decay. -tf.math.log(1.) * tf.range(num_components, dtype=tf.float32), name='logits')), components_distribution=tfd.MultivariateNormalTriL( loc=tf.Variable(tf.zeros([num_components, event_size]), name='loc'), scale_tril=tfp.util.TransformedVariable( 10. * tf.eye(event_size, batch_shape=[num_components]), bijector=tfb.FillScaleTriL(), name='scale_tril')), name='learnable_mix_mvntril') print(learnable_mix_mvntril) print(learnable_mix_mvntril.trainable_variables)
tfp.distributions.MixtureSameFamily("learnable_mix_mvntril", batch_shape=[], event_shape=[4], dtype=float32) (<tf.Variable 'loc:0' shape=(3, 4) dtype=float32, numpy= array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]], dtype=float32)>, <tf.Variable 'scale_tril:0' shape=(3, 10) dtype=float32, numpy= array([[9.999945, 0. , 0. , 0. , 9.999945, 9.999945, 0. , 0. , 0. , 9.999945], [9.999945, 0. , 0. , 0. , 9.999945, 9.999945, 0. , 0. , 0. , 9.999945], [9.999945, 0. , 0. , 0. , 9.999945, 9.999945, 0. , 0. , 0. , 9.999945]], dtype=float32)>, <tf.Variable 'logits:0' shape=(3,) dtype=float32, numpy=array([-0., -0., -0.], dtype=float32)>)

학습 불가능한 첫 번째 혼합과 첫 번째 성분이 있는 다변량 정규 분포(전체 Cov)의 혼합

# Make a bijector which pads an eye to what otherwise fills a tril. num_tril_nonzero = lambda num_rows: num_rows * (num_rows + 1) // 2 num_tril_rows = lambda nnz: prefer_static.cast( prefer_static.sqrt(0.25 + 2. * prefer_static.cast(nnz, tf.float32)) - 0.5, tf.int32) # TFP doesn't have a concat bijector, so we roll out our own. class PadEye(tfb.Bijector): def __init__(self, tril_fn=None): if tril_fn is None: tril_fn = tfb.FillScaleTriL() self._tril_fn = getattr(tril_fn, 'inverse', tril_fn) super(PadEye, self).__init__( forward_min_event_ndims=2, inverse_min_event_ndims=2, is_constant_jacobian=True, name='PadEye') def _forward(self, x): num_rows = int(num_tril_rows(tf.compat.dimension_value(x.shape[-1]))) eye = tf.eye(num_rows, batch_shape=prefer_static.shape(x)[:-2]) return tf.concat([self._tril_fn(eye)[..., tf.newaxis, :], x], axis=prefer_static.rank(x) - 2) def _inverse(self, y): return y[..., 1:, :] def _forward_log_det_jacobian(self, x): return tf.zeros([], dtype=x.dtype) def _inverse_log_det_jacobian(self, y): return tf.zeros([], dtype=y.dtype) def _forward_event_shape(self, in_shape): n = prefer_static.size(in_shape) return in_shape + prefer_static.one_hot(n - 2, depth=n, dtype=tf.int32) def _inverse_event_shape(self, out_shape): n = prefer_static.size(out_shape) return out_shape - prefer_static.one_hot(n - 2, depth=n, dtype=tf.int32) tril_bijector = tfb.FillScaleTriL(diag_bijector=tfb.Softplus()) learnable_mix_mvntril_fixed_first = tfd.MixtureSameFamily( mixture_distribution=tfd.Categorical( logits=tfp.util.TransformedVariable( # Changing the `1.` intializes with a geometric decay. -tf.math.log(1.) * tf.range(num_components, dtype=tf.float32), bijector=tfb.Pad(paddings=[(1, 0)]), name='logits')), components_distribution=tfd.MultivariateNormalTriL( loc=tfp.util.TransformedVariable( tf.zeros([num_components, event_size]), bijector=tfb.Pad(paddings=[(1, 0)], axis=-2), name='loc'), scale_tril=tfp.util.TransformedVariable( 10. * tf.eye(event_size, batch_shape=[num_components]), bijector=tfb.Chain([tril_bijector, PadEye(tril_bijector)]), name='scale_tril')), name='learnable_mix_mvntril_fixed_first') print(learnable_mix_mvntril_fixed_first) print(learnable_mix_mvntril_fixed_first.trainable_variables)
tfp.distributions.MixtureSameFamily("learnable_mix_mvntril_fixed_first", batch_shape=[], event_shape=[4], dtype=float32) (<tf.Variable 'loc:0' shape=(2, 4) dtype=float32, numpy= array([[0., 0., 0., 0.], [0., 0., 0., 0.]], dtype=float32)>, <tf.Variable 'scale_tril:0' shape=(2, 10) dtype=float32, numpy= array([[9.999945, 0. , 0. , 0. , 9.999945, 9.999945, 0. , 0. , 0. , 9.999945], [9.999945, 0. , 0. , 0. , 9.999945, 9.999945, 0. , 0. , 0. , 9.999945]], dtype=float32)>, <tf.Variable 'logits:0' shape=(2,) dtype=float32, numpy=array([-0., -0.], dtype=float32)>)