Czy sieć neuronowa może nauczyć się funkcjonalnej i jej funkcjonalnej pochodnej?

11

Rozumiem, że sieci neuronowe (NN) można uznać za uniwersalne aproksymatory zarówno funkcji, jak i ich pochodnych, pod pewnymi założeniami (zarówno w sieci, jak i funkcji do aproksymacji). W rzeczywistości przeprowadziłem szereg testów prostych, ale nietrywialnych funkcji (np. Wielomianów) i wydaje się, że rzeczywiście potrafię je dobrze przybliżyć i ich pierwsze pochodne (przykład pokazano poniżej).

Nie jest dla mnie jednak jasne, czy twierdzenia, które prowadzą do powyższego, rozciągają się (a może mogłyby być rozszerzone) na funkcjonały i ich funkcjonalne pochodne. Rozważmy na przykład funkcjonalną: z pochodną funkcjonalną: gdzie zależy całkowicie i nie trywialnie od . Czy NN może nauczyć się powyższego mapowania i jego funkcjonalnej pochodnej? Mówiąc dokładniej, jeśli dyskretyzujemy domenę nad i podamy (w dyskretnych punktach) jako dane wejściowe i

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)]jako wynik, czy NN może poprawnie nauczyć się tego mapowania (przynajmniej teoretycznie)? Jeśli tak, to czy może nauczyć się funkcjonalnej pochodnej mapowania?

Zrobiłem szereg testów i wydaje się, że NN może rzeczywiście nauczyć się mapowania , do pewnego stopnia. Jednak chociaż dokładność tego mapowania jest OK, nie jest wielka; i kłopotliwe jest to, że obliczona pochodna funkcjonalna jest kompletnym śmieciem (chociaż oba mogą być związane z problemami ze szkoleniem itp.). Przykład jest pokazany poniżej.F[f(x)]

Jeśli NN nie nadaje się do uczenia funkcjonalnego i jego pochodnej funkcjonalnej, czy istnieje inna metoda uczenia maszynowego?

Przykłady:

(1) Poniżej podano przykład przybliżenia funkcji i jej pochodnej: NN został przeszkolony, aby nauczyć się funkcji w zakresie [-3,2]: z którego rozsądna uzyskuje się aproksymację do : Należy zauważyć, że zgodnie z oczekiwaniami aproksymacja NN do i jej pierwszej pochodnej poprawia się wraz z liczbą punktów treningowych, architekturą NN, ponieważ lepsze minima znajdują się podczas treningu itp.f(x)=x3+x+0.5d f ( x ) / d x f ( x )funkcjonowaćdf(x)/dxpochodna funkcjif(x)

(2) Poniżej znajduje się przykład aproksymacji funkcjonalnej i jej pochodnej funkcjonalnej: NN został przeszkolony, aby nauczyć się funkcjonalnej . Dane treningowe uzyskano za pomocą funkcji postaci , gdzie i zostały wygenerowane losowo. Poniższy wykres ilustruje, że NN rzeczywiście jest w stanie dość dobrze przybliżać : Obliczone pochodne funkcjonalne są jednak kompletnym śmieciem; przykład (dla konkretnego ) pokazano poniżej: Jako ciekawą uwagę aproksymacja NN doF[f(x)]=12dx f(x)2f(x)=axbabF[f(x)]f ( x ) F [ f ( x ) ]funkcjonalnyf(x)pochodna funkcjonalnaF[f(x)] wydaje się poprawiać wraz z liczbą punktów treningowych itp. (jak w przykładzie (1)), ale pochodna funkcjonalna nie.

Michał
źródło
Interesujące pytanie. Jak reprezentujesz wejście f funkcjonalnego F? Zakładam, że f jest kwantyzowane do jakiegoś wektora wartości f (powiedzmy wektor 1000 próbek). Jeśli tak, co oznacza oś x twojego trzeciego wykresu? Wygląda na to, że różni się od osi x czwartego wykresu. Czy sieć jest szkolona do nauki F [f] i dF / df, czy obliczasz dF / df po przeszkoleniu sieci?
Christian Bueno,

Odpowiedzi:

3

To dobre pytanie. Myślę, że obejmuje to teoretyczny dowód matematyczny. Od dłuższego czasu (około roku) pracuję z Deep Learning (w zasadzie siecią neuronową) i na podstawie mojej wiedzy ze wszystkich artykułów, które czytam, nie widziałem jeszcze na to dowodów. Jednak jeśli chodzi o dowody eksperymentalne, myślę, że mogę wyrazić opinię.

Rozważmy ten przykład poniżej:

wprowadź opis zdjęcia tutaj

W tym przykładzie uważam, że poprzez wielowarstwową sieć neuronową powinna ona być w stanie nauczyć się zarówno f ​​(x), jak i F [f (x)] poprzez propagację wsteczną. Jednak niezależnie od tego, czy dotyczy to bardziej skomplikowanych funkcji, czy wszystkich funkcji we wszechświecie, wymaga to więcej dowodów. Jednakże, gdy weźmiemy pod uwagę przykład konkurencji Imagenet --- do sklasyfikowania 1000 obiektów, często stosuje się bardzo głęboką sieć neuronową; najlepszy model może osiągnąć niesamowity poziom błędu do ~ 5%. Tak głęboki NN zawiera ponad 10 warstw nieliniowych i jest to eksperymentalny dowód, że skomplikowana relacja może być reprezentowana przez głęboką sieć [w oparciu o fakt, że wiemy, że NN z 1 ukrytą warstwą może rozdzielać dane nieliniowo].

Ale to, czy WSZYSTKICH pochodnych można się nauczyć, wymagało dalszych badań.

