Skip to main content

신경망에서의 푸리에 변환이라니??!!

최근에 제안된 순수 MLP 기반 아키텍처를 분석하는 연재 보고를 이어갑니다. 이번 글에서는 James Lee-Thorp, Joshua Ainslie, Ilya Eckstein, Santiago Ontañón의 “FNet: Mixing Tokens with Fourier Transforms”를 정리합니다. 이 글은 AI 번역본입니다. 오역이 있으면 댓글로 알려주세요.
Created on September 15|Last edited on September 15
이 보고서는 순수 MLP 기반 아키텍처를 다루는 연재물의 일부입니다. 이 시리즈의 다른 보고서는 다음과 같습니다.

논문 | GitHub 저장소 + Python 패키지 | 모델 체크포인트

소���

솔직히 말해, 지난 몇 년은 전적으로 어텐션의 시대였습니다. 저자들의 말처럼, 셀프 어텐션 은:
"입력의 각 토큰을 다른 모든 토큰의 가중 관련성 기반으로 서로 연결해 주는 귀납적 바이어스"
어텐션을 사용할 때는 각 은닉 유닛이 이전 층의 은닉 유닛들을 기반으로 한 기저에서 표현됩니다. 지난 4년 동안 매우 다양한 어텐션 변형들이 제안되어 왔으며, 각각이 다양한 구문적·의미적 관계를 포착할 수 있게 해 줍니다.
하지만 우리는 여전히 그 질문에 대한 답을 얻지 못했습니다. 셀프 어텐션의 귀납적 바이어스가 트랜스포머의 효과에 필수적인가? 트랜스포머의 성공을 가능하게 하는 요인이 무엇인지 여전히 명확하지 않습니다: 트랜스포머의 성능을 좌우하는 것은 피드포워드 구조일까요, 아니면 멀티헤드 셀프 어텐션 층일까요?
또한, 이차 시간 복잡도 어텐션의 시간 복잡도 때문에 다양한 도메인에 성공적으로 적용하기가 매우 어렵습니다. 이것이 트랜스포머를 비전에 적용하지 못했던 주된 이유 중 하나였습니다. 이후 많은 논문들이 다음과 같이 이 시간 복잡도를 줄이기 위해 시도했습니다. 린포머 그리고 롱포머하지만 마침내 일부 연구자들이 이 무한한 수렁에서 벗어날 길을 찾기 시작했습니다. 최근에는 어텐션이나 컨볼루션 없이 MLP만으로 구성된 모델에 관한 연구가 다수 발표되고 있습니다. (최근 MLP 기반 연구 모음). 다음과 같은 흥미로운 새로운 방법들과 함께 RepMLP, ResMLP (CVPR 2021), 어텐션이 MLP가 CNN을 따라잡도록 만들 수 있을까? (CVM 2021) 및 사전 학습된 합성곱 신경망은 사전 학습된 트랜스포머보다 더 나을까? (ACL 2021). 이 새롭게 되살아난 관심은 널리 받아들여지고 있는 듯하며, Google, Facebook과 같은 빅테크 기업과 칭화대학교, 모나시대학교 같은 대학들이 이 주제에 대해 최상위 학회에 여러 편의 논문을 제출하고 있다.

모델 아키텍처

그림 1: FNet 아키텍처 개요
FNet 아키텍처는 여전히 표준 Transformer 기반 구조이지만, 어텐션 대신 푸리에 하위층을 사용합니다. 이제 아키텍처를 여러 하위 구성 요소로 나누어 살펴보겠습니다.

1️⃣ 피드포워드 모듈

그림 2: MLP-Mixer와 FNet의 FeedForward 블록 비교
이 논문의 FeedForward 블록은 다음과 매우 유사합니다 MLP-믹서, 이는 비선형 함수가 들어간 완전연결 계층 2개로 구성됩니다 (GELU). 유일한 차이점은 FNet의 경우 마지막 부분에 드롭아웃 레이어가 추가된다는 것입니다.
다음은 FeedForward 모듈의 구현입니다 Flax. 전체 코드는 관련 GitHub 리포지토리를 참고하세요
class FeedForward(nn.Module):
dim: int
expansion_factor: int
dropout_rate: jnp.float32

def setup(self):
self.fc1 = nn.Dense(features=self.expansion_factor * self.dim)
self.fc2 = nn.Dense(features=self.dim)
self.drop = nn.Dropout(rate=self.dropout_rate)

@nn.compact
def __call__(self, x, deterministic=False) -> Array:

out = self.fc1(x)
out = nn.gelu(out)
out = self.fc2(out)
output = self.drop(out, deterministic=deterministic)

return output

2️⃣ 인코더 블록

FNet 아키텍처의 핵심 구성입니다. 이는 MLP-Mixer 아키텍처의 Mixer 블록과도 유사합니다. 여기에서 저자들은 다음을 대체합니다 토큰-믹싱 블록 푸리에 변환과 함께
푸리에 변환은 수학에서 나온 놀랍고 아름다운 개념으로, 어떤 함수를 그에 포함된 주파수 성분으로 분해할 수 있게 해줍니다. 푸리에 변환에 대한 간단한 소개는 다음을 참고하세요. 이것 3Blue1Brown의 놀라운 영상.
이러한 푸리에 서브레이어는 그 위에서 2D 이산 푸리에 변환(DFT)을 적용합니다 (시퀀스 길이, 숨겨진 차원) 임베딩 입력. 복소수를 처리하기 위해 레이어 구조를 바꾸지 않으려면, 변환 결과에서 실수 부분만 유지하면 됩니다.
y=R(Fseq(Fh(x)))y = \mathcal{R}(\mathcal{F}_{seq}(\mathcal{F}_h(x)))


