La red neuronal resuelve ecuaciones diferenciales ordinarias (ODE)

original

1 Introducción a los principios

La ecuación diferencial se puede escribir en 2 partes :

  • La primera parte satisface las condiciones iniciales y de contorno y contiene parámetros no ajustables.
  • La segunda parte no afecta a la primera parte, que trata de las redes neuronales feedforward , incluidos los parámetros ajustables (pesos) .

Por lo tanto, al construir una función de una ecuación diferencial, se deben cumplir las dos condiciones anteriores. Veámoslo brevemente hoy.

Supongamos que existe la siguiente ecuación diferencial :

La ecuación diferencial anterior fcorresponde a una función u(t)y satisface las condiciones iniciales u(0)=u_0, para ello podemos hacer:

Entonces NN(t)la derivada es:

Según la ecuación anterior, NN(t)la derivada de es aproximadamente :

La ecuación anterior se puede convertir en una función de pérdida :

En resumen, se conoce la función diferencial , luego se usa una red neuronal para ajustar la función original de la función diferencial , y luego se usa la fórmula diferencial como función de pérdida para aproximarse a la función diferencial original .

Fórmula diferencial:

Además, es necesario tener en cuenta las condiciones iniciales :

Lo anterior no es un buen método: cuantos más elementos se pierdan, más se verá afectada la estabilidad . Para ello se define una nueva función que satisface las condiciones iniciales y es t:

Entonces la función de pérdida es:

Tenga en cuenta que las redes diferenciales neuronales se utilizan actualmente principalmente para aproximar algunas funciones diferenciales simples , y las comparaciones complejas requieren mucho tiempo y una gran potencia informática .

2 practica

Supongamos que existen las siguientes funciones y redes diferenciales:

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(123)
tf.random.set_seed(123)

"""微分初始条件以及相应参数定义"""
f0 = 1 # 初始条件 u(0)=1

# 用于神经网络求导,无限小的小数
inf_s = np.sqrt(np.finfo(np.float32).eps) 

learning_rate = 0.01
training_steps = 500
batch_size = 100
display_step = training_steps/10

"""神经网络参数定义"""
n_input = 1     # 输入维度
n_hidden_1 = 32 # 第一层输出维度
n_hidden_2 = 32 # 第二层输出维度
n_output = 1    # 最后一层输出维度
weights = {
    
    
'h1': tf.Variable(tf.random.normal([n_input, n_hidden_1])),
'h2': tf.Variable(tf.random.normal([n_hidden_1, n_hidden_2])),
'out': tf.Variable(tf.random.normal([n_hidden_2, n_output]))
}
biases = {
    
    
'b1': tf.Variable(tf.random.normal([n_hidden_1])),
'b2': tf.Variable(tf.random.normal([n_hidden_2])),
'out': tf.Variable(tf.random.normal([n_output]))
}
"""优化器"""
optimizer = tf.optimizers.SGD(learning_rate)


"""定义模型和损失函数"""
"""多层感知机"""
def multilayer_perceptron(x):
  x = np.array([[[x]]],  dtype='float32')
  layer_1 = tf.add(tf.matmul(x, weights['h1']), biases['b1'])
  layer_1 = tf.nn.sigmoid(layer_1)
  layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])
  layer_2 = tf.nn.sigmoid(layer_2)
  output = tf.matmul(layer_2, weights['out']) + biases['out']
  return output

"""近似原函数"""
def g(x):
  return x * multilayer_perceptron(x) + f0

"""微分函数"""
def f(x):
  return 2*x

"""定义损失函数逼近导数"""
def custom_loss():
  summation = []
  # 注意这里,没有定义数据,根据函数中t的范围选取了10个点进行计算
  for x in np.linspace(0,1,10):
    dNN = (g(x+inf_s)-g(x))/inf_s
    summation.append((dNN - f(x))**2)
  return tf.reduce_mean(tf.abs(summation))

"""训练函数"""
def train_step():
  with tf.GradientTape() as tape:
    loss = custom_loss()
  trainable_variables=list(weights.values())+list(biases.values())
  gradients = tape.gradient(loss, trainable_variables)
  optimizer.apply_gradients(zip(gradients, trainable_variables))

"""训练模型"""
for i in range(training_steps):
  train_step()
  if i % display_step == 0:
    print("loss: %f " % (custom_loss()))

"""绘图"""
from matplotlib.pyplot import figure
figure(figsize=(10,10))

# True Solution (found analitically)
def true_solution(x):
  return x**2 + 1
  
X = np.linspace(0, 1, 100)
result = []
for i in X:
  result.append(g(i).numpy()[0][0][0])
  
S = true_solution(X)
plt.plot(X, S, label="Original Function")
plt.plot(X, result, label="Neural Net Approximation")
plt.legend(loc=2, prop={
    
    'size': 20})
plt.show()

Referencia:
https://towardsdatascience.com/using-neural-networks-to-solve-ordinary- Differential-equations-a7806de99cdd

Supongo que te gusta

Origin blog.csdn.net/mengjizhiyou/article/details/128508965
Recomendado
Clasificación