Question

RBM, dans la phase positive de mise à jour de la couche cachée (qui devrait également être binaire), [acually considère un noeud de h1 ? H (vecteur de couche cachée)] pour h1 un nombre binaire on calcule la probabilité de rotation sur une unité cachée en actionnant la fonction d'activation sur l'entrée totale (après l'opération de la fonction d'activation, nous subirions des valeurs comprises entre 0 et 1, puisque la fonction d'activation J'utilise - sigmoïde). Mon doute est que comment pouvons-nous le faisons binaire en tirant parti de la probabilité calculée. Je ne pense pas que si P> = 0,5, faire 1 sinon 0 est une méthode appropriée pour travailler.

Par quelques revues de la littérature, J'ai trouvé ce documents (par Hinton), dans la section 3.1: il a déclaré « les tours unitaires cachés sur si cette probabilité est supérieure à un nombre aléatoire uniformément réparti entre 0 et 1 ». Qu'est-ce que cela signifie réellement? Et aussi, disent-ils dans ce lien « Ensuite, l'unité est si jème sur le choix de nombre aléatoire uniformément réparti entre 0 et 1, nous constatons que sa valeur est inférieure à sig [j]. Sinon, il est éteint « . En fait, je n'ai pas eu cela. Si le nombre aléatoire généré est le même pour tout h ? H? Une autre requête est, qu'en l'aléatoire dans la prochaine itération d'échantillonnage?

J'ai vu cette vidéo . Il suffit de regarder la vidéo de ce moment-là que par le lien. Comment obtenez-vous ce nombre échantillonné? Que nous avons juste rand run () dans Matlab et l'obtenir? Au cas où ce serait différent pour chaque h (i) (oh Nooon! Je ne pense pas que la machine va apprendre correctement)? Que ce soit le nombre aléatoire doit être différent pour chaque itération ou le même nombre aléatoire peut être utilisé pour toutes les itérations pour comparer?

Était-ce utile?

La solution

Comme vous le dites bien, on calcule la probabilité d'une unité cachée $ h_j $ étant l'un, puis le rendre binaire. Cette probabilité est donnée par $$ p (h_j = 1) = \ sigma \ left (b_j + \ sum_ {i = 1} ^ V w_ {ij} v_i \ right) $$ où $ \ sigma $ est la fonction sigmoïde, $ b_j $ est le biais de l'unité cachée $ h_j $, V $ est le nombre d'unités visibles, $ v_i $ est l'état (binaire!) de l'unité visible $ i $, et $ W_ {ij} $ sont les poids.

Alors, votre code Matlab pour obtenir les probabilités hidden_probs est quelque chose comme ça (nous écrivons implicitement la somme en faisant une multiplication matricielle):

hidden_probs = sigmoid(hidden_bias + data * weights)

Maintenant, nous avons la probabilité $ p (h_j = 1) $ pour chaque unité cachée $ j \ in [1, M] $. Maintenant, ce n'est une probabilité. Et nous avons besoin d'un nombre binaire, soit 0 ou 1. La seule chose que nous pouvons faire est de choisissez un échantillon aléatoire de la distribution de probabilité de $ h_j $, ce qui est un Bernoulli .

Comme toutes les unités cachées sont indépendantes, nous avons besoin d'obtenir un échantillon pour chaque unité cachée de manière indépendante. Et aussi, à chaque étape de formation, nous avons besoin d'attirer de nouveaux échantillons.

Pour tirer ces échantillons de la distribution Bernoulli, vous pouvez utiliser les fonctions intégrées de par exemple Matlab ( binornd ) ou Python ( numpy.random.binomial ). Notez que ces fonctions sont à l'échantillon d'une distribution binomiale, mais la distribution Bernoulli est un cas particulier de la distribution binomiale avec N=1. Dans Matlab, ce serait quelque chose comme

hidden_states = binornd(1, hidden_probs)

qui créerait vecteur hidden_states qui contient soit 0 ou 1, choisi au hasard pour chaque probabilité de hidden_probs.

Comme vous l'avez probablement remarqué, personne ne le fait! Par ex décrit dans son Guide pratique RBMs formation , comme

les spires unitaires cachés sur si cette probabilité est supérieure à un nombre aléatoire uniformément distribué entre 0 et 1.

C'est exactement ce que fait Hinton dans son Code RBM : il reçoit un nombre aléatoire pour chaque unité cachée en utilisant rand, soit inclus dans l'échantillon au hasard de la distribution uniforme entre [0,1]. Il fait alors la comparaison:

hidden_states = hidden_probs > rand(1, H)

Cela équivaut à l'utilisation binornd, mais est probablement plus rapide. Par exemple, pour générer un nombre aléatoire qui est 1 avec p=0.9, vous obtenez un nombre aléatoire de [0,1]. Maintenant, dans 90% des cas, ce nombre aléatoire est inférieur à 0,9, et dans 10% des cas, il est supérieur à 0,9. Donc, pour obtenir un nombre aléatoire qui est 1 avec p=0.9, vous pouvez appeler 0.9 > rand(1) - ce qui est exactement ce qu'ils font

.

tl; dr Pick un nouveau nombre aléatoire de la gamme [0,1] pour chaque unité cachée dans chaque itération. Comparez-le à votre probabilité avec hidden_probs > rand(1,H) pour le rendre binaire.

Licencié sous: CC-BY-SA avec attribution
scroll top