NLP

RNN과 LSTM

알 수 없는 사용자 2021. 5. 2. 04:03
반응형

이전 글을 쓰면서 돌리던 학습이 아직도 안끝났다.

2편을 썼는데 기어코 오늘 3편을 쓰게 만드는 녀석이다.

그래도 기분이 조금 들뜨는게 지금까지 중에서 최고의 결과가 나오는 중이다.

 

잡설은 여기까지 하고 다시 NLP로 돌아가보자.

 

이번 포스팅에서는 RNN과 LSTM이라는 NLP의 기초중의 기초인 녀석들을 알아 볼 것이다.

CV에선 Max pooling 정도 되는 녀석들 일 것 같다. 과거의 영광을 누렸으나 지금은 잘 안보이는...

 

일단 이녀석들을 알기 위해서는 Feed-forward Neural Network를 알아야 한다.

사실 이미 알고 있다.

주구장창 말했던 딥러닝 네트워크가 Feed forward 이다.

http://uc-r.github.io/feedforward_DNN

요런 녀석들 말이다. 그저 입력넣고 출력 나오는 녀석들이 바로 피드포워드 네트워크이다.

핵심적인 동작은 데이터(또는 벡터)를 넣어서 벡터를 뽑아낸다는 것이다.

 

자 그럼 이제 NLP에 대해 탐구해보자.

NLP 하면 무엇이 가장 먼저 떠오르나?

필자의 경우 단연 '번역'이었다. (요즘엔 아니다.)

번역을 생각해 보면 단어들이 이어져서 형성된 문장을 넣는다. 그렇다고 문장마다 개별적으로 생각 할 수도 없다.

Look at that dog. It is so cute!

이 문장을 번역할 때 It을 번역하기 위해서는 이전 문장의 정보가 사용되어야 한다.

약간의 의역을 하면 '저것좀 봐. 강아지 진짜 귀엽다!' 이런 식으로 번역 할 수도 있어야 한다는 것이다.

 

이 경우 순서가 중요하다. 이전 정보들을 차례로 받아 사용해야 한다. 이러한 데이터를 Sequential Data라고 한다. NLP는 Sequential Data이다. 

 

이번 포스팅의 경우 스탠포드 대학 강의를 많이 참고하였다.

www.youtube.com/watch?v=6niqTuYFZLQ 해당 링크에서 강의를 볼 수 있다.

cs231n.stanford.edu/slides/2017/cs231n_2017_lecture10.pdf 강의자료이다.

 

 

여러 네트워크들이 존재 할 것이다. 왼쪽 부터 차례대로

1to1 : Vanilla Neural Networks (Feed-forward Neural Network라고 이해하면 편하다.)

1toMany : image -> sequence of words (이미지 캡션 등등)

Manyto1 : sequence of words -> sentiment

many to many : seq of words -> seq of words(번역이 여기에 해당 할 것이다.)

두번째 : Video classification on frame level

 

이런 예시들을 들 수 있다.

 

 

RNN이란 기본적인 Feed-forward Neural Network를 이어붙인 녀석이다.

이를 수식적으로 적은 것을 보면 입력 벡터와 이전 상태의 값을 함께 넣어 새로운 출력을 만들어 낸다.

(the same function and the same set of parameters are used at every time step.)

 

만약에 어떤 문장을 영어로 번역한다고 생각해보자. 그러면 입력 벡터는 시퀀셜(문장)이고 출력 또한 시퀀셜일 것이다. 이는 many to many로 다음과 같은 네트워크를 짜면 될 것이다.

네모가 많고 복잡해 보인다고 겁먹지 말자.

단순하다. 느낌적으로 이해하자. 여러개를 넣어서 나온 중간 결과들을 계속 다음으로 전달해주는 것이다. output으로 나온 결과물들도 어떤 것들이 나왔었는지 공유하는 것이다. 이로써 이전 정보들을 유지할 수 있고 시퀀셜 데이터를 잘 다룰 수 있다.

 

 

뭐든지 예시를 보면 쉽다.

hello 라는 단어가 학습되어있다고 생각해보자. 이 네트워크에 h를 넣으면 다음 단어로는 e를 뽑으라고 말 할 것이다. 그러면 두 번째 input으로 이전 output인 e를 넣자. 그러면 l을 내보내라 할 것이고 그 후엔 l 그 다음엔 o를 내보내라 할 것이다. 이 때 이전에 어떤 값을 내보냈는지에 대한 정보를 hidden layer의 값 전달을 통해 전달하는 것이다.

 

