24.4 Neural Operator와 동역학 학습

실습 · 연습문제 1개

스펙트럼 합성곱 층 spectral-conv-1d

FNO의 핵심 층은 입력을 Fourier 계수로 바꾸고, 낮은 KK개 모드에서만 채널을 섞는 가중치를 곱한 뒤 격자로 되돌린다. 입력 채널 CinC_{\text{in}}개, 출력 채널 CoutC_{\text{out}}개일 때

v^o(k)=∑i=1CinWi,o,k u^i(k)(0≤k<K),v^o(k)=0(k≥K)\hat{v}_{o}(k) = \sum_{i=1}^{C_{\text{in}}} W_{i,o,k}\,\hat{u}_i(k) \quad (0 \le k < K), \qquad \hat{v}_o(k) = 0 \quad (k \ge K)

이다. u^i(k)\hat{u}_i(k)는 채널 ii의 kk번째 Fourier 계수다.

함수 spectral_conv1d(u, weights)를 완성한다.

인자 shape 뜻
u (C_in, N) 실수 주기 격자 [0,1)[0, 1)의 NN점 값
weights (C_in, C_out, K) 복소수 모드별 채널 혼합 가중치, K≤N/2+1K \le N/2 + 1

반환값은 shape (C_out, N)의 실수 배열이다.

해상도 불변성의 조건. 같은 함수를 다른 NN으로 샘플링해도 같은 결과가 나오려면 Fourier 계수가 NN에 의존하지 않아야 한다. np.fft.rfft는 계수에 NN을 곱한 값을 주므로, np.fft.rfft(u, axis=-1) / N으로 정규화하고, 되돌릴 때 np.fft.irfft(v_hat * N, n=N, axis=-1)을 쓴다(또는 두 함수의 norm="forward" 옵션).

테스트는 다음을 확인한다.

  • 출력 shape과 실수성
  • 같은 함수를 32점과 128점에서 샘플링했을 때, 겹치는 점에서 출력이 같다(해상도 불변성)
  • 파수 KK 이상의 성분은 출력에서 사라진다
  • 가중치 W0,0,k=2πikW_{0,0,k} = 2\pi i k는 미분 연산자다: sin⁡2πx\sin 2\pi x를 넣으면 2πcos⁡2πx2\pi\cos 2\pi x가 나온다

힌트: 채널 혼합은 np.einsum("ik,iok->ok", u_hat[:, :K], weights)로 쓸 수 있다.