À actuellement, les alors grands dédicace de l’vérification en mensuration ont eu canton à cause le redevance de l’vérification supervisé, nécessitant de nombreuses occurrence de évolution annotées. Toutefois, les occurrence ne sont pas (ordinairement) accompagnées d’annotations ou d’inscriptions. Itou, vérification non supervisé est reliant en excuse de l’sympathie derrière la coeur mortelle.

Jusqu’ce jour, sur ce blog, quelques-uns avons vu un duo de architectures majeures revers l’vérification non supervisé : les auto-encodeurs variationnels et les réseaux génératifs antagonistes. Moins connus, purement attrayants revers des raisons conceptuelles et de geste sont régulation des bascule (Jimenez Rezende et Mohamed 2015). Pendant lequel cet feuilleton et le talonnant, quelques-uns présenterons les bascule, en quelques-uns concentrant sur la soigné de les réaliser à l’collègue de Anticipation TensorFlow (TFP).

Inversement aux journaux précédentes impliquant TFP qui accédait à ses fonctionnalités en utilisant des $-syntaxe, quelques-uns utilisons gardant tfprobability, un wrapper R à cause le débit de keras, tensorflow et tfdatasets. Une apostille à propos de ce produit : il est aussi en espèce de progrès et l’API peut ébranler. Au conjoncture d’calligraphier ces degrés, les wrappers n’existent pas aussi revers entiers les modules TFP, purement toutes les fonctionnalités TFP sont disponibles en utilisant $-la phonologie si indigence.

Idée de la précision et digitalisation

Revenons à l’vérification non supervisé, et en intelligent alors essentiellement aux auto-encodeurs variationnels, quelles sont les principales choses qu’ils quelques-uns apportent ? Une machin qui avorté guère à cause les éditoriaux sur les méthodes génératives, ce sont des images de visages essence réels (ou de cours à allonger, ou d’élevage…). Donc effectivement digitalisation (ou : prolifération) est une compétition importante. Si quelques-uns pouvons échantillonner à directement d’un modèle et extorquer des créatures qui semblent réelles, ceci signifie que le modèle a renseigné chaque machin sur la créer lequel les choses sont distribuées à cause le monde : il a renseigné une immunité. Pendant lequel le cas des auto-encodeurs variationnels, il y a alors : les créatures sont supposées personnalité déterminées par un chorale de facteurs latents méconnaissables et démêlés (espérons-le !). Cependant ce n’est pas l’augure à cause le cas de la régulation des bascule, quelques-uns n’allons tandis pas quelques-uns allonger sur ce point ici.

Derrière souvenir, hein échantillonne-t-on à directement d’un VAE ? Quelques-uns tirons de (z), la ambulatoire latente, et exécutez le tissage de décodeurs à ce niveau. Le acquisition devrait – quelques-uns l’pourvu – étendre l’position qu’il provient de la immunité des occurrence expérimentaux. Il ne faut uniquement pas possession l’air littéralement alors n’importe léser des éléments utilisés revers policer les VAE, soit quelques-uns n’avons contretype renseigné d’capital.

La aide machin que l’on peut extorquer d’un VAE est une conversation de la chance des occurrence individuelles, à user par original à cause la localisation d’anomalies. Ici, la « chance » est intentionnellement verbeux : derrière la VAE, quelques-uns n’avons annulé intercession de marier une précision régulière en deçà le culot.

Que se passe-t-il si quelques-uns voulons ou avons indigence des un duo de : la prolifération d’échantillons et l’exemple de la précision ? C’est ici que régulation des bascule Entrez.

Organiser les bascule

UN chavirer est une suite de mappages différentiables et inversibles des occurrence inspiration une immunité « convenable », chaque machin que quelques-uns pouvons gentiment échantillonner et user revers marier une précision. Prenons alors original la soigné canonique de engendrer des échantillons à directement d’une efficace immunité, l’exponentielle, par original.

Quelques-uns commençons par consulter à à nous alternateur de nombres aléatoires un abondance saisi imprégné 0 et 1 :

Ce abondance que quelques-uns traitons alors provenant d’un immunité de anticipation cumulée (CDF) – d’un exponentiel CDF, revers personnalité succinct. Gardant que quelques-uns avons une bravoure du CDF, quelque ce que quelques-uns avons à employer est de mapper ce “réintégration” à une bravoure. Cette géodésie CDF -> value que quelques-uns recherchons est étroit l’opposé du CDF d’une immunité exponentielle, le CDF rencontrant

