Un réseau de neurones peut-il apprendre une fonctionnelle et sa dérivée fonctionnelle?

11

Je comprends que les réseaux de neurones (NN) peuvent être considérés comme des approximateurs universels des deux fonctions et de leurs dérivés, sous certaines hypothèses (à la fois sur le réseau et sur la fonction à approximer). En fait, j'ai fait un certain nombre de tests sur des fonctions simples mais non triviales (par exemple, les polynômes), et il semble que je puisse en effet bien les approcher et leurs premières dérivées (un exemple est montré ci-dessous).

Ce qui n'est pas clair pour moi, cependant, est de savoir si les théorèmes qui conduisent à ce qui précède s'étendent (ou pourraient être étendus) aux fonctionnelles et à leurs dérivées fonctionnelles. Considérons, par exemple, la fonctionnelle: avec la dérivée fonctionnelle: où dépend entièrement et non trivialement de . Un NN peut-il apprendre la cartographie ci-dessus et sa dérivée fonctionnelle? Plus précisément, si l'on discrétise le domaine sur et fournit (aux points discrétisés) en entrée et

F[f(x)]=abdx f(x)g(x)
δF[f(x)]δf(x)=g(x)
f(x)g(x)x[a,b]f(x)F[f(x)]en sortie, un NN peut-il apprendre ce mappage correctement (au moins théoriquement)? Dans l'affirmative, peut-il également apprendre la dérivée fonctionnelle de la cartographie?

J'ai fait un certain nombre de tests, et il semble qu'un NN puisse en effet apprendre le mapping , dans une certaine mesure. Cependant, bien que la précision de ce mappage soit correcte, elle n'est pas excellente; et troublant est que la dérivée fonctionnelle calculée est une ordure complète (bien que ces deux éléments puissent être liés à des problèmes de formation, etc.). Un exemple est montré ci-dessous.F[f(x)]

Si un NN n'est pas adapté à l'apprentissage d'une fonction et de sa dérivée fonctionnelle, existe-t-il une autre méthode d'apprentissage automatique?

Exemples:

(1) Voici un exemple d'approximation d'une fonction et de sa dérivée: Un NN a été formé pour apprendre la fonction sur la plage [-3,2]: à partir de laquelle une une approximation de est obtenue: Notez que, comme prévu, l'approximation NN de et sa dérivée première s'améliorent avec le nombre de points d'entraînement, l'architecture NN, car de meilleurs minima sont trouvés pendant l'entraînement, etc.f(x)=x3+x+0.5d f ( x ) / d x f ( x )une fonctiondf(x)/dxdérivée de fonctionf(x)

(2) Voici un exemple d'approximation d'une fonctionnelle et de sa dérivée fonctionnelle: Un NN a été formé pour apprendre la fonctionnelle . Les données d'apprentissage ont été obtenues en utilisant des fonctions de la forme , où et ont été générés aléatoirement. Le graphique suivant illustre que le NN est en effet capable d'approcher assez bien : Les dérivés fonctionnels calculés, cependant, sont des ordures complètes; un exemple (pour un spécifique ) est montré ci-dessous: Comme une note intéressante, l'approximation NN àF[f(x)]=12dx f(x)2f(x)=axbabF[f(x)]fonctionnelf(x)dérivé fonctionnelF[f(x)] semble s'améliorer avec le nombre de points d'entraînement, etc. (comme dans l'exemple (1)), mais pas la dérivée fonctionnelle.

Michael
la source
Question interessante. Comment représentez-vous l'entrée f du F fonctionnel? Je suppose que f est quantifié en un vecteur de valeurs f (disons un vecteur de 1000 échantillons). Si oui, que signifie l'axe des x de votre troisième graphique? Il semble être différent de l'axe des x de votre quatrième tracé. Le réseau est-il formé pour apprendre le F [f] et le dF / df, ou calculez-vous le dF / df une fois le réseau formé?
Christian Bueno

Réponses:

3

C'est une bonne question. Je pense que cela implique une preuve mathématique théorique. Je travaille avec le Deep Learning (essentiellement un réseau neuronal) depuis un certain temps (environ un an), et sur la base de mes connaissances de tous les articles que j'ai lus, je n'ai pas encore vu de preuve à ce sujet. Cependant, en terme de preuve expérimentale, je pense pouvoir apporter un retour d'expérience.

Prenons cet exemple ci-dessous:

entrez la description de l'image ici

Dans cet exemple, je crois que via un réseau neuronal multicouche, il devrait être capable d'apprendre à la fois f (x) et aussi F [f (x)] via la rétropropagation. Cependant, que cela s'applique à des fonctions plus complexes ou à toutes les fonctions de l'univers, cela nécessite plus de preuves. Cependant, lorsque nous considérons l'exemple de la concurrence Imagenet --- pour classer 1000 objets, un réseau neuronal très profond est souvent utilisé; le meilleur modèle peut atteindre un taux d'erreur incroyable à ~ 5%. Un tel NN profond contient plus de 10 couches non linéaires et c'est une preuve expérimentale qu'une relation compliquée peut être représentée par un réseau profond [basé sur le fait que nous savons qu'un NN avec 1 couche cachée peut séparer les données de manière non linéaire].

