Bisakah jaringan saraf mempelajari fungsional, dan turunan fungsionalnya?

10

Saya mengerti bahwa neural networks (NNs) dapat dianggap sebagai aproksimator universal untuk kedua fungsi dan turunannya, berdasarkan asumsi tertentu (baik pada jaringan dan fungsi untuk perkiraan). Bahkan, saya telah melakukan sejumlah tes pada fungsi-fungsi sederhana, namun tidak sepele (misalnya, polinomial), dan tampaknya saya memang bisa memperkirakannya dan turunan pertamanya dengan baik (contohnya ditunjukkan di bawah).

Namun, yang tidak jelas bagi saya adalah apakah teorema yang mengarah pada perluasan di atas (atau mungkin dapat diperluas) ke fungsional dan turunan fungsionalnya. Pertimbangkan, misalnya, fungsional: dengan turunan fungsional: mana bergantung sepenuhnya, dan non-trivial, pada . Bisakah NN mempelajari pemetaan di atas dan turunan fungsionalnya? Lebih khusus lagi, jika seseorang mendiskritisasi domain lebih dari dan memberikan (pada titik yang didiskritisasi) sebagai input dan

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)]sebagai output, dapatkah NN mempelajari pemetaan ini dengan benar (setidaknya secara teoritis)? Jika demikian, dapatkah ia mempelajari turunan fungsional pemetaan?

Saya telah melakukan sejumlah tes, dan sepertinya seorang NN memang dapat mempelajari pemetaan , sampai batas tertentu. Namun, meskipun akurasi pemetaan ini baik-baik saja, itu tidak bagus; dan yang mengganggu adalah bahwa turunan fungsional yang dihitung adalah sampah lengkap (meskipun keduanya bisa terkait dengan masalah pelatihan, dll.). Contohnya ditunjukkan di bawah ini.F[f(x)]

Jika NN tidak cocok untuk mempelajari turunan fungsional dan fungsionalnya, adakah metode pembelajaran mesin lainnya?

Contoh:

(1) Berikut ini adalah contoh perkiraan suatu fungsi dan turunannya: NN dilatih untuk mempelajari fungsi pada rentang [-3,2]: dari mana yang wajar perkiraan ke diperoleh: Perhatikan bahwa, seperti yang diharapkan, perkiraan NN ke dan turunan pertamanya meningkat dengan jumlah poin pelatihan, arsitektur NN, karena minima yang lebih baik ditemukan selama pelatihan, dll.f(x)=x3+x+0.5fungsidf(x)/dxturunan fungsif(x)

(2) Berikut ini adalah contoh perkiraan fungsional dan turunan fungsionalnya: NN dilatih untuk mempelajari fungsionalF[f(x)]=12dx f(x)2 . Data pelatihan diperoleh dengan menggunakan fungsi dari bentuk f(x)=axb , di mana a dan b dihasilkan secara acak. Plot berikut menggambarkan bahwa NN memang mampu mendekati F[f(x)] cukup baik: fungsional Turunan fungsional yang dihitung, bagaimanapun, adalah sampah lengkap; sebuah contoh (untuk f(x)) ditunjukkan di bawah ini: turunan fungsional Sebagai catatan yang menarik, perkiraan NN ke F[f(x)] tampaknya meningkat dengan jumlah poin pelatihan, dll. (seperti dalam contoh (1)), namun turunan fungsional tidak.

Michael
sumber
Pertanyaan menarik. Bagaimana Anda merepresentasikan input f dari F fungsional? Saya berasumsi f sedang dikuantisasi ke beberapa vektor nilai-f (katakanlah vektor 1000 sampel). Jika demikian, apa arti sumbu x plot ketiga Anda? Tampaknya berbeda dari sumbu x plot ke-4 Anda. Apakah jaringan dilatih untuk mempelajari F [f] dan dF / df, atau apakah Anda menghitung dF / df setelah jaringan dilatih?
Christian Bueno

Jawaban:

3

Ini pertanyaan yang bagus. Saya pikir ini melibatkan bukti matematis teoritis. Saya telah bekerja dengan Deep Learning (pada dasarnya jaringan saraf) untuk sementara waktu (sekitar satu tahun), dan berdasarkan pengetahuan saya dari semua makalah yang saya baca, saya belum melihat bukti tentang ini. Namun, dalam hal bukti eksperimental, saya pikir saya dapat memberikan umpan balik.

Mari kita perhatikan contoh di bawah ini:

masukkan deskripsi gambar di sini

