python neuronales netz oder wahrscheinlichkeit?


07.05.2022, 16:23

ich habe das hier im internet gefunden sollte ungefar so aussehn

https://colab.research.google.com/drive/1vtguJUse_hACM1xdzPTW9TIgPrWuwwS2?pli=1

3 Antworten

Kannst ja mal ausprobieren:

import tensorflow as tf
from tensorflow import keras

model = keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
xs=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
ys=[1,2,1,2,1,1,2,1,2,1,1,2,2,1,2,1,2,2,1,2,1,2,2,1,2,1,2,1,2,2,1]
model.fit(xs, ys, epochs=1000)
print(model.predict([32]))

Wobei ich A als 1 und B als 2 gesetzt habe. Aber Tensorflow gibt auf, kann keine adäquat Vorhersage treffen und das ist auch begründet. Denn

ababaababaabbababbababbabababba

besteht aus

  • 15 mal a
  • 16 mal b

Die Wahrscheinlichkeit für ein a liegt (basierend auf den uns vorliegenden Daten) also bei 15/31 was ungefähr 48,3871% entspricht.

Die Fehlertoleranz ist dabei allerdings riesig, da der String viel zu klein ist um eine wirklich gescheite Vorhersage zu treffen.

GuteAntwort2021  07.05.2022, 19:28

Nachtrag:

Das Machine Learning Module scheint nicht dafür ausgelegt zu sein und der Effekt schein auch stark begrenzt. Während es bei linearen Modellen schon noch gescheite Vorhersagen trifft, scheitert es selbst bei sowas simplen wie der Fibonacci Folge kläglich.

import tensorflow as tf
from tensorflow import keras


model = keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
xs=[1,2,3,4,5,6,7,8,9,10]
ys=[1,2,3,5,8,13,21,34,55,89]
model.fit(xs, ys, epochs=1500)
print(model.predict([11]))

Das Modell kommt nicht hinter die Logik und prognostiziert 68,77548 als Nachfolger. Und selbst wenn ich epochs hochschraube ändert sich nichts ander Vorhersage.

0
covid69  08.05.2022, 04:12

Dein Code ist inhaltlich komplett falsch. Ich weiß gar nicht wo ich anfangen soll.

0
GuteAntwort2021  08.05.2022, 12:08
@covid69

Ich habe es lediglich von seinem geposteten Beispiel adaptiert. Du darfst mir aber natürlich gerne den passenden Code beifügen. :)

Mit linearen Zahlen funktioniert es auch einwandfrei.

0
GuteAntwort2021  08.05.2022, 12:18
@covid69

Gleicher Code mit nur einer anderen Zahlenreihe:

ys=[1,2,3,4,5,6,7,8,9,10]

Sagt korrekt 11 voraus.

ys=[2,4,6,8,10,12,14,16,18,20]

Sagt auch korrekt 22 voraus.

0
covid69  08.05.2022, 12:36
@GuteAntwort2021

Buchstaben vorhersagen ist eine klassifizierung und nicht regrression. OP will wahrscheinlichkeiten. Zweitens müsstest du die buchstaben als input one-hot encoded weil du sonst auf soeinen unsinn kommst z>a+b

außerdem will OP wahrscheinlich die buchstaben in abhängig von einem Wortanfang vorhersagen.

0
GuteAntwort2021  08.05.2022, 16:46
@covid69

Ich hatte, wie bereits erwähnt, lediglich sein gepostetes Beispiel adaptiert. A und B hatte ich zu Zahlen verwandelt (1 & 2) und erwartet, dass es mir ein Ergebnis zwischen 1 und 2 ausspuckt. Je näher an der 2, desto wahrscheinlicher das B, je näher an der 1, desto wahrscheinlicher das a.

Bei 1,5 quasi 50% WK für a und für b. Bei 1,25 hätte a dann eine Wahrscheinlichkeit von 75%. Aber das funktionierte leider nicht so wie erwartet.

Ich würde aber nicht behaupten, dass ich mich mit neuralen Netzen großartig auskenne. Ich weiß, wie sie grundsätzlich funktionieren in der Theorie, aber selbst noch nichts mit gemacht.

Quasi nur seinen Link aus der Beschreibung genommen und die Zahlenreihe angepasst.

0
covid69  09.05.2022, 04:20
@GuteAntwort2021

Wie gesagt es ist falsch. Angenommen Das neuronale netz kommt mit 50% wahrscheinlichkeit auf A und 50% wahrscheinlichkeit auf C, dann ist die Antwort B??? Dein encoding von buchstaben als Zahlen keinen Sinn. Du verwirrst OP

0

Der code den du oben geposted hast wird nicht funktionieren.

