오늘의 인기 글
최근 글
최근 댓글
Today
Total
11-23 00:00
관리 메뉴

우노

[DL] RNN, LSTM, GRU 란? 본문

AI/Deep Learning

[DL] RNN, LSTM, GRU 란?

운호(Noah) 2021. 2. 16. 15:35

Naive Neural Network

  • "Yesterday, Harry Potter met Hermione Granger"라는 문장을 입력 받았을 때,
  • 문장의 각 단어가 사람 이름이라면 1, 아니라면 0을 매핑하는 Naive한 개체명 인식 신경망을 만든다고 가정해보자.
  • 입력 문장의 각 단어는 Voca(단어사전)의 index를 통해 사전 개수 만큼의 차원을 가지는 one-hot vector로 매핑될 것이며,
  • 단어는 총 9개이므로, 9개의 one-hot vector가 구성될 것이다.
  • 따라서, 해당 단어가 사람 이름이라면, 해당 one-hot vector의 y값은 0으로 매핑
  • 해당 단어가 사람 이름이 아니라면, 해당 one-hot vector의 y값은 1로 매핑되며 학습이 진행될 것이다.
  • 하지만 이러한 방법은 잘 동작하지 않는다.
  • 위처럼 개체명 인식 문제가 아닌, 기계 번역과 같은 경우에는, 입력과 출력 시퀀스의 길이가 동일하지 않을수 있기 때문이다.
  • 또한, 위와 같은 방법은 서로 다른 위치에서 학습된 단어의 특성이 공유되지 않는다.
  • 이를 해결하기 위해, RNN(Recurrent Neural Network)이 존재한다.

RNN (Recurrent Neural Network)

  • RNN의 기본 구조는 아래 그림과 같다.

  • 좌에서 우로 문장을 읽는다면, 처음 읽는 단어 x<1>를 신경망의 입력으로 사용한다.

  • 그리고 내부 신경망(hidden layer, output layer)를 통해, 해당 단어가 사람의 이름인지 y^<1>을 예측한다.

  • 그리고 두번째 단어 x<2>를 읽고, y^<2>를 예측한다.

  • 이 때, y^<2> 예측 시 x<2>만 사용하는 것이 아니라, 첫번째 단어로 연산한 정보의 일부를 사용하게 된다.

  • 구체적으로는 첫번째 시점의 activation 값이 두번째 시점에 전달되게 된다.

  • 이처럼 RNN을 통한 개체명 인식은, 이전 단계의 연산결과와 매개변수들이 공유되며 마지막 단계까지 진행되게 된다.

  • RNN 학습을 시작하기 전에 a<0>이 사용되는 것을 볼 수 있는데,

  • 이것은 보통 무작위로 초기화하거나, 0으로 초기화한다. (0으로 초기화하는 경우가 가장 일반적이다.)

  • Basic RNN의 단점

    • Basic RNN 모델의 단점은, 앞서 나온 단어들의 정보만을 사용해서 예측을 한다는 것이다.
    • 예를 들어, 아래와 같은 문장이 주어지고, y^<3> 예측을 한다고 가정한다면 Basic RNN 모델은 x<4>, x<5>, x<6>의 정보를 사용하지 않는다.
      • He said, "Teddy Roosevelt was a great President."
      • He said, "Teddy bears are on sale."
    • 단지 x<1>, x<2>의 정보만을 사용해 예측하기 때문에, y^<3>인 Teddy가 사람인지 아닌지 구분하기 어려워진다.

RNN의 Forward Propagation

  • RNN의 순전파를 알아보자

  • 초기에 사용되는 a<0>는 일반적으로 0 vector로 초기화된다.

  • 다음으로 a<1>을 구하기 위해선 [ Waa<0> + Wax<1> + ba ] 에 activation function을 적용해 구한다.

    • activation function으로는 tanh나 ReLU가 사용된다.
  • 다음으로 첫번째 단어의 예측 y^<1>은 다음과 같이 구할 수 있다.

    • activation function으로는 sigmoid나 softmax가 사용된다.
  • 따라서 일반화하면 다음과 같다.

  • 그리고, 위 식에서 a는 아래와 같이 단순화시킬 수 있다.

    • Wa는 [Waa⋮Wax]를 의미하는데,
    • 만약 a가 (100, 1) vector이고, x가 (10,000, 1) vector라면
    • Waa는 (100, 100) matrix, Wax는 (100, 10000) matrix을 갖게 되고,
    • 두 가중치 matrix를 연결하면 Wa는 (100, 10100) matrix가 된다.
    • 따라서, Wa와 연산되는 [ a<t−1>, x ]는 (10100, 1) 벡터가 된다.
  • 또한, y^는 아래와 같이 단순화시킬 수 있다.

