RNN에 대해 짧게 복습한 후, RNN의 다양한 task에 대한 설명을 다룰 것입니다.
RNN
RNN이라고 하는 것은, sequence data 혹은 time series data를 입력으로 받는 함수이다.
sequence data라는 것은, 매 time step마다 들어오고 있는 입력이 있다는 것이다. 예를들면, ' I go home ' 이라는 문장이 있을 때, time step 이 1일때, I 가 들어오고, time step이 2일 때, go가 들어오게 된다.
RNN의 기본 구조는 매 time step마다 동일한 function을 쓰고, 이 function의 출력은 현재 time step의 hidden state이고, 입력은 이전 time step의 hidden state vector와 현재 time step에 들어온 xt가 된다.
예시는 다음과 같다.
RNN은 각각의 입력인 I, am, happy에 해당하는 것들이 one-hot vector로 들어오게 된다.
처음에 'I' 라는 one-hot vector로 이루어진 입력이 들어온 다음, 2차원의 hidden state vector를 만들어서 다음 번째 hidden vector의 fully connected layer를 수행할 때, 그 때의 입력(am)에 해당하는 vector만 입력으로 받는것이 아닌, 이전 hidden state vector를 추가적으로 같이 사용한다.
그렇게 되면, 이 때의 총 입력이 5 dimension이 되고(one-hot vector인 입력 벡터(3 dimension) + 이전 hidden state vector(2 dimension)), 여기서 2 dimension으로 줄여서 hidden state vector를 뽑는다. 이것은 다음 time step의 fully connected layer를 수행할 때의 입력의 한 부분으로 들어가게 된다. 이것이 기본적인 RNN의 구조가 된다.
RNN의 여러 가지 구조 중 one-to-many와 many-to-one은 입력 혹은 출력이 둘 중 하나가 sequence data가 될 수 있고, 아니면 둘 다 sequence data가 될 수 있다.
먼저, one-to-many는 입력이 들어왔을 때, 입력은 static한 data이고, 출력이 sequence data인 구조이다.
대표적인 예로는 image captioning이 있다. 입력으로는 image 한 장이 들어오게 되고, 이 이미지에 대한 설명 글을 출력으로 내보내기 때문에 출력은 sequence data가 된다.
many-to-one 예로는 sentiment classification이 있다. 입력으로 'I am happy' 가 들어왔을 때, 최종적인 출력은 이 문장을 다 읽고난 후의 classification을 한 결과가 나온다. 이는 입력이 sequence data이고, 출력이 static하게 된다.
many-to-many는 입력과 출력 모두 sequence가 된다. many-to-many는 두 가지 category가 있다. 하나는 입력을 다 읽고나서 출력 sequence를 만들어내는 경우이고, 그 예시로는 machine translation이 있다. 다른 하나는 입력 하나하나가 들어올 때마다 출력을 실시간으로 만들어내는 경우이고 그 예시로는 비디오 상에서의 실시간 처리가 있다.
그렇다면, 이것을 왜 Recurrent Nerual Network라고 부를까?
Recurrent라는 말은 '반복적'이라는 의미를 갖고 있다. RNN은 t가 변해도 똑같은 function을 쓰기 때문에( = function의 parameter가 똑같다) 이러한 말이 붙여졌다.
기본적인 RNN구조는 위의 식과 같다. xt는 현재 입력이고, ht-1은 이전 입력의 hidden state이다.
일반적으로 fully connected layer를 구성할 때, 선형한다음, 비선형을 통과시켜준다. RNN에서는 이 비선형을 항상 tanh를 쓴다. tanh를 제외한 다른 비선형 변환은 sigmoid와 relu가 있다.
RNN에서는 tanh만을 사용하게 되고, tanh라는 non linear unit은 sigmoid와 relu와는 달리 x값을 -∞부터 +∞까지 주었을 때, 평균적으로 0에 가까운 값을 갖게 된다. RNN은 timestep 별로 동일한 연산을 수행해야하기 때문에, 상대적으로 편파적이지 않고 non linear unit이 0근처의 입력을 점점 늘어나는것이 아닌, 0근처의 입력으로 유지시켜주는 tanh를 사용하는 이유이다.
RNN with character-level Language model
Character-level Language Modeling이라는 task가 있다.
Language Modeling 혹은 Language Model이라고 하는 것은 단어를 순차적으로 다음 단어가 무엇인지 맞추는 것이다.
예를 들면 다음과 같다.
보통 자연어처리에서 문장을 다룰 때에는 <SOS> token 혹은 <BOS> token라는 특수 단어를 문장의 맨 앞에 위치시켜서 '문장이 시작한다'는 의미를 지니게 한다. 이러한 token을 word embedding에 추가시켜서 이 token도 하나의 vector로써 embedding을 부여받는 단어이다.
Language Modeling은 맨 처음으로 <SOS> token이 나왔을 때, 다음에 나올 단어를 예측하는 것이다.
RNN을 생각해보면, 우선 h0는 기본적으로 0벡터 입력을 받는다. h0와 <SOS> token을 입력으로 받아 h1이 나오게 된다. h1은 다음 time step의 RNN에 들어가게 될 뿐만 아니라, 또 다른 linear transformation 혹은 fully connected layer를 거쳐서 최종적으로 4개의 단어 중 하나를 예측하는 것이라고 하면, <SOS> 다음에 나타날 단어는 'I' 이기 때문에, 4개의 단어가 'I' 로 예측하게끔 학습시킬 수 있다. 그 다음, h1에 해당하는 vector와 'I'에 해당하는 vector를 입력으로 받아서 h2가 나타나고, 이 h2가 다음 time step의 RNN으로 넘어감과 동시에, 앞에서 사용한것과 같은 layer를 사용해서 4개의 단어 중 하나로 예측하는 것이다. 그 예측 값은 아마 'study'가 될 것이다. 이런식으로 계속해서 진행된다.
위 예시에서는 Language Modeling을 word-level에서 진행했다. 자연어처리를 다룰 때에는 character 단위에서도 처리할 수 있을 것이다. 가령, 알파벳을 처리한다고 할 때, 알파벳은 총 26개 이므로, 각각을 26 dimension인 one-hot vector로 나타낼 수 있을 것이다. 또한, character-level에서는 공백(space), 마침표(.) 등 도 특수문자로 본다. 그렇게 되면, categorical valriable의 종류는 더 늘어나게 될 것이다. 이렇게 character-level에서의 modeling도 생각해 볼 수 있다.
character-level language modeling에서 주어진 학습 데이터 혹은 text가 'hello'라는 단어 하나라고 생각해보자.
여기서 우리가 Language Modeling이라는 task를 수행하려면, 다음과 같다.
train data가 단어 하나이고, 이는 5개의 character sequence로 이루어져 있고, 이를 사전으로 구축한다고 하면, unique한 character만 취급하기 때문에 'h', 'e', 'l', 'o' 로 구성된 사전을 만들 수 있을 것이다. (여기서는 간단한 예시를 위해 특수문자는 제외하는 것으로 생각하자.)
input으로는 'h', 'e', 'l', 'l'이 각각 순차적으로 주어지게 된다. 이들은 각각 one-hot vector로 이루어져 있다. (여기서는 embedding vector가 없이, 각각 character에 대응하는 값을 입력으로 주자) 각각은 4차원의 입력을 받게 된다.(x1, x2, x3, x4)
hidden layer에서 보이는 vector 값들은 3차원으로 이루어져 있는 것을 알 수 있고, 이들은 각각 h1, h2, h3, h4이다. 예를 들어, time step = 2를 기준으로 한다면, h2는 one-hot vector인 x2를 입력으로 받고, 3차원 벡터인 h1도 입력으로 받을 것이다. 이것을 표현하면 다음과 같다.
h1과 x2가 concat되어서 입력으로 받게 되면, RNN은 3차원 벡터인 h2를 뽑게 된다. 뽑는 과정에서 필요로하는 parameter는 W라는 linear transformation 혹은 fully connected layer로 있을 것이다. 보통 fully connected layer에서 linear layer로 거치고 난 후, non linear layer를 수행하게 된다. 그렇기 때문에 tanh, relu, sigmoid등을 선택할 수 있는데, RNN에서는 tanh를 사용한다. 이 W라는 matrix는 h1과 x2를 concat한 것을 받아서 tanh를 걸어서 h2가 3차원 벡터가 될 수 있게끔 만들어주어야 한다.
결국 h2를 만들어내게 된 구체적인 neural net의 구조는, concat된 입력을 받아서 fully connected layer를 거치고 난 후, tanh를 거쳐서 나온 벡터라고 할 수 있다. 이를 식으로 나타내면 다음과 같다.
이를 위의 예시에 대입해보면, ht는 h2이고, ht-1은 h1이고, xt는 x2일 것이다. 그러나 linear transform을 담당하는 W라는 matrix가 2가지가 있는 것을 확인할 수 있다. 앞에서는 W가 하나였지만, 식에서는 왜 2가지로 쪼개질 수 있는지는 다음과 같다.
ht-1, xt, W가 위 그림처럼 있다. A에서 생성되는 첫 번째 값을 보자.(노란색) 오른쪽에 있는 그림과 같이 내적을 수행해서 값이 나오게 된다. 이 내적 값의 패턴을 보면, 위 그림과 같다. dimension 7짜리의 내적은 3차원 벡터와 4차원 벡터를 쪼개서 concat된 두 개의 vector가 각각 내적을 하고, 이 둘을 더하면 나오는 값이다. 다음 값도 같은 방식으로 계산하게 된다.
W는 3 x 7 행렬이다. 여기서 7은 3 + 4 의 dimension이다. 빨간 경계선을 기준으로 왼쪽을 W(ht-1 ht), 오른쪽을 W(xt ht)라고 쓴다면, W(ht-1 ht) * h(t-1) + W(xt ht) * h(t) 로 계산식을 쓸 수 있을 것이고, 이는 위 식과 동일하다.
이렇게 RNN에서 중요한 hidden state vector는 다음 time step으로 넘어갈 뿐만 아니라, character level language modeling을 수행해야하기 때문에, 예측을 수행해야한다. 이 예측은 주어진 character들이 우리의 categorical variable로써 'h', 'e', 'l', 'o' 중 하나이므로, h1는 W2라는 두 번째 layer인 output layer라는 4차원 vector를 만들어주고, 이 중 하나를 골라야하므로 softmax를 취해준다. 결과 값인 ground truth character는 'e' 이므로 softmax에 대입한 e^2.2 / (e + e^2.2 + e^-3 + e^4.1) 이 가장 높은 확률값이 되도록 학습을 계속해서 진행해야 할 것이다. 지금의 상태로써는 틀린 값을 정답으로 나타내고 있으므로 학습을 시켜서 정답을 맞춤게끔 해야한다.
다음 step으로는, h2를 가지고 앞에서 사용했던 W2라는 동일한 layer를 통과시켜서 위와 같이 예측을 수행해야한다.
Language Modeling 관점에서는 입력에서는 'h', 'e', 'l', 'l' 을 주고, 출력에서는 'e', 'l', 'l', 'o'를 출력 혹은 예측값으로 주어야 한다.
이런식으로 학습이 끝나면 Language Modeling을 통해서 예측을 수행할 수 있게 된다. 우리는 첫 번째 입력으로 'h'를 줄 것이고, 이것의 예측을 'e'라고 하면, 예측한 값인 'e'를 다음 step의 입력으로 주어서 또 다시 예측을 수행하는 방향으로 이어지게 된다. 이는 마치 categorical variable이 아니라 매 time step에 들어오는 값이 real value라고 하면, 예를 들어 오늘 주가를 넣어 다음날 주가를 예측하는 모델을 만들 수 있을 것이다.
이러한 모델을 auto regressive model이라고 부를 수도 있다.
'NLP > AI기술 자연어처리 전문가 양성 과정 3기_NLP' 카테고리의 다른 글
Day 40. NLP Quiz 1 (0) | 2022.06.11 |
---|---|
Day 39. LSTM & GRU (0) | 2022.06.09 |
Day 37. Word Embedding (0) | 2022.06.08 |
Day 36. Topic Modeling (0) | 2022.06.07 |
Day35. NLP intro (0) | 2022.03.22 |