논문 리뷰: DeepONet
개요 및 요약
- 레퍼런스, 수식의 번호, 표기법 등은 가능한 논문을 따른다.
접근성을 위해서 저널에 출간된 버전이 아닌 아카이브에 올라와있는 버전을 기준으로 리뷰한다. 실험 파트에서 다룬 문제가 조금 다르긴 하지만, 어차피 핵심은 실험 결과와 성능이 아니라 DeepONet 기법 그 자체에 대한 설명이다.
DeepONet은 연산자를 학습하기 위해 제안된 딥러닝 기법이다. 연산자란 함수를 함수로 대응시키는 함수이다(본문에서 자세히 설명한다). 즉 어떤 함수 $u$에 대해서, 연산자 $G$란 다음과 같다.
$$ G : u \mapsto G(u) $$
이때 $u$도 함수이며, $Gu = G(u)$도 함수이다. "DeepONet은 연산자를 학습한다" 이것이 첫번째 중요한 점이고, 두번째는 "$Gu$를 급수로서 근사한다"는 것이다. 어떤 적절한 함수공간 $X$가 있고, 이의 기저를 $\left\{ \phi_{k} \right\}$라 하자. 그러면 $Gu \in X$는 다음과 같이 표현된다.
$$ Gu = \sum_{k=1}^{\infty} c_{k}\phi_{k} $$
DeepONet이 학습하는 것은 $c_{k}$와 $\phi_{k}$이며, 계수 $c_{k}$를 학습하는 부분을 브랜치 네트워크branch network, 기저 $\left\{ \phi_{k} \right\}$를 학습하는 부분을 트렁크 네트워크trunk network라 한다.
구현
- 파이토치로 구현하기
- 줄리아로 구현하기
1 Introduction
보편 근사 정리the universal approximation theorem는 신경망이 임의의 연속 함수를 근사할 수 있음을 보장한다. 이는 인공신경망과 딥러닝 기법이 잘 작동하는 것에 대한 이론적 근거가 되며, 이를 바탕으로 다양한 분야에서 딥러닝 기법이 활약하고 있다. 하지만 이보다 더 놀라운 결과는 인공신경망이 모든 비선형 범함수functional와 (비선형) 연산자operator까지도 근사할 수 있다는 것이다.
수학에 익숙하지 않을 독자를 위해 함수, 범함수, 연산자에 대해서 잠깐 설명하겠다. 이 셋은 기본적으로 큰 틀에서는 함수(정의역에 있는 하나의 원소를 공역에 있는 정확히 하나의 원소로 대응시키는 것)이다. 하지만 굳이 범함수, 연산자라는 단어를 쓰는 맥락에서 이들은 조금 특별한 의미를 갖는다. 우선 별 말이 없으면 함수라는 것은 숫자(혹은 벡터)를 숫자(혹은 벡터)로 대응시키는 것을 의미한다. 다항식, 삼각함수 등 일반적으로 많이 다루는 함수들이 모두 이 맥락에서의 함수이다.
$$ \text{function}: \mathbb{R}^{n} \to \mathbb{R}^{m} $$
함수를 숫자(스칼라)로 대응시키는 함수를 특별히 범함수라고 한다. 구체적으로는 정적분이 있다. $I_{[a,b]}$라고 하는 범함수를 $\displaystyle I_{[a,b]}(f) = \int_{a}^{b} f(x)dx$라고 정의하면, 이 범함수는 $f$가 주어질 때 마다 구간 $[a, b]$에서 $f$의 그래프 아래 면적을 대응시키는 함수이다. $X$를 적절한 함수공간이라고 하면 범함수란 다음과 같다.
$$ \text{functional}: X \to \mathbb{R} $$
연산자란, 함수를 함수로 대응시키는 함수를 말한다. 예로는 부정적분, 미분 등이 있다.
$$ \text{operator}: X \to X $$ 함수 $f$에 대해서 $D$라고 하는 연산자를 $D(f) = \dfrac{df}{dx}$라고 정의하면 이는 주어진 함수를 그 함수의 도함수로 대응시키는 미분 연산자가 된다. $I$라는 연산자를 $\displaystyle I(f) = \int f(x) dx$라고 정의하면, 이는 주어진 함수를 그 함수의 부정적분으로 대응시키는 연산자가 된다.
이제 아래에서 말하는 함수, 범함수, 연산자란 위의 설명에서와 같다. 본격적인 얘기에 앞서 논문 전체에서 통용될 표기법을 소개한다. $G$는 변수가 함수 $u$인 연산자를 가리킨다.
$$ G : u \mapsto G(u) $$
$G$가 연산자이므로 $G$의 함숫값인 $G(u)$도 하나의 함수이며, 이의 변수를 $y$라 표기하한다.
$$ G(u) : y \mapsto G(u)(y) $$
따라서 $y$와 $G(u)(y)$는 모두 실수이다.
$$ y, G(u)(y) \in \mathbb{R} $$
이 논문에서는 연산자를 학습하는 것이 목표이므로 다음과 같이 $u$와 $y$를 입력으로 받아, $G(u)(y)$를 출력하는 신경망을 고려한다.
$$ \text{network} : (u, y) \mapsto G(u)(y) $$
이론적으로 연산자 $G$는 $u$라는 함수 자체를 변수로 가지나, 컴퓨터 시뮬레이션을 위해선 이산화가 필요하며 $u$ 대신 유한개의 함숫값 $u(x_{1})$, $u(x_{2})$, $\dots$, $u(x_{m})$을 신경망의 입력으로 다룬다. 이때 $\left\{ x_{1}, x_{2}, \dots, x_{m} \right\}$를 논문에선 센서sensors라 부른다. 즉 제안하는 신경망은 다음과 같은 구조를 가진다(Fig. 1A).
Fugure 1A
Theorem 1 (Universal Approximation Theorem for Operator) $\sigma$를 연속인 비다항함수non-polynomial function라 하자. $X$를 바나흐 공간, $K_{1} \subset X$, $K_{2} \subset X$를 컴팩트 집합이라 하자. $V \subset C(K_{1})$를 컴팩트 집합, $G : V \to C(K_{2})$를 비선형 연속 연산자라고 하자.
그러면 임의의 $\epsilon > 0$에 대해, 양의 정수 $n$, $p$, $m$과 상수 $c_{i}^{k}$, $\xi_{ij}^{k}$, $\theta_{i}^{k}$, $\zeta_{k} \in \mathbb{R}$, $w_{k} \in \mathbb{R}^{d}$, $x_{j} \in K_{1}$ ($i = 1,\dots,n$, $k = 1,\dots,p$, $j = 1,\dots,m$)이 존재하여 다음이 성립한다.
$$ \left| G(u)(y) - \sum\limits_{k=1}^{p} \underbrace{\sum\limits_{i=1}^{n} c_{i}^{k}\sigma\left( \sum\limits_{j=1}^{m} \xi_{ij}^{k}u(x_{j}) + \theta_{i}^{k} \right)}_{branch} \underbrace{\sigma(w_{k} \cdot y + \zeta_{k})}_{trunk} \right| < \epsilon \quad \text{for all } u \in V, y \in K_{2} \tag{1} $$
본 논문에서는 위 정리의 근사식을 크게 두 부분으로 나누어 브랜치brach와 트렁크trunk라 부른다.
위 근사 정리는 신경망이 비선형 연산자를 학습할 수 있을거라는 것을 암시하지만, 이를 어떻게 효과적으로 학습할 수 있는지는 알려주지 않는다. 실제로 보편 근사 정리에 따르면 임의의 [MLP]가 임의의 연속함수를 근사할 수 있어야하지만, 이미지와 관련된 작업은 CNN이나 다른 신경망 구조가 더 잘 작동한다. 유용한 네트워크는 훈련하기 쉬워야하며, 일반화 성능generalization error이 좋아야한다. 저자들은 이것이 가능한 새로운 방법론을 제안하고자 한다.
제안하는 방법이 비선형 연산자를 학습하기에 적합하다는 것을 보이기 위해, 데이터에 대한 제약constraints을 아주 약하게 설정하였다. 이 조건은 구체적으로 입력 데이터인 $u_{i}$들이 같은 센서를 가져야한다는 것이다. 물론 센서가 균일한 격자 위에 있어야할 필요는 없으며, 변수 $y$에 대한 제약은 없다. 이 조건은 다음의 그림(Fig. 1B)에 잘 나타다있다.
Fugure 1B
저자들은 제안하는 구조를 DeepONet(DeepOperatorNetwork)이라 하며, 이는 입력 함수($u(x_{1}), \dots, u(x_{m})$)에 대한 브랜치 넷branch net과 출력 함수의 변수($y$)에 대한 함수 트렁크 넷trunk net으로 구성되어있다. 이는 2장에서 자세히 설명하도록 하겠다.
논문에서는 두가지 유형의 연산자, 상미분 방정식(ODE)으로 표현되는 동적 시스템과 편미분 방정식를 고려한다.
2Methodology
2.1 Deep operator networks (DeepONets)
저자들은 일반적인 상황에서의 연산자 학습에 중점을 두었으며, 이를 위한 제약 조건은 오직 입력 함수($u$)들이 같은 센서를 가져야한다는 것이다. 제안하는 신경망의 입력값은 크게 두 부분으로 나뉘며, 위 그림 Fig. 1A에서 보이듯이, $[u(x_{1}), \dots, u(x_{m})]$과 $y$이다. 신경망의 구조에는 제약이 없으며, 논문에서는 성능의 우수성을 자랑하기 위해 가장 간단한 신경망인 [fully-connected neural networks] (FNNs)를 사용하였다. 원한다면 [CNN], RNN등의 구조를 적용할 수 있으며, 어텐션 메커니즘을 적용할 수도 있다고 설명한다.
우선 트렁크 네트워크는 $y$를 입력으로 받아, $[t_{1}, t_{2}, \dots, t_{p}]^{T} \in \mathbb{R}^{p}$를 출력한다. $p$개의 브랜치 네트워크는 $[u(x_{1}), \dots, u(x_{m})]$를 입력으로 받아, 각각 $b_{k} \in \mathbb{R}$을 출력한다($k = 1,2,\dots,p$). 이 둘을 수식 $(1)$과 같이 합하면 다음과 같다.
$$ G(u)(y) \approx \sum_{k=1}^{p} b_{k}t_{k} = \sum_{k=1}^{p} b_{k}([u(x_{1}), u(x_{2}), \cdots, u(x_{m})]) t_{k}(y) $$
주목할 점은 트렁크넷의 마지막 레이어에도 활성화 함수를 적용했다는 것이다. 위 수식에서는 잘 드러나지 않지만, 이와 같은 접근법은 $Gu = G(u)$라는 함수를 급수로 근사하는 것이라고 해석할 수 있다. 적절한 함수공간 $X$가 주어져있고, 이의 기저를 $\left\{ \phi_{k} \right\}$라 하자. 그러면 $Gu \in X$에 대해서 다음과 같이 표현할 수 있다.
$$ Gu = \sum_{k=1}^{\infty} b_{k}\phi_{k} $$
다시말해 $t_{k} = \phi_{k}(y)$라고 보면, 급수의 $t_{k}$는 기저부분, $b_{k}$는 급수의 계수 부분이다. 즉 DeepONet은 $Gu$를 직접 근사하는 것이 아니라, 급수로 분해하여 근사하는 것이다. Theorem 1에서는 필요없는 부분이지만, 아래와 같이 바이어스(상수항)를 추가하면 일반화 성능이 향상된다.
$$ G(u)(y) \approx \sum_{k=1}^{p} b_{k}t_{k} + b_{0} $$
실제로 구현할 때 $p$는 최소 10개 이상이며, $p$가 커질수록 계산 비용이 증가한다. 그래서 논문에서는 각각의 $b_{k}$를 학습하는 브랜치 네트워크를 따로 두는 형태(Fig. 1C)인 Stacked DeepONet과 하나의 네트워크로 모든 $b_{k}$를 학습하는 형태(Fig. 1D)인 Unstacked DeepONet을 소개한다. DeepONet에 관한 모든 코드는 https://github.com/lululxvi/deepxde에서 확인할 수 있지만, 저자의 다른 연구들에서 제안된 모든 코드들이 포함되어있어 원하는 부분을 찾기는 좀 어렵다.
Fugure 1C and 1D
2.2 Data generation
논문에서는 두 함수공간 가우시안 랜덤 필드Gaussian random field(GRF)와 [직교다항식 공간]을 다룬다. 저자는 평균이 $0$인 GRF를 사용하였다.
$$ u \sim \cal{G}(0, k_{l}(x_{1}, x_{2})) $$
여기서 $k_{l}(x_{1}, x_{2}) = \exp (- \| x_{1} - x_{2} \|^{2} / 2l^{2})$은 공분산 커널covariance kernel이다. 직교 다항식 공간으로는 체비셰프다항식을 선택하였다. $M > 0$이고 $T_{i}$을 제 1종 체비셰프 다항식이라 하면,
$$ V_{\text{poly}} = \left\{ \sum\limits_{i=0}^{N-1} a_{i} T_{i}(x): |a_{i}| \le M \right \} $$
데이터 셋은 $a_{i} \in [-M, M]$을 랜덤 샘플링하여 생성하였다. 이렇게 생성된 데이터셋에서 각각의 $u$에 대해 룽게-쿠타 메소드로 ODE system을 풀고, 유한 차분법로 2계 PDE를 풀어 reference solution을 구하였다.
3 Number of sensors for identifying nonlinear dynamic systems
이 섹션에서는 DeepONet으로 비선형 역학 시스템을 풀 때 임의의 정확도 $\varepsilon$을 달성하기 위해서 얼마나 많은 센서가 필요한지에 대해 논의한다.
4 Simulation results
이 섹션에서는 우선 가장 쉬운 선형 문제에서도 FNN보다 DeepONet이 더 나은 성능을 보여줌을 확인하고, 비선형 ODE 및 PDE 문제 세 가지에 대한 결과를 보여준다. 모든 문제에서 옵티마이저는 학습률이 $0.001$인 Adam을 사용하였고, 따로 명시되어있지 않는 한 네트워크의 크기는 아래의 표에서 나와있는 것과 같다.
Table 1 and 2
4.1 A simple 1D dynamic system
1차원 역학 시스템은 다음과 같이 표현된다.
$$ \begin{align*} \dfrac{ds(x)}{dx} &= g(s(x), u(x), x), \qquad x\in[0, 1] \\ s(0) &= 0 \end{align*} $$
이 문제에서 목표는 임의의 $u$에 대해서, 솔루션 $s(x) \text{ on } [0,1]$을 찾는 것이다.
4.1.1 Linear case: $g(s(x), u(x), x) = u(x)$
우선 아주 간단한 경우를 생각해보자.
$$ \begin{align*} \dfrac{ds(x)}{dx} &= u(x), \qquad x\in[0, 1] \\ s(0) &= 0 \end{align*} $$
이 경우에 연산자 $G : u \mapsto s$는 다음과 같은 부정적분 연산자이다.
$$ G : u(x) \mapsto s(x) = \int_{0}^{x} u(\tau)d\tau $$
우선 비교를 위해 depth와 width를 조절해가며 FNN으로 $G$를 학습하도록 했다. depth는 늘려도 성능에 큰 영향을 주지 않으며, width가 늘어나면 훈련 오차가 줄어들긴 하지만 여전히 일반화 성능(test error)이 개선되지는 않는다(Fig. 2).
Figure 2
반면에 DeepONet은 훈련 오차와 테스트 오차의 차이가 거의 없다 (Fig. 3A). 바이어스 $b_{0}$를 추가하면 성능이 소폭 상승한다. 또한 Unstacked DeepONet이 Stacked DeepONet에 비해 훈련 오차는 크지만, 더 중요한 테스트 오차는 더 낮다. Unstacked DeepONet이 파라미터 수가 적기 때문에 훨씬 적은 메모리를 사용하여 더 빠르게 학습할 수 있다.
Figure 3
4.1.2 Nonlinear case: $g(s(x), u(x), x) = −s^{2}(x) + u(x)$
이 경우에서는 Unstacked DeepONet과 Stacked DeepONet을 비교하는데 더 중점을 뒀다. 훈련 오차와 테스트 오차간의 상관관계를 보면 Unstacked DeepONet이 더 강하다는 것을 알 수 있다(Fig. 4A). 여러 학습률과 초기값에 대해서도 Unstacked 쪽이 훨씬 더 강한 상관관계를 보였다(Fig. 4B).
Figure 4
4.2 Gravity pendulum with an external force
이 서브섹션에서는 다음과 같은 외력이 있는 진자 운동을 다룬다.
$$ \begin{align*} \dfrac{ds_{1}}{dt} &= s_{2} \\ \dfrac{ds_{2}}{dt} &= -k \sin s_{1} + u(t) \\ s_{1}(0) &= 0, \quad s_{2}(0) = 0 \end{align*} $$
이어지는 내용에서는 DeepONet이 해당 문제에 대해서 잘 작동함을 보여주고, 센서의 수, error convergence 등에 대해서 다룬다.
4.3 Diffusion-reaction system with a source term
다음과 같은 확산-반응 방정식을 다룬다.
$$ \dfrac{\partial s}{\partial t} = D \dfrac{\partial^{2} s}{\partial^{x}} + ks^{2} + u(x),\qquad x\in [0,1], t\in [0,1] $$ $$ \text{with zero initial/boundary conditions} $$
앞의 예제와 다르게 $u(x)$의 변수는 1차원이지만, $s(x, t)$의 변수는 2차원이다. 이 경우에도 DeepONet이 잘 작동함을 보여준다. 하나의 $u$에 대한 트레이닝 데이터는 아래와 같은 식이다.
$$ \begin{align*} \big( (u, (x_{1}, t_{1})), s(x_{1}, t_{1}) \big) \\ \big( (u, (x_{2}, t_{2})), s(x_{2}, t_{2}) \big) \\ \vdots \\ \big( (u, (x_{p}, t_{p})), s(x_{p}, t_{p}) \big) \end{align*} $$
$(u, (x_{i}, t_{i}))$는 DeepONet의 입력값이고, $s(x_{i}, t_{i})$는 최종 출력 값이다. 구체적으로 $u$는 브랜치, $(x_{i}, t_{i})$는 트렁크의 입력이다. 이처럼 구성된 데이터가 각각 다른 $u$에 대해서 생성되어 학습에 사용된다.
5 Conclusion
본 논문에서는 비선형 연산자를 학습하기위한 DeepONet을 제안하였다. DeepONet은 브랜치와 트렁크로 구성되어있으며, 브랜치는 계수를, 트렁크는 기저를 학습한다고 해석할 수 있다. 본문에는 테스트 오차에 대한 다양한 요인들(센서의 수, 최대 예측 시간, 입력 함수 공간의 복잡도, 훈련 데이터셋의 크기, 네트워크의 크기)의 영향에 대한 분석이 포함되어있다. 또한 f approximation error가 다양한 요인에 어떻게 영향을 받는지에 이론적으로 유도했으며, 결과가 계산과 일치함을 보였다.
하지만 DeepONet 그 자체에 대한 이론적 분석에 대해서 아직 연구할 것이 많이 남아있다. 또한 논문에서는 FNN만 사용하였지만, CNN이나 어텐션 메커니즘, 혹은 그 외의 다른 신경망 구조/기법과의 연계에 대해서도 연구할 여지가 남아있다.