Kann ein neuronales Netzwerk eine Funktion und ihre funktionale Ableitung lernen?


10

Ich verstehe, dass neuronale Netze (NNs) unter bestimmten Voraussetzungen (sowohl für das Netz als auch für die zu approximierende Funktion) als universelle Approximatoren für beide Funktionen und ihre Ableitungen angesehen werden können. Tatsächlich habe ich eine Reihe von Tests mit einfachen, aber nicht trivialen Funktionen (z. B. Polynomen) durchgeführt, und es scheint, dass ich sie und ihre ersten Ableitungen tatsächlich gut approximieren kann (ein Beispiel ist unten gezeigt).

Was mir jedoch nicht klar ist, ist, ob sich die Theoreme, die zu dem Obigen führen, auf Funktionale und ihre funktionalen Ableitungen erstrecken (oder vielleicht erweitert werden könnten). Betrachten Sie zum Beispiel die Funktion:

F[f(x)]=abdx f(x)g(x)
mit der funktionellen Ableitung:
δF[f(x)]δf(x)=g(x)
wobeif(x)vollständig und nicht trivial vong(x)abhängt. Kann ein NN die obige Abbildung und ihre funktionale Ableitung lernen? Genauer gesagt, wenn man die Domänexüber[a,b]diskretisiertundf(x)(an den diskretisierten Punkten) als Eingabe undF[f(x)]bereitstellt]F[f(x)]Kann ein NN diese Zuordnung als Ausgabe korrekt lernen (zumindest theoretisch)? Wenn ja, kann es auch die funktionale Ableitung des Mappings lernen?

Ich habe eine Reihe von Tests durchgeführt, und es scheint, dass ein NN tatsächlich die Abbildung F[f(x)] bis zu einem gewissen Grad lernen kann . Die Genauigkeit dieser Zuordnung ist zwar in Ordnung, aber nicht großartig. und beunruhigend ist, dass das berechnete funktionale Derivat vollständiger Müll ist (obwohl beide mit Problemen beim Training usw. zusammenhängen könnten). Ein Beispiel ist unten gezeigt.

Wenn ein NN nicht zum Lernen einer Funktion und ihrer funktionalen Ableitung geeignet ist, gibt es dann eine andere Methode des maschinellen Lernens?

Beispiele:

(1) Das Folgende ist ein Beispiel für die Approximation einer Funktion und ihrer Ableitung: Ein NN wurde trainiert, um die Funktion f(x)=x3+x+0.5 über den Bereich [-3,2] zu lernen, Funktion aus dem eine vernünftige Approximation hervorgeht zu df(x)/dx wird erhalten: Es ist zu Funktionsableitung beachten, dass sich erwartungsgemäß die NN-Näherung an f(x) und ihre erste Ableitung mit der Anzahl der Trainingspunkte, der NN-Architektur verbessern, da während des Trainings usw. bessere Minima gefunden werden .

F[f(x)]=12dx f(x)2f(x)=axbabF[f(x)]funktionalf(x)funktionelles DerivatF[f(x)]


Interessante Frage. Wie repräsentieren Sie den Eingang f des funktionalen F? Ich gehe davon aus, dass f auf einen Vektor von f-Werten quantisiert wird (sagen wir einen Vektor von 1000 Abtastwerten). Wenn ja, was bedeutet die x-Achse Ihres dritten Diagramms? Es scheint anders zu sein als die x-Achse Ihres 4. Diagramms. Wird das Netzwerk trainiert, um F [f] und dF / df zu lernen, oder berechnen Sie dF / df, sobald das Netzwerk trainiert ist?
Christian Bueno

Antworten:


3

Das ist eine gute Frage. Ich denke, es geht um theoretische mathematische Beweise. Ich arbeite seit einer Weile (ungefähr ein Jahr) mit Deep Learning (im Grunde genommen einem neuronalen Netzwerk) und habe aufgrund meines Wissens aus allen von mir gelesenen Artikeln noch keinen Beweis dafür gesehen. In Bezug auf experimentelle Beweise denke ich jedoch, dass ich ein Feedback geben kann.