다만 RNN의 경우 여러 문제점들이 많다. 일단 기본적으로 너무 길어지면 Loss를 전달하기에 너무 길기 때문에 뒤쪽의 값들이 잘 안바뀌는 문제가 있다.

그래서 잘라내는 방식(Truncated Backpropagation) 등의 개선책들도 나왔었다.

자세한 개념은 넘어가도록 하겠다.

 

중요 특징은 다음과 같다.

RNNs allow a lot of flexibility in architecture design

Vanilla RNNs are simple but don’t work very well

 

 

(연구중인 학습이 막바지에 다달았다. 이 글을 다 쓸때 쯤이면 끝날 듯 하다.)

 

RNN은 개념적으로 이해하기 참 좋지만 그렇게 잘 동작하지는 않았다.

그러던 중 1997년 Long Short Term Memory (LSTM)라는 개념이 소개되었다.

간단하지만 강력한 녀석이다.

 

요녀석의 사진은 이걸 봐도 좋다.

언제나 말하고 있지만 이 포스팅은 개념적 이해를 목표로 한다. 어디선가에서 아주 정말 훌륭한 설명을 듣고 이 LSTM에 대해 개념적으로는 거의 완벽하게 이해했다. 그 설명을 한번 끄적여 보고자 한다.

일단 위 그림에서 c 부분과 h 부분이 있다. C는 윗줄 h는 아래줄이다.

 

작은 노란 네모를 왼쪽부터 1번네모~4번네모라고 부르겠다.

입력값 x_t는 일단 먼저 이전 h와 합쳐진 뒤 1번 네모를 통과한다. 그려져 있는 저 로마기호는 시그모이드 함수를 뜻한다. 시그모이드 함수는 0~1 사이의 값을 반환한다. 대부분의 값에 대해 0 또는 1을 반환한다고 생각해도 좋다. 근데 1번 박스를 통과한 화살표가 위에서 c와 만나 곱해진다. 이는 이전 값을 얼마나 기억할지 정하는 단계라고 생각하면 좋다.

 

만약 이 값이 0이라면 이전 값들은 다 없어질 것이다. 이 값이 1이라면 그냥 그대로 일 것이다. 즉, 현재 input과 이전 h를 가지고 c를 잊을지 기억해둘지 또는 얼마나 기억할지 결정하는 것이다.

 

2번 네모와 3번 네모를 보자. 2번 네모는 똑같이 0~1의 값을 내보낸다. 이는 위에서 설명한 것과 같이 어떤 것들은 버리고 어떤 것들은 기억하자는 필터의 역활을 한다. 3번네모는 기억할 것을 만드는 역활을 한다. tanh는 -1~1 사이의 값을 반환하는 함수이다. 이는 어떤 값들을 출력한다고 생각해도 좋을 듯 하다.

이렇게 3번을 통해 기억할 것들을 만들고 2번을 통해 그 중 일부를 거른 뒤 c와 더한다.

이렇게 만들어진 새로운 c는 다시 tanh를 통해 h로 보낼 것을 만들고, 이전 값을 기반으로 4번 네모를 통해 필터링을 하여 다음 h로 보내진다.

즉, 모든 시그모이드 네모들은 기억할지 잊을지 정하는 것이고 tanh는 기억할 것을 만드는 것이라 생각하면 좋다.

 

이런 것들을 여러개 연결한 것이 LSTM이다.

여기서 언급한 잊을지 말지, 그리고 무엇을 기억할지는 일종의 attention 개념으로 봐도 무방하다.

이와 관련해서는 다음 포스팅에서 더 자세히 다루겠다.. (연구 학습이 끝났다...ㅎ)

 

Common to use LSTM or GRU: their additive interactions improve gradient flow

Backward flow of gradients in RNN can explode or vanish. Exploding is controlled with gradient clipping. Vanishing is controlled with additive interactions (LSTM)

Better/simpler architectures are a hot topic of current research 

Better understanding (both theoretical and empirical) is needed.

반응형

'NLP' 카테고리의 다른 글

인공지능에서 Attention 이란? _ seq to seq  (0) 2021.06.11
NLP 벤치마크 GLUE  (0) 2021.06.11
Word Embedding  (0) 2021.05.02
딥러닝에 대한 짧은 정리  (0) 2021.05.01
NLP 정리를 시작하며  (0) 2021.05.01