어떤 직관인지 궁금하시죠?

글쓴이들에 따르면, 푸리에 변환은 토큰을 혼합하는 데 효과적인 메커니즘이다, 모든 토큰에 접근할 수 있도록 피드포워드 서브레이어를 지원합니다. 또한 푸리에 변환의 쌍대성 때문에, 번갈아 배치된 인코더와 디코더 블록은 각각 푸리에 변환과 역푸리에 변환을 교대로 적용하여 입력을 시간 영역과 주파수 영역 사이에서 왕복 변환한다.
주파수 영역에서 피드포워드 레이어의 계수를 곱하는 것은 시간 영역에서의 합성과 동치다. 따라서, FNet은 행렬 곱셈과 ( 을 번갈아 수행하는 것으로 볼 수 있다대형 커널) 합성곱.
아래는 Encoder 블록의 구현이다 Flax. 전체 코드는 관련 GitHub 리포지토리를 참고하세요
class EncoderBlock(nn.Module):
d_hidden: int = 512

def setup(self):
self.ff = FeedForward(dim=self.d_hidden, expansion_factor=4, dropout_rate=0.1)

@nn.compact
def __call__(self, x):

x_fft = lax.real(jnp.fft.fft2(x, axes=(-1, -2)))
x = nn.LayerNorm(name="LN1")(x + x_fft)
x_ff = self.ff(x)
x = nn.LayerNorm(name="LN2")(x + x_ff)
return x

완성 모델

토큰 전처리를 위해 이 아키텍처는 BERT와 동일한 임베딩 블록과 출력 헤드로 구성된다.
아래는 FNet 아키텍처의 구현이다 Flax. 전체 코드는 관련 GitHub 리포지토리를 참고하세요
class FNet(nn.Module):
depth: int
dim: int

def setup(self):

self.layers = [EncoderBlock(d_hidden=self.dim) for _ in range(self.depth)]
self.dense = nn.Dense(features=self.dim)

@nn.compact
def __call__(self, x) -> Array:

for layer in self.layers:
x = layer(x)

output = self.dense(x)
return output

🧐 흥미로운 결과 몇 가지

저자들은 FNet을 다음과 대상과 비교하는 광범위한 비교 연구를 수행했다:
  • 선형 인코더: 여기서는 셀프 어텐션 서브레이어를 두 개의 학습 가능한 밀집 선형 서브레이어로 대체하는데, 하나는 히든 차원에, 다른 하나는 시퀀스 차원에 적용된다.
  • 랜덤 인코더: 여기서는 셀프 어텐션 서브레이어를 두 개의 고정 랜덤 행렬로 대체하는데, 하나는 히든 차원에, 다른 하나는 시퀀스 차원에 적용된다.
  • FF 전용 인코더: 여기서는 Transformer 레이어에서 셀프 어텐션 서브레이어를 제거한 경우를 말한다 [ 토큰 믹싱 없음!! ]

GLUE 지표

ModelAverage GLUE score
BERT-Base83.3
Linear-Base77.0
FNet-Base76.7
Random-Base56.6
FF-only-Base49.3

잠시 FNet은 옆에 두고, “선형” 인코더 기반 모델의 성능을 한번 살펴보자. 저자들의 실험을 바탕으로, 정확도 측면에서 큰 이점은 없음 소프트맥스나 멀티헤드 프로젝션에서 비롯된 현상(예: Synthesizer에서 보이는 것들)은 관찰되지 않았지만, 학습 속도는 약간 감소했다.
또한 저자들은 선형 모델이 일부 작업에서는 FNet보다 더 나은 성능을 낼 수 있음을 보이지만, FNet과 비교했을 때 몇 가지 단점이 있음을 보여준다. 구체적으로, GPU에서 더 느리고, 메모리 사용량이 훨씬 크며, 학습 과정에서 불안정해지기 쉽다.
그림 3: GPU 사전 학습에서의 속도–정확도 절충. 점선은 다음을 나타낸다 파레토 효율성 전선
GPU 사전 학습에서 속도와 MLM 정확도의 관계 곡선은 다음에 제시된다 그림 3더 크고 느린 모델의 경우, BERT가 파레토 효율성 경계를 정의한다. 그러나 더 작고 빠른 모델에서는 FNet과 Linear 모델이 효율성 경계를 형성하며, 이는 BERT보다 속도와 정확도 사이의 더 나은 절충을 제공함을 의미한다. 따라서 “Mini” FNet이 “Micro” BERT보다 크더라도, FNet은 더 작은 “Micro” BERT보다 더 정확하고 학습도 더 빠르다.

결론

이 논문에서 저자들은 소개한다 FNet은 학습 가능한 Self-Attention 층을 학습 불가능한 Fourier Transform으로 대체한, Transformer에서 영감을 받은 새로운 아키텍처이며, 이 연구는 어텐션 메커니즘을 대체할 수 있는 손쉬운 대안으로서 선형 유닛의 잠재력을 부각한다특히 빠른 FFT 덕분에 푸리에 변환이 매우 효율적인 토큰 혼합 메커니즘이라는 점을 확인했다. 놀랍게도 이러한 비매개변수적 혼합 방식만으로도 비교적 경쟁력 있는 모델을 만들 수 있다.
이 연구는 많은 관련 작업 가운데서도, Transformer 계열 모델을 저연산 환경에 배포하는 데 특히 중요하다.

이 글은 AI가 번역한 기사입니다. 오역이 의심되는 부분이 있으면 댓글로 알려주세요. 원문 보고서는 아래 링크에서 확인할 수 있습니다: 원문 보고서 보기