Angenommen du willst den nächsten Buchstaben vorhersagen wenn die vorherigen buchstaben schon gegeben sind. (Eigentlich ist das ein sehr einfaches Programm für das man kein deep learning braucht, aber nehmen wir an du wilst es mit deep learning lösen). Ein Wort besteht aus beliebig vielen Buchstaben also brauchst du ein recurrent neural network (zb LSTM) oder ein transformer. Angenommen du willst einen transformer benuzten, dann benuzte eine embedding layer um die embeddings von jedem buchstaben zu lernen. Dann addiere dein sinosoidal positional encoding zu den embeddings. Das geht dann durch die self attention layers (wahrscheinlich muss dein netzwerk nicht besonders tief sein) und dann am ende softmax activation und du hast deine Wahrscheinlichkeiten. Als trainingsaten kannst du einfach den Duden benutzen.

GuteAntwort2021  08.05.2022, 12:12

Ich vermute sein Modell soll lediglich aus "a" und "b" bestehen. Und man bekommt zwar schon den Eindruck, dass du Ahnung von der Materie hast, aber wenn das Programm so einfach ist, frage ich mich, warum du nicht einfach ein Codesnippet beifügst? :)

0
covid69  08.05.2022, 13:10
@GuteAntwort2021

Aber sein approach im Beispiel wird nicht funktionieren.
mehrere Gründe. Erstens ist es sinnlos weil OP nichtmal programmieren kann. Zweitens kostet mich das ne halbe Stunde und ich habe keine Lust das zu programmieren. Es ist inhaltlich einfach und eine anfängeraufgabe in NLP

0
GuteAntwort2021  08.05.2022, 13:21
@covid69

Wie erwartet: Viel heiße Luft, aber keine Resultate! :)

Wenn du die Zeit, die du zum Kritisieren gebraucht hast, stattdessen zum Programmieren genutzt hättest, hättest du ihm eine sehr schöne Antwort in Form eines lauffähigen Beispiels geben können.

0
GuteAntwort2021  08.05.2022, 16:37
@covid69

Ich aber vermutlich schon. Und es wäre ja trotzdem schön für ihn/sie einfach mal ein passende Beispiel zu sehen. Auch wenn er/sie nicht direkt versteht wie es funktioniert, ist es ja trotzdem spannend es zu sehen. :)

Und ich würde es wirklich gerne sehen und versprochen, ich werde es auch verstehen!

0
GuteAntwort2021  09.05.2022, 14:54
@covid69

Vielen Dank für deine Mühe, weiß ich zu schätzen. ABER: Du hast die Aufgabe verfehlt. Denn wenn ich das Beispiel vom Fragensteller eingebe:

ababaababaabbababbababbabababba

bekomme ich exakt diese Ausgabe:

ababaababaabbababbababbabababba

Das Programm soll nicht Wörter raten, sondern die Wahrscheinlichkeit - basierend auf dem Eingabestring - dafür angeben, dass der nächste Buchstabe ein a bzw. b ist. :)

Trotzdem schön zu sehen! Geht das nur, dass es den fehlenden hinteren Teil ermittelt, oder könnte man auch ein z. B. Sternchen einsetzen und es würde aus:

M*gl*chk**t dann Möglichkeit ermitteln? Wäre das viel Änderungsaufwand? ;-)

Sonst könntest du das super als Online Tool für Kreuzworträtsel und so Wörterrate-Apps präsentieren. :D

0
covid69  09.05.2022, 15:56
@GuteAntwort2021

Genau das macht mein Model aber. Mein model hat als input die Buchstaben M ö g l i c und errät iterativ die nächsten buchstaben h k e i t. Sternchen setzten wäre extrem leicht. Das einzige was ich ändern müsste wäre die self attention mask rauszulöschen und den character set ausf das sternchen erweitern. Das ist ne 5 Minuten aufgabe die ich den Leser überlasse.v

0
covid69  09.05.2022, 16:00
@covid69

(mit LSTM wäre es etwas aufwändiger auf die sternchen zu erweitern)

0
GuteAntwort2021  09.05.2022, 16:17
@covid69
und errät iterativ

Es gleicht einfach mit seinen Trainingsdaten ab, welche Wörter sich aus dieser Buchstabenfolge bilden lassen.

Und genau hier grenzt das Modell dann an seine Grenzen, denn für

ababaababaabbababbababbabababba

findet es keine Erweiterung, es gibt also einfach den Input wieder aus. Das ist aber nicht das, was der Fragensteller wollte, oder? :)

Er/sie wollte wissen, mit welcher Wahrscheinlichkeit der nächste Buchstabe a wird. Er hat es zwar nicht weiter eingegrenzt, aber aus seiner Frage geht hervor, dass es wohl nur die möglichen Buchstaben a und b geben soll.

Daher war mein Ansatz, dass man die Buchstaben in Zahlen umwandelt und ein Modell entwickelt, welches irgendwie versucht ein Muster aus der Zahlenreihen zu erkennen, bzw. die Entwicklung vorhersagen kann.

Ähnlich wie einige zum Beispiel versuchen, den Aktienkurs eines Unternehmens mit den vorangegangenen Aktienkursen vorherzusagen - nur mit der Beschränkung, dass der output hier eine Zahl >=1 und <=2 sein muss.

0
covid69  09.05.2022, 16:34
@GuteAntwort2021