Betrachten wir das folgende Beispiel:

Geben Sie hier die Bildbeschreibung ein

In diesem Beispiel sollte es meines Erachtens über ein mehrschichtiges neuronales Netzwerk in der Lage sein, sowohl f (x) als auch F [f (x)] über die Rückausbreitung zu lernen. Unabhängig davon, ob dies für kompliziertere Funktionen oder für alle Funktionen im Universum gilt, sind mehr Beweise erforderlich. Wenn wir jedoch das Beispiel der Imagenet-Konkurrenz betrachten - um 1000 Objekte zu klassifizieren, wird häufig ein sehr tiefes neuronales Netzwerk verwendet; Das beste Modell kann eine unglaubliche Fehlerrate von ~ 5% erreichen. Solch ein tiefes NN enthält mehr als 10 nichtlineare Schichten und dies ist ein experimenteller Beweis dafür, dass eine komplizierte Beziehung durch ein tiefes Netzwerk dargestellt werden kann [basierend auf der Tatsache, dass wir wissen, dass ein NN mit 1 verborgenen Schicht Daten nichtlinear trennen kann].

Ob jedoch ALLE Derivate erlernt werden können, erfordert mehr Forschung.

Ich bin mir nicht sicher, ob es Methoden des maschinellen Lernens gibt, mit denen die Funktion und ihre Ableitung vollständig erlernt werden können. Das tut mir leid.


Vielen Dank für Ihre Antwort. Eigentlich war ich zuerst ein bisschen überrascht, dass ein neuronales Netzwerk überhaupt eine Funktion annähern kann. Wenn man die Tatsache akzeptiert, dass dies möglich ist, scheint es dann intuitiv, dass Informationen über seine funktionale Ableitung in der Lösung enthalten sein sollten (wie dies bei Funktionen der Fall ist), insbesondere für einfache Funktionen und Funktionale (wie in Ihrem Beispiel). Dies ist jedoch nicht der Fall. In Anbetracht Ihres Beispiels habe ich meinem ursprünglichen Beitrag einige Beispiele hinzugefügt.
Michael

Cool, wie ist die Einstellung für Ihr neuronales Netzwerk? Wie Anzahl der Ebenen, versteckte Einheiten, Aktivierungsfunktionen usw.
RockTheStar

Ich habe verschiedene Einstellungen ausprobiert: 1-3 versteckte Ebenen, 5 bis 100 versteckte Einheiten (pro Ebene), verschiedene Anzahlen von Eingaben (während die Funktion als Grenze für die Unendlichkeit definiert ist, habe ich nur vier Punkte ausprobiert). , Sigmoid- und Tanh-Aktivierungsfunktionen (normal sowie von LeCun empfohlen) sowie verschiedene Trainingsmethoden (Backpropagation, QRPROP, Partikelschwarmoptimierung und andere). Ich habe sowohl interne als auch bekannte Software ausprobiert. Während ich mich verbessern kann, wenn ich Dinge ändere, kann ich die funktionale Ableitung nicht verbessern.
Michael

Cool. Welche Software haben Sie verwendet? Haben Sie eine Kreuzvalidierung durchgeführt, um Ihre Netzwerkeinstellungen zu optimieren? Hier sind einige meiner Gedanken: (1) Ich würde 3 oder mehr versteckte Ebenen erwarten, die möglicherweise erforderlich sind, da das Problem stark nichtlinear ist. (2) Versuchen Sie, eine unvollständige Einstellung für versteckte Einheiten zu verwenden, dh Eingabe-100-50-20 -output anstelle von input-20-50-100-output (3) verwende ReLU anstelle von Sigmoid oder Tanh; Eine Studie veröffentlichte in den 2010er Jahren nur wenige Artikel und bewies, dass ReLU zu besseren Ergebnissen führen kann. (4) Parameter wie Gewichtsabfall, Lernrate sind wichtig.
Stellen

