[PYTHON] Résumé de la netteté et du lissage des probabilités + Applicable à la génération simple de documents

Récemment. Je lis un article sur la conception moléculaire [1], mais j'ai parlé de redimensionner la probabilité, alors je l'ai résumé.

Le rééchelonnement des probabilités est utilisé pour affiner et lisser les distributions de probabilité discrètes.

L'augmentation de la probabilité est l'opération consistant à convertir une probabilité élevée en une probabilité plus élevée et une probabilité faible en une probabilité plus faible. Par cette opération, la distribution de probabilité discrète se rapproche d'une distribution de probabilité unique (1 pour certains éléments et 0 pour d'autres).

D'autre part, le lissage de probabilité est une opération qui lisse la distribution de probabilité. Il s'agit d'une opération qui rapproche la distribution de probabilité discrète d'une distribution uniforme.

sample.png

La netteté et le lissage sont utilisés lors de l'ajustement de la distribution de probabilité pour la génération d'échantillon. Si vous utilisez la netteté dans la génération de documents pour le traitement du langage naturel, des phrases plus couramment utilisées seront générées. D'un autre côté, le lissage produit un large éventail de phrases.

Cette idée est utilisée non seulement dans le traitement du langage naturel, mais également dans divers endroits tels que le regroupement non supervisé et la génération de conception moléculaire.

Ici, je vais présenter deux méthodes de redimensionnement et les essayer avec un simple problème de génération de phrases.

Thermal Rescaling Cette méthode utilise la distribution de Boltzmann utilisée en mécanique statistique. En supposant que la distribution de probabilité avant la remise à l'échelle est q_i et que la distribution de probabilité après la remise à l'échelle est p_i, la redimensionnement thermique est la suivante.

p_i = \frac{\exp(\frac{q_i}{T})}{\sum_{j}\exp(\frac{q_j}{T})}

Ici, T est un paramètre de température, et lorsque T est petit, il est accentué, et lorsque T est grand, il est lissé. Le changement de la distribution de probabilité dû au rééchelonnement thermique est le suivant.

example_thermal.png

Les caractéristiques du redimensionnement thermique sont les trois points suivants.

  1. Lorsque T s'approche de 0, il s'approche de la distribution de probabilité One-Hot "v".
  2. Lorsque T augmente, il s'approche de la distribution uniforme "u".
  3. Il n'y a pas toujours un paramètre de température "T" qui correspond à la distribution de probabilité avant conversion **.

En tant que système de caractéristique 3, il est important que les éléments avec une probabilité de 0 ne soient pas préservés (élément 3 dans la figure ci-dessus). Ce problème peut casser les règles de distribution de probabilité qui étaient supposées avant la remise à l'échelle.

Ce qui suit montre les informations KL de la distribution après la remise à l'échelle, (A) la distribution d'origine q, (B) la distribution uniforme u et (C) la distribution de probabilité à un point v.

KL_thermal.png

Lorsque T s'approche de 0, la quantité d'informations KL avec la distribution de probabilité unique v s'approche de 0, et à mesure que T augmente, la quantité d'informations KL avec la distribution uniforme u s'approche de 0. En revanche, la quantité d'informations KL avec la distribution d'origine q ne s'approche jamais de 0.

Ce n'est pas autant que du code, mais si vous utilisez numpy, cela ressemble à ceci:

#Distribution de probabilité discrète originale
q = np.array([0.1,0.05,0.6,0,0.2,0.05])
#Paramètre de température
T = 0.05
#Remise à l'échelle
p = np.exp(q/T) / np.sum(np.exp(q/T))

Freezing function

Il existe une fonction Freezing comme méthode de redimensionnement qui multiplie exponentiellement la probabilité. Cette idée est également utilisée dans la méthode d'apprentissage non supervisé, Deep Embedded Clustering (DEC) [2]. En supposant que la distribution de probabilité avant la remise à l'échelle est q_i et la distribution de probabilité après la remise à l'échelle est p_i, la fonction de gel est la suivante.

p_i = \frac{q_i^{\frac{1}{T}}}{\sum_{j}q_j^{\frac{1}{T}}}

Semblable au redimensionnement thermique, T est un paramètre de température, qui est accentué lorsque T est petit et lissé lorsque T est grand. Le changement de la distribution de probabilité dû au rééchelonnement thermique est le suivant.

example_freesing.png

Les caractéristiques de la fonction Freezing sont les trois points suivants.

  1. Lorsque T s'approche de 0, il s'approche de la distribution de probabilité One-Hot "v".
  2. Lorsque T augmente, il ne s'approche pas toujours de la distribution uniforme "u" **.
  3. Lorsque T = 1, il correspond à la distribution de probabilité avant la conversion.