wie gesagt genau das macht mein model. In meinem model werden Buchstaben als vektor (embedding) dargestellt und diese werden erlernt. Du kannst als trainingsdaten irgendeien zeichenfolge geben (in meinem fall habe ich einen deutschen text genommen) und es wird lernen in welcher reihenfolge die buchstaben am wahrscheinlichsten sind. zb ist ein “h” sehr wahrscheinlich wenn die vorherigen Buchstaben “s” und “c” waren. Wie wahrscheinlich? Schaue dir den output nach der softmax activation an. Das ist die wahrscheinlichkeit für jeden möglichen Buchstaben basierend auf allen vorherigen buchstaben.

0
GuteAntwort2021  09.05.2022, 16:36
@covid69

Aber hier ist das Problem. Deine Trainingsdaten sind nicht dafür geeignet den nächsten Buchstaben von

ababaababaabbababbababbabababba

vorherzusagen. Auf welcher Grundlage sollte das auch geschehen? :)

Dein Modell eignet sich also nicht zur Lösung des Problems, denn es stehen keine geeigneten Trainingsdaten zur Verfügung. Du musst also einen komplett anderen Ansatz verfolgen.

Versteh' mich nicht falsch, ich weiß deinen Aufwand wirklich zu schätzen und es ist für andere Dinge wirklich sinnvoll (Kreuzworträtsel und sowas), aber nicht für das genannte Problem geeignet!

0
covid69  09.05.2022, 16:49
@GuteAntwort2021

du verstehst es nicht. Sagen wir mal wir haben ein Wort in den trainingsdaten und das ist: aaabaaabaaab (also 3 mal a und 1 mal b). Dann wird das model genau diese Zeichenfolge so fortsetzen.

Mal angenommen die wörter sind extrem Zeichen lang und bestehen aus komplett zufälligen Buchstaben bis auf das jedes A 10 buchstaben später von einem B gefolgt werden muss. Zb rAthAshfuikBwjBjd. Dann würde mein model dieses Muster erlernen.

Das A könnte sogar erst 10000 Buchstaben später von einem B gefolgt werden. Mein model könnte es trotzdem erlernen. (Brauchst aber viele trainingdaten und musst lange trainieren)

0
GuteAntwort2021  09.05.2022, 17:35
@covid69
Brauchst aber viele trainingdaten und musst lange trainieren

Es gibt aber keine Trainingsdaten. Es gibt nur diesen String. Nur

ababaababaabbababbababbabababba

mehr ist nicht vorhanden! Und genau daraus soll es den nächsten Buchstaben ableiten. Dein Modell kann nicht trainieren, weil es keine Daten zum Trainieren gibt.

0
covid69  09.05.2022, 17:42
@GuteAntwort2021

dieser string kann als trainingdaten dienen. Was auch immer da für Muster enthalten sind das model kann sie erlernen. Wahrscheinlich würde es ein b sein da AA sehr unwahrscheunlich ist.

0

Ja geht ist total bescheert. Und dumm. Also neuronale netze Fang erstmal mit was einfachem an. Sonst schau dir pytorch oder trndorflow an das sind Tools in Python für neuronale netze und Code senden: das ist sehr sehr sehr viel code

Woher ich das weiß:Studium / Ausbildung – info studium
givgadot 
Fragesteller
 07.05.2022, 16:27

aber das ist ganz wenig code und es klapt guck dir das mal an

https://colab.research.google.com/drive/1vtguJUse_hACM1xdzPTW9TIgPrWuwwS2?pli=1

0
TechPech1984  07.05.2022, 16:30
@givgadot

es gibt immer code der als beispiel ganz einfach ist , da du sonst erstmal ein halbes studium absolvieren musst um mit kanten und nodes klar zu kommen . ist also kein argument . schon eine kleine änderung der aufgabenstellung kann etwas in der komplexität so weit aufblähen ds das ergebnis nutzlos wird .

1
CarinaSchoppe  07.05.2022, 16:33
@givgadot

Ja für so ein billiges modell... Nutzt du pytorch sähe das schon 5x so viel aus. Und das Beispiel ist naja sehr sehr sehr simpel dann baundas sich Mal um wenn du meinst

0
givgadot 
Fragesteller
 07.05.2022, 16:39
@CarinaSchoppe

also kurz gesagt ist es nicht möglich ? ich habe keinerler programier kenntnise

will hier keinen verärgern will es aber lehrnen und habe millionen fragen

0
CarinaSchoppe  07.05.2022, 16:40
@givgadot

Es ist möglich aber für dich unmöglich. Weil 0 Ahnung von der materiellen ich programmieren seit über 10 Jahren und verstehe nicht Mal genug ums n 10 jährigen zu erklären

0
givgadot 
Fragesteller
 07.05.2022, 16:45
@CarinaSchoppe

ok also für mich unmöglich klar bin anfänger aber für dich möglich so ein code zu schreiben auch wenn du es nicht erklären kannst könnt es du es ja schreiben oder ? nur ne frage

0