FUNDAMENTAL 27. 딥러닝 레이어의 이해(2) Embedding, Recurrent
1. 분포가설과 분산표현
- 희소 표현(Sparse Representation) : 벡터의 특정 차원에 단어 혹은 의미를 직접 매핑하는 방식
- 분포 가설(distribution hypothesis) : 모든 단어를 고정차원의 벡터로 표현한다. 어떤 차원이 특정한 의미를 가진다고 가정하지 않는다. 단지 유사한 맥락에서 나타나는 단어는 그 의미도 비슷하다라는 가정을 한다.
- 분산 표현(distributed Representation) : 유사한 맥락에 나타난 단어들끼리는 두 단어 벡터 사이의 거리를 가깝게 하고, 그렇지 않은 단어들끼리는 멀어지도록 조금씩 조정하여 얻어지는 단어 벡터
- 다음에 배울 Embedding 레이어는 단어의 분산 표현을 구현하기 위한 레이어이다. 간단하게 컴퓨터용 단어 사전인 것이다.
2. 단어를 부탁해! Embedding 레이어
- Embedding레이어는 간단히 컴퓨터용 단어 사전이다.
- 우리가 단어 n개를 쓸거라고 전달하면 컴퓨터는 알아서 사전을 만들고, 수많은 데이터를 거치며 각 단어의 의미(분산 표현)를 차근차근 업데이트한다.
- 그리고 우리는 Embedding 사이즈를 정해주면서 단어를 더 깊게 표현해달라고 말할 수 있다. 그럼 Weight는 자연스럽게 (단어의 개수, Embedding 사이즈)로 정의된다.
- Embedding 레이어는 입력으로 들어온 단어를 분산 표현으로 연결해 주는 역할을 하는데, 그것이 Weight에서 특정 행을 읽어오는 것과 같아서 이 레이러를 룩업 테이블(Lookup Table)이라 부르기도 한다.
- 단어가 룩업 테이블에 매핑되는 부분의 원리를 이해하기 위해 원-핫 인코딩(One-hot Encoding)을 알아야 한다.
- Embedding 레이어는 아주 쉽지만 주의사항이 하나가 있다.
1) 기본적으로 딥러닝은 미분을 기반으로 동작하는데, Embedding 레이어는 그저 단어를 대응 시켜 줄 뿐이니 미분이 불가능하다.
2) 그래서 신경망 설계를 할 때, 어떤 연산 결과를 Embedding 레이어에 연결시키는 것은 불가능하다.
3) 임베딩 레이어는 입력에 직접 연결되게 사용해야한다는 것만 꼭 기억하자. 그리고 입력은 원-핫 인코딩된 단어 벡터의 형태가 가장 이상적이다.
- 다음 단계에서는 문장 데이터에 특화된 레이어를 배울 것이다.
3. RNN
- 문장이나 영상, 음성 등의 데이터는 이미지 데이터와 다르게 순차적인(Sequential) 특성이 있다.
- 데이터의 나열 사이에 연관성이 없다고 순차적인 데이터가 아니라고 할 수 없다. 하지만 인공지능이 예측을 하기 위해선 요소 간의 연관성이 있어야만 한다.
- 따라서 딥러닝에서 말하는 시퀀스 데이터는 순차적인 특성을 필수로 갖는다.
- 순차 데이터를 처리하기 위해 고안된 것이 Recurrent Neural Network 또는 Recurrent 레이어이다. (RNN)
- RNN의 입력으로 들어가는 모든 단어만큼 Weight를 만드는게 아님에 유의해야 한다.
- (입력의 차원, 출력의 차원)에 해당하는 단 하나의 Weight를 순차적으로 업데이트 하는 것이 RNN이다. 그러다 보니 한 문장일 읽고 처리하는데 여러 번의 연산이 필요해서 다른 레이어에 비해 느리다는 단점이 있다.
- 그리고 첫 입력이 마지막 입력에 다다라서는 거의 희석되는 현상을 보이는데, 이것이 RNN의 고질적인 문제이다. 이를 기울기 소실(Vanishing Gradient)문제 라고 한다.
4. LSTM
- LSTM은 Long Short-Term Memory의 약어로 기울기 소실 문제를 해결하기 위해 고안된 RNN 레이어이다.
- 기본적으로 바닐라(Simple) RNN보다 4배나 큰 Weight를 가지고 있다. 이는 4배 깊은 RNN이라기보다 4종류의 서로 다른 Weight를 가진 RNN이라고 이해하는 것이 좋다.
- 각 Weight들은 Gate라는 구조에 포함되어 어떤 정보를 기억하고, 어떤 정보를 다음 스텝에 전달할지 등을 결정한다.
- LSTM은 3개의 Gate Layer를 갖는다.
1) Forget Gate Layer : cell state의 기존 정보를 얼마나 잊어버릴지 결정한다.
2) Input Gate Layer : 새롭게 만들어진 cell state를 기존 cell state에 얼마나 반영할지를 결정한다.
3) Output Gate Layer : 새롭게 만들어진 cell state를 새로운 hidden state에 얼마나 반영할지를 결정한다.
- 2000년에 소개된 LSTM의 변형 모델에 소개된 엿보기 구멍(Peephole eonnection)이란 것이 있다.
1) 기존 LSTM은 Gate들이 input과 hidden state만을 참조하여 값을 결정했다. 그에 반해, 엿보기 구멍이란 Gate layer들이 cell state를 쳐다보게 만드는 것이다.
- 2014년에 소개된 GRU라는 모델도 있다.
1) LSTM의 Forget Gate와 Input Gate를 Update Gate로 합쳤다. 그리고 Cell State와 Hidden State를 합쳤다. 그리고 LSTM에 비해 학습할 가중치(Weight)가 더 적다. (LSTM의 1/4)
- LSTM과 GRU 둘 다 각각의 장단점을 가지고 있기에 뭐가 더 좋다라고 말할 수 없다.
- LSTM은 GRU에 비해 Weight가 많기 때문에 충분한 데이터가 있는 상황에 적합할 것이고, GRU는 적은 데이터에서도 웬만한 학습 성능을 보일 것이다.
- 이것저것 사용해보면서 프로젝트에 적합한 레이어를 찾아야한다.
- 마지막으로 양방향(Bidirectional) RNN을 살펴본다.
1) 진행 방향에 변화를 준 RNN 이다.
2) 지금까지 배운 RNN은 모두 순방향이였는데, "날이 너무 [] 에어컨을 켰다"라는 문장에서 [] 안에 "더워서"가 들어가면 다행이지만 "추워서"라고 하면 안되기에 순방향 학습만으로는 부족하다.
3) 이를 해결하기 위해 제안된 것이 양방향(Bidirectional) RNN이다. 말만 어렵지 그저 진행 방향이 반대인 RNN을 2개 겹쳐놓은 형태라고 한다.
4) 원리만큼 간단하게 Tensorflow에서도 LSTM 등 모든 RNN 계열 레이어에 쉽게 적용시킬 수 있다. 단지 사용하고자 하는 레이어를 layers의 Bidirectional이라는 함수로 감싸주기만 하면 된다.
5) 양방향 RNN이 필요한 상황은 보통 문장 분석이나 생성보다는 기계변역 같은 테스크에 유리할 것이다.
6) 양방향 RNN은 순방향 Weight와 역방향 Weight를 각각 정의하므로 우리가 사용한 RNN의 2배 크기 Weight가 정의된다.
5. 마무리
- 총 2편에 걸쳐서 딥러닝 전반으로 사용하는 레이어를 봤다.
- 노드에서는 머리가 아플 수 있겠지만이라 하지만 배우는 입장에서는 매우 아프다.
- 그러나 한 번 직관을 얻어두면 앞으로 유용할 것이다. 신경망은 결국 레이어들의 결합으로 이뤄지니 하나하나 파고들면 이제는 모르는 부분이 없을 거라 한다. 그러니 지레 겁먹지 말자.
- 개념을 이해하는 것과 활용하는 것은 차이가 있다. 막연하다는 느낌이 있지만 차근차근 나가다보면 실력이 늘어있는 자신을 발견할 것이다.
- 레고 블럭 다루듯이 딥러닝 모델을 다루는 그 날까지 꾸준히 공부하자.