Contrairement au redimensionnement thermique, les éléments avec une probabilité de 0 sont enregistrés. Par conséquent, s'il existe un élément avec une probabilité de 0, le lissage n'entraînera pas une distribution uniforme.

Ce qui suit montre les informations KL de la distribution après la remise à l'échelle, (A) la distribution d'origine, (B) la distribution uniforme u et (C) la distribution de probabilité à un point v. (D(u||p)Ne peut pas être calculé, donc D(p||u)A été calculé. )

KL_freesing.png

Similaire au redimensionnement thermique, lorsque T s'approche de 0, la quantité d'informations KL avec la distribution de probabilité one-hot v approche 0, mais même si T augmente, la quantité d'informations KL avec la distribution uniforme u ne s'approche pas de 0. Hmm. Par contre, lorsque T = 1, la quantité d'informations KL avec la distribution d'origine q converge vers 0.

Ce n'est pas autant que du code, mais si vous utilisez numpy, cela ressemble à ceci:

#Distribution de probabilité discrète originale
q = np.array([0.1,0.05,0.6,0,0.2,0.05])
#Paramètre de température
T = 0.2
#Remise à l'échelle
p = q**(1/T) / np.sum(q**(1/T))

Application à la génération de documents

Les trois phrases suivantes sont utilisées pour l'apprentissage.

I have a pen. 
I have a dog. 
I buy a pen.

Cette fois, le modèle de génération de phrases utilise un simple 1 gramme. Si vous créez environ 10 phrases en utilisant 1 gramme, ce sera comme suit.

 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a dog [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I buy a dog [EoS]
 [SoS] I buy a dog [EoS]
 [SoS] I have a pen [EoS]

Une certaine phrase désordonnée est générée.

Tout d'abord, en utilisant la fonction Freezing, les phrases accentuées sont les suivantes (T = 0,1).

 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]

Comme il existe de nombreuses phrases d'apprentissage qui utilisent «ont» après «je» et «stylo» après «a», une seule phrase a été générée par la netteté.

