[PYTHON] Ich konnte den Sortieralgorithmus (mit variabler Länge und Ordnungsflag) mit RNN maschinell lernen, der den Speicher manipuliert!

Differenzierbare neuronale Maschine?

Das von Google Deep Mind to Nature eingereichte Papier "Hybrid-Computing mit einem neuronalen Netzwerk mit dynamischem externem Speicher" ist irgendwie. Es hat einen gefährlichen Geruch. Im offiziellen Einführungsartikel "Differenzierbare neuronale Computer" beginnt die Geschichte mit Platons Gedächtnistheorie und in der Arbeit Kaiba, die das Gedächtnis des Gehirns steuert. Es ist ziemlich großartig, weil es damit verglichen wird. Wir konnten der idealen künstlichen Intelligenz aus philosophischer und neurowissenschaftlicher Sicht einen Schritt näher kommen und nicht nur die Leistung neuronaler Netze verbessern. Ich halte dies für eine Erfindung einer neuen Art des Computers.

Der Mechanismus umfasst das beliebte Konzept der Aufmerksamkeit, das eine Matrix enthält, die den Speicher darstellt, und eine Steuerung, die Vektoren eingibt und ausgibt, während sie selektiv manipuliert wird. Der Controller ist ein RNN (rekursives neuronales Netzwerk), und Speicheroperationen können ebenfalls unterschieden werden. Daher denke ich, dass es möglich ist, einen allgemeinen Algorithmus mit einer Datenstruktur wie eine Turing-Maschine maschinell zu lernen. vielleicht. In dem Experiment in der Arbeit scheint es, dass die Routensuche des Graphen mit hoher Genauigkeit gelernt werden konnte. Was ist das erstaunlich.

Ich war schockiert, aber ich habe die Formeln in der Zeitung noch nicht gelesen, aber sofort "Übersicht über DNC (Differentiable Neural Computers) + Implementierung durch Chainer" Einige Leute haben es implementiert, also werde ich damit spielen. Im ursprünglichen Code haben wir Echo gelernt, also entwickeln wir Sortierlernen.

Ergebnis

Dann ist hier das Ergebnis des Tests nach dem Training von 20.000 Proben. Ja, alle Fragen sind richtig.

# 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" ist die Eingabespalte und die Sortierreihenfolge. "ASC" ist in aufsteigender Reihenfolge, "DESC" ist in absteigender Reihenfolge. "Ans" ist die richtige Antwort, "out" ist die Ausgabespalte und die Übereinstimmungsrate mit der richtigen Antwort. Aus diesem Ergebnis können wir erkennen, dass DNC die Sortierung und auch die Sortierung mit dem Ordnungsflag und der variablen Spaltenlänge lernen konnte.

Und obwohl die Trainingsdaten nur mit Daten mit Spaltenlängen von 2 bis 8 angegeben werden, können im Test auch Spalten mit einer Länge von 9 sortiert werden, sodass sie auch für die Spaltenlänge verallgemeinert werden. Es sieht so aus, als wären Sie erfolgreich. Das war eine Überraschung.

Parameter & Modell

Ich habe versucht, den DNC-Einstellungsparameter so einzustellen.

Parameter Wert
Eingabevektorgröße 12
Ausgabevektorgröße 10
Anzahl der Erinnerungen 20
Eine Speichergröße 12
Anzahl der gelesenen Header 2

Die RNN des Controllers bleibt der ursprüngliche Code, eine Schicht ist die LSTM-Schicht (in: 36 out: 83) und die zweite Schicht ist die vollständig verbundene Schicht (in: 83 out: 83), daher ist sie nicht tief. Ich habe hier nichts eingestellt, daher denke ich, dass ich es auf verschiedene Weise verbessern kann. Ich hatte eher Angst, weil ich leicht auf einmal lernen konnte, ohne etwas zu tunen.

Verschlüsseln entschlüsseln

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

Es geht tatsächlich in der folgenden Reihenfolge in die DNC ein und aus: Setzen Sie zuerst das Bestellflag und nach dem Eingeben der Zahlenfolge wird das Sortierergebnis ausgespuckt.

Ausführungsschritt 1 2 3 4 5 6 7
Eingang ASC 1 6 3 - - -
Ausgabe x x x x 1 3 6

Um genau zu sein, ist der Eingang One-Hot-codiert. "-" Ist ein Nullvektor. Die Ausgabe übernimmt den Index des größten Vektorelements. Ignoriere das "x". Dieser Bereich ist auch der Originalcode.

Bei DNC ist die Länge der zu sortierenden Zahlenfolge erst bekannt, nachdem der Nullvektor eingetroffen ist, und in diesem Schritt muss die minimale oder maximale Anzahl ausgegeben werden. Bevor ich lernte, erwartete ich, dass ich einen Gnadenschritt von Eingabe zu Ausgabe machen musste, aber es gab kein besonderes Problem. Clever.

Gedicht

Die Entwicklung und Anwendung des neutralen Netzwerks in den letzten Jahren war bemerkenswert, aber es ist immer noch ein Monster der Mustererkennung in einem bestimmten Bereich wie einem Bild oder einer natürlichen Sprache, und es ist immer noch weit von echter künstlicher Intelligenz entfernt. Könnte DCGAN eine zweidimensionale Illustration erzeugen? (Lassen Sie den Computer mit Chainer eine Illustration zeichnen) Hat LSTM Shakespeare-ähnliche Sätze generiert? (Die unvernünftige Wirksamkeit wiederkehrender neuronaler Netze) Nun, wenn Sie es aus der Ferne betrachten, könnten Sie sich täuschen lassen. Wow wow.

Ich argumentierte, dass es hoch war, aber ich fragte mich, ob es an der Zeit war, wirklich Intelligenz zu erlangen. Wenn wir wirklich allgemeines maschinelles Lernen von Datenstrukturen und Algorithmen mit einem DNC-ähnlichen Ansatz durchführen könnten, besteht eine vage Befürchtung, dass die Arbeit des Programmierers weggenommen würde und die Menschen ihre eigene Intelligenz haben. Ich befürchte, dass das, was ich glaube, automatisiert wird, oder ich kann nicht über den Handwerker lachen, der die Maschine in der industriellen Revolution zerstört hat. .. .. Praktisch gesehen ist es offensichtlich übertrieben, DNC auf so etwas zu bringen, und wie der Satz über das kostenlose Mittagessen lehrt, ist die Aufgabe, Wissen wie die mathematische Optimierung voll auszuschöpfen, eine Person. Ich denke, es ist am besten zu programmieren. Je nach Genre der Aufgabe kann die Ära "Nicht programmieren und trainieren" kommen.

Code

yos1up / DNC / main.py | GitHub

Der Dateiausführungsteil von wird durch den folgenden ersetzt. Da es sich um einen Code handelt, der das Erscheinungsbild imitiert, ohne Chainer zu kennen, weisen Sie bitte darauf hin, ob es etwas Seltsames gibt 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)

Ausführungsumgebung

$ 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

Ich konnte den Sortieralgorithmus (mit variabler Länge und Ordnungsflag) mit RNN maschinell lernen, der den Speicher manipuliert!
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich konnte die Web-App-Authentifizierung mit Flask-Login implementieren
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
Beachten Sie, dass ich süchtig danach war, mit Pythons mysql.connector über eine Webanwendung auf die Datenbank zuzugreifen
Ich ließ RNN Sin Wave lernen und versuchte vorherzusagen
(Maschinelles Lernen) Ich habe versucht, den EM-Algorithmus in der gemischten Gaußschen Verteilung sorgfältig mit der Implementierung zu verstehen.