Может ли нейронная сеть выучить функционал и его функциональную производную?


11

Я понимаю, что нейронные сети (НС) можно считать универсальными аппроксиматорами как для функций, так и для их производных, при определенных предположениях (как для сети, так и для функции, которую нужно аппроксимировать). На самом деле, я провел ряд тестов на простые, но нетривиальные функции (например, полиномы), и мне кажется, что я действительно могу хорошо аппроксимировать их и их первые производные (пример показан ниже).

Однако мне неясно, распространяются ли теоремы, которые приводят к вышеизложенному (или, возможно, могут быть расширены), на функционалы и их функциональные производные. Рассмотрим, например, функционал: с функциональной производной: где полностью и нетривиально зависит от . Может ли NN изучить приведенное выше отображение и его функциональную производную? Более конкретно, если кто-то дискретизирует область над и предоставляет (в дискретизированных точках) в качестве входных данных и

F[е(Икс)]знак равноaбdИкс е(Икс)г(Икс)
δF[е(Икс)]δе(Икс)знак равног(Икс)
е(Икс)г(Икс)Икс[a,б]е(Икс)F[е(Икс)]как вывод, может ли NN правильно изучить это отображение (по крайней мере, теоретически)? Если так, может ли он также узнать функциональную производную отображения?

Я провел ряд тестов, и кажется, что NN действительно может в некоторой степени изучить отображение . Однако, хотя точность этого сопоставления в порядке, она невелика; и проблема в том, что вычисленная функциональная производная является полным мусором (хотя оба они могут быть связаны с проблемами с обучением и т. д.). Пример показан ниже.F[е(Икс)]

Если NN не подходит для изучения функционала и его производной, есть ли другой метод машинного обучения?

Примеры:

(1) Ниже приведен пример аппроксимации функции и ее производной: NN обучен изучению функции е(Икс)знак равноИкс3+Икс+0,5 в диапазоне [-3,2]: функция из которого можно получить разумное приближение для dе(Икс)/dИкс получается: производная функции обратите внимание, что, как и ожидалось, приближение NN к е(Икс) и его первой производной улучшается с увеличением количества обучающих точек, архитектуры NN, поскольку лучшие минимумы находятся во время обучения и т. д. ,

(2) Ниже приведен пример аппроксимации функционала и его функциональной производной: NN обучен изучению функционала F[е(Икс)]знак равно12dИкс е(Икс)2 . Обучающие данные были получены с использованием функций вида , где и были сгенерированы случайным образом. Следующий график иллюстрирует, что NN действительно способен достаточно хорошо аппроксимировать : однако, вычисленные функциональные производные являются полным мусором; пример (для конкретногое(Икс)знак равноaИксбaбF[е(Икс)]f ( x ) F [ f ( x ) ]функциональнаяе(Икс)) показано ниже: функциональная производная Как интересное примечание, NN-приближение к кажется, улучшается с увеличением количества тренировочных точек и т. д. (как в примере (1)), но функциональная производная этого не делает.F[е(Икс)]


Интересный вопрос. Как вы представляете вход f функционала F? Я предполагаю, что f квантуется на некоторый вектор значений f (скажем, вектор из 1000 выборок). Если это так, что означает ось X вашего третьего графика? Кажется, он отличается от оси X вашего 4-го графика. Тренируется ли сеть для изучения F [f] и dF / df, или вы вычисляете dF / df после обучения сети?
Кристиан Буэно

Ответы:


3

Это хороший вопрос. Я думаю, что это связано с теоретическим математическим доказательством. Я работал с Deep Learning (в основном нейронной сетью) некоторое время (около года), и, основываясь на моих знаниях из всех прочитанных мной работ, я еще не видел доказательств по этому поводу. Однако, с точки зрения экспериментального доказательства, я думаю, что могу предоставить обратную связь.

Давайте рассмотрим этот пример ниже:

введите описание изображения здесь

Я полагаю, что в этом примере через многослойную нейронную сеть она должна быть способна выучить как f (x), так и F [f (x)] посредством обратного распространения. Однако, применимо ли это к более сложным функциям или ко всем функциям во вселенной, требуется больше доказательств. Однако, когда мы рассматриваем пример конкуренции Imagenet - для классификации 1000 объектов, часто используется очень глубокая нейронная сеть; лучшая модель может достичь невероятного уровня ошибок до ~ 5%. Такой глубокий NN содержит более 10 нелинейных слоев, и это является экспериментальным доказательством того, что сложные отношения могут быть представлены через глубокую сеть [основываясь на том факте, что NN с 1 скрытым слоем может разделять данные нелинейно].

