Una rete neurale può imparare un derivato funzionale e funzionale?


11

Comprendo che le reti neurali (NN) possono essere considerate approssimatori universali di entrambe le funzioni e i loro derivati, sotto determinate ipotesi (sia sulla rete che sulla funzione da approssimare). In effetti, ho fatto una serie di test su funzioni semplici, ma non banali (ad es. Polinomi), e sembra che io possa effettivamente approssimarle bene e i loro primi derivati ​​(un esempio è mostrato sotto).

Ciò che non mi è chiaro, tuttavia, è se i teoremi che portano a quanto sopra si estendono (o forse potrebbero essere estesi) ai funzionali e ai loro derivati ​​funzionali. Si consideri, ad esempio, il funzionale: con la derivata funzionale: dove dipende interamente, e non banalmente, da . Un NN può imparare la mappatura sopra e la sua derivata funzionale? Più specificamente, se si discretizza il dominio su e si fornisce (nei punti discretizzati) come input e

F[f(X)]=un'BdX f(X)g(X)
δF[f(X)]δf(X)=g(X)
f(X)g(X)X[un',B]f(X)F[f(X)]come output, un NN può imparare correttamente questa mappatura (almeno teoricamente)? In tal caso, può anche imparare la derivata funzionale della mappatura?

Ho fatto una serie di test e sembra che un NN possa effettivamente imparare la mappatura , in una certa misura. Tuttavia, mentre l'accuratezza di questa mappatura è OK, non è eccezionale; e preoccupante è che il derivato funzionale calcolato è immondizia completa (sebbene entrambi questi potrebbero essere correlati a problemi con la formazione, ecc.). Di seguito è mostrato un esempio.F[f(X)]

Se un NN non è adatto per l'apprendimento di un derivato funzionale e funzionale, esiste un altro metodo di apprendimento automatico che è?

Esempi:

(1) Di seguito è riportato un esempio di approssimazione di una funzione e della sua derivata: A NN è stato addestrato per apprendere la funzione nell'intervallo [-3,2]: da cui un ragionevole si ottiene l' approssimazione a : si noti che, come previsto, l'approssimazione NN ad e la sua prima derivata migliorano con il numero di punti di allenamento, l'architettura NN, poiché si ottengono minimi migliori durante l'allenamento, ecc.f(X)=X3+X+0.5d f ( x ) / d xfunzionedf(X)/dXderivata di funzionef(X)

(2) Di seguito è riportato un esempio di approssimazione di una derivata funzionale e funzionale: A NN è stato addestrato per apprendere la funzionale . Dati di addestramento sono stati ottenuti utilizzando funzioni della forma , dove e sono stati generati in modo casuale. Il seguente diagramma illustra che l'NN è effettivamente in grado di approssimare abbastanza bene : I derivati ​​funzionali calcolati, tuttavia, sono spazzatura completa; un esempio (per una specifica ) è mostrato di seguito: Come nota interessante, l'approssimazione di NN aF[f(X)]=12dX f(X)2f(X)=un'XBun'BF[f(X)]f ( x ) F [ f ( x ) ]funzionalef(X)derivato funzionaleF[f(X)] sembra migliorare con il numero di punti di allenamento, ecc. (come nell'esempio (1)), ma la derivata funzionale no.


Domanda interessante. Come stai rappresentando l'ingresso f dell'F funzionale? Suppongo che f sia quantizzato su un vettore di valori f (diciamo un vettore di 1000 campioni). In tal caso, cosa significa l'asse x del terzo grafico? Sembra essere diverso dall'asse x della tua quarta trama. La rete viene addestrata per apprendere F [f] e dF / df o stai calcolando dF / df una volta che la rete è stata addestrata?
Christian Bueno,

Risposte:


3

Questa è una buona domanda Penso che implichi prove teoriche matematiche. Ho lavorato con Deep Learning (fondamentalmente rete neurale) per un po '(circa un anno), e sulla base delle mie conoscenze di tutti gli articoli che ho letto, non ho ancora visto prove su questo. Tuttavia, in termini di prove sperimentali, penso di poter fornire un feedback.

Consideriamo questo esempio di seguito:

inserisci qui la descrizione dell'immagine

In questo esempio, credo attraverso la rete neurale multistrato, dovrebbe essere in grado di apprendere sia f (x) che F [f (x)] tramite la propagazione all'indietro. Tuttavia, se questo si applica a funzioni più complicate o a tutte le funzioni nell'universo, richiede più prove. Tuttavia, quando consideriamo l'esempio della competizione di Imagenet --- per classificare 1000 oggetti, viene spesso utilizzata una rete neurale molto profonda; il modello migliore può raggiungere un incredibile tasso di errore del 5% circa. Tale NN profondo contiene più di 10 strati non lineari e questa è una prova sperimentale che una relazione complicata può essere rappresentata attraverso una rete profonda [in base al fatto che sappiamo che un NN con 1 livello nascosto può separare i dati in modo non lineare].

Ma se TUTTI i derivati ​​possono essere appresi, sono necessarie ulteriori ricerche.

Non sono sicuro che esistano metodi di apprendimento automatico in grado di apprendere completamente la funzione e la sua derivata. Mi dispiace per quello.


La ringrazio per la risposta. All'inizio ero un po 'sorpreso che una rete neurale potesse approssimare un funzionale a tutti. Accettando il fatto che potrebbe, tuttavia, sembra quindi intuitivamente che le informazioni sulla sua derivata funzionale debbano essere contenute nella soluzione (come nel caso delle funzioni), specialmente per funzioni e funzionali semplici (come nell'esempio). In pratica, Tuttavia, questo non è il caso. Alla luce del tuo esempio, ho aggiunto alcuni esempi al mio post originale.
Michael,

Bene, qual è l'impostazione per la tua rete neurale? Come numero di livelli, unità nascoste, funzioni di attivazione, ecc.
RockTheStar,

Ho provato varie impostazioni: 1-3 livelli nascosti, da 5 a 100 unità nascoste (per livello), vari numeri di input (mentre il funzionale è definito come il limite che questo va all'infinito, ho provato fino a quattro punti) , funzioni di attivazione sigmoide e tanh (normale, così come raccomandato da LeCun) e vari metodi di allenamento (backpropagation, QRPROP, ottimizzazione dello sciame di particelle e altro). Ho provato sia software interni che noti. Mentre posso ottenere miglioramenti nell'approssimazione del funzionale mentre cambio le cose, non riesco nella derivata funzionale.
Michael,

Freddo. che software hai usato? Hai effettuato la convalida incrociata per ottimizzare le impostazioni di rete? Ecco alcuni dei miei pensieri: (1) mi aspetto che 3 o più livelli nascosti siano forse necessari perché il problema è altamente non lineare, (2) prova a usare un'impostazione incompleta per le unità nascoste, ovvero input-100-50-20 -output, invece di input-20-50-100-output, (3) usa ReLU invece di sigmoid o tanh; una ricerca pubblica alcuni articoli nel 2010 e ha dimostrato che ReLU può portare a risultati migliori, (4) parametri come il calo ponderale, il tasso di apprendimento sono importanti, assicurati di regolarli in modo appropriato, (5) caffe come strumento
RockTheStar

Oltre al software interno, ho usato stats ++, Encog e NeuroSolutions (quest'ultimo era solo una versione di prova gratuita e non lo uso più). Non ho ancora provato la validazione incrociata per ottimizzare le cose, ma lo farò; Proverò anche altri tuoi suggerimenti. Grazie per i tuoi pensieri
Michael,


0

F[f(X)]=un'Bf(X)g(X)dX
g(X)fio(X), io=0,...,MF[fio(X)]
F[f(X)]=ΔX[f0g02+f1g1+...+fN-1gN-1+fNgN2]
F[f(X)]ΔX=y=f0g02+f1g1+...+fN-1gN-1+fNgN2
f0=un', f1=f(X1), ..., fN-1=f(XN-1), fN=B,
un'<X1<...<XN-1<B,  ΔX=Xj+1-Xj

Mfio(X), io=1,...,Mio

F[fio(X)]ΔX=yio=fio0g02+fio1g1+...+fio,N-1gN-1+fioNgN2

g0,...,gN

X=[f00/2f01...f0,N-1f0N/2f10/2f11...f1,N-1f1N/2...............fM0/2fM1...fM,N-1fMN/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[un',B]

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

Prendiamo seni e coseni con frequenze diverse come le nostre funzioni di allenamento. Calcolo del vettore target:

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

Ora, la matrice del regressore:

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

Regressione lineare:

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()

inserisci qui la descrizione dell'immagineg(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()

inserisci qui la descrizione dell'immagine

F[f(X)]f(X)

F[f(X)]=un'BL(f(X))dX
f0,f1...,fNX
F[f(X)]=un'BL(f(X),f'(X))dX
f'f0,f1...,fNLf0,f1...,fN, si potrebbe tentare di apprenderlo con un metodo non lineare, ad esempio reti neurali o SVM, anche se probabilmente non sarà così facile come nel caso lineare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.