AIFFEL FD #18 딥러닝 레이어 - Embedding, Recurrent

이재준·2021년 8월 16일
0

AIFFEL Fundamental

목록 보기
19/25
post-custom-banner

✅ 핵심내용

  • 희소표현, 분포가설, 분산표현
  • 레이어 개념 이해
  • 딥러닝 모델 속 각 레이어(Embedding, RNN, LSTM)의 동작 방식 이해
  • 데이터의 특성을 고려한 레이어 설계 및 Tensorflow 로 정의


희소표현, 분포가설, 분산표현

  • 희소표현(Sparse Representation) : 벡터의 특정 차원에 단어 혹은 의미를 직접 매핑 하는 방식
  • 분포가설(distribution hypothesis) : 유사한 맥락에서 나타나는 단어는 그 의미도 비슷 하다는 가정

  • 분산 표현(Distributed Representation) : 유사한 맥락에 나타난 단어들끼리는 두 단어 벡터 사이의 거리를 가깝게 하고, 그렇지 않은 단어들끼리는 멀어지도록 조금씩 조정하여 얻어지는 단어 벡터

분산 표현을 사용하면 희소 표현과는 다르게 단어 간의 유사도 를 계산으로 구할 수 있다는 장점이 있다.


원-핫 인코딩 (One-Hot Encoding)

텍스트를 유의미한 숫자(벡터)로 바꾸는 가장 손쉬운 방법 중 하나인 원-핫 인코딩은 N개의 단어를 각각 N차원의 벡터로 표현하는 방식이다. 즉, 단어가 포함되는 자리엔 1을 넣고 나머지에는 0을 넣는 방법이다.

원-핫 인코딩의 두 단어 벡터의 내적(inner product)은 0으로 직교(orthogonal) 한다. 이는 단어 간 존재하는 유의어, 반의어와 같은 의미를 포함하지 못하고 서로 독립적으로만 존재함을 의미한다.

또한, 차원의 저주(curse of dimensionality) 문제가 발생한다. 원-핫 인코딩을 이용하여 데이터셋을 구성하면 차원수가 일정 수준이 넘어가 고차원의 벡터를 학습하기 어려워져 성능이 떨어진다.

Embedding 레이어

Embedding 레이어는 단어의 분산 표현을 구현하기 위한 레이어이다.

Embedding 레이어는 간단하게 말하면 컴퓨터용 단어 사전이다. Embedding 사이즈를 정해주면 Weight는 자연스럽게 단어의 개수, Embedding 사이즈로 정의된다.


위 그림에서 파란 선에 해당하는 역할은 각 단어를 원-핫 인코딩해서 Linear 연산을 하는 것이 다.

Embedding 레이어를 사용할 때 주의할 점은 아래와 같다.

  • 기본적으로 딥러닝은 미분을 기반으로 동작하는데, Embedding 레이어는 그저 단어를 대응 시켜 줄 뿐이니 미분이 불가능

  • 신경망 설계를 할 때 어떤 연산 결과를 Embedding 레이어에 연결시키는 것은 불가능

  • Embedding 레이어는 입력에 직접 연결되게 사용


Recurrent 레이어 - RNN

한 장의 이미지 데이터와는 달리 문장이나 영상, 음성 등의 데이터는 순차적인(Sequential) 특성 을 가진다.

딥러닝에서 말하는 시퀀스 데이터는 순차적인 특성을 필수로 갖는다. 이러한 시퀀스 데이터를 처리하기 위해 고안된 것이 바로 Recurrent Neural Network 또는 Recurrent 레이어(이하 RNN) 이다.

RNN은 RNN의 입력으로 들어가는 모든 단어만큼 Weight를 만드는 게 아니라, (입력의 차원, 출력의 차원) 에 해당하는 단 하나의 Weight를 순차적으로 업데이트한다.

참고 링크 : Illustrated Guide to Recurrent Neural Networks

RNN의 고질적인 문제는 입력의 앞부분이 뒤로 갈수록 옅어져 손실이 발생하는 기울기 소실(Vanishing Gradient) 문제 이다.

단기 기억과 기울기 소실는 역전파의 특성 때문에 발생한다. 초기 단어의 정보(위 그림에서 진녹색 부분) 는 마지막 시간 단계에서 거의 존재하지 않는다.

RNN 과정을 코드로 표현한 것을 아래의 Github 에 기록하였다.

GitHub Link : FD21_Deep_Layer_Embedding_Recurrent

간단한 예를 코드로 표현하고 아래의 최종 형태를 얻었다.


LSTM (Long Short-Term Memory)