RNN의 Back Propagation

  • RNN의 Back Propagation이 어떻게 동작하는지 알아보자.

  • Back Propagation은 아래 그림과 같이 Forward Propagation의 반대로 진행된다.

  • 따라서, 우선 아래 그림의 초록선과 같이 순전파 과정에서 Wa, ba를 통해 a를 구하고, Wy, by를 통해 예측값 y^를 구한 뒤

  • Back Propagation 계산을 위해, 실제값과 예측값의 Loss를 계산하고, 총 Loss 값을 구한다.

  • Loss function으로는 Cross Entropy Loss(Logistic Regression Loss)를 사용할 수 있는데,

  • 각 element의 Loss와 총 Loss는 다음과 같다.

  • 순전파와 Loss 계산이 끝났으면, 아래 그림의 빨간선과 같이 Back Propagation을 진행하며 매개변수들을 업데이트 한다.

Language model using RNN

  • RNN을 통해 Language model을 만드는 방법에 대해서 알아보자.

  • Language model이란 무엇일까?

    • 우리가 Speech recognition(음성 인식) 시스템을 만들고 있으며,

    • 아래 그림과 같이, 두 개의 문장을 듣고, 더 말이 되는(가능성이 높은) 문장을 골라내야한다고 가정해보자.

    • 첫 번째 문장의 확률이 3.2 x 10^-13, 두 번째 문장의 확률이 5.7 x 10^-10이라면

    • 음성 인식 시스템은, 말이 되는 문장으로 두 번째 문장을 선택하게 된다.

    • 이렇게, 문장이 주어졌을 때 각 문장의 확률을 구하는 모델이 Language model이다.

Vanishing gradients with RNN

  • 두 문장이 주어졌다고 가정해보자.
    • 'The cat, which already ate ...., was full'
    • 'The cats, which already ate ...., were full'
  • 위 문장에서, 문장 초반부의 cat/cats에 따라 문장 후반부의 was/were 가 달라지는 것을 알 수 있다.
  • 이는, 문장 초반부의 단어가 문장 후반부에 영향을 끼친다는 것을 의미한다.
  • 하지만, RNN은 이와 같은 장기적인 의존성을 확인하는데 효과적이지 않다.
  • Basic RNN 모델은 Vanishing gradient 문제가 발생할 수 있기 때문이다.
    • RNN은 기본적으로 많은 토큰들을 다루기 때문에, 깊은 신경망으로 이루어져있으며, Back Propagation을 사용해 가중치를 업데이트한다.
    • 이 때, 문장 초반부의 단어가 결과에 미치는 영향은, 문장 후반부의 단어가 결과에 미치는 영향으로부터 계산되는데,
    • 신경망이 깊어질수록 Vanishing gradient로 인해, 문장 초반부의 단어가 결과에 미치는 영향이 적어진다.
    • 따라서, RNN은 가까운 곳에 있는 입력에 영향을 더 많이 받을 수 밖에 없다.
    • 이것이 Basic RNN 알고리즘의 약점이다.
  • 이를 해결하기 위해, LSTM (Long Short Term Memory)가 제안됐다.

LSTM (Long Short Term Memory)

  • LSTM은 Basic RNN의 장기 의존성(Long-Term Dependency) 문제를 해결하기 위해 제안됐다.

  • Basic RNN의 구조는 아래 그림과 같다.

    • Basic RNN은 단순한 neural network 모듈을 반복시키는 체인과 같은 구조를 가지고 있다.
    • 표준 RNN 모듈은 tanh layer 한 층을 가지고 있다.
  • LSTM의 구조는 아래 그림과 같다.

    • LSTM도 Basic RNN과 같이 체인과 같은 구조를 가지고 있지만,
    • 각 반복 모듈은 다른 구조를 가지고 있다.
    • 단순한 1개의 layer 대신에, 4개의 layer가 특별한 방식으로 서로의 정보를 주고 받도록 돼있다.
  • 모듈 요소

    • 노란색 박스는 학습된 neural network layer를 나타낸다.
    • 분홍색 동그라미는 vector 합과 같은 pointwise operation을 나타낸다.
    • 각 선은 한 노드의 output을 다른 노드의 input으로, vector 전체를 보내는 흐름을 나타낸다.
    • 합쳐지는 선은 concatenation을 의미하고,
    • 갈라지는 선은 정보를 복사해서 다른 쪽으로 보내는 fork를 의미한다.

