[PYTHON] J'ai pu apprendre par machine l'algorithme de tri (avec un indicateur de longueur et d'ordre variable) avec RNN qui manipule la mémoire!

Machine neuronale différenciable?

L'article «L'informatique hybride utilisant un réseau neuronal avec mémoire externe dynamique» soumis par Google Deep Mind to Nature est en quelque sorte. Il a une odeur dangereuse. Dans l'article d'introduction officiel «Ordinateurs neuronaux différentiables», l'histoire commence avec la théorie de la mémoire de Platon, et dans l'article Kaiba, qui contrôle la mémoire du cerveau. C'est assez magnifique parce que c'est comparable à. Non seulement en améliorant les performances du réseau de neurones, mais aussi du point de vue de la philosophie et des neurosciences, nous avons pu nous rapprocher de l'intelligence artificielle idéale, et je pense que c'est une invention d'une nouvelle manière d'informatique.

Le mécanisme comprend le concept populaire de Attention, qui comprend une matrice qui représente la mémoire et un contrôleur qui entre et sort des vecteurs tout en les manipulant sélectivement. Le contrôleur est un RNN (réseau neuronal récursif), et les opérations de mémoire peuvent également être différenciées. Par conséquent, je pense qu'il est possible d'apprendre automatiquement un algorithme général avec une structure de données, tout comme une machine de Turing. peut être. Dans l'expérience de l'article, il semble que la recherche d'itinéraire du graphique puisse être apprise avec une grande précision. Qu'est-ce que c'est incroyable.

J'ai été choqué, mais je n'ai pas encore lu les formules dans le journal, mais immédiatement "Présentation de DNC (Différentiable Neural Computers) + Implementation by Chainer" Certaines personnes l'ont implémenté, alors je vais jouer avec. Dans le code original, nous avons appris l'écho, développons donc l'apprentissage du tri.

résultat

Ensuite, voici le résultat des tests après avoir formé 20 000 échantillons. Oui, toutes les questions sont correctes.

# 20000

in  [7, 4] ASC
ans [4, 7]
out [4, 7] 1.0

in  [1, 6, 3] ASC
ans [1, 3, 6]
out [1, 3, 6] 1.0

in  [2, 6, 1, 2] ASC
ans [1, 2, 2, 6]
out [1, 2, 2, 6] 1.0

in  [1, 0, 6, 1, 7] DESC
ans [7, 6, 1, 1, 0]
out [7, 6, 1, 1, 0] 1.0

in  [5, 1, 2, 1, 4, 6] ASC
ans [1, 1, 2, 4, 5, 6]
out [1, 1, 2, 4, 5, 6] 1.0

in  [5, 4, 3, 5, 5, 8, 5] DESC
ans [8, 5, 5, 5, 5, 4, 3]
out [8, 5, 5, 5, 5, 4, 3] 1.0

in  [9, 3, 6, 9, 5, 2, 9, 5] ASC
ans [2, 3, 5, 5, 6, 9, 9, 9]
out [2, 3, 5, 5, 6, 9, 9, 9] 1.0

in  [0, 6, 5, 8, 4, 6, 0, 8, 0] ASC
ans [0, 0, 0, 4, 5, 6, 6, 8, 8]
out [0, 0, 0, 4, 5, 6, 6, 8, 8] 1.0

"In" est la colonne d'entrée et l'ordre de tri. "ASC" est en ordre croissant, "DESC" est en ordre décroissant. "Ans" est la bonne réponse, "out" est la colonne de sortie et le taux de correspondance avec la bonne réponse. À partir de ce résultat, nous pouvons voir que DNC a pu apprendre les tris, ainsi que les tris avec des indicateurs d'ordre et des longueurs de colonne variables.

Et bien que les données d'apprentissage ne soient fournies que pour celles dont la longueur de colonne est comprise entre 2 et 8, le test peut également trier les colonnes de longueur 9, il est donc également généralisé pour la longueur de colonne. On dirait que vous réussissez. C'était une surprise.

Paramètres et modèle

J'ai essayé de définir le paramètre de réglage DNC comme ceci.

Paramètres valeur
Taille du vecteur d'entrée 12
Taille du vecteur de sortie 10
Nombre de mémoires 20
Une taille de mémoire 12
Nombre d'en-têtes lus 2

Le RNN du contrôleur reste le code d'origine, une couche est LSTM Layer (in: 36 out: 83) et la deuxième couche est Fully Connected Layer (in: 83 out: 83), donc elle n'est pas profonde. Je n'ai rien réglé ici, donc je pense que je peux l'améliorer de différentes manières. J'avais plutôt peur parce que je pouvais facilement apprendre d'un seul coup sans rien régler.

Encoder et décoder

in  [1, 6, 3] ASC
ans [1, 3, 6]
out [1, 3, 6] 1.0

Il entre et sort du DNC dans l'ordre suivant: Tout d'abord, placez l'indicateur d'ordre, et après avoir mis la séquence de numéros, le résultat du tri est craché.

Étape d'exécution 1 2 3 4 5 6 7
contribution ASC 1 6 3 - - -
production x x x x 1 3 6

Pour être précis, l'entrée est encodée à chaud. "-" Est un vecteur nul. La sortie adopte l'indice du plus grand élément vectoriel. Ignorez le "x". Cette zone est également le code d'origine.

Pour DNC, la longueur de la séquence de nombres à trier n'est connue qu'après l'arrivée du vecteur zéro, et à cette étape, le nombre minimum ou maximum doit être sorti. Avant d'apprendre, je m'attendais à devoir donner une étape de grâce de l'entrée à la sortie, mais il n'y avait pas de problème particulier. Intelligent.

poème

Le développement et l'application du réseau neutre ces dernières années ont été remarquables, mais il s'agit toujours d'un monstre de reconnaissance de formes dans un domaine spécifique comme une image ou un langage naturel, et il est encore loin de la véritable intelligence artificielle. Eh, DCGAN pourrait-il générer une illustration en deux dimensions? (Laissez l'ordinateur dessiner une illustration en utilisant Chainer), LSTM a-t-il généré des phrases de type Shakespeare? (L'efficacité déraisonnable des réseaux neuronaux récurrents) Eh bien, si vous le regardez de loin, vous pourriez être dupe. Wow Wow.

Je disais que c'était élevé, mais je me demandais s'il était temps d'acquérir vraiment de l'intelligence. Si nous pouvions vraiment faire un apprentissage automatique général des structures de données et des algorithmes avec une approche de type DNC, il y avait une vague crainte que le travail du programmeur ne soit enlevé et que les gens aient leur propre intelligence. J'ai peur que ce que je crois soit automatisé, ou je ne peux pas rire de l'artisan qui a détruit la machine lors de la révolution industrielle. .. .. Eh bien, dans la pratique, il est évidemment excessif d'amener DNC à quelque chose comme ce genre, et comme l'enseigne le théorème du déjeuner gratuit, la tâche d'utiliser pleinement les connaissances telles que l'optimisation mathématique incombe aux êtres humains. Je pense qu'il vaut mieux programmer. Selon le genre de tâche, l'ère du «ne pas programmer et s'entraîner» peut venir.

code

yos1up / DNC / main.py | GitHub

La partie exécution de fichier de est remplacée par la suivante. Puisqu'il s'agit d'un code qui imite l'apparence sans connaître Chainer, veuillez préciser s'il y a quelque chose d'étrange m (_ _) m

len_number = 10
X = len_number + 2
Y = len_number
N = 20
W = X
R = 2
mdl = DNC(X, Y, N, W, R)
opt = optimizers.Adam()
opt.setup(mdl)


def run(low, high, train=False):
    order = np.random.randint(0, 2)
    content = [np.random.randint(0, len_number) for _ in range(np.random.randint(low, high))]
    sorted_content = sorted(content, reverse=(order != 0))
    x_seq_list = map(lambda i: onehot(i, X), [len_number + order] + content) + [np.zeros(X).astype(np.float32)] * len(content)
    t_seq_list = ([None] * (1 + len(content))) + map(lambda i: onehot(i, Y), sorted_content)

    result = []
    loss = 0.0

    for (x_seq, t_seq) in zip(x_seq_list, t_seq_list):
        y = mdl(Variable(x_seq.reshape(1, X)))
        if t_seq is not None:
            t = Variable(t_seq.reshape(1, Y))
            if train:
                loss += (y - t) ** 2
            else:
                result.append(np.argmax(y.data))

    mdl.reset_state()
    if train:
        mdl.cleargrads()
        loss.grad = np.ones(loss.data.shape, dtype=np.float32)
        loss.backward()
        loss.unchain_backward()
        opt.update()
    else:
        print 'in ', content, 'ASC' if order == 0 else 'DESC'
        print 'ans', sorted_content
        print 'out', result, sum(1.0 if s == r else 0.0 for (s, r) in zip(sorted_content, result)) / len(result)


for i in range(100000):
    run(2, 9, train=True)
    if i % 100 == 0:
        print
        print '#', i
        for j in range(2, 10):
            print
            run(j, j + 1)

Environnement d'exécution

$ python --version
Python 2.7.11

$ pip freeze
chainer==1.17.0
filelock==2.0.7
nose==1.3.7
numpy==1.11.2
protobuf==3.1.0.post1
six==1.10.0

Recommended Posts

J'ai pu apprendre par machine l'algorithme de tri (avec un indicateur de longueur et d'ordre variable) avec RNN qui manipule la mémoire!
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai pu implémenter l'authentification d'application Web avec flask-login
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Notez que j'étais accro à accéder à la base de données avec mysql.connector de Python en utilisant une application Web
J'ai fait apprendre à RNN la vague de péché et j'ai essayé de prédire
(Apprentissage automatique) J'ai essayé de comprendre attentivement l'algorithme EM dans la distribution gaussienne mixte avec l'implémentation.