(F(x) = 1 – e^{-lambda x})

L’opposé est lorsque

( F^{-1}(u) = -frac{1}{commun} ln (1 – u) )

ce qui signifie que quelques-uns pouvons extorquer à nous édifiant exponentiel

commun <- 0.5 # pick some commun
x <- -1/commun * log(1-u)

Quelques-uns voyons que le CDF est en document un chavirer (ou un tronçon vital de celui-là, si quelques-uns imaginons la grand nombre des bascule alors acéré contradictoires transformations), vu que

  • Il mappe les occurrence sur une immunité monotone imprégné 0 et 1, permettant d’compter la chance des occurrence.
  • Contradictoirement, il mappe une anticipation à une bravoure régulière, permettant par conséquent de engendrer des échantillons.

À directement de cet original, quelques-uns voyons aussi un bascule devrait personnalité inversible, purement quelques-uns ne voyons pas aussi aussi il devrait l’personnalité différentiable. Ceci deviendra visible en deçà peu, purement examinons d’entour hein les bascule sont disponibles à cause tfprobability.

Bijecteurs

TFP est livré derrière un ressources de transformations, billard bijectorsfougue de lithiase faciles alors l’exponentiation à des lithiase alors complexes alors la transformée en cosinus distinguée.

Derrière débarquer, utilisons tfprobability revers engendrer des échantillons à directement de la immunité quotidienne. Il y a un bijecteur tfb_normal_cdf() qui prend les occurrence d’crise à l’marge ((0,1)). Sa transformée opposé certifie lorsque une ambulatoire conjectural derrière la immunité quotidienne courant :

Contradictoirement, quelques-uns pouvons user ce bijecteur revers emballer la anticipation (log) d’un édifiant à directement de la immunité quotidienne. Quelques-uns allons contrôler relativement à une maniement clair de tfd_normal à cause le distributions ascendant:

x <- 2.01
d_n <- tfd_normal(loc = 0, scale = 1) 

d_n %>% tfd_log_prob(x) %>% as.numeric() # -2.938989

Derrière extorquer cette même anticipation log du bijecteur, quelques-uns ajoutons un duo de composants :

  • Ensemble d’entour, quelques-uns analysons l’édifiant à défaut le forward modification et marier la anticipation logarithmique en deçà la immunité monotone.
  • Secondement, alors quelques-uns utilisons la immunité monotone revers emballer la anticipation d’un édifiant cohérent, quelques-uns endettons parrainer l’renversement de la anticipation en deçà cette modification. Ceci se document en appelant tfb_forward_log_det_jacobian (à fixer ci-après).
b <- tfb_normal_cdf()
d_u <- tfd_uniform()

l <- d_u %>% tfd_log_prob(b %>% tfb_forward(x))
j <- b %>% tfb_forward_log_det_jacobian(x, event_ndims = 0)

(l + j) %>% as.numeric() # -2.938989

Par conséquent ceci fonctionne-t-il ? Mettons-nous en situation.

La cerné de anticipation est conservée

Les bascule sont basés sur le postulat que en deçà modification, la cerné de anticipation est conservée. Disons que quelques-uns avons un bascule de (X) à (z):
(z = f(x))

Supposons que quelques-uns échantillonnions à directement de (z) plus, calculez la transformée opposé revers extorquer (X). On connaît la anticipation de (z). Lequel est la anticipation que (X)l’édifiant changé, se situe imprégné (x_0) et (x_0 + dx)?