LSTM 구조

  • Cell State

    • LSTM의 핵심은 Cell State인데, 모듈 그림에서 수평으로 그어진 윗 선에 해당한다.
    • 메모리와 같은 존재이며, 컨베이어 벨트와 같아서 State가 꽤 오래 경과하더라도 Gradient가 잘 전파된다.
    • 또한, Cell State는 Gate라고 불리는 구조에 의해 정보가 추가되거나 제거되며
    • Gate는 training을 통해 어떤 정보를 유지하고 어떤 정보를 버릴지 학습한다.
  • Gates

    • LSTM은 3개의 Gate를 가지고 있고, 이 gate들은 cell state를 보호하고 제어한다.
      • forget gate (f) : 과거 정보를 잊기 위한 게이트
      • input gate (i) : 현재 정보를 기억하기 위한 게이트
      • output gate (o) : 최종 결과를 내보내기 위한 게이트
  • Sigmoid

    • 모든 Gate는 시그모이드 함수를 사용하고, 시그모이드 함수의 출력 범위는 0~1이다.
    • 따라서, 그 값이 0이라면 "아무 것도 넘기지 말라"가 되고, 값이 1이라면 "모든 것을 넘겨드려라"가 된다.
  • Forget Gate

    • 과거 정보를 얼마나 잊을지에 대한 단계이며, "forget gate"라고 불린다.
    • 이 단계에서는, h(t−1)와 x(t)를 받아서, sigmoid layer를 통해 0과 1 사이의 값을 C(t−1)에 보내준다.
    • 그 값이 1이면 "이전 상태의 모든 정보를 보존해라"가 되고, 0이면 "이전 상태의 모든 정보를 버려라"가 된다.
  • Input Gate

    • 현재 정보를 얼마나 기억할 것인지에 대한 단계이며, "input gate"라고 불린다.
    • 이 단계에서는, h(t−1)와 x(t)를 받아서, sigmoid layer를 통해 i(t)를 구한 뒤
    • tanh layer를 통해 새로운 후보 값들인 ~C(t)라는 vector를 만들고,
    • i(t)와 ~C(t)의 정보를 합쳐, cell state를 업데이트할 재료를 만들게 된다.
  • State Update

    • 이전 cell state인 C(t−1)를 업데이트해서 새로운 cell state인 C(t)를 만드는 단계이다.
    • 이전 cell state를 얼마나 잊을건지(forget gate) 곱셈
    • 현재 cell state를 얼마나 반영할건지(inpute gate) 덧셈
    • 최종 결과를 다음 상태의 cell state로 내보낸다.
  • Output Gate

    • 다음 State로 내보낼 output(hidden state)을 구하는 단계이다.
    • cell state에 tanh를 취한 뒤
    • h(t−1)와 x(t)를 받아 sigmoid layer를 통해 O(t)를 계산한 후
    • O(t)와 tanh 결과를 곱해 output(hidden state)을 내보낸다.

GRU (Gated Recurrent Unit)

  • GRU는 LSTM과 비슷한 이유로 만들어졌는데, LSTM을 구성하는 Time-Step의 Cell을 조금 더 간소화한 버전이다.

  • GRU는 LSTM보다 학습 속도가 빠르다고 알려져있지만, 여러 평가에서 GRU는 LSTM과 비슷한 성능을 보인다고 알려져 있다.

  • 데이터 양이 적을 때는, 매개 변수의 양이 적은 GRU가 조금 더 낫고,

  • 데이터 양이 더 많으면 LSTM이 더 낫다고 알려져 있다.

  • LSTM 구조

  • GRU 구조

  • 차이점

    • GRU는 LSTM과 다르게 Gate가 2개이며, Reset Gate(r)과 Update Gate(z)로 이루어져있다.
      • Reset Gate는 이전 상태를 얼마나 반영할지
      • Update Gate는 이전 상태와 현재 상태를 얼마만큼의 비율로 반영할지
    • 또한, LSTM에서의 Cell State와 Hidden State가 Hidden State로 통합되었고
    • Update Gate가 LSTM에서의 forget gate, input gate를 제어한다.
    • GRU에는 Output Gate가 없다.
  • Reset Gate

    • 이전 상태의 hidden state와 현재 상태의 x를 받아 sigmoid 처리
    • 이전 hidden state의 값을 얼마나 활용할 것인지에 대한 정보
  • Update Gate

    • 이전 상태의 hidden state와 현재 상태의 x를 받아 sigmoid 처리
    • LSTM의 forget gate, input gate와 비슷한 역할을 하며,
    • 이전 정보와 현재 정보를 각각 얼마나 반영할 것인지에 대한 비율을 구하는 것이 핵심이다.
      • 즉, update gate의 계산 한 번으로 LSTM의 forget gate + input gate의 역할을 대신할 수 있다.
    • 따라서, 최종 결과는 다음 상태의 hidden state로 보내지게 된다.
Comments