Ausgewogenheit bei der Entscheidungsfindung. Gabel "zufällige Erfahrung"

Bild

Um das wirkliche Leben zu schreiben, brauchen Sie nichts anderes, als sich vollständig und vollständig zu besiegen. Ich erstelle es weiter und später werde ich einen großen Artikel zu diesem Thema schreiben, aber was ist das für ein Ding an sich und wie schwierig es ist, siebenmal zu messen, eines abzuschneiden, es dann noch 77 Mal zu messen und schließlich nicht abzuschneiden. Messen, wieder messen! - Dies ist das Motto von jemandem, der etwas wirklich Ungewöhnliches schaffen möchte. Codierung ist viel einfacher als Denken. Aber zu denken ist im Allgemeinen schmerzhaft und ungewöhnlich.

Aber heute möchte ich auf ein "Problem" eingehen, das hier in der Kampagne aufgetaucht ist. Stellen Sie sich die chaotische Bewegung von Partikeln oder chemischen Elementen vor - sie bewegen sich in einem bedingt begrenzten Volumen, kollidieren nur miteinander oder stoßen das Chaos in seiner reinsten Form ab. Wenn ein solches System gestartet wird, werden selbst in diesem scheinbar nutzlosen Ameisenhaufen von Zeit zu Zeit strukturierte Bewegungen beobachtet: Zufällige Kollisionen zu einem bestimmten Zeitpunkt können so auftreten, dass die Richtung des Aufpralls (Impuls) mehr oder weniger in eine Richtung ausfällt und dann kollidiert Partikel bewegen sich in eine Richtung und bilden eine Welle. In Zukunft wird diese Welle von Kollisionen mit Dritten allmählich abnehmen und wir werden wieder ein chaotisches Bild sehen.

Jene. zufällig bildet in seinem Wesen unwillkürlich eine Struktur, aber Struktur ist nur eine vorübergehende Form dieses Zufalls. Auf diese Weise fließend nimmt das Chaos verschiedene Formen an, die wir als etwas Vernünftiges wahrnehmen, d. H. bestellt. Im Großen und Ganzen ist das Rationale das, was wiederholt wird, damit eine solche Wiederholung für eine Person bemerkt werden kann. Wir werden uns jetzt jedoch nicht damit befassen, sondern etwas ausführlicher darüber nachdenken.

Denken Sie daran, dass höchstwahrscheinlich die sogenannten Das „Leben“ auf der Erde entstand durch die chaotische Wechselwirkung chemischer Elemente. Ein solches Leben wäre niemals passiert, wenn ein Molekül nicht in der Lage gewesen wäre, Elektronen von einem anderen zu ziehen oder umgekehrt, getrennt von seinem eigenen. Diese GELEGENHEIT selbstes war nur auf die Tatsache zurückzuführen, dass Verbindungen aus den Elementen und aus den Verbindungen auch die ersten Replikanten und Organismen hervorgingen. Wenn wir also ein digitales Leben schaffen wollen, müssen wir die Gelegenheit zur Interaktion geben.

Wenn wir große Architekten des Universums wären und genau alle seine Gesetze kennen würden, ausgehend von den primären, dann wären die Probleme, sie zu digitalisieren, keine ernsthaften Probleme. Aber weil da wir es (leider) nicht sind, können wir uns nur darauf verlassen, dass wir die gleichen Bedingungen erraten und schaffen können, die mit dem Aufkommen des biologischen Lebens gegeben waren, wodurch das digitale Leben entstehen kann.

Aus diesem Grund versuche ich, die Prinzipien des freien Codes zu beschreiben. Der maximal mögliche freie Code. Frei von unserem eigenen Verständnis, wie das Leben gestaltet werden sollte - denn ein solches Verständnis ist höchstwahrscheinlich falsch oder so unvollständig, dass es zu wenig Sinn ergibt. Wir kleinen Kreaturen versuchen so sehr, alles um uns herum zu studieren und zu beschreiben, dass wir es nicht einmal tun können. Aber niemand verbot es zu versuchen.

