Numpilot
손안의 수치해석/4부 AI로 넓히기

FNO: 답이 아니라 연산자를 배운다

24 / 30
2026-08-16 · 읽는 데 10분

무엇을 배우는가의 차이

이 편의 제목에 있는 “연산자”라는 말부터 풀어야 한다.

일반적인 기계학습은 숫자에서 숫자로 가는 관계를 배운다. 사진을 넣으면 “고양이”라는 답이 나오고, 조건 몇 개를 넣으면 온도 하나가 나온다.

그런데 우리 문제는 그런 모양이 아니다. 입력도 분포이고 출력도 분포다.

  • 입력 — 어디가 뜨겁고 어디가 차가운지, 어떤 재료가 어디 있는지 (공간 전체에 걸친 정보)
  • 출력 — 각 위치의 온도 (공간 전체에 걸친 정보)

이렇게 함수를 받아 함수를 내놓는 관계를 수학에서 연산자라 부른다. 미분이 연산자의 예다. 함수를 넣으면 다른 함수가 나온다.

FNO(Fourier Neural Operator)의 발상은 이 연산자 자체를 학습하는 것이다.

왜 이 구분이 중요한가

실용적인 차이가 하나 있다. 격자에 묶이지 않는다는 것.

일반적인 신경망으로 온도 분포를 다루려면, 격자점의 값들을 죽 늘어놓아 입력으로 준다. 100×100 격자면 만 개의 숫자다.

그러면 모델이 그 격자 크기에 묶인다. 50×50 격자로 학습한 모델에 100×100을 넣을 수 없다. 입력의 개수가 다르니까.

연산자를 배우면 이 제약이 풀린다. 배운 것이 “격자점 만 개를 다루는 방법”이 아니라 “분포를 분포로 옮기는 규칙”이기 때문이다.

실용적으로는 이렇게 쓸 수 있다. 성긴 격자로 학습하고, 촘촘한 격자에 적용한다. 학습 비용은 싸고 사용은 정밀하게. 이게 FNO 계열 방법이 주목받은 이유 중 하나다.

어떻게 작동하나

23편에서 준비한 아이디어가 여기서 조립된다.

구조를 단계로 나누면 이렇다.

① 푸리에 세계로 옮긴다. 입력 분포를 파동 성분으로 쪼갠다.

② 각 성분에 곱한다. 이 곱하는 값을 학습으로 정한다. 이게 핵심이다. 이상적인 조건에서는 수식으로 유도되지만, 현실적인 조건에서는 유도할 수 없으므로 데이터에서 찾는다.

③ 급한 성분은 버린다. 아주 빠른 파동 성분은 잘라낸다. 계산량이 줄고, 잡음도 함께 걸러진다.

④ 원래 세계로 돌아온다. 성분들을 다시 합쳐 분포를 만든다.

⑤ 이걸 몇 겹 쌓는다. 한 번으로는 표현력이 부족하므로 여러 층을 통과시킨다.

23편에서 말한 “얽힘이 풀린 좋은 좌표계”의 이점이 여기서 나온다. 푸리에 세계에서는 성분들이 서로 독립적이므로, 학습해야 할 관계가 훨씬 단순해진다. 원래 세계에서 모든 점이 모든 점과 얽힌 관계를 배우는 것보다 압도적으로 쉽다.

얼마나 빨라지나

이 방법의 매력은 속도다.

전통적인 계산은 반복한다. 격자를 훑고, 갱신하고, 다시 훑는다. 수천 번.

FNO는 한 번 통과한다. 입력을 넣으면 몇 개의 층을 지나 답이 나온다. 반복이 없다.

그래서 조건이 정해진 뒤 답을 얻는 시간이 크게 줄어든다. 문헌에 보고된 가속 배수는 문제와 구현에 따라 크게 다르지만, 반복이 사라진다는 구조적 차이는 분명하다.

우리 목적에서 이 차이가 뜻하는 것은 이렇다. 15편에서 “몇 초”라고 했던 응답 시간이 더 짧아지고, 무엇보다 더 큰 문제를 폰에서 다룰 수 있게 된다. 3차원이나 과도 해석처럼 19편에서 포기한 것들 중 일부가 가능해질 수 있다.

대가: 검증 체계가 흔들린다

여기가 이 편에서 가장 중요한 부분이다.