Но чтобы узнать ВСЕ производные, требуется больше исследований.

Я не уверен, существуют ли какие-либо методы машинного обучения, которые могут полностью изучить функцию и ее производную. Прости за это.


Спасибо за ваш ответ. Сначала я был немного удивлен, что нейронная сеть вообще может приближаться к функционалу. Принимая тот факт, что он мог бы, тогда он тогда интуитивно кажется, что информация о его функциональной производной должна содержаться в решении (как в случае с функциями), особенно для простых функций и функционалов (как в вашем примере). На практике, Однако, это не так. В свете вашего примера я добавил несколько примеров к своему первоначальному сообщению.
Майкл

Круто, какие настройки для вашей нейронной сети? Например, количество слоев, скрытые юниты, функции активации и т. Д.
RockTheStar,

Я пробовал различные настройки: 1-3 скрытых слоя, от 5 до 100 скрытых единиц (на слой), различное количество входных данных (в то время как функционал определен как предел, что это уходит в бесконечность, я пробовал всего четыре точки) функции активации сигмовидной и светло-коричневой (нормальной, а также рекомендованной LeCun) и различные методы обучения (обратное распространение, QRPROP, оптимизация роя частиц и другие). Я пробовал как собственное, так и некоторое известное программное обеспечение. Хотя я могу улучшить аппроксимацию функционала, когда меняю вещи, я не могу получить функциональную производную.
Майкл

Круто. Какое программное обеспечение вы использовали? Вы провели перекрестную проверку для оптимизации настроек вашей сети? Вот некоторые из моих мыслей: (1) я ожидаю, что может потребоваться 3 или более скрытых слоя, потому что проблема очень нелинейная, (2) попытаться использовать незавершенную настройку для скрытых единиц, то есть input-100-50-20 -output вместо input-20-50-100-output (3) использовать ReLU вместо сигмоида или tanh; исследование опубликовало несколько работ в 2010-х годах и доказало, что ReLU может привести к лучшему результату, (4) такие параметры, как снижение веса, скорость обучения, важны, убедитесь, что вы настраиваете их соответствующим образом, (5) caffe как инструмент
RockTheStar

Помимо собственного программного обеспечения, я использовал stats ++, Encog и NeuroSolutions (последняя была только бесплатной пробной версией, и я ее больше не использую). Я еще не пробовал перекрестную проверку для оптимизации, но я сделаю это; Я также попробую ваши другие предложения. Спасибо за ваши мысли.
Майкл


0

F[f(x)]=abf(x)g(x)dx
g(x)fi(x), i=0,,MF[fi(x)]
F[е(Икс)]знак равноΔИкс[е0г02+е1г1+,,,+еN-1гN-1+еNгN2]
F[е(Икс)]ΔИксзнак равноYзнак равное0г02+е1г1+,,,+еN-1гN-1+еNгN2
е0знак равноa, е1знак равное(Икс1), ,,,, еN-1знак равное(ИксN-1), еNзнак равноб,
a<Икс1<,,,<ИксN-1<б,  ΔИксзнак равноИксJ+1-ИксJ

Mея(Икс), язнак равно1,...,Mя

F[ея(Икс)]ΔИксзнак равноYязнак равноея0г02+ея1г1+,,,+ея,N-1гN-1+еяNгN2

г0,...,гN

Иксзнак равно[е00/2е01...е0,N-1е0N/2е10/2е11...е1,N-1е1N/2...............еM0/2еM1...еM,N-1еMN/2]
Yзнак равно[Y0,...,YM]

г(Икс)

import numpy as np 

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

Икс[a,б]

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

Давайте возьмем в качестве наших тренировочных функций синусы и косинусы с разными частотами. Расчет целевого вектора:

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

Теперь матрица регрессора:

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

Линейная регрессия:

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

введите описание изображения здесьг(Икс)

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

введите описание изображения здесь

F[е(Икс)]е(Икс)

F[е(Икс)]знак равноaбL(е(Икс))dИкс
е0,е1...,еNИкс
F[е(Икс)]знак равноaбL(е(Икс),е'(Икс))dИкс
е'е0,е1...,еNLе0,е1...,еNможно попытаться изучить его с помощью нелинейного метода, например, нейронных сетей или SVM, хотя, вероятно, это будет не так просто, как в линейном случае.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.