O que é o Tensorflow Probability?

Este é uma biblioteca que adiciona raciocínio probabilístico e análise estatística ao Tensorflow.

Através do TFP (Github ou site), podemos integrar métodos probabilísticos com redes profundas de forma simples, tomando vantagem das features do Tensorflow, como diferenciação automática, escalabilidade e etc, podendo criar o que chamados de Redes Neurais Bayesianas (BNNs - Bayesian Neural Networks), por exemplo.

Só para ter um pouco mais de noção sobre o quê estas redes são, vamos ver uma explicação bem básica sobre elas

Redes Neurais Bayesianas - BNNs

Atualmente, as redes neurais profundas que conhecemos ficaram famosas por sua alta capacidade de entender padrões nos dados e ligá-los à alguma quantidade desejada (magnitudes e redshifts ou classes morfológicas, por exemplo). Porém, apenas este mapeamento não é suficiente para várias situações, sendo de extrema importância também obter estimativas da incerteza.

Como já falamos antes, existem dois tipos de incertezas que, quando somadas, resultam na incerteza preditiva, a incerteza 'total' de cada estimativa feita pela rede:

  1. Aleatória
  2. Epistêmica

De novo, uma medida da incerteza é essencial para entendermos quais são os limites dos nossos modelos e verificarmos a sua confiança nas predições.

O grande diferencial das BNNs é o fato de que cada peso da rede é uma distribuição, não um número único. Esta distribuição pode ser aprendida durante o processo de treinamento ou pode ser fixa.

Diferença entre uma rede neural normal e uma BNN.

Mas qual é a vantagem desse approach?

O 'problema' das redes neurais profundas é que elas maximizam a verossimilhança (maximum likelihood) da amostra de treinamento dado os parâmetros da rede (ou seja, $P(D|w)$), de forma que ela acaba sendo optimizada exclusivamente para o range de parâmetros que a amostra de treinamento abrange, diminuindo sua capacidade de generalização.

Podemos melhorar um pouco essa situação utilizando técnicas de regularização, como dropout, L1, L2, early-stopping e por aí vai. Porém ainda falta uma coisa neste tipo de rede: uma estimativa da incerteza da predições.

Não só isso, BNNs são mais robustas à over-fitting e tem maior capacidade de aprender a partir de conjuntos de dados menores.


Os parâmetros destas distribuições, que agora representam os pesos, são estimados com inferência Bayesiana, que usa o teorema de Bayes:

$P(w|D) \propto P(D|w) \cdot P(w)$, onde

Todo esse processo é muito pesado computacionalmente, talvez impossível para grandes redes. Por isso utilizamos aproximações como, por exemplo, aproximar a distribuição posterior como uma Gaussiana (posterior variacional - $q(w|D)$), ajustando os parâmetros desta distribuição para serem o mais próximo possível do posterior verdadeiro ($P(w|D)$). Isto é feito minimizando a divergência Kullback-Leibler entre esta distribuição simples e o posterior verdadeiro.

Algumas leituras:


Mas ok, como que podemos fazer um modelo e aplicá-lo em alguma coisa?

Tensorflow Probability - Primeiros passos

Antes de tudo, devemos instalar o Tensorflow 2 para poder utilizar o Tensorflow Probability. O Colab usa o TF2 por padrão e já possui o TFP instalado.

Para instalar no seu computador é só usar o pip:

pip install tensorflow-probability

Regressão

O primeiro caso que vamos ver é uma aplicação bem simples do TFP em um problema de regressão em 4 etapas:

  1. Modelo sem incertezas
  2. Modelo com incerteza aleatória
  3. Modelo com incerteza epistêmica
  4. Modelo com as duas incertezas juntas

Referência: Regression with Probabilistic Layers in TensorFlow Probability

Modelo sem incertezas

Modelo com incerteza aleatória

Modelo com incerteza epistêmica

Para estimar a incerteza epistêmica nós utilizaremos uma camada específica do Tensorflow Probability, chamada de DenseVariational. Para utilizá-la é necessário mais duas definições: um posterior e um prior.

  1. O posterior ($Q(w)$) que nós definimos é uma forma de representar a incerteza sobre o valor dos pesos do modelo;
  2. O prior ($P(w)$) representa a incerteza dos pesos antes de olharmos para os dados.

A função desta camada é regularizar o posterior para que fique semelhante ao prior.


Como agora os pesos da rede não são exatos (as distribuições conferem incerteza a eles), toda vez que fizermos uma predição com esta rede obteremos um valor diferente, pois estamos fazendo amostragens destes pesos.

Amostragem em uma BNN.

Nas definições abaixo, o posterior é uma distribuição normal, na qual tanto a média quanto o desvio padrão podem ser treinados. Já o prior é uma distribuição normal com média treinável, porém o desvio padrão é fixo em 1.

Modelo com as duas incertezas juntas

Após treinar este modelo e fazer uma amostragem grande (várias predições), podemos calcular as três incertezas (aleatória, epistêmica e preditiva) utilizando os valores das médias e variâncias das predições

Variational Autoencoder

Referência: aqui ou aqui, mais detalhado

Outros tipos de rede

O uso do TFP não é restrito à problemas de regressão e classificação. Pode também ser usado em