Nie jestem pewien, czy istnieją metody uczenia maszynowego, które mogą w pełni poznać funkcję i jej pochodną. Przepraszam za to.

RockTheStar
źródło
Dziękuję za Twoją odpowiedź. Na początku byłem trochę zaskoczony, że sieć neuronowa w ogóle może działać w przybliżeniu. Akceptując fakt, że może, to intuicyjnie wydaje się, że informacja o jego pochodnej funkcjonalnej powinna być zawarta w rozwiązaniu (jak w przypadku funkcji), szczególnie w przypadku prostych funkcji i funkcjonałów (jak w twoim przykładzie). W praktyce tak jednak nie jest. W świetle twojego przykładu dodałem kilka przykładów do mojego oryginalnego postu.
Michael
Fajnie, jakie jest ustawienie twojej sieci neuronowej? Takich jak liczba warstw, ukryte jednostki, funkcje aktywacyjne itp.
RockTheStar
Wypróbowałem różne ustawienia: 1-3 ukryte warstwy, 5 do 100 ukrytych jednostek (na warstwę), różne liczby danych wejściowych (podczas gdy funkcjonalność jest zdefiniowana jako granica, która prowadzi do nieskończoności, próbowałem zaledwie czterech punktów) , funkcje aktywacji sigmoidalnej i tanh (normalnej, a także zalecanej przez LeCun) oraz różne metody treningowe (propagacja wsteczna, QRPROP, optymalizacja roju cząstek i inne). Wypróbowałem zarówno oprogramowanie wewnętrzne, jak i dobrze znane. Chociaż mogę uzyskać poprawę w przybliżeniu funkcjonalnego, gdy zmieniam rzeczy, nie mogę w pochodnej funkcjonalnej.
Michael
Fajne. Z jakiego oprogramowania korzystałeś? Czy przeprowadziłeś walidację krzyżową w celu optymalizacji ustawień sieci? Oto kilka moich przemyśleń: (1) Oczekiwałbym, że mogą być wymagane 3 lub więcej ukrytych warstw, ponieważ problem jest wysoce nieliniowy, (2) spróbuj użyć niepełnego ustawienia dla ukrytych jednostek, tj. Input-100-50-20 -output, zamiast wejścia-20-50-100-output, (3) użyj ReLU zamiast sigmoid lub tanh; badanie opublikowało kilka artykułów w 2010 roku i wykazało, że ReLU może prowadzić do lepszych wyników, (4) parametry takie jak spadek masy ciała, tempo uczenia się są ważne, upewnij się, że odpowiednio je
dostroiłeś
Oprócz oprogramowania wewnętrznego użyłem statystyk ++, Encog i NeuroSolutions (ten ostatni był tylko darmową wersją próbną i już go nie używam). Nie próbowałem jeszcze krzyżowej weryfikacji w celu optymalizacji, ale zrobię to; Spróbuję również innych sugestii. Dziękuję za twoje przemyślenia.
Michael
3

Sieci neuronowe mogą aproksymować ciągłe odwzorowania między euklidesowymi przestrzeniami wektorowymi gdy ukryta warstwa staje się nieskończona. To powiedziawszy, bardziej efektywne jest dodawanie głębi niż szerokości. Funkcjonalność to po prostu mapa, w której zakres wynosi tj. . Tak więc, sieci neuronowe mogą uczyć się funkcjonałów, o ile dane wejściowe są skończonymi wymiarowymi przestrzeniami wektorowymi, a pochodną można łatwo znaleźć poprzez różnicowanie w trybie odwrotnym, czyli propagację wsteczną. Ponadto, kwantyzacja danych wejściowych jest rzeczywiście dobrym sposobem na rozszerzenie sieci na wejścia funkcji ciągłych.f:RMRNRN=1

Daniel Worrall
źródło
0

Jeśli funkcja ma postać to można nauczyć się z regresją liniową przy wystarczającej funkcji szkoleniowych i wartości docelowe . Odbywa się to w przybliżeniu całki za pomocą reguły trapezoidalnej: czyli gdzie

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

Załóżmy, że mamy FUNKCJE szkoleniowych . Dla każdego mamy Mfi(x), i=1,,Mi

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

Wartości znajdują się następnie jako rozwiązanie problemu regresji liniowej z macierzą zmiennych objaśniających i cel wektor .g0,,gN

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

Przetestujmy to na prostym przykładzie. Załóżmy, że jest gaussowskim.g(x)

import numpy as np 

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

Zdyskretuj domenęx[a,b]

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

Weźmy sinus i cosinus o różnych częstotliwościach jako nasze funkcje treningowe. Obliczanie wektora docelowego:

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

Teraz macierz regresora:

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

Regresja liniowa:

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

wprowadź opis zdjęcia tutaj Funkcja Gaussa została pomyślnie wyuczona, chociaż dane są nieco rozłożone wokół prawdziwej funkcji. Spread jest większy, gdy jest bliskie zeru. Ten spread można wygładzić za pomocą filtra 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()

wprowadź opis zdjęcia tutaj

Ogólnie rzecz biorąc, nie zależy liniowo od , to znaczy Nadal można go zapisać jako funkcję po dyskretyzacji co jest również prawdziwe dla funkcjonałów postaci ponieważ można aproksymować skończonymi różnicami . Ponieważ jest nieliniową funkcją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,fN, można próbować nauczyć się go za pomocą metody nieliniowej, np. sieci neuronowych lub SVM, chociaż prawdopodobnie nie będzie to tak łatwe, jak w przypadku liniowym.

Vladislav Gladkikh
źródło