초거대언어모델(LLM) 이전의 언어모델 : vanilla RNN
확률과 통계로 언어를 표현하는 인공지능에서 살펴본 통계언어모델은 분포가설과 확률이론에 근거하여 문장속 특정 위치에 어떤 단어가 들어갈 단어를 예측해내는 매우 간단하면서도 훌륭한 언어모델입니다. 그러나 문맥 파악이나 자연스러움 그리고 한정된 텍스트 데이터에 의존할 수 밖에 없다는 치명적인 단점 때문에 연구자와 대중들의 외면을 받아왔습니다.
이러한 통계 기반 언어모델의 문제점들을 해결하기 위해 딥러닝 기반 언어모델이 등장했습니다. 특히 자연어처리 분야에서는 순서와 위치의 영향을 크게 받는 자연어의 특성을 제대로 반영하기 위해 순환신경망(Recurrent Neural Network, RNN)이라는 딥러닝 모델이 널리 사용됩니다. 언어를 구성하는 문장은 단어의 연속입니다. 단어라는 자동차 하나 하나를 실로 꿰어서 꿰어서 하나의 기차로 만든 것과 같지요. 그래서 seq2seq라는 개념역시 등장합니다.
물론 위치와 공간정보를 포착해 내는데에 뛰어나 이미지처리 분야에서 많이 사용되는 컨볼루셔널 신경망(Convolutional Neural Network, CNN)도 자연어처리에 사용되기는 하지만, 이 브런치북에서는 생략하도록 하겠습니다.
순환신경망(RNN)은 시계열 분석이나 날씨 예측 등 연속적인 데이터 분석에 활용되는 대표적인 딥러닝 알고리즘입니다. 자연어를 구성하는 텍스트 데이터 역시 단어의 위치와 문맥에 따라 의미가 전혀 달라진다는 점에서 날씨, 주가, 분기별 매출 등과 같이 연속 데이터(sequential data)의 일종으로 볼 수 있습니다.
이처럼 연속 데이터로써 자연어의 특성을 충분히 반영하기 위해 순환신경망(RNN) 계열 모델의 한계점을 점차 보완하며 LSTM과 GRU라는 형태로 발전해 왔습니다.순환신경망(RNN) 계열의 딥러닝 기반 언어모델은 순차적으로 입력된 정보를 바탕으로 다음 정보 혹은 시퀀스 데이터를 예측하는 구조로 되어있는데, 이 구조를 시퀀스-투-시퀀스(seq2seq) 라고 합니다.
seq2seq 구조를 따르는 모델은 주로 문장을 입력하는 인코더와 출력하는 디코더 두가지 부분으로 이루어져 있는데, 이러한 인코더-디코더 구조는 현재 SoTA(State-of-The-Art) 모델로 일컬어지는 GPT-4.0을 비롯한 초거대언어모델(LLM)의 뼈대가 되는 트랜스포머(Transformer) 계열 모델의 기본구조로 이어지고 있으므로 기억해 두는 것이 좋습니다. seq2seq 구조를 구성하는 핵심 요소는 크게 문맥 벡터(context vector), 인코더(encoder) 그리고 디코더(decoder) 세가지가 있는데 그 역할은 다음과 같습니다.
1. 문맥 벡터(context vector)는 seq2seq 모델에서 핵심적인 요소로, 인코더가 입력 시퀀스를 처리하고 생성하는 고정 길이의 벡터입니다. 문맥(Context)이라는 단어에서 유추할 수 있듯이 이 벡터는 입력 시퀀스의 정보를 압축적으로 담고 있습니다. (참고로 뒤의 어텐션 메커니즘에서 다루게 될 문맥 벡터와는 다르게 seq2seq의 문맥 벡터는 인코더의 마지막 hidden state만을 가리킨다.)
2. 인코더(encoder)는 입력 시퀀스(예: 원문 문장)를 받아들여 내부 상태를 업데이트하고 문맥 벡터(context vector)를 생성하는 역할을 합니다.
3. 디코더(decoder)는 인코더를 통해 생성된 문맥 벡터(context vector)를 초기 상태로 사용하여 출력 시퀀스(예: 번역된 문장)를 생성하는 역할을 합니다.
자연어처리에서 RNN의 쓰임새를 쉽게 이해하기 위해 우리가 책을 읽는 과정에 대해 생각해 봅시다. 속독파는 전체적으로 글을 훑으면서 대략적인 내용을 파악한 뒤에 중요한 부분만 골라서 읽습니다. 반면 정독파는 첫 문단 첫 문장부터 끝까지 천천히 그 의미와 문맥을 파악합니다. RNN 기반 언어모델은 문장을 처음부터 읽어내려 가며 읽는 정독파처럼 순서대로 문맥을 이해하는 모델입니다.
이번 파트에서 배우게 될 LSTM과 GRU는 RNN의 한계점을 해결하기 위해 등장한 모델입니다. LSTM과 GRU 역시 RNN의 한 종류입니다. 세 가지 언어모델 모두 seq2seq 방식을 사용하고 있으며 비슷한 메커니즘으로 작동하기 때문에 똑같은 RNN이라고 칭하죠. 초기 순환신경망 모델을 LSTM과 GRU와 구분하기 위해 기본 순환신경망(vanilla RNN)이라고 부르기도 하니 기억해 두도록 합시다.
RNN의 구조를 이해하기 위해서는 Hidden State(은닉상태)가 출력값에 어떻게 영향을 미치는지 이해할 필요가 있습니다. 위의 그림에서 볼 수 있듯이 입력값으로 들어온 x0값이 첫 번째 시퀀스를 거치면서 h0라는 은닉상태를 출력해 냅니다. 다음 x1값이 두 번째 시퀀스에 입력될 때 이전의 학습정보를 저장하고 있는 h0라는 은닉상태가 반영되어 또다시 h1이라는 은닉상태가 나오게 됩니다. 이러한 방식으로 꼬리에 꼬리를 물듯 이전 시퀀스의 정보를 가지고 있는 새로운 은닉상태가 다음 시퀀스에 반영되는 방식으로 작동하는 것이 RNN의 원리입니다.
RNN은 다른 딥러닝 모델들처럼 순전파(Feed-Forward)와 역전파 알고리즘(Backpropagation)을 통해 모델의 가중치를 조정하면서 시퀀스 데이터를 처리하고, 시퀀스의 다음 요소를 예측하는데 이러한 방식을 통해서 RNN 모델은 문맥을 이해할 수 있게 됩니다. 예를 들어 ‘I cycle to work(나는 자전거로 출근한다)’와 ‘I work to cycle(나는 자전거를 타려고 일한다)’이라는 문장이 있다고 가정해 봅시다. 기존의 통계 기반 언어모델 방식으로는 문장 구조와 단어가 거의 같은 두 문장의 차이를 구분해 내기 어렵습니다. 그러나 RNN은 ‘cycle’이라는 단어 뒤에 ‘I’라는 단어가 오고, ‘work라는 단어 뒤에 I cycle to’라는 단어들의 집합이 온다는 정보를 이미 포함하고 있기에 두 단어의 차이점을 명확히 구분해 낼 수 있게 됩니다.
*역전파(Backprogagation) : 기울기 기반 최적화 알고리즘에 따라 출력층에서 입력층(입력과 반대 방향)으로 오차를 전파해 가중치를 조정하는 방식
기울기 소실(Gradient Vanishing)과 장기 의존 문제(Long-Term Dependency)
단순 RNN은 순차적으로 입력되는 값이 hidden-state에 반영되어 문맥 파악이 용이하다는 장점이 있었지만, 이는 반대로 입력되는 문장의 길이가 길어질수록 점점 문장의 학습력이 떨어지는 치명적인 단점을 야기하기도 합니다. 이를 장기 의존 문제(Long-Term Dependency)라고 하는데 이는 위에서 살펴본 역전파 과정에서 발생하는 기울기 소실(Gradient Vanishing) 문제 때문에 발생합니다. 기울기 소실 문제란, 가중치에 따라 결괏값의 기울기가 0이 되어 경사 하강법을 이용할 수 없게 되는 경우를 말합니다.
다음시간에는 이러한 RNN의 한계점을 극복하기 위한 모델들이 어떠한 과정을 거쳐 발전했는지 알아보도록 하겠습니다.