Path: blob/master/site/pt-br/probability/examples/FFJORD_Demo.ipynb
25118 views
Copyright 2018 The TensorFlow Probability Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Configuração
Primeiro instale os pacotes usados nesta demonstração.
Bijetor FFJORD
Neste Colab, demonstraremos o bijetor FFJORD, proposto originalmente no artigo de Grathwohl, Will, et al. (link no arxiv).
Resumidamente, a ideia por trás dessa estratégia é estabelecer uma correspondência entre uma distribuição base conhecida e a distribuição de dados.
Para estabelecer essa ligação, precisamos:
Definir um mapa bijetor , entre o espaço em que a distribuição base é definida e o espaço do domínio de dados.
Controlar de maneira eficiente as deformações que realizamos para transferir a noção de probabilidade para .
A segunda condição é formalizada na seguinte expressão para a distribuição de probabilidades definida em :
O bijetor FFJORD consegue fazer isso definindo a transformação
Essa transformação é irreversível, desde que a função que descreve a evolução do estado seja bem-comportada e que log_det_jacobian
possa ser calculado fazendo a integral da seguinte expressão:
Nesta demonstração, treinaremos um bijetor FFJORD para deformar uma distribuição gaussiana na distribuição definida pelo dataset Moons
, o que é feito em três etapas:
Definição da distribuição base
Definição do bijetor FFJORD
Minimização da log-verossimilhança exata do dataset
Primeiro, carregamos os dados:
Depois, instanciamos uma distribuição base:
Usamos um perceptron multicamada para modelar state_derivative_fn
.
Embora não seja necessário para este dataset, tornar state_derivative_fn
dependente do tempo costuma trazer benefícios. Aqui, fazemos isso concatenando t
às entradas da rede.
Agora, construímos uma pilha de bijetores FFJORD. Cada bijetor é fornecido com ode_solve_fn
, trace_augmentation_fn
e seu próprio modelo state_derivative_fn
para que representem uma sequência de diferentes transformações.
Agora, podemos usar TransformedDistribution
, que é o resultado de deformar base_distribution
com o bijetor stacked_ffjord
.
Agora, definimos o procedimento de treinamento. Simplesmente minimizamos a log-verossimilhança negativa dos dados.
Plote as amostras das distribuições base e transformada.
0%| | 0/40 [00:00<?, ?it/s]
Fazer o treinamento por mais tempo com a taxa de aprendizado traz mais melhorias.
O bijetor FFJORD tem suporte à estimativa de traçado estocástico de Hutchinson, o que não abordamos neste exemplo. O estimador específico pode ser fornecido por meio de trace_augmentation_fn
. De maneira similar, podem ser usados integradores alternativos definindo uma ode_solve_fn
personalizada.