LSTM은 Long Short-Term Memory의 약어로 기울기 소실 문제를 해결하기 위해 고안된 RNN 레이어 이다.

이전 예시의 SimpleRNN 레이어에 대한 부분을 LSTM 으로 바꾸어 진행하였다.

GitHub Link : FD21_Deep_Layer_Embedding_Recurrent

간단한 예를 코드로 표현하고 아래의 최종 형태를 얻었다.

LSTM 레이어를 사용하는 경우, Embedding 벡터의 차원수(unit) 의 크기가 동일 할 때, Weight 의 크기가 위에서 사용했던 SimpleRNN 의 4배나 되는 것을 확인 할 수 있다.

이는 4배 깊은 RNN이라고 표현하기보다, 4종류의 서로 다른 Weight를 가진 RNN 이라고 할 수 있다.
Weight들은 Gate라는 구조에 포함되어 어떤 정보를 기억하고, 어떤 정보를 다음 스텝에 전달할지 등을 결정한다.

LSTM에는 Cell state 라는 새로운 개념이 추가되는데, 긴 문장이 들어와도 이 Cell state 를 통해 오래된 기억 또한 큰 손실 없이 저장할 수 있다.

LSTM은 아래의 3개의 Gate Layer 을 갖는다.

  • Forget Gate Layer : cell state의 기존 정보를 얼마나 잊어버릴지를 결정하는 gate
  • Input Gate Layer : 새롭게 만들어진 cell state를 기존 cell state에 얼마나 반영할지를 결정하는 gate
  • Output Gate Layer : 새롭게 만들어진 cell state를 새로운 hidden state에 얼마나 반영할지를 결정하는 gate

GRU (Gated Recurrent Unit)

GRU (Gated Recurrent Unit) 는 LSTM의 변형 모델로 LSTM의 Forget Gate와 Inpurt Gate를 Update Gate 로 합치고 Cell State와 Hidden State를 합친 구조 를 가지고 있다

GRU는 LSTM과 비슷한 성능을 보이는데, LSTM에 비해 GRU가 학습할 가중치(Weight)가 더 적다는 장점을 가지고 있다.

그러므로 LSTM은 GRU에 비해 Weight가 많기 때문에 충분한 데이터가 있는 상황에 적합하고, 반대로 GRU는 적은 데이터에도 웬만한 학습 성능을 보인다.

tf.keras.layers.GRU() 로 선언해서 사용하는 과정을 아래의 Github 에 기록하였다.

GitHub Link : FD21_Deep_Layer_Embedding_Recurrent

간단한 예를 코드로 표현하고 아래의 최종 형태를 얻었다.

LSTM에 비해 GRU가 학습할 가중치(Weight)가 더 적은 것을 확인 할 수 있다.


양방향(Bidirectional) RNN

양방향(Bidirectional) RNN 은 진행 방향에 변화를 준 RNN 이다.

간단한 예로, 날이 너무 [더워서] 에어컨을 켰다. 라는 문장 속에 [더워서]를 예측 할때, 순방향 RNN 만으로는 에어컨이라는 정보가 없는 채로 예측을 하여 이상한 결과(날이 너무 [추워서] 에어컨을 켰다.)가 나올 수 있다.

이를 해결하기 위해 진행 방향이 순방향인 RNN과 반대인 RNN을 겹쳐놓은 형태를 양방향(Bidirectional) RNN 이라고 한다.

양방향(Bidirectional) RNN은 문장 분석이나 생성보다는 주로 기계번역 같은 테스크에 유리하다. 따라서 번역기를 만들 때 양방향(Bidirectional) RNN 계열의 네트워크, 혹은 동일한 효과를 내는 Transformer 네트워크를 주로 사용한다.

양방향(Bidirectional)RNN 과정을 코드로 표현한 것을 아래의 Github 에 기록하였다.

GitHub Link : FD21_Deep_Layer_Embedding_Recurrent

간단한 예를 코드로 표현하고 아래의 최종 형태를 얻었다.

Bidirectional RNN은 순방향 Weight와 역방향 Weight를 각각 정의하므로 위에서 다룬 RNN의 2배 크기 Weight가 정의된다.


profile
🏫 𝑲𝒚𝒖𝒏𝒈 𝑯𝒆𝒆 𝑼𝒏𝒊𝒗. / 👨‍🎓 𝑪𝒐𝒍𝒍𝒆𝒈𝒆 𝒐𝒇 𝑬𝒏𝒈𝒊𝒏𝒆𝒆𝒓𝒊𝒏𝒈
post-custom-banner

0개의 댓글