Mais pour savoir si TOUS les dérivés peuvent être appris, des recherches supplémentaires ont été nécessaires.

Je ne sais pas s'il existe des méthodes d'apprentissage automatique capables d'apprendre complètement la fonction et sa dérivée. Désolé pour ça.

RockTheStar
la source
Merci pour votre réponse. J'étais en fait un peu surpris au début qu'un réseau de neurones puisse se rapprocher d'un fonctionnel du tout. En acceptant le fait que cela puisse être le cas, il semble alors intuitivement que des informations sur sa dérivée fonctionnelle devraient être contenues dans la solution (comme c'est le cas avec les fonctions), en particulier pour les fonctions simples et fonctionnelles (comme dans votre exemple) En pratique, Cependant, ce n'est pas le cas. À la lumière de votre exemple, j'ai ajouté quelques exemples à mon message d'origine.
Michael
Cool, quel est le réglage de votre réseau neuronal? Tels que le nombre de couches, les unités cachées, les fonctions d'activation, etc.
RockTheStar
J'ai essayé différents paramètres: 1-3 couches cachées, 5 à 100 unités cachées (par couche), différents nombres d'entrée (alors que la fonction est définie comme la limite qui va à l'infini, j'ai essayé aussi peu que quatre points) , les fonctions d'activation sigmoïde et tanh (normales, ainsi que celles recommandées par LeCun), et diverses méthodes d'entraînement (rétropropagation, QRPROP, optimisation des essaims de particules, etc.). J'ai essayé à la fois en interne et certains logiciels bien connus. Bien que je puisse obtenir une amélioration dans l'approximation de la fonctionnalité lorsque je change les choses, je ne peux pas dans le dérivé fonctionnel.
Michael
Cool. Quel logiciel avez-vous utilisé? Avez-vous effectué une validation croisée pour optimiser votre configuration réseau? Voici quelques-unes de mes réflexions: (1) Je m'attendrais à ce que 3 couches cachées ou plus soient nécessaires parce que le problème est très non linéaire, (2) essayez d'utiliser un paramètre incomplet pour les unités cachées, c'est-à-dire, input-100-50-20 -sortie, au lieu de l'entrée-20-50-100-sortie, (3) utiliser ReLU au lieu de sigmoïde ou tanh; une recherche a publié peu d'articles dans les années 2010 et a prouvé que ReLU peut conduire à de meilleurs résultats, (4) des paramètres tels que la perte de poids, le taux d'apprentissage sont importants, assurez-vous de les régler correctement, (5) caffe en tant qu'outil
RockTheStar
Outre les logiciels internes, j'ai utilisé stats ++, Encog et NeuroSolutions (ce dernier n'était qu'un essai gratuit et je ne l'utilise plus). Je n'ai pas encore essayé la validation croisée pour optimiser les choses, mais je le ferai; J'essaierai également vos autres suggestions. Merci pour vos pensées.
Michael
3

Les réseaux de neurones peuvent approximer les correspondances continues entre les espaces vectoriels euclidiens lorsque la couche cachée devient infinie. Cela dit, il est plus efficace d'ajouter de la profondeur que de la largeur. Une fonctionnelle est simplement une carte où la plage est c'est-à-dire . Donc, oui, les réseaux neuronaux peuvent apprendre les fonctions tant que l'entrée est un espace vectoriel de dimension finie et que la dérivée est facilement trouvée par différenciation en mode inverse, ou rétropropagation. De plus, la quantification de l'entrée est en effet un bon moyen d'étendre le réseau à des entrées à fonction continue.f:RMRNRN=1

Daniel Worrall
la source
0

Si la fonctionnelle est sous la forme alors peut être appris avec une régression linéaire avec suffisamment de fonctions d'apprentissage et valeurs cibles . Cela se fait en approximant l'intégrale par une règle trapézoïdale: c'est-à-dire où

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

Supposons que nous ayons fonctions de formation . Pour chaque nous avons Mfi(x), i=1,,Mi

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

Les valeurs sont alors trouvées comme solution d'un problème de régression linéaire avec une matrice de variables explicatives et la cible vecteur .g0,,gN

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

Testons-le pour un exemple simple. Supposons que soit gaussien.g(x)

import numpy as np 

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

Discrétisez le domainex[a,b]

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

Prenons les sinus et les cosinus de fréquences différentes comme fonctions d'entraînement. Calcul du vecteur cible:

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

Maintenant, la matrice du régresseur:

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

Régression linéaire:

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

entrez la description de l'image ici La fonction gaussienne est apprise avec succès bien que les données soient quelque peu réparties autour de la vraie fonction. L'écart est plus grand lorsque est proche de zéro. Cette propagation peut être lissée avec un filtre Savitzky-Golayg(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()

entrez la description de l'image ici

En général, ne dépend pas linéairement de , c'est-à-dire Il est toujours possible de l'écrire en fonction de après discrétisation de ce qui est également vrai pour les fonctionnelles de la forme car peut être approximé par des différences finies de . Comme est une fonction non linéaire deF[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,fN, on peut tenter de l'apprendre avec une méthode non linéaire, par exemple les réseaux de neurones ou SVM, bien que ce ne sera probablement pas aussi facile que dans le cas linéaire.

Vladislav Gladkikh
la source