21편의 표에서 “답 예측”의 위험이 크다고 했다. 왜 그런지 구체적으로 보자.

20편에서 만든 검증들이 그대로 적용되지 않는다.

격자 수렴 검사 — 격자를 촘촘히 해서 답이 안정되는지 보는 검사였다. FNO는 격자에 묶이지 않으므로, 격자를 바꿔도 답이 “수렴”하는 것이 아니다. 이 검사의 의미가 달라진다.

반복 수렴 검사 — 반복이 없으므로 해당 사항이 없다.

알려진 해 대조 — 이건 여전히 유효하다. 단순 문제의 정확한 답과 비교할 수 있다. 다만 학습 데이터에 그 문제가 들어 있었다면 검증이 아니다. 외운 것을 확인하는 것에 불과하다.

남는 것은 물리적 일관성 검사다. 에너지가 보존되는가, 최대값이 제자리에 있는가, 조건을 바꿨을 때 방향이 맞는가.

이건 예측된 답에도 적용할 수 있다. 그래서 FNO를 쓸 때 이 검사들이 유일한 방어선이 된다.

더 근본적인 문제: 조용히 틀린다

10편에서 계속 경계한 “조용히 틀리는 실패”가 여기서 최악의 형태로 나타난다.

전통적인 계산이 실패하면 대개 티가 난다. 발산하거나, 진동하거나, 수렴하지 않는다.

FNO는 항상 답을 낸다. 학습 범위 밖의 조건이 들어와도, 물리적으로 불가능한 입력이 들어와도, 무언가 그럴듯한 분포를 내놓는다. 신경망은 “모르겠다”고 말하지 않는다.

그리고 그 답이 얼마나 틀렸는지 알 방법이 없다. 정답을 모르니까.

이것이 우리가 FNO를 조심스럽게 도입하는 이유다.

그래서 어떻게 쓰나

우리 설계에서 FNO의 위치를 정리하면 이렇다.

① 전통 솔버를 대체하지 않는다. 병행한다.

② 탐색 단계에 쓴다. 사용자가 조건을 바꿔가며 열 번 시도하는 동안, 즉시 답을 준다. 이 단계에서 필요한 것은 정확도가 아니라 방향이다.

③ 결정 단계에서는 전통 솔버로 확인한다. 18편에서 만든 구조와 같다. 사용자가 “이 조건으로 가자”고 판단한 시점에 검증된 방법으로 다시 계산한다.

④ 두 답이 다르면 알린다. FNO 예측과 전통 계산이 크게 다르면, 그건 그 조건이 학습 범위를 벗어났다는 신호다.

⑤ 물리 검사를 상시 적용한다. 예측된 답이 에너지 보존을 위반하면 표시하거나 폐기한다.

이 구조에서 FNO는 빠른 초안이고 전통 솔버는 확인이다. 그리고 ④가 자동 감사 장치로 작동한다. 사용자가 결정할 때마다 FNO의 성능이 자동으로 점검되는 셈이다.

정직한 현재 위치

이 편을 마무리하며 상태를 분명히 해두자.

FNO는 우리 로드맵의 후반부다. 지금 앱에 들어 있는 것은 전통 계산이고, FNO는 미리보기 수준의 실험이다.

이유는 데이터다. FNO를 학습시키려면 (조건, 답) 짝이 대량으로 필요하다. 21편에서 “무한히 만들 수 있다”고 했지만, 그건 계산 자원이 있으면 그렇다는 뜻이다. 수만 건의 해석을 돌리는 것은 서버에서 오래 걸리는 작업이다.

그리고 어떤 조건 범위를 학습해야 하는지도 실사용 데이터가 쌓여야 안다.

그러니 순서는 이렇다. 전통 계산으로 서비스를 만들고 → 사용 데이터에서 실제 조건 분포를 파악하고 → 그 범위에서 학습 데이터를 생성하고 → FNO를 학습해 탐색 단계에 투입한다.

이 순서가 25편의 주제로 이어진다. 사용이 데이터를 만들고, 데이터가 성능을 만드는 구조.


다음 편 예고 — 데이터가 자산이 되는 구조. 사용이 쌓이면서 도구가 좋아지는 순환을 어떻게 만드는지, 그리고 그 순환의 함정은 무엇인지.