Wenn Sie einen chaotischen Code schreiben, stoßen Sie unweigerlich auf eine Gabelung. Zufällige Erfahrung. Jene. entweder chaotisch weiter gehen oder die Bildung von Erfahrung ermöglichen. Jene. ermöglichen nicht nur die Kollision von Partikeln, sondern auch die Interaktion. Wir suchen ein Analogon des biologischen Lebens, das ohne den Transfer und die Regeneration von Erfahrung undenkbar ist. RNA / DNA ist eine aufgezeichnete Erfahrung, die übertragen wird.

Andererseits kann es auf keinen Fall bestimmt werden, weil wir nicht wirklich wissen, wie es sich entwickelt und entwickelt hat. Wenn diese Versuchung nicht beseitigt wird, sind Fehler unvermeidlich. Mit anderen Worten, wir können dem Programm nicht sagen, wie die Erfahrung aussehen und wie sie gebildet werden soll. Aber wir können ihr die Werkzeuge geben, mit denen er im Prinzip geformt werden kann.

Ich hatte sehr lange mit mir selbst zu kämpfen, weil es mir so schien, als könne die Struktur der Speicherung von Erfahrungen ganz einfach beschrieben werden. Zu denken, dass Einfachheit, die uns aufgrund unserer eigenen Vorstellungen von Einfachheit einfach erscheint, ein sicherer Weg ist, uns selbst zu täuschen. Ich vermute, dass wahre Einfachheit wirklich komplex ist. Aber ich schlage vor, hier nicht auf Demagogie einzugehen.

Angenommen, wir haben zufällig eine ausführbare Codezeile als Antwort auf eine numerische Zufallsmenge generiert. Es kann angenommen werden, dass die Erzeugung oder Reaktion von Antworten Erfahrung ist. Wenn etwas auf dieselben eingehenden Signale stabil gleich reagiert, können wir sagen, dass es Erfahrung nutzt. Daher möchte ich mich an die generierte Zeichenfolge erinnern. Dies kann aber nicht direkt erfolgen! Sie können diese Zeile nicht einfach in die Array-Variable der Klasseninstanz verschieben und auf diese Weise eine Art Reaktionsbibliothek erstellen, indem Sie so etwas wie IF [input.set in memory_ array] THEN [memory .-> Reaktion] schreiben. Es ist unmöglich! Denn es ist keine Tatsache, dass „biologische Gedächtnissysteme“ so funktionieren. Und nicht die Tatsache, dass ihre Konstruktion ursprünglich dieselbe war, wie wir sie jetzt sehen.

Gleichzeitig können Sie nicht einfach eine Zeichenfolge von mindestens 256 Bytes nehmen und zufällig generieren und versuchen, sie auszuführen, da dies auf modernen Computern sehr viel Zeit in Anspruch nimmt und nicht zu uns passt. Es ist möglich, dass eine solche Methode ideal ist, aber leider ist es unmöglich, dies mit aktuellen unentwickelten Technologien zu überprüfen.

Außerdem haben wir immer noch eine Programmiersprache und, was auch immer man sagen mag, unsere eigene Vorstellung von zumindest etwas. Man kann überhaupt nichts aus dem Nichts bauen. Deshalb brauchen wir einen subjektiven Blick. Zum Beispiel kann ich nicht anders, als zu sehen, wie eine Form in eine andere übergeht und umgekehrt, wie das Chaos leicht eine Form annimmt und sich auch davon trennt, wenn ein Ball, der von einem Boden gehoben und losgelassen wird, auf diesen Boden fällt und Spuren hinterlässt. Daher möchte ich nichts genau bestimmen, aber ich kann auch nicht alles zufällig sortieren.

