순환신경망
정의1
$\overline{\sigma}$를 활성화함수 $\sigma$를 입력 벡터의 성분별로 적용시키는 함수라고 하자. 즉, 스칼라 함수 $\sigma : \mathbb{R} \to \mathbb{R}$에 대해서 다음과 같이 정의된 벡터 함수이다.
$$ \overline{\sigma}(\mathbf{z}) = \begin{bmatrix} \sigma(z_{1}) \\ \sigma(z_{2}) \\ \vdots \\ \sigma(z_{m}) \end{bmatrix} \qquad \text{where } \mathbf{z} = \begin{bmatrix} z_{1} \\ z_{2} \\ \vdots \\ z_{m} \end{bmatrix} $$
입력벡터들의 수열 $(\mathbf{x}_{1}, \mathbf{x}_{2}, \dots, \mathbf{x}_{T})$ $(\mathbf{x}_{t} \in \mathbb{R}^{n})$가 주어졌다고 하자. $\mathbf{W} \in M^{m \times m}$, $\mathbf{U} \in M^{m \times n}$을 가중치, $\mathbf{b} \in \mathbb{R}^{m}$를 바이어스라고 하자. 은닉상태hidden state $\mathbf{h}_{t} \in \mathbb{R}^{m}$를 다음과 같이 점화식으로 정의하는 신경망을 순환신경망recurrent neural network, RNN이라 한다.
$$ \mathbf{h}_{t} = \overline{\sigma}\left( \mathbf{W} \mathbf{h}_{t-1} + \mathbf{U} \mathbf{x}_{t} + \mathbf{b} \right), \qquad \mathbf{h}_{0} = \mathbf{0} $$
각 시점 $t$의 출력 $\mathbf{y}_{t} \in \mathbb{R}^{p}$는 은닉상태에 완전연결층을 합성하여 얻는다. $\mathbf{V} \in M^{p \times m}$을 가중치, $\mathbf{c} \in \mathbb{R}^{p}$를 바이어스라 하면,
$$ \mathbf{y}_{t} = \mathbf{V} \mathbf{h}_{t} + \mathbf{c} $$

설명
다층퍼셉트론MLP이 벡터 하나를 입력받아 벡터 하나를 내놓는 함수였다면, 순환신경망은 벡터의 수열sequence을 다루는 함수이다. 자연어의 문장, 시계열, 음성 신호처럼 순서가 의미를 가지는 데이터를 처리하기 위해 고안되었다.
MLP나 합성곱 신경망처럼 정보가 입력에서 출력으로 한 방향으로만 흐르고 되돌아오는 연결이 없는 신경망을 순방향신경망feedforward neural network이라 한다. 이 말은 은닉상태가 자기 자신에게로 되먹임되는 순환 구조를 가진 순환신경망과 대비할 때 특히 자주 쓰인다. 초기에는 사실상 MLP만을 가리키는 말이었으나, 지금은 순환신경망이 아닌 신경망을 통틀어 지칭한다고 보면 된다.
순환신경망의 핵심은 은닉상태 $\mathbf{h}_{t}$가 현재 입력 $\mathbf{x}_{t}$와 직전 은닉상태 $\mathbf{h}_{t-1}$에 동시에 의존한다는 점이다. $\mathbf{h}_{t-1}$은 다시 $\mathbf{h}_{t-2}$에 의존하므로, 은닉상태는 과거의 입력을 요약해 담고 있는 일종의 기억memory 역할을 한다. 점화식을 풀어 쓰면 $\mathbf{h}_{t}$가 시점 $t$까지의 모든 입력의 함수임이 드러난다.
$$ \mathbf{h}_{t} = \overline{\sigma}\left( \mathbf{W} , \overline{\sigma}\left( \mathbf{W} , \overline{\sigma}\left( \mathbf{W} , \overline{\sigma}( \cdots ) + \mathbf{U} \mathbf{x}_{t-2} + \mathbf{b} \right) + \mathbf{U} \mathbf{x}_{t-1} + \mathbf{b} \right) + \mathbf{U} \mathbf{x}_{t} + \mathbf{b} \right) $$
가중치 공유
주목할 점은 위 식에서 등장하는 가중치 $\mathbf{W}, \mathbf{U}$와 바이어스 $\mathbf{b}$가 모든 시점에서 동일하다는 것이다. 즉, 시점마다 다른 레이어를 쓰는 것이 아니라 하나의 레이어를 반복해서 적용한다. 합성곱층이 커널 하나를 공간 전체에 걸쳐 공유하듯, 순환신경망은 레이어 하나를 시간 축을 따라 공유한다.
덕분에 순환신경망은 입력열의 길이 $T$에 상관없이 고정된 개수의 파라미터만을 가진다. 서로 다른 길이의 입력을 같은 신경망으로 처리할 수 있는 것도 이 때문이다.
기울기 소실
순환신경망에서 은닉상태를 계산하는 과정에는 동일한 가중치 $\mathbf{W}$가 반복해서 곱해진다. 따라서 역전파 과정에서 기울기에는 $\mathbf{W}$와 관련된 항이 대략 $T$번 거듭 곱해지는 꼴이 나타난다. 이 값은 $\mathbf{W}$의 크기에 따라 $0$으로 지수적으로 줄어 기울기 소실이 일어나거나 발산한다. 그 결과 기본형 순환신경망은 시점이 멀리 떨어진 입력 사이의 관계를 학습하기 어렵다. 이 장기 의존성 문제를 게이트gate 구조로 완화한 것이 LSTM과 GRU이며, 오늘날 순차 데이터에는 순환 구조 대신 어텐션 기반의 트랜스포머가 주로 쓰인다.
같이보기
Ian Goodfellow. Deep Learning, p378-381. ↩︎

저희들의 저서 「줄리아 프로그래밍」이 2024 세종도서 학술부문에 선정되었습니다!

