제퍼넷 로고

딥 러닝으로 쉽게 만드는 상미분 방정식

시간


생물학, 주식, 물리학, 심지어 일반적인 삶의 시나리오에 이르기까지 우리 주변의 모든 것은 미분 방정식을 사용하여 수학적으로 모델링할 수 있습니다. 그것은 우리 주변의 모든 것을 예측하는 놀라운 능력을 가지고 있습니다. 미분 방정식을 사용하여 투자 수익을 극대화하거나 코로나바이러스 발병을 모델링하는 데 사용하거나 다음 피크에 도달할 때를 예측할 수 있습니다. 미분 방정식은 x에 대한 y의 변화를 결정하는 dy/dx(설명을 위해) 형식으로 작성됩니다.

이 글에서는 상미분 방정식을 다룰 것입니다. 이 기사는 Quant, 수학자, 컴퓨터 과학자, 심지어 생물학자까지 수학적 모델링을 시작하는 모든 사람에게 도움이 될 수 있습니다.

상미분 방정식의 예

상미분 방정식이 정확히 무엇인지 설명하기 위해 예를 들어 보겠습니다. 바다에서 주어진 시간에 고래의 개체수를 계산하고 싶다고 가정해 봅시다. 우리는 일부 연구를 통해 성장이 현재 인구에 정비례한다는 것을 알고 있습니다. 그리고 질병에 의한 사망률은 일정합니다. 이 시나리오를 수학으로 모델링해야 한다면 다음과 같을 것입니다.

상미분 방정식의 예

여기서 Psi는 고래의 개체수이고 첫 번째 항은 시간에 따른 고래 개체수의 변화입니다. 이제 고래의 초기 개체수가 다음과 같이 주어졌다고 가정해 봅시다.

상미분 방정식 psi

이제 간단한 ODE이므로 통합하여 분석 솔루션을 찾을 수 있습니다.

분석 솔루션 상미분 방정식

따라서 주어진 시점에서 우리는 현재 고래 개체수가 얼마인지 쉽게 알 수 있습니다.

상미분 방정식 풀기의 과제

미분방정식에서 직접 해석해를 찾는 것이 항상 쉬운 것은 아니기 때문에 지금까지 미분방정식을 풀기 위한 많은 방법이 개발되었습니다. 그들 중 일부는 일련의 선형 방정식에 의해 그리드 점에서만 솔루션을 제공하기 때문에 제한이 있는 수치적 방법을 사용하여 솔루션을 생성합니다. 그러나 실제로는 몇 개의 점뿐만 아니라 전체 데카르트 평면에 대한 솔루션이 필요합니다.

딥 러닝을 사용한 상미분 방정식에 대한 제안 솔루션

우수한 함수 근사기로 신경망의 사용이 증가함에 따라 우리는 이 능력을 활용하여 미분 방정식을 풀고 이 기사는 젊은 애호가를 위한 동일한 방법을 제시합니다.

분석 솔루션을 모방하기 위해 NN을 사용하여 함수를 근사합니다. 이것은 전체 데카르트 평면에서 솔루션을 제공할 뿐만 아니라 훈련하기도 더 쉽습니다. 이 기사는 IE Lagaris(일반 및 부분 해결을 위한 인공 신경망)에서 영감을 받았습니다.
미분 방정식).

일반 미분 방정식

논의된 방법은 이 형식의 일반 미분 방정식에 적용됩니다.

그러나 더 간단한 버전의 일반 미분 방정식을 생각해 보겠습니다. x와 psi의 순수 함수로서 우변이 있는 XNUMX차 및 선형 상미분 방정식.

단일 상미분 방정식에 적용된 개념은 결합된 상미분 방정식과 일부 PDE로 이전할 수 있습니다.

두 가지 유형의 조건이 있을 수 있으므로 –

  1. 초기 상태(IC)
  2. 경계 조건(BC)

우리는 두 조건을 하나씩 다룰 것입니다. 이 상미분 방정식의 초기 조건을 다음과 같이 취합시다.

여기에 A 스칼라 값입니다. 편미분 방정식에서, A 함수도 될 수 있습니다. 이제 이 상미분 방정식을 풀려면 매개변수화해야 합니다. 이를 사용하여 손실 함수를 공식화합니다. 여기서 '트릭'은 다음과 같이 평가판 솔루션을 만드는 것입니다.

여기서 Psi_t는 우리의 시도 솔루션이고 N은 x가 입력이고 A가 초기 조건인 신경망입니다. x=0에서 초기 조건을 이미 만족하는지 확인하십시오.

우리는 이 트릭을 사용하여 Neural Network approximator를 제공하기 위해 모든 Ordinary Differential Equations를 매개변수화할 것입니다.

이제 신경망의 가장 중요한 부분은 손실을 최소화하는 것입니다. 손실 함수를 생성하기 위해 초기 일반 미분 방정식을 사용하고 MSE 손실을 최소화하려고 합니다.

여기서 Psi_t는 원래 미분 방정식을 만족해야 하는 NN의 솔루션입니다.

파이썬에서 ODE 코딩하기

이 예제에서는 Pytorch, Numpy 및 Matplotlib만 사용할 것입니다.

import torch import torch.nn as nn import matplotlib.pyplot as plt import numpy as np ## GPU를 사용할 수 있는지 확인하고 사용하십시오. 그렇지 않으면 CPU 장치를 사용하십시오. = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 

원본 논문에서 제안한 신경망은 50개의 뉴런으로 구성된 하나의 은닉층으로 구성되었습니다.

N = nn.Sequential(nn.Linear(1, 50), nn.Sigmoid(), nn.Linear(50,1, 바이어스=False))

초기 조건

마지막으로 우리의 평가판 솔루션은