Stellen Sie sich zum Verständnis des Problems vor, dass der Code zwei mögliche Aktionen enthält. Sie können nicht direkt angeben, welche Sie auswählen sollen, da dies eine Bestimmung ist. Und wenn Sie alles zufällig sortieren, müssen Sie Wahrscheinlichkeiten verwenden. Nur was? 50/50? 30/70? 80/20? Angenommen, andere Dinge sind gleich, 50/50 ist in der Tat die unbestimmteste Beziehung. Dann sieht der Code ungefähr so ​​aus:

if random.random() >= 0.5:
      1
else:
     2


Was ist los mit diesem Code? Und die Tatsache, dass dieser Code bei jeder Iteration der Schleife IMMER zufällig entweder die erste oder die zweite Aktion auswählt . Mit anderen Worten, ein solches Chaos ist niemals strukturiert, weil es nicht einmal eine solche theoretische Möglichkeit hat. Im Großen und Ganzen handelt es sich hier um dieselbe Entschlossenheit. Es gibt einen Ausweg aus dieser Situation. Es besteht darin, dass Aktion1 und Aktion2 selbst die Bedingungen ändern müssen, unter denen sie angewendet werden. Ich denke, es gibt verschiedene Möglichkeiten, aber ich möchte Folgendes anbieten.

Wie Sie wissen, gleichen Betriebssysteme Threads in der Ausführungswarteschlange mithilfe der Priorisierung aus. Ein zur Laufzeit ausführender Thread verliert allmählich an Priorität, während ein Thread in einer Warteschlange diese Priorität erhöht. Bei einem bestimmten Schlag wird die Priorität des letzteren höher als die des ersten, die Flüsse wechseln die Plätze und dann wiederholt sich die Situation. Somit wechseln sich die Flüsse ziemlich schnell nacheinander ab und wir sehen die Illusion, dass sie fast gleichzeitig ausgeführt werden.

In unserem Fall können wir nach dem Prioritätsprinzip nicht die Threads für die Ausführung auf dem Kernel ändern, sondern Teile des Codes, in die die Steuerung übertragen wird. Und wenn wir einen Teil des Codes als "zufällig" und den zweiten als "experimentell" festlegen, ist ihre alternative Änderung genau die Lösung, nach der wir suchen.

Mit anderen Worten, der Code, der Erfahrung anwendet, erhöht jedes Mal die Wahrscheinlichkeit, dass die Aktion das nächste Mal zufällig ist, und zufälliges Handeln erhöht die Wahrscheinlichkeit, Erfahrung bei nachfolgenden Iterationen des Zyklus anzuwenden. So bekommen wir den gewünschten Chaosfluss in die Erfahrung und umgekehrt - genau das, was wir brauchen.

Ein unglaublicher Vorteil dieses Entwurfs besteht darin, dass es kein Problem mit der Ossifikation des Systems gibt, die beispielsweise in denselben neuronalen Netzen bekannt ist. Auf der anderen Seite opfern wir die Stabilität, aber wir brauchen sie hier nicht.

Ich möchte hier besonders betonendass gewöhnliche klassische Programmierer Codestabilität als Manna vom Himmel benötigen: Die Erkennung muss stabil erkennen, und nicht jedes Mal muss der Server von Zeit zu Zeit mit einer vorgeschriebenen Antwort auf die entsprechende Client-Anfrage antworten, und nicht einmal für dieselbe Antwort und dann noch eine usw. usw. Bei der regulären Programmierung ist die Code-Instabilität ein klarer Fehler, der beim Testen auftritt. In unserem Fall wird diese Stabilität vom Wort her überhaupt nicht benötigt, da wir keine eindeutige Codeaufgabe haben. Genauer gesagt ist es überhaupt nicht. Aber wir können es anders ausdrücken: Wir brauchen die Stabilität der Änderung des Kontrollübertragungscodes, und wir bekommen sie. Man kann auch sagen, dass das Pendel stabil ist, obwohl es in einem Zyklus von einem Punkt zum anderen gelangt.

