-
RNN(recurrent neural network)개발 이야기/TIL 2023. 8. 7. 14:13
Transformer: Attention is all you need를 읽기 전에 그 전에 나왔던 NLP 아키텍쳐 구조인 Recurrent Neural Networks(RNN)과 RNN의 일종인 Long Short-Term Memory models(LSTM)에 관해 간단히 리뷰해보려고 한다.
First Order System
현재 시간의 상태는 이전 시간의 상태와만 관련이 있다.
x: 상태(시세, 날씨, 숫자 등)
t: 시간
u: 현재의 입력
이라고 하면
$$ x_t = f(x_{t-1},u_t) $$
해당 시스템은 어떤 외부 입력 없이(초기조건을 제외하고), 잘 돌아간다, 즉, autonomus system이다
Q) 모든 시간 대 t에서 모든 상태 $ x_t $가 관측 가능한가?
보이지 않는 변수가 있을 수 있기 때문에, 상태에 관해 일부만 관측 가능하다
따라서 관측 가능한 상태의 모음을 output $ y_t $라고 하고, 이를 state space model이라 한다.
즉,
$$ y_t = h(x_t) $$
이는 NN모델에서
Input: $ u_t $
Hiddenstate(weight part): $ x_t $
output: $ y_t $
로 표현된다.
그럼 이를 변형하면 RNN 모델이 된다(시계열 데이터를 처리하기 위해)
RNN(Recurrent Neural Network)
RNN의 배경
우리는 단어, 혹은 문장을 처리할 때 앞의 단어, 문장을 바탕으로 끊임없이 데이터를 업데이트하는 지속성을(persistence) 지닌다. 이는 대다수의 시계열 데이터의 특징이다. 즉, 과거가 현재에 영향을 미치는 것이다.
문제는 전통적인 뉴럴 네트워크는 이러한 지속성을 가지는 데이터를 처리할 수 없었는데, 이는 모든 입력값들은 서로 독립적이라고 가정했기 때문이다. 따라서 이를 해결하기 위해 네트워크 안에 feedback loop, 혹은 recurrent loop을 만들어 정보가 지속되도록 하였다.
RNN이란?
RNN은 이름에서 알 수 있듯이 재귀적 뉴럴 네트워크이다.
이런 재귀적인 루프를 만든 이유는 출력값이 이전 결과에 의존하기 때문인데, 이런 특성을 memory, 기억을 가지고 있다고 표현하기도 한다. 이는 지금까지 어떤 정보가 들어왔고, 어떻게 계산했었는지에 관한 것이다.
RNN은 히든 노드가 방향을 가진 edge로 연결되어 재귀(순환구조)를 이루는 신경망으로 시간에 따라 같은 weight(가중치)를 사용한다(CNN과 비교시, CNN은 이미지 구역별로 같은 weight를 공유한다)
그러면 이를 시간에 따른 state-space model로 다시 표현하면 아래 그림과 같다. 이는 loop를 펼쳐서 생각하는 것이다. 즉, 이는 시간축으로 deep neural network를 만든 것과 같다.
이 부분에서 cell에서 전달해주는 $ h_t $는 이전까지의 상태와 이전까지의 입력을 모두 대표하는 압축본이라고 할 수 있기에, 시계열 데이터를 처리한다고 할 수 있는 것이다.
즉, f는 self feed back loop의 함수, h는 output함수라고 할 수 있다.
따라서 $ h_t $는 시계열로 들어오는 입력들을 최대한 상세히 표현할 수 있어야 한다.
NLP에서의 목적은 주어진 문장에서 다음 단어로 나올 단어를 최대한 유추하는 것이다.
원래는 문제에서 Input과 ouput을 1-1로 direct하게 연결해줘야했지만,
Hiddent state를 통해 전의 상태들을 받아서 사용가능하기에, 마지막 state만 이용해도 충분하다.
즉, 아래와 같은 문제를 푸는 것으로 바뀐다.
RNN 유형
RNN은 입력과 출력의 길이를 다르게 설계할 수 있기에 다양한 구조로 변형가능하다.
각 변형 구조는 아래와 같고 아래와 같은 예시에 사용된다
Many to many: 번역
Many to one: 예측
one-to-many: 생성
RNN의 수식
RNN의 기본구조는 위 그림과 같은데, 녹색박스가 hidden state, x가 input, y가 ouput을 의미한다.
수식을 보면 알 수 있듯이 히든 state의 활성화 함수는 비선형 함수인 tanh이다.
이때 tanh이, 비선형 함수를 사용하는 이유는 아래와 같다.
선형 함수인 $ h(x)=cx $를 활성 함수로 사용한 3층 네트워크를 떠올려 보세요.
이를 식으로 나타내면 $ y(x) = h(h(h(x))) $ 가 됩니다. 이 계산은
y(x)= c*c*c*x 처럼 세번의 곱셈을 수행하지만 실은 y(x) = ax와 동일한 식입니디ㅏ.
$ a=c^3 $이라고만 하면 끝이죠. 즉 히든레이어가 없는 네트워크로 표현할 수 있습니다. 그래서 층을 쌓는 혜택을 얻고 싶다면 활성함수로는 반드시 비선형함수를 사용해야 합니다.참고자료
https://hyen4110.tistory.com/25
https://www.youtube.com/watch?v=Hn3GHHOXKCE
https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/
'개발 이야기 > TIL' 카테고리의 다른 글
[Pandas] Stat series를 dataframe으로 바꾸는법 (0) 2024.03.10 LSTM(Long short term memory) (0) 2023.08.07 TIL 파이썬으로 조합과 순열 구하기 (0) 2023.02.01 Andorid studio AVD emulator is already running error 해결기 (0) 2023.01.25 Python 백준 2751 set in과 list in 비교 + 이진탐색 풀이 (0) 2023.01.24