Ensuite, le texte lissé à l'aide de la fonction Freezing est le suivant (T = 2.0).

 [SoS] I have a dog [EoS]
 [SoS] I buy a dog [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a pen [EoS]
 [SoS] I have a dog [EoS]
 [SoS] I buy a dog [EoS]
 [SoS] I buy a pen [EoS]
 [SoS] I buy a pen [EoS]
 [SoS] I have a dog [EoS]

Le nombre d'échantillons qui utilisent "acheter" après "I" augmente, mais les règles d'écriture ne sont pas enfreintes.

Enfin, le texte lissé à l'aide de la redimensionnement thermique est le suivant. (T = 1,0)

 [SoS] a I have dog I have I [EoS]
 [SoS] [EoS]
 [SoS] have [SoS] I buy [EoS]
 [SoS] a a [EoS]
 [SoS] [SoS] [SoS] [EoS]
 [SoS] [EoS]
 [SoS] a buy a dog dog [SoS] I dog pen pen pen buy pen [EoS]
 [SoS] dog buy a I pen I have buy I buy a dog [EoS]
 [SoS] dog buy buy I dog a pen have dog pen [EoS]
 [SoS] I [SoS] buy dog [SoS] a pen pen [EoS]

La règle de déclaration est enfreinte. Le redimensionnement thermique est dû au fait de ne pas enregistrer les éléments avec une probabilité de 0.

Le code de génération de phrases est indiqué ci-dessous. ..

import numpy as np

corpus = "I have a pen. I have a dog. I buy a pen."
#Divisez en phrases
sentences =  corpus.split('.')
#Avec la suppression du texte vierge[SoS],[EoS]En plus de
sentences = ['[SoS] ' + s + ' [EoS]' for s in sentences if s != '']
# [EoS]→[EoS]Ajouter
sentences.append("[EoS] [EoS]")
#Suppression du double espace
sentences = [s.replace('  ',' ')  for s in sentences]
#Divisez en mots
words =[]
for s in sentences:
    words.append(s.split(' '))
#Créer une liste de mots
word_list = ['[SoS]'] + list(set(sum(words,[])) - set(['[SoS]','[EoS]'])) + ['[EoS]']
#Convertir la liste de mots en numéro d'élément
num_list = np.arange(len(word_list))
word_dict = dict(zip(word_list,num_list))
#Créer des probabilités de transition
A = np.zeros((len(word_list),len(word_list)))
for s in words:
    for i in range(len(s) - 1):
        #Compter
        A[word_dict[s[i+1]],word_dict[s[i]]] +=1
A = A / A.sum(axis = 0)
#Génération de documents originaux
sentences_g = []

for i in range(10):
    #Initialement[SoS]
    w = [0]
    while True:
        #Prochaine distribution de probabilité
        q = A[:,w[-1]]
        # sampling and append
        w.append(np.argmax(np.random.multinomial(1,q)))
        # if EoS then break
        if w[-1] == len(word_list)-1:
            break;
    #Convertir en chaîne
    s = ''
    for i in w:
        s = s + ' ' +word_list[i]  

    #Ajouter un document
    sentences_g.append(s)
#afficher
for s in sentences_g:
    print(s)

Code d'affûtage par fonction Freezing:

#  Sharpening by Freezing : T = 0.1
T = 0.1
sentences_g = []
for i in range(10):
    w = [0]
    while True:
        q = A[:,w[-1]]
        #Remise à l'échelle
        p = q**(1/T) / np.sum(q**(1/T))
        w.append(np.argmax(np.random.multinomial(1,p)))
        if w[-1] == len(word_list)-1:
            break;
    s = ''
    for i in w:
        s = s + ' ' +word_list[i]  
    sentences_g.append(s)
for s in sentences_g:
    print(s)

Code de lissage par redimensionnement thermique:

#  Smoothing by Thermal : T = 1.0
T = 1.0
sentences_g = []
for i in range(10):
    w = [0]
    while True:
        q = A[:,w[-1]]
        #Remise à l'échelle
        p = np.exp(q/T) / np.sum(np.exp(q/T))
        w.append(np.argmax(np.random.multinomial(1,p)))
        if w[-1] == len(word_list)-1:
            break;
    s = ''
    for i in w:
        s = s + ' ' +word_list[i]  

    sentences_g.append(s)
for s in sentences_g:
    print(s)

Si vous voulez biaiser et redimensionner

Nous pouvons redimensionner pour faire apparaître certains éléments. Dans ce cas, vous pouvez utiliser la fonction Gumbel-softmax [3].

En supposant que la distribution de probabilité avant la remise à l'échelle est $ q_i $ et la distribution de probabilité après la remise à l'échelle est de $ p_i $, la fonction Gumbel-Softmax est la suivante.

p_i = \frac{\exp(\frac{\log(q_i)+ g_i}{T})}{\sum_{j}\exp(\frac{\log(q_j)+ g_j}{T})}

Ici, T est un paramètre de température, et comme le rééchelonnement jusqu'à présent, il est accentué lorsque T est petit et lissé lorsque T est grand. De plus, g_i est un paramètre qui détermine la priorité lors de la remise à l'échelle. Dans l'article, g_i est généré à partir de la distribution suivante.

g_i = -\log (-\log u),\quad u\sim {\rm Uniform}(0, 1)

En plus de la fonction Gumbel-Softmax, je pense qu'il existe une méthode de biais et de redimensionnement. Je veux l'utiliser en fonction de la situation.

Résumé

Si vous souhaitez conserver l'élément avec une probabilité de 0, utilisez la fonction Freezing, et si vous ne souhaitez pas conserver l'élément avec une probabilité de 0, utilisez la redimensionnement thermique.

code https://github.com/yuji0001/2020GenerativeModel

Author Yuji Okamoto: [email protected]

Reference [1] Elton, D. C., Boukouvalas, Z., Fuge, M. D., & Chung, P. W. (2019, August 1). Deep learning for molecular design - A review of the state of the art. Molecular Systems Design and Engineering, Vol. 4, pp. 828–849. https://doi.org/10.1039/c9me00039a

[2] Xie, J., Girshick, R., & Farhadi, A. (2015). Unsupervised Deep Embedding for Clustering Analysis. 48. Retrieved from http://arxiv.org/abs/1511.06335

[3] Jang, E., Gu, S., & Poole, B. (2019). Categorical reparameterization with gumbel-softmax. 5th International Conference on Learning Representations, ICLR 2017.

Recommended Posts

Résumé de la netteté et du lissage des probabilités + Applicable à la génération simple de documents
[python] Résumé de la récupération des listes et des éléments du dictionnaire
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
Extension Sphinx pour convertir arbitrairement du texte en pré-traitement de la génération de documents
Résumé de l'utilisation de pandas.DataFrame.loc
Résumé de l'utilisation de pyenv-virtualenv
Explication et mise en œuvre du perceptron simple
Résumé de l'utilisation de csvkit
Résumé des index et des tranches Python
Description et résumé de ce dont vous avez besoin pour installer Chainer sur Mac