Um nicht unbegründet zu sein, schlage ich vor, den folgenden elementaren Code in Python zu betrachten, den ich heute skizziert habe und der sich an allen oben genannten Überlegungen orientiert.

import random

deter_numb = 69
p_deter = 0.01
p_random = 0.99
iteration = 1

while True:
        print('iter = ',iteration)
        print('p_rand =  ', p_random)         
        print('p_deter = ', p_deter)
        input()
        if p_random > random.random():
            p_random-=0.01                     #  
            p_deter+=0.01
            print(random.random())    #  
        if p_deter > random.random():       
            p_deter-=0.01                      #  
            p_random+=0.01
            print(deter_numb)            #  
        iteration+=1


Ich fordere Sie dringend auf, dieses Skript selbst auszuführen und zu prüfen, wie es funktioniert. Dies ist ein selbstausgleichender Code. Wie Aktion 1 steht
print(random.random())
- d.h. nur eine Zufallszahlenausgabe und Aktionen 2 -
print(deter_numb)
- Ausgabe einer bestimmten Zahl. Im Code wird es Aktionen an ihrer Stelle geben, ich habe die Drucke hier nur gemacht, um das Prinzip zu demonstrieren.

Wenn die Steuerung zur ersten Bedingung übergeht (dem zufälligen Teil des Codes), verringert der Code selbst die Wahrscheinlichkeit der Wiederholung (p_random- = 0,01 - dekrementiert sich selbst) und erhöht gleichzeitig die Wahrscheinlichkeit der Ausführung des Teils des Codes, auf den die Erfahrung angewendet wird (p_deter + = 0,01 - Inkrement der Wahrscheinlichkeit eines anderen). Das gleiche passiert, wenn die Kontrolle auf die zweite Bedingung übertragen wird. Somit "verlangsamen" diese beiden Codeteile, wenn sie ausgeführt werden, selbst und "beschleunigen" gleichzeitig den anderen "konkurrierenden" Teil des Codes.

Bitte beachten Sie, dass die anfängliche Wahrscheinlichkeit, dass die Kontrolle auf den zufälligen Teil des Codes übertragen wird, 99% und auf den experimentellen Teil - 1% beträgt. Dies soll zeigen, dass das System auch bei solch radikal unterschiedlichen Wahrscheinlichkeiten ausgeglichen ist. Bei der Ausführung des Codes wird ersichtlich, wie dieses Verhältnis in nur hundert Iterationen zu 50/50 kommt und eine Normalverteilung mit einem expliziten Peak von 0,5 und einer Arbeitsumgebung von etwa 6% (in den nächsten 3 bis 500 Iterationen) bildet.

Bei der Ausführung des Codes ist klar, dass die Wahrscheinlichkeiten ins Gleichgewicht kommen und sich um 0,5 einstellen und über diesen Punkt hinaus balancieren, genau wie ein Pendel, das in der Nähe seines unteren Punkts balanciert.

Hier ist ein weiteres Merkmal sichtbar: Es wird entweder eine Zufallszahl oder eine bestimmte Zahl angezeigt (69) oder beide gleichzeitig, was bedeutet, dass das System entweder Erfahrung anwenden und dann zufällig handeln kann oder umgekehrt oder einfach Erfahrung anwenden oder einfach handeln kann nach dem Zufallsprinzip. Mit anderen Worten, die Ausführung des Codes selbst bleibt zufällig, aber wir haben es dem System ermöglicht, Erfahrung anzuwenden, d. H. Wir haben die Entschlossenheit losgeworden, als wir uns für die Aktion entschieden haben, genau das, was wir brauchten.

Im nächsten Artikel werden wir die Bildung von zufälligen Handlungen und Erfahrungen betrachten. Nun, oder etwas anderes, mal sehen, wie es geht.

All Articles