|
|
[딥러닝] 순환 신경망 RNN — RNN,
Vanilla RNN, encoder-decoder, BPTT, LSTM, GRU, Attention
1. 기억을 갖는 신경망 모델, RNN
■ 순차 데이터와 콘텍스트
시간이나 공간적으로 순서 관계가 있는 데이터를 순차 데이터(sequence data)라고 한다. 문장, 음성, 동영상 프레임, 주가 등이 해당한다. 순차 데이터는 콘텍스트(context, 문맥)를 가진다. 데이터 하나만으로는 의미가 정해지지 않고, 앞뒤를 함께 봐야 역할이 정해진다.
기존 신경망(FCN, CNN)은 입력을 한 번에 통째로 받아 처리하며, 입력 순서라는 개념이 없다. 따라서 앞뒤 맥락에 따라 현재 데이터의 의미가 달라지는 순차 데이터를 다루지 못한다.
■ 피드백 연결과 은닉 상태
RNN은 순차 데이터를 다루기 위해 두 가지 구조를 가진다.
첫째, 데이터를 시간 순서대로 하나씩 입력받는다 (x₁, x₂, x₃ ...).
둘째, 은닉 계층에 피드백 연결(feedback connection)을 둔다. 이전 단계 은닉 계층의 출력을 다음 단계의 입력으로 되먹임시키는 구조다. 이 되먹임을 통해 지금까지 입력된 내용이 다음 단계로 계속 전달되며, 이것이 RNN의 '기억'에 해당한다.
다음 단계로 전달되는 값을 은닉 상태(hidden state) hₜ라고 한다. 은닉 상태는 별도의 저장소가 아니라 고정 크기의 숫자 벡터 하나다. 차원이 128이면 숫자 128개짜리 벡터이며, 지금까지 입력된 모든 데이터가 이 벡터에 압축되어 들어간다. 이 압축된 내용물이 콘텍스트다. 벡터 하나가 매 단계 덮어쓰기되며 갱신되고, 새 값 안에 이전 값이 녹아드는 방식으로 이어진다.
■ Vanilla RNN 구조와 수식
가장 기본적인 RNN(Vanilla RNN)의 한 단계 계산은 다음과 같다.
hₜ = tanh(Wₓₕ·xₜ + Wₕₕ·hₜ₋₁ + b)
· xₜ : 현재 단계의 입력
· hₜ₋₁ : 이전 단계의 은닉 상태
· Wₓₕ : 입력에 곱하는 가중치
· Wₕₕ : 이전 은닉 상태에 곱하는 가중치
· b : 편향
· tanh : 값을 -1~1 사이로 제한하는 활성화 함수
가공한 현재 입력(Wₓₕ·xₜ)과 가공한 이전 기억(Wₕₕ·hₜ₋₁)을 더한 뒤 tanh를 적용해 새 은닉 상태 hₜ를 만든다. 이 hₜ가 다음 단계의 입력으로 다시 사용된다.
가중치 첨자는 '어디서 → 어디로' 가는 변환을 나타낸다 (x=입력, h=은닉, y=출력).
· Wₓₕ : 입력 → 은닉
· Wₕₕ : 은닉 → 은닉
· Wₕᵧ : 은닉 → 출력
출력은 은닉 상태에서 한 번 더 변환해 계산한다.
yₜ = Wₕᵧ·hₜ + c
■ 가중치 공유와 그 이점
RNN을 시간순으로 여러 단계 펼쳐도 가중치 Wₓₕ, Wₕₕ, Wₕᵧ는 한 세트를 모든 단계가 공유한다. 1단계의 Wₕₕ와 50단계의 Wₕₕ는 동일한 값이다. 이를 가중치 공유(weight sharing)라 한다. 이점은 다음과 같다.
· 위치 불변 : 같은 W로 모든 단계를 처리하므로, 특정 순차 패턴이 어느 위치에 나타나도 포착할 수 있다.
· 가변 길이 처리 : 단계를 추가하기만 하면 되므로 입력 길이에 제약이 없다.
· 파라미터 절약과 일반화 : 파라미터 수가 줄고, 같은 가중치를 반복 학습하면서 정규화 효과로 일반화가 향상된다.
다만 같은 Wₕₕ를 매 단계 반복해서 곱하는 구조는, 펼쳐 보면 Wₕₕ × Wₕₕ × Wₕₕ ... 처럼 동일 행렬의 거듭제곱이 된다. 이 반복 곱이 이후 그래디언트 소실/폭발 문제의 원인이 된다 (4장).
▶ 핵심 한 줄 : RNN은 입력을 시간순으로 하나씩 받으며, 맥락을 은닉 상태에 담아 다음 단계로 넘기는 신경망이다.
2. 순환 신경망의 주요 모델
순환 신경망은 입력과 출력이 각각 순차열인지 아닌지에 따라 모델 형태가 갈린다.
■ 다대일(many-to-one)
입력은 순차열이지만 출력은 하나인 경우다. 모든 단계에서 입력을 받지만 출력은 마지막 단계에서만 한다. 영화 평론이 긍정인지 부정인지 판단하는 감성 분석(sentiment analysis)이 대표적이다. 평론을 단어 단위로 입력하고, 긍정/부정 여부는 마지막 단계에서 출력한다. 마지막 은닉 상태가 문장 전체의 콘텍스트를 담고 있기 때문에 그 한 번으로 판단할 수 있다.
■ 다대다(many-to-many)
입력과 출력이 같은 길이의 순차열인 경우다. 모든 단계에서 입력을 받고 모든 단계에서 출력한다. 동영상을 프레임별로 분류하는 작업이 예시로, 단계마다 프레임을 입력해 각 프레임의 분류 결과를 출력한다.
다대다 모델 학습에는 티처 포싱(teacher forcing)을 사용한다. 티처 포싱은 현재 단계의 출력을 다음 단계의 입력으로 사용하는 방식인데, 학습 초반에는 모델의 예측이 부정확하므로 그 틀린 출력을 다음 입력으로 넣으면 오류가 누적된다. 이를 막기 위해 훈련 시에는 모델의 예측 대신 실제 타깃을 다음 단계 입력으로 넣어준다. 이렇게 하면 학습이 안정되고 수렴 속도도 빨라진다.
■ 일대다(one-to-many)
입력은 하나지만 출력은 순차열인 경우다. 첫 번째 단계에서만 입력하고 모든 단계에서 출력한다. 이미지 캡션 생성이 대표적으로, 첫 단계에서 이미지 컨텍스트를 입력하고 각 단계에서 설명 문장의 단어를 순서대로 출력한다. 여기서 입력의 단계 수가 적더라도 입력 벡터가 충분히 풍부한 정보를 담고 있어야 의미 있는 출력을 생성할 수 있다.
■ 양방향(bidirectional)
입력을 순방향과 역방향 양쪽으로 살펴보는 방식이다. 시간순으로 생성되는 데이터는 현재가 과거에만 의존하므로 한 방향으로만 봐야 하지만, 공간적 순서 관계를 갖는 데이터는 앞뒤를 모두 보는 것이 더 정확하다. 예를 들어 문장의 빈칸을 채울 때 앞 단어만으로는 부족하고 뒤 단어까지 봐야 정확히 추론할 수 있다.
양방향 모델은 입력을 순방향 계층과 역방향 계층에 모두 통과시키고, 두 계층의 출력을 합쳐 예측한다. 단, 역방향으로 읽으려면 입력 전체가 주어져 있어야 하므로, 실시간으로 데이터가 들어오는 예측 상황에는 사용할 수 없다.
■ 인코더-디코더(encoder-decoder)
입력과 출력의 길이가 서로 다른 순차열인 경우다. 입력을 요약하는 인코더와 요약을 받아 출력을 생성하는 디코더로 구성되며, 순차열을 다른 순차열로 변환한다는 의미에서 Seq2Seq(sequence-to-sequence)라고도 한다. 기계 번역이 대표적이다.
인코더는 입력을 순차적으로 처리한 뒤 마지막 단계의 은닉 상태를 콘텍스트 벡터(context vector)로 출력한다. 디코더는 이 콘텍스트 벡터를 받아 단계별로 출력을 생성하며, 안정적인 학습을 위해 티처 포싱을 적용한다.
여기서 콘텍스트 벡터는 매 단계 누적되는 일반적인 콘텍스트와 구분된다. 인코더가 입력 전체를 다 읽고 만든 최종 요약 한 개를 가리킨다. 인코더와 디코더는 별도로 학습되는 것이 아니라, 최종 출력의 손실 하나가 디코더에서 인코더까지 거슬러 전파되며 함께 학습된다. 다만 입력이 길어질수록 모든 정보를 콘텍스트 벡터 하나에 담아야 하는 병목이 생기는데, 이는 이후 어텐션으로 해결된다 (5장).
▶ 핵심 한 줄 : 입력과 출력의 길이 관계에 따라 모델 형태가 갈린다.
3. 시간펼침 역전파 (BPTT)
BPTT는 Backpropagation Through Time, 우리말로 시간펼침 역전파다. 일반 역전파가 신경망의 '층'을 거꾸로 타고 내려가는 것이라면, BPTT는 RNN을 시간순으로 펼친 뒤 '시간'을 거꾸로 타고 내려가는 것이다. 알고리즘 자체는 일반 역전파와 동일하며, 거꾸로 진행하는 축이 층에서 시간으로 바뀐 것뿐이다.
RNN은 물리적으로는 셀 하나를 반복 사용하지만, 역전파를 위해 시간순으로 펼쳐(unfold) 놓으면 깊은 신경망처럼 보인다. 단, 일반적인 깊은 신경망과 달리 모든 단계가 같은 가중치를 공유한다.
■ 손실 함수 — 단계별 손실의 합
손실 함수(loss function)는 모델의 예측이 정답에서 얼마나 벗어났는지를 하나의 숫자로 나타내는 함수다. 손실이 클수록 많이 틀렸고, 0이면 완벽하다. 학습의 목표는 이 손실을 최소화하는 것이며, 역전파는 이 손실에서 출발한다.
· 회귀 문제 : MSE(평균제곱오차). 예측과 정답의 차이를 제곱한다.
· 분류 문제 : 크로스 엔트로피. 정답 클래스에 부여한 확률이 높을수록 손실이 작다. 단순히 맞았는지뿐 아니라 정답을 얼마나 확신했는지까지 반영한다.
RNN은 단계마다 출력하므로 손실도 단계마다 생긴다. 전체 손실은 각 단계 손실의 합이다.
L = L₁ + L₂ + L₃ + L₄
■ 시간펼침 역전파 — 펼쳐서 시간 역순으로
역전파는 전체 손실 L에서 시작한다. L에서 각 단계의 손실 Lₜ, 출력 yₜ를 거쳐 은닉 상태 hₜ에 도달하는 경로는 여러 단계에서 동시에 시작될 수 있다.
문제는 은닉 상태들이 서로 사슬처럼 연결되어 있다는 점이다. 순방향에서 h₃이 h₄를 만드는 데 쓰였으므로, 역방향에서는 h₄의 그래디언트가 h₃으로도 흘러내린다. 따라서 각 은닉 상태는 '자기 출력에서 온 그래디언트'와 '다음 단계에서 흘러온 그래디언트'를 합쳐서 받고, h₄ → h₃ → h₂ → h₁ 순으로 시간을 거꾸로 타며 그래디언트가 누적된다.
이 과정에서 한 단계 거꾸로 갈 때마다 ∂hₜ/∂hₜ₋₁ 가 곱해지는데, 그 안에 Wₕₕ가 들어 있다. 따라서 멀리 떨어진 단계까지 거슬러 가면 같은 Wₕₕ가 반복해서 곱해진다.
∂h₄/∂h₁ ≈ Wₕₕ × Wₕₕ × Wₕₕ = Wₕₕ³
단계가 100개면 Wₕₕ¹⁰⁰이 된다. 이것이 1장에서 예고한 반복 곱이며, 그래디언트 소실/폭발의 직접적 원인이다. 한편 Wₕₕ는 모든 단계가 공유하므로, 각 단계에서 계산된 그래디언트를 모두 더해 한 번에 업데이트한다.
■ 절단 BPTT — 너무 긴 순차열 끊어서 처리
기본 BPTT는 마지막 단계까지 순방향을 끝낸 뒤 역전파를 시작한다. 따라서 순차열이 매우 길거나 끝이 없으면 역전파를 시작할 수 없고, Wₕₕ가 지나치게 많이 곱해지며, 모든 중간값을 저장해야 해 메모리도 부담이 된다.
절단 BPTT(truncated BPTT)는 순차열을 일정 길이의 묶음으로 끊어, 묶음 단위로 순방향과 역전파를 수행한다. 핵심은 끊되 맥락은 유지한다는 점이다. 역전파(그래디언트)는 묶음 안에서만 진행하지만, 은닉 상태는 다음 묶음으로 넘긴다. 첫 묶음의 마지막 은닉 상태를 다음 묶음의 초기 상태로 전달하므로, 콘텍스트는 끊기지 않고 그래디언트만 묶음 안에서 끊긴다.
즉 절단 BPTT는 모델의 순방향 동작은 그대로 두고, 역전파가 거슬러 올라가는 범위만 제한하는 학습 방식의 변경이다.
▶ 핵심 한 줄 : RNN을 시간순으로 펼쳐 역전파하되, 순차열이 길면 묶음으로 끊고 은닉 상태만 이어서 전달한다.
4. LSTM과 GRU
■ 기본 순환 신경망의 문제점
기본 RNN에는 두 가지 문제가 있다.
장기 의존성(long-term dependency) 문제는 콘텍스트 범위가 넓을 때 멀리 떨어진 입력의 영향이 점점 사라지는 현상이다. 순차열이 길어질수록 오래전 입력 정보가 흐려져 정확한 예측이 어렵다.
그래디언트 소실/폭발(gradient vanishing/exploding) 문제는 그 직접적 원인이다. 3장에서 본 것처럼 역전파 시 같은 Wₕₕ가 반복해서 곱해져 Wₕₕⁿ 형태가 된다. 행렬이 거듭제곱되면 고윳값 크기가 1보다 크면 발산(폭발)하고, 1보다 작으면 0으로 수렴(소실)한다. 예를 들어 0.9¹⁰⁰은 거의 0, 1.1¹⁰⁰은 약 13780으로, 1에서 조금만 벗어나도 반복 곱하면 극단으로 간다.
폭발은 그래디언트 클리핑(gradient clipping)으로 비교적 간단히 막을 수 있다. 그래디언트 크기가 임계치를 넘으면 방향은 유지하고 크기만 임계치로 잘라낸다. 그러나 소실은 0이 된 값을 되살릴 수 없으므로 클리핑으로 막을 수 없다. 이 소실 문제를 해결하기 위해 등장한 것이 LSTM과 GRU다.
■ LSTM — cell state로 W 곱 없는 경로 만들기
LSTM(Long Short-Term Memory)은 기억을 두 갈래로 나눈다.
· 셀 상태(cell state) Cₜ : 장기 기억. W 곱이 없는 경로로 멀리 전달된다.
· 은닉 상태(hidden state) hₜ : 단기 기억. 최근 맥락을 담아 매 단계 예측에 사용된다.
소실의 원인이 그래디언트 경로에서 Wₕₕ가 반복 곱해지는 것이었으므로, LSTM은 그 곱이 일어나지 않는 별도의 경로(셀 상태)를 만들어 문제를 해결한다.
LSTM은 기억을 통과시킬지 결정하는 게이트(gate)를 사용한다. 게이트는 시그모이드를 통해 0~1 사이 값을 내며, 0이면 차단, 1이면 완전 통과, 0.7이면 70% 통과를 의미한다. 게이트는 네 종류다.
· 망각 게이트(forget) : 장기 기억 중 버릴 것을 결정한다.
· 입력 게이트(input) : 새 기억 중 장기 기억으로 보낼 것을 고른다.
· 기억 게이트 : 망각 게이트를 통과한 장기 기억에 입력 게이트를 통과한 새 기억을 더해 장기 기억을 갱신한다.
· 출력 게이트(output) : 갱신된 장기 기억에서 현재 단계에 쓸 부분을 골라 단기 기억을 만든다.
게이트 세 개(망각·입력·출력)는 모두 같은 형태이며, 이전 단기 기억 hₜ₋₁과 새 입력 xₜ를 입력받아 각자 다른 가중치로 계산한다.
fₜ = σ(W_f·[hₜ₋₁, xₜ] + b_f) (망각)
iₜ = σ(W_i·[hₜ₋₁, xₜ] + b_i) (입력)
oₜ = σ(W_o·[hₜ₋₁, xₜ] + b_o) (출력)
새 기억 후보는 게이트가 아니라 실제 내용이므로 시그모이드 대신 tanh를 써서 -1~1 범위로 만든다.
C̃ₜ = tanh(W_C·[hₜ₋₁, xₜ] + b_C)
장기 기억인 셀 상태는 다음과 같이 갱신된다. (⊙는 원소별 곱)
Cₜ = fₜ ⊙ Cₜ₋₁ + iₜ ⊙ C̃ₜ
즉 '망각 게이트로 거른 이전 장기 기억'과 '입력 게이트로 고른 새 기억'을 더한 것이다. 이 식에는 W 곱이 없다. Cₜ₋₁ 앞에 붙은 것은 W가 아니라 게이트 fₜ다.
단기 기억은 갱신된 장기 기억에서 출력 게이트로 필요한 부분만 골라 만든다.
hₜ = oₜ ⊙ tanh(Cₜ)
■ LSTM에서 그래디언트 소실이 생기지 않는 이유
셀 상태 경로를 역전파로 거꾸로 가면, Cₜ₋₁ 앞에 붙은 것이 게이트 fₜ이므로 ∂Cₜ/∂Cₜ₋₁ ≈ fₜ가 된다. 따라서 거꾸로 100칸을 가도 곱해지는 것은 W의 거듭제곱이 아니라 게이트 값들의 곱(f₁₀₀ × ... × f₁)이다.
기본 RNN은 W가 고정값이라 매번 같은 값이 강제로 곱해져 0.8¹⁰⁰처럼 0으로 사라지는 것을 피할 수 없었다. 반면 LSTM의 게이트는 단계마다 다르고 학습으로 조절되므로, 지켜야 할 기억에는 fₜ를 1에 가깝게 학습해 그래디언트를 거의 그대로 유지할 수 있다. 1을 곱하면 반복해도 값이 변하지 않기 때문이다. 즉 기본 RNN은 1을 선택할 수 없어 소실을 피하지 못했고, LSTM은 게이트를 통해 소실을 피하는 것을 선택할 수 있게 된 것이다.
게이트가 어떤 기억을 지키고 버릴지는 사람이 정하는 것이 아니라, 손실을 줄이는 과정에서 학습으로 결정된다.
■ GRU — 게이트 2개로 간소화
GRU(Gated Recurrent Unit)는 LSTM의 장점을 유지하면서 구조를 단순화한 모델이다. 셀 상태를 없애고 은닉 상태 하나가 장기·단기 기억을 모두 담당하며, 게이트를 두 개로 줄였다.
· 리셋 게이트(reset) rₜ : 새 기억을 만들 때 이전 기억을 얼마나 참고할지 정한다.
· 업데이트 게이트(update) zₜ : 이전 기억과 새 기억을 섞는 비율을 정한다.
새 기억 후보는 리셋 게이트로 이전 기억을 거른 뒤 만든다.
h̃ₜ = tanh(W·[rₜ ⊙ hₜ₋₁, xₜ])
최종 은닉 상태는 이전 기억과 새 기억 후보의 가중 평균으로 계산한다.
hₜ = (1 − zₜ) ⊙ hₜ₋₁ + zₜ ⊙ h̃ₜ
이전 기억의 비중 (1−zₜ)와 새 기억의 비중 zₜ를 더하면 항상 1이 된다. 즉 이전 기억을 덜 쓰면 자동으로 새 기억을 더 쓰게 된다. 이 업데이트 게이트 하나가 LSTM의 망각 게이트와 입력 게이트 역할을 합친 것이다. LSTM은 버리기와 넣기를 독립된 두 게이트로 처리했지만, GRU는 이를 하나의 비율로 묶었다.
GRU는 LSTM보다 셀 구조가 단순하고 연산량이 적지만 성능은 비슷하다. 소실을 막는 원리(W 곱 없는 경로로 기억을 직통 전달)는 LSTM과 동일하며, 더 적은 부품으로 같은 일을 해낸다.
▶ 핵심 한 줄 : cell state(또는 GRU의 직통 경로)로 W의 반복 곱을 없애, 지킬 기억의 그래디언트를 그대로 흘려보내 소실을 막는다.
5. 순환 신경망 개선 — 어텐션
LSTM과 GRU는 그래디언트 소실을 완화했을 뿐 완전히 해결하지는 못했다. 콘텍스트가 매우 길면 여전히 오래전 정보가 흐려지고, 특히 인코더-디코더는 입력 전체를 콘텍스트 벡터 하나에 담아야 하는 병목이 있다. 이를 개선하기 위한 방법이 어텐션(attention)이다.
■ 어텐션 — 연관 있는 기억에만 집중
어텐션은 모든 정보를 동등하게 기억하지 않고, 연관성 있는 정보에 집중하는 방식이다. 사람이 문장을 읽을 때 모든 단어를 똑같이 보지 않고 관련 깊은 단어에 더 주의를 기울이는 것과 같다.
어텐션 계산에는 세 가지 요소가 필요하다.
· 쿼리(Query, q) : 지금 기준이 되는 것. 무엇과 연관된 것을 찾을지.
· 키(Key, k) : 각 대상이 가진 식별용 이름표. 쿼리와의 연관 정도를 계산할 대상.
· 밸류(Value, v) : 연관 정도에 따라 실제로 사용할 데이터.
계산 순서는 다음과 같다. 먼저 쿼리 q와 각 키 k의 연관 정도를 어텐션 점수(attention score)로 계산한다. 점수는 보통 내적(dot product)으로 구하며, 두 벡터의 방향이 비슷할수록 큰 값이 나온다. 이 점수에 소프트맥스를 적용해 0~1 사이 확률(합이 1)로 바꾼 뒤, 각 밸류 v에 그 확률을 곱해 모두 더한다. 결과적으로 연관 큰 대상의 정보가 많이, 연관 적은 대상의 정보가 적게 섞인 요약이 나온다.
셀프 어텐션(self-attention)은 쿼리, 키, 밸류를 모두 같은 입력(자기 자신)에서 뽑아, 문장 안에서 단어들끼리 서로 얼마나 연관되는지를 보는 방식이다. 예를 들어 "그 동물은 길을 안 건넜다, 그것(it)이 너무 피곤했기 때문에"에서 'it'이 '동물'을 가리킨다는 것을, it의 쿼리를 모든 단어의 키와 비교해 알아낸다. 이 셀프 어텐션이 트랜스포머의 핵심 구조다.
어텐션은 계산 방식에 따라 구분되기도 한다. 하드 어텐션(hard attention)은 점수가 가장 높은 하나만 선택하고, 소프트 어텐션(soft attention)은 점수를 가중치로 삼아 전체를 가중 합산한다. 소프트 어텐션이 미분 가능해 학습에 주로 쓰인다.
■ 어텐션이 장기 의존성을 해결하는 방식
RNN은 멀리 떨어진 단어의 정보를 전달하려면 그 사이의 모든 단계를 거쳐야 하므로, 거리가 멀수록 정보가 흐려졌다. 어텐션은 모든 단어를 한 번에 보고 각 단어 쌍의 연관도를 직접 계산한다. 1번 단어와 50번 단어가 중간 단계를 거치지 않고 곧바로 연결되므로, 거리에 관계없이 정보가 흐려지지 않는다.
이 때문에 순환 구조 자체가 불필요해진다. 초기 어텐션은 순환 구조에 결합해 사용했지만, 최근 모델은 순환을 완전히 배제하고 어텐션 계층만으로 구성한다. 이것이 트랜스포머(Transformer)이며, 이후의 ViT, VLM으로 이어지는 출발점이다.
▶ 핵심 한 줄 : 모든 것을 똑같이 기억하지 말고, 연관 있는 것에 거리와 무관하게 직접 집중한다.
───────────────────────────────────────
[부록] 추가 내용
───────────────────────────────────────
■ 분산 표현 (distributed representation)
은닉 상태나 기억 벡터의 각 숫자가 의미를 담는 것은 맞지만, '한 칸 = 한 의미'는 아니다. 의미는 여러 칸의 조합(패턴)에 분산되어 표현된다. 색을 R, G, B 세 숫자의 조합으로 수백만 가지 표현하는 것과 같다. '보라색'이 특정 칸 하나에 있는 게 아니라 R=128, B=128의 조합으로 나타나듯, 신경망의 의미도 칸들의 조합으로 떠오른다. 덕분에 적은 차원으로 방대한 의미를 표현할 수 있고, 비슷한 의미는 비슷한 벡터가 되어 일반화에 유리하다. 게이트가 한 차원을 줄여도 의미가 통째로 사라지지 않는 것도 이 때문이다.
■ 어텐션의 연산량 — O(n²)
셀프 어텐션은 모든 단어가 모든 단어와 연관도를 계산하므로, 단어가 n개면 n×n번의 계산이 필요하다. 이를 O(n²) 복잡도라 한다. 단어 수가 2배면 연산은 4배가 된다. 문장 수준에서는 괜찮지만 긴 문서에서는 부담이 크다. RNN이 O(n)으로 저렴한 대신 장기 의존성에 약했다면, 어텐션은 O(n²)으로 비싼 대신 장기 의존성을 해결한 것으로, 둘은 트레이드오프 관계다.
■ 긴 입력을 나눠 처리하기
긴 입력을 묶음 단위로 어텐션하고 묶음 사이에는 상태를 전달하는 방식도 연구되어 있다. Transformer-XL은 입력을 세그먼트로 끊고 이전 세그먼트의 은닉 상태를 캐시해 다음 세그먼트가 참고하게 하며(절단 BPTT와 유사한 발상), 계층적 어텐션은 단어를 묶어 문장 벡터를 만들고 문장 벡터끼리 다시 어텐션한다. 다만 묶음 경계를 넘는 디테일이 흐려지는 단점이 있어, 전체를 직접 연결하는 풀 어텐션과 효율적 어텐션이 함께 쓰인다.
참고자료 , 이미지 출처 : https://sonstory.tistory.com/82
|
|