Dalam contoh ini, saya percaya melalui jaringan saraf multi-layer, ia harus dapat mempelajari f (x) dan juga F [f (x)] melalui back-propagation. Namun, apakah ini berlaku untuk fungsi yang lebih rumit, atau semua fungsi di alam semesta, ini membutuhkan lebih banyak bukti. Namun, ketika kita mempertimbangkan contoh kompetisi Imagenet --- untuk mengklasifikasikan 1000 objek, jaringan saraf yang sangat dalam sering digunakan; model terbaik dapat mencapai tingkat kesalahan luar biasa hingga ~ 5%. NN yang dalam seperti itu mengandung lebih dari 10 lapisan non-linear dan ini adalah bukti eksperimental bahwa hubungan yang rumit dapat direpresentasikan melalui jaringan yang mendalam [berdasarkan pada fakta bahwa kita tahu NN dengan 1 lapisan tersembunyi dapat memisahkan data secara non-linear].

Tetapi apakah SEMUA turunan dapat dipelajari diperlukan penelitian lebih lanjut.

Saya tidak yakin apakah ada metode pembelajaran mesin yang dapat mempelajari fungsi dan turunannya sepenuhnya. Maaf soal itu.

RockTheStar
sumber
Terima kasih atas jawaban Anda. Saya sebenarnya agak terkejut pada awalnya bahwa jaringan saraf dapat memperkirakan fungsional sama sekali. Menerima kenyataan bahwa hal itu dapat terjadi, maka kemudian secara intuitif tampak bahwa informasi tentang turunan fungsionalnya harus terkandung dalam solusi (seperti halnya dengan fungsi), terutama untuk fungsi dan fungsional sederhana (seperti pada contoh Anda) Dalam praktiknya, Namun, ini bukan masalahnya. Mengingat contoh Anda, saya menambahkan beberapa contoh ke posting asli saya.
Michael
Keren, apa pengaturan untuk jaringan saraf Anda? Seperti jumlah lapisan, unit tersembunyi, fungsi aktivasi, dll.
RockTheStar
Saya telah mencoba berbagai pengaturan: 1-3 lapisan tersembunyi, 5 hingga 100 unit tersembunyi (per lapisan), berbagai jumlah input (sementara fungsional didefinisikan sebagai batas hingga infinity, saya telah mencoba sedikitnya empat poin) , fungsi aktivasi sigmoid dan tanh (normal, serta yang direkomendasikan oleh LeCun), dan berbagai metode pelatihan (backpropagation, QRPROP, optimisasi kerumunan partikel, dan lainnya). Saya sudah mencoba keduanya di rumah dan beberapa perangkat lunak terkenal. Sementara saya bisa mendapatkan peningkatan dalam mendekati fungsional saat saya mengubah sesuatu, saya tidak bisa dalam turunan fungsional.
Michael
Keren. Perangkat lunak apa yang Anda gunakan? Sudahkah Anda melakukan validasi silang untuk mengoptimalkan pengaturan jaringan Anda? Berikut adalah beberapa pemikiran saya: (1) Saya berharap 3 atau lebih lapisan tersembunyi mungkin diperlukan karena masalahnya sangat non-linear, (2) mencoba menggunakan pengaturan kurang lengkap untuk unit tersembunyi, yaitu input-100-50-20 -output, bukannya input-20-50-100-output, (3) gunakan ReLU bukan sigmoid atau tanh; sebuah penelitian menerbitkan beberapa makalah pada tahun 2010 dan membuktikan bahwa ReLU dapat menghasilkan hasil yang lebih baik, (4) parameter seperti penurunan berat badan, tingkat pembelajaran adalah penting, pastikan Anda menyetelnya dengan tepat, (5) caffe sebagai alat
RockTheStar
Selain perangkat lunak in-house, saya telah menggunakan stats ++, Encog, dan NeuroSolutions (yang terakhir hanya uji coba gratis, dan saya tidak menggunakannya lagi). Saya belum mencoba cross validasi untuk mengoptimalkan berbagai hal, tetapi saya akan melakukannya; Saya juga akan mencoba saran Anda yang lain. Terima kasih atas pemikiran anda
Michael
3

f:RMRNRN=1

Daniel Worrall
sumber
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)

Mari kita ambil sinus dan cosinus dengan frekuensi berbeda sebagai fungsi pelatihan kita. Menghitung vektor 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

Sekarang, matriks regressor:

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

Regresi linier:

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

masukkan deskripsi gambar di sinig(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()

masukkan deskripsi gambar di sini

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, orang mungkin berusaha mempelajarinya dengan metode non-linear, misalnya jaringan saraf atau SVM, meskipun mungkin tidak akan semudah dalam kasus linear.

Vladislav Gladkikh
sumber