Neben der internen Software habe ich stats ++, Encog und NeuroSolutions verwendet (letzteres war nur eine kostenlose Testversion und ich verwende sie nicht mehr). Ich habe noch keine Kreuzvalidierung versucht, um die Dinge zu optimieren, aber ich werde es tun. Ich werde auch Ihre anderen Vorschläge versuchen. Danke für deine Gedanken.
Michael


0

F[f(x)]=abf(x)g(x)dx
g(x)fi(x), i=0,,MF[fi(x)]
F[f(x)]=Δx[f0g02+f1g1+...+fN1gN1+fNgN2]
F[f(x)]Δx=y=f0g02+f1g1+...+fN1gN1+fNgN2
f0=a, f1=f(x1), ..., fN1=f(xN1), fN=b,
a<x1<...<xN1<b,  Δx=xj+1xj

Mfi(x), i=1,,Mi

F[fi(x)]Δx=yi=fi0g02+fi1g1+...+fi,N1gN1+fiNgN2

g0,,gN

X=[f00/2f01f0,N1f0N/2f10/2f11f1,N1f1N/2fM0/2fM1fM,N1fMN/2]
y=[y0,,yM]

g(x)

import numpy as np 

def Gaussian(x, mu, sigma):
    return np.exp(-0.5*((x - mu)/sigma)**2)

x[a,b]

x = np.arange(-1.0, 1.01, 0.01)
dx = x[1] - x[0]
g = Gaussian(x, 0.25, 0.25)

Nehmen wir Sinus und Cosinus mit unterschiedlichen Frequenzen als Trainingsfunktionen. Berechnung des Zielvektors:

from math import cos, sin, exp
from scipy.integrate import quad

freq = np.arange(0.25, 15.25, 0.25)

y = []
for k in freq:
    y.append(quad(lambda x: cos(k*x)*exp(-0.5*((x-0.25)/0.25)**2), -1, 1)[0])
    y.append(quad(lambda x: sin(k*x)*exp(-0.5*((x-0.25)/0.25)**2), -1, 1)[0])
y = np.array(y)/dx

Nun die Regressormatrix:

X = np.zeros((y.shape[0], x.shape[0]), dtype=float)
print('X',X.shape)
for i in range(len(freq)):
    X[2*i,:] = np.cos(freq[i]*x)
    X[2*i+1,:] = np.sin(freq[i]*x)

X[:,0] = X[:,0]/2
X[:,-1] = X[:,-1]/2

Lineare Regression:

from sklearn.linear_model import LinearRegression
reg = LinearRegression().fit(X, y)
ghat = reg.coef_

import matplotlib.pyplot as plt 

plt.scatter(x, g, s=1, marker="s", label='original g(x)')
plt.scatter(x, ghat, s=1, marker="s", label='learned $\hat{g}$(x)')
plt.legend()
plt.grid()
plt.show()

Geben Sie hier die Bildbeschreibung eing(x)

from scipy.signal import savgol_filter
ghat_sg = savgol_filter(ghat, 31, 3) # window size, polynomial order

plt.scatter(x, g, s=1, marker="s", label='original g(x)')
plt.scatter(x, ghat, s=1, marker="s", label='learned $\hat{g}$(x)')
plt.plot(x, ghat_sg, color="red", label='Savitzky-Golay $\hat{g}$(x)')
plt.legend()
plt.grid()
plt.show()

Geben Sie hier die Bildbeschreibung ein

F[f(x)]f(x)

F[f(x)]=abL(f(x))dx
f0,f1,fNx
F[f(x)]=abL(f(x),f(x))dx
ff0,f1,fNLf0,f1,fNMan kann versuchen, es mit einer nichtlinearen Methode zu lernen, z. B. mit neuronalen Netzen oder SVM, obwohl es wahrscheinlich nicht so einfach sein wird wie im linearen Fall.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.