Psi_t = 람다 x: A + x * N(x)

테스트 예제(종이의 문제 2)를 사용하여 NN을 사용하여 해결해 보겠습니다.

위의 방정식을 x와 Psi의 함수로 원래 형태로 변환합니다.

f = 람다 x, Psi: torch.exp(-x / 5.0) * torch.cos(x) - Psi / 5.0

손실 함수 생성 –

def loss(x): x.requires_grad = True 출력 = Psi_t(x) Psi_t_x = torch.autograd.grad(출력, x, grad_outputs=torch.ones_like(출력), create_graph=True)[0] return torch.mean( ( Psi_t_x - f(x, 출력) ) ** 2)

Lagaris가 사용하는 옵티마이저는 BFGS이지만 확률론적 접근 방식도 사용할 수 있습니다.

옵티마이저 = torch.optim.LBFGS(N.parameters())

Lagaris가 사용한 배열 포인트는 0에서 2 사이였습니다.

x = 토치.텐서(np.linspace(0, 2, 100)[:, 없음])

옵티마이저를 실행하기 위한 클로저 함수를 생성합니다.

def closure(): optimizer.zero_grad() l = loss(x) l.backward() range(10)에서 i에 대해 l 반환: optimizer.step(closure)

이제 결과를 분석 솔루션과 NN 솔루션과 비교할 때입니다.

xx = np.linspace(0, 2, 100)[:, None] with torch.no_grad(): yy = Psi_t(torch.Tensor(xx)).numpy() yt = np.exp(-xx / 5.0) * np.sin(xx) fig, ax = plt.subplots(dpi=100) ax.plot(xx, yt, label='True') ax.plot(xx, yy, '--', label='신경망 네트워크 근사') ax.set_xlabel('$x$') ax.set_ylabel('$Psi(x)$') plt.legend(loc='best');

이것은 꽤 좋은 근사치였습니다!! 이 방법은 XNUMX차로 쉽게 외삽할 수 있습니다. 다음 예제를 통해 시도해 보겠습니다.

Dirichlet 경계 조건을 적용해 보겠습니다.

시험해법은 BC를 만족하도록 변경하고 Neural Net에서 다시 수정합니다.

ta는 x를 입력으로 하는 매개변수입니다. N은 시도 솔루션으로 Psi 모자를 사용하는 신경망입니다. 기존 네트워크를 그대로 사용하겠습니다.

N = nn.Sequential(nn.Linear(1, 50), nn.Sigmoid(), nn.Linear(50,1, 바이어스=False))

경계 조건 –

A = 0. B = 0.

평가판 솔루션 –

Psi_t = 람다 x: A*(1-x) + B * x + (1-x)* x * N(x)

우변 함수가 -1인 경우

f = 람다 x, Psi: -1

이전 문제에서 우리는 XNUMX차 초기 방정식을 직접 기반으로 하는 손실 함수를 사용했습니다. 이 아이디어는 XNUMX차에서도 구현됩니다.

상미분 방정식 이전 문제

이제 구현 시 XNUMX차 도함수를 계산해야 합니다. 이것은 Pytorch의 autograd를 사용하여 쉽게 달성할 수 있습니다.

def loss(x): x.requires_grad = True 출력 = Psi_t(x) #우리는 Psi_x_x가 필요합니다 #그라디언트를 두 번 계산 Psi_t_x = torch.autograd.grad(outputs, x, grad_outputs=torch.ones_like(outputs), create_graph=True) [0] Psi_t_x_x = torch.autograd.grad(Psi_t_x, x, grad_outputs=torch.ones_like(Psi_t_x), create_graph=True )[0] return torch.mean((Psi_t_x_x - f(x, 출력)) ** 2)

BFGS를 옵티마이저로 사용(Adam도 사용할 수 있음)

옵티마이저 = 토치.optim.LBFGS(N.parameters()) x = 토치.텐서(np.linspace(0, 1, 100)[:, 없음])

최적화 프로그램 실행

def closure(): optimizer.zero_grad() l = loss(x) l.backward() range(10)에서 i에 대해 l 반환: optimizer.step(closure)

이제 우리는 모두 끝났습니다. 결과를 NN 근사기와 비교하도록 합시다.

xx = np.linspace(0, 1, 100)[:, None] with torch.no_grad(): yy = Psi_t(torch.Tensor(xx)).numpy() yt = (0.5) * (-xx** 2 + xx ) #실제 함수 pts fig, ax = plt.subplots(dpi=100) ax.plot(xx, yt, label='True') ax.plot(xx, yy, '--', label=' 신경망 근사') ax.set_xlabel('$x$') ax.set_ylabel('$Psi(x)$') plt.legend(loc='best');
플롯 범례 상미분 방정식

결론

결과는 정확히 우리가 예상했던 것입니다!! 우리의 네트워크는 우리의 데이터 포인트와 일치하는 기능을 생성할 수 있었고 최소한의 오류로 분석 솔루션의 프록시로 사용할 수 있습니다.

이 아이디어를 PDE(비선형)로 확장하려면 어떻게 해야 할까요? George Em Karniadakis의 훌륭한 논문이 있습니다(Physics informed Deep Learning, Solutions of Nonlinear Partial Differential Equations).

의심스러운 경우 다음을 통해 저에게 연락하십시오. LinkedIn(니할 싱)

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

PlatoAi. Web3 재창조. 데이터 인텔리전스 증폭.
액세스하려면 여기를 클릭하십시오.

출처: https://www.analyticsvidhya.com/blog/2021/09/ordinary-differential-equations-made-easy-with-deep-learning/

spot_img

최신 인텔리전스

spot_img

우리와 함께 채팅

안녕하세요! 어떻게 도와 드릴까요?