Cette anticipation est (p(x) dx), la précision multipliée par la mensuration de l’marge. Celle-là-ci doit personnalité égale à la anticipation que (z) est saisi imprégné (f(x)) et (f(x + dx)). Ce nouveau marge a une mensuration (f'(x) dx)tandis:

(p(x) dx = p(z) f'(x) dx)

Ou synonyme

(p(x) = p(z) * dz/dx)

Tel quel, la anticipation de l’édifiant (p(x)) est ferme par la anticipation de séance (p(z)) de la immunité transformée, multiplié par quel nombre le bascule étend l’détourné.

Il en va élément à cause les dimensions supérieures : aussi une coup, le bascule concerne le articulation de cubage de anticipation imprégné le (z) et (y) les espaces:

(p(x) = p(z) queue de pie{vol(dz)}{vol(dx)})

En largeur abbesse, le jacobien remplace la dérivée. Ultérieurement, la magnitude de cubage est captée par la bravoure intégrale de son apposition :

(p(mathbf{x}) = p(f(mathbf{x})) bigg|detfrac{immérité f({mathbf{x})}}{immérité{mathbf{ x}}}bigg|)

En servant, quelques-uns travaillons derrière des probabilités logarithmiques, tandis

(log p(mathbf{x}) = log p(f(mathbf{x})) + log bigg|detfrac{immérité f({mathbf{x})}}{ immérité{mathbf{x}}}bigg| )

Voyons ceci derrière un dissemblable bijector original, tfb_affine_scalar. Plus bas, quelques-uns construisons un mini-flux qui mappe nous choisis illégalement (X) droits revers froisser à eux bravoure (scale = 2):

x <- c(0, 0.5, 1)
b <- tfb_affine_scalar(shift = 0, scale = 2)

Derrière examiner les densités en deçà le bascule, on choisit la immunité quotidienne, et on dévisagé les log densités :

d_n <- tfd_normal(loc = 0, scale = 1)
d_n %>% tfd_log_prob(x) %>% as.numeric() # -0.9189385 -1.0439385 -1.4189385

Gardant, appliquez le bascule et calculez les nouvelles densités de log alors une montant des densités de log du concordant (X) droits et le apposition logarithmique du jacobien :

z <- b %>% tfb_forward(x)

(d_n  %>% tfd_log_prob(b %>% tfb_inverse(z))) +
  (b %>% tfb_inverse_log_det_jacobian(z, event_ndims = 0)) %>%
  as.numeric() # -1.6120857 -1.7370857 -2.1120858

Quelques-uns voyons qu’à avare que les droits s’étirent à cause l’détourné (quelques-uns multiplions par 2), les densités de log individuelles diminuent. Quelques-uns pouvons contrôler que la anticipation cumulée rebut la même en utilisant tfd_transformed_distribution():

d_t <- tfd_transformed_distribution(immunité = d_n, bijector = b)
d_n %>% tfd_cdf(x) %>% as.numeric()  # 0.5000000 0.6914625 0.8413447

d_t %>% tfd_cdf(y) %>% as.numeric()  # 0.5000000 0.6914625 0.8413447

Jusqu’ce jour, les bascule que quelques-uns avons vus présentaient statiques – hein ceci s’intègre-t-il à cause le contenant des réseaux de neurones ?

Établir un bascule

Existant donné que les bascule sont bidirectionnels, il y a un duo de façons de les inspecter. Supra, quelques-uns avons particulièrement insisté sur la géodésie opposé : quelques-uns voulons une immunité clair à directement laquelle quelques-uns pouvons échantillonner et que quelques-uns pouvons user revers marier une précision. Pendant lequel cette nervure, les bascule sont tantôt appelés “mappages des occurrence au entourage” – entourage rencontrant particulièrement une gaussienne isotrope. Toutefois, en servant, quelques-uns n’avons pas aussi ce « entourage », quelques-uns avons étroit des occurrence. Ainsi en servant, il faut acquiescer un bascule qui effectue un tel mappage. Quelques-uns le faisons en utilisant bijectors derrière des paramètres entraînables. Quelques-uns allons remarquer un original méchamment clair ici, et omettre les “bascule du monde effectif” au hominien feuilleton.

L’original est basé sur la compétition 1 de l’préface d’Eric Jang à la régulation des bascule. La responsable disproportion (en extérieur de la uniformisation revers présenter le modèle de séance) est que quelques-uns utilisons une conception précoce.

Quelques-uns partons d’une gaussienne isotrope bidimensionnelle et quelques-uns voulons modéliser des occurrence qui sont puisque normales, purement derrière une norme de 1 et une variance de 2 (à cause les un duo de dimensions).

library(tensorflow)
library(tfprobability)

tfe_enable_eager_execution(device_policy = "silent")

library(tfdatasets)

# where we start from
base_dist <- tfd_multivariate_normal_diag(loc = c(0, 0))

# where we want to go
target_dist <- tfd_multivariate_normal_diag(loc = c(1, 1), scale_identity_multiplier = 2)

# create jogging data from the target immunité
target_samples <- target_dist %>% tfd_sample(1000) %>% tf$cast(tf$float32)

batch_size <- 100
dataset <- tensor_slices_dataset(target_samples) %>%
  dataset_shuffle(buffer_size = dim(target_samples)(1)) %>%
  dataset_batch(batch_size)

Quelques-uns allons gardant former un infime tissage de neurones, hybride d’une modification affine et d’une non-linéarité. Derrière le précurseur, on peut user tfb_affinele imparfait divers de tfb_affine_scalar. En ce qui concerne les non-linéarités, imitation TFP est livré derrière tfb_sigmoid et tfb_tanhpurement quelques-uns pouvons former à nous doué ReLU paramétré en utilisant tfb_inline:

# aleph is a learnable parameter
bijector_leaky_relu <- function(aleph) {
  
  tfb_inline(
    # forward transform leaves effective values untouched and scales negative ones by aleph
    forward_fn = function(x)
      tf$where(tf$greater_equal(x, 0), x, aleph * x),
    # opposé transform leaves effective values untouched and scales negative ones by 1/aleph
    inverse_fn = function(y)
      tf$where(tf$greater_equal(y, 0), y, 1/aleph * y),
    # cubage bourse is 0 when effective and 1/aleph when negative
    inverse_log_det_jacobian_fn = function(y) {
      I <- tf$ones_like(y)
      J_inv <- tf$where(tf$greater_equal(y, 0), I, 1/aleph * I)
      log_abs_det_J_inv <- tf$log(tf$abs(J_inv))
      tf$reduce_sum(log_abs_det_J_inv, axis = 1L)
    },
    forward_min_event_ndims = 1
  )
}

Définissez les variables apprenables revers les parturition affine et PReLU :

d <- 2 # dimensionality
r <- 2 # rank of update

# shift of affine bijector
shift <- tf$get_variable("shift", d)
# scale of affine bijector
L <- tf$get_variable('L', c(d * (d + 1) / 2))
# rank-r update
V <- tf$get_variable("V", c(d, r))

# scaling factor of parameterized épelé
aleph <- tf$abs(tf$get_variable('aleph', list())) + 0.01

Comme une conception leste, les variables doivent personnalité utilisées à l’pensionnaire de la assaut de coulage, c’est tandis là que quelques-uns définissons les bijecteurs. À nous enfant bascule est gardant un tfb_chain de bijecteurs, et on l’coque à cause un TransformationDistribution (tfd_transformed_distribution) qui joint les distributions origine et souffre-douleur.

loss <- function() {
  
 affine <- tfb_affine(
        scale_tril = tfb_fill_triangular() %>% tfb_forward(L),
        scale_perturb_factor = V,
        shift = shift
      )
 lrelu <- bijector_leaky_relu(aleph = aleph)  
 
 flow <- list(lrelu, affine) %>% tfb_chain()
 
 dist <- tfd_transformed_distribution(immunité = base_dist,
                          bijector = flow)
  
 l <- -tf$reduce_mean(dist$log_prob(batch))
 # keep track of progress
 print(reprise(as.numeric(l), 2))
 l
}

Gardant, quelques-uns pouvons positivement établir la évolution !

optimizer <- tf$coffre$AdamOptimizer(1e-4)

n_epochs <- 100
for (i in 1:n_epochs) {
  iter <- make_iterator_one_shot(dataset)
  until_out_of_range({
    batch <- iterator_get_next(iter)
    optimizer$minimize(loss)
  })
}

Les résultats différeront en assaut de l’mise en route conjectural, purement vous-même devriez remarquer une aggravation légitime (si parasite). En utilisant des bijecteurs, quelques-uns avons en document formé et amené un enfant tissage de neurones.

Perspectives

Hormis annulé hésitation, ce bascule est bien clair revers modéliser des occurrence complexes, purement il est informatif d’possession vu les coutumes de séance précocement de se enliser à cause des bascule alors complexes. Pendant lequel le hominien feuilleton, quelques-uns vérifierons bascule autorégressifscontinuellement en utilisant TFP et tfprobability.

Jimenez Rezende, Danilo et Shakir Mohamed. 2015. “Production variationnelle derrière des bascule de régulation.” Impressions électroniques arXiv, mai, arXiv:1505.05770. https://arxiv.org/abs/1505.05770.

By nsmaat