[MIT 6.S191] Recurrent Neural Networks, Transformers, and Attention

2023. 9. 27. 16:16

All materials are copyrighted and licensed under MIT license.

© Alexander Amini and Ava Amini
MIT Introduction to Deep Learning
IntroToDeepLearning.com

 

MIT Deep Learning 6.S191

MIT's introductory course on deep learning methods and applications.

introtodeeplearning.com

 

이 강의 자료에 대한 모든 저작권은 MIT 에 있으며, 관련 자료가 필요하신 분은 위 사이트로 들어가면 누구나 자료를 다운받을 수 있으니 참고하길 바란다.

시험기간 제외하고 일주일에 한 강좌씩 보는게 목표였는데 종프랑 여러 과제때문에 시간이 부족해서 이제야 다 보고 정리한다. 이번주가 추석이니 추석 중에 한 강좌를 더 봐야겠다!

https://www.youtube.com/watch?v=ySEx_Bqxvvo&list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI&index=2 

 

Contents

  • Introduction
    - Sequential data
    - Sequence modeling applications
  • Neurons with recurrence
    - Handling Individual Time Steps
    - Neurons with recurrence
  • Recurrent Neuron Networks (RNN)
    - RNN State Update and Output
    - RNN Implementation
    - Sequence Modeling: Design Criteria
  • A Sequence Modeling Problem : Predict the Next World
    - Encoding Language for a Neural Network
    - Model Long-Term Dependencies
  • Backpropagation Through Time (BPTT)
    - BackPropagation in Feed Forward Models
    - RNNs: Backpropagation Through Time
  • Standard RNN Gradient Flow
    - Exploding & Vanishing Gradients 
    - Trick #1. Activation Function
    - Trick #2. Parameter Initialization
    - Trick #3. Gated Cells
    - Long Short Term Memory
  • RNN Applications & Limitations
    - Example task (Applications)
    - Limitations of Recurrent Models
  • Attention Is All You Need
    - Intuition Behind Self-Attention
    - Understanding Attention with Search
    - Learning Self-Attention with Neural Networks
    - Self-Attention Applied

 

Introduction

Sequential data

당신에게 질문을 하나 해보겠다. 공 이미지가 하나 있다. 이 공은 어디로 갈 것인가?

이에 대한 정답을 맞추는 사람이 있을까? 매우 낮은 확률로 맞추는 사람도 있겠지만, 우리는 이걸 맞출 확률이 거의 없다.

하지만, 공이 어디서부터 왔는지 정보가 생기면 어떨까?

과거에 공이 왼쪽에서 부터 평행하게 이동했다고 하면, 높은 확률로 오른쪽 방향으로 갈 것이라고 우리는 예상한다. 물론 아닐 수도 있다. 갑자기 경로를 바꿀 수도 있지만, 과거 정보가 있으면 아무 정보가 없을 때보다 예측이 맞을 확률이 높아진다. 

이 이유는 이 데이터가 Sequential data이기 때문이다. 이런 데이터들은 생활속에 매우 많다.

  • Audio ( voice )
  • Text 
  • Language
  • Medical Signal ( 심전도 같은 정보들 ) 

 

Sequence Modeling Applications

이런 sequence model도 유형이 있다. 

1. One to One (binary classification)
하나의 input이 들어오면 하나의 output이 나온다. -> 이런 경우 순서에 대한 개념이 존재하지 않는다. (지난시간에 다룬 것 생각하면 쉽다. )

 

2. Many to One (Sentiment Classification)
순차적인 input이 들어오고 하나의 output이 도출된다. 문장을 분석해 긍정적인 내용인지 부정적인 내용인지 분류하는 문제가 대표적인 예시이다.

 

3. One to Many (Image Captioning)
Many to One과 반대로 하나의 input 이 들어오면 여러 순서로 된 output이 나온다. 이미지를 입력하고 그에 대한 자막을 다는 것이 이에 해당된다. 

 

4. Many to Many (Machine Translation)
순차적인 input이 들어오고 순차적인 output이 나오는 경우가 many to many이다. 번역기 등이 있다. 

 

결론적으로는 시간의 순서를 지닌 여러 유형의 데이터들이 있다. 이런 유형의 데이터를 다루는 모델이 오늘 강의의 주제이다. 

 

Neurons with Recurrence

Handling Individual Time Steps

이때까지 우리가 배운 기본 모델을 각 time 마다 일어난다고 생각해보자 ( x0 -> x1 -> x2 ... 순서대로 input 된다고 생각 )

위 그림 상황을 보면 각가의 time step 에 해당하는 input이 individual 하다. x0, x1이 서로 연관있는 데이터라고 해도 위 모델을 사용하면 개별적으로 작동한다. 그래서 우리는 각 time의 결과를 다음 step에 넣어주는 방식으로 모델을 확장했다.

 

Neurons with Recurrence

output y는 현재 x에만 영향을 받는 것이 아니라, 과거의 상태를 담고 있는 h에도 영향을 받는다. 지금 위쪽 사진은 각 time step마다 풀어썼지만, 실제로는 h는 자기 자신에게 다시 돌아가는 형태로 구현이 된다. 

이 형태가 RNN의 기본 형태이다. 

 

Recurrent Neural Networks(RNNs)

RNN State Update and Output

sequence를 실행할 때 모든 time step에 대해 recurrence relation을 적용한다. 이때, 우리는 모든 step에서 같은 파라미터와 같은 함수를 사용한다는 것을 잊지 말자 ( 때로 펼쳐진 모델을 보고 헷갈리는 사람들이 있다. 주의! )

우리는 train으로 weight 를 찾아야한다. RNN에서는 h가 생기면서 weight가 x-> h, h-> h, h->y , 총 3가지 단계에서 발생한다. 우리는 이 weight를 구분하기 위해 아래 첨자로 적어두겠다. ( W_xh == x -> h로 갈 때의 weight )

핵심은 ht를 구할 때 지난 상태 (ht-1)을 사용한다는 것이다. 

이제 이 가중치들을 학습시켜야한다. 각 time step 마다 개별의 Loss 값을 구할 수 있고 전체적인 Loss도 구할 수 있다. 

 

RNN Implementation

# 직접 만드는 법
class MyRNNCell(tf.keras.layers.Layer):
	def __init__(self, rnn_units, input_dim, output_dim):
    	super(MyRNNCell, self).__init__()
        
        self.W_xh = self.add_weight([rnn_units, input_dim])
        self.W_hh = self.add_weight([rnn_units, rnn_units])
        self.W_hy = self.add_weight([output_dim, rnn_units])
        
        self.h = tf.zeros([rnn_units, 1])
        
    def call(self, x):
    	self.h = tf.math.tanh(self.W_hh * self.h + self.W_xh * h)
        output = self.W_hy + self.h
        
        return outpu, self.h
        

# keras
tf.keras.layers.SimpleRNN(rnn_units)
my_rnn = RNN() # RNN 모델 불러오고, 파라미터 설정해야함. 
hidden_state = [0,0,0,0]

sentence = ["I", "love", "recurrnet", "neural"]

for word in sentence:
	prediction, hidden_state = my_rnn(word, hidden_state)
    
next_word_prediction = prediction

 

Sequence Modeling: Design Criteria

1. Handle variable-length sequence
2. Track long-tem dependencies
3. Maintain information about order
4. Share parameters across the sequence

 

A Sequence Modeling Problem : Predict the Next World

Encoding Language for a Neural Network

마지막에 오는 단어 walk를 예측하는 모델을 만들어보자. 

그럼 단어를 model에 넣어야한다. 하지만, RNN등 모델은 단순히 숫자를 입력받고 연산을 한 뒤 출력하는 방식으로 작동한다. 단어를 어떻게 숫자로 바꿀것인가? => 단어 임베딩을 사용하자. 

 

단어 임베딩은 단어를 벡터(숫자)로 바꾸는 기술이다. 

1. Vocabulary : corpus of words
2. Indexing : Word to index 
3. Embedding : Index to fixed-sized vector

임베딩은 두 가지 방법이 있다. 

  • one-hot embedding
    단순히 그 단어가 몇번째 index인지 표시한다. (단어의 의미를 전혀 고려하지 않는다.) 
  • learned embedding
    비슷한 단어끼리 포착한다. -> 유사한 뜻을 지닌 단어끼리 mapping이 된다.

 

Model Long-Term Dependencies

문장과 같은 과거 step이 있는 단어들은 각 step과의 종속성이 있을 수 있다. 문장도 똑같다. 문장 전반에 걸쳐 단어의 종속성이 생길 수 있다. 

 

Backpropagation Through Time (BPTT)

BackPropagation in Feed Forward Models

 

RNNs: Backpropagation Through Time

이제 본격적으로 w를 업데이트 하는 방법을 알아보자. 기본 개념은 같다. 

가중치를 업데이트 하기 위해서는 각 time step에서 나온 y가 실제 값과 얼마나 다른지에 대한 각각의 loss가 나올 것이다. 이 개별 loss들을 종합해 결국 하나의 큰 L이 나올 것이다. 전체 Loss값을  통해 gradient를 뒤에서부터 업데이트 한다. 

 

위의 빨간 과정이 RNN에서의 backpropagation이다. 뒤에서부터 업데이트 된다. 

 

Standard RNN Gradient Flow 

Exploding & Vanishing Gradients

gradient를 계산하는 과정에서는 두 가지 측면의 문제점이 생길 수 있다. 첫번째는 gradient가 너무 폭발적으로 증가하는 것, 두번 째는 gradient가 너무 작아지는 것이다. 

1. Exploding Gradients
1보다 큰 값을 여러 번 곱할 때, Gradient가 폭발적으로 증가할 수 있다. ( 예를 들어 2를 10번만 곱해도 벌써 1024이다. )
이 문제는 gradient clipping으로 해결할 수 있다. 

2. Vanishing Gradients
1보다 작은 값을 여러 번 곱할 때, gradient가 너무 작아질 수 있다. ( 0.1을 3번만 곱해도 벌써 0.0001이다. )

RNN에서는 Vanishing gradient의 문제가 빈번하게 발생할 수 있다. 왜냐하면, Long-Term 의 경우 time step 이 많아져서 활성함수가 여러번 사용되고 gradient가 감소하는 문제가 발생한다. 

Trick #1. Activation Function

 

f'의 값으로 인해 가라앉는 것을 막기 위해 ReLU function을 사용한다. 

 

Trick #2. Parameter Initialization

Initial weight를 identity matrix로 초기화한다. ( 1로 초기화한다 )

사소해 보일지라도 0으로 가는 것을 약간이라도 해소해준다고 한다. 

 

Trick #3. Gated Cells

가장 핵심적인 방법으로 Gate를 사용하는 것이다. 

Gate로 중요한 정보와 중요하지 않은 정보를 분리하여 장기 의존성을 향상시킨다. 이 개념을 적용해 만든 모델이 LSTM이다. 

Long Short Term Memory

주요 개념은 아래와 같다. 

1. Maintain a cell state

2. Use gates to control the flow of information from current input
- Forget gate gets rid of irrelevant information
- Store relevant information from current input
- selectively update cell state
- output gate returns a filtered version of the cell state

3. Backpropagation through time with partially uninterrupted gradient flow

 

RNN Applications & Limitations

Example task (Applications)

1. Music Generation

 

2. Sentiment Classification

 

Limitations of Recurrent Models

RNN의 문제는 여러가지들이 있다. 

  • Encoding bottleneck
  • Slow, no parallelization
  • Not long memory

특히 병렬화가 되지 않는 점은 단어가 점점 길어지면 더 느려지기 때문에 큰 문제가 된다. 

 

병렬화가 되기 위해서는 모든 input이 동시에 들어가야한다. 

위의 그림처럼 모든 input이 동시에 들어가게 하고, long memery도 가능하게 하는 방법을 찾아야한다. 하지만, 단순히 한꺼번에 넣으면, long memory도 안되고, scalable하지도 않는다. 

 

Attention Is All You Need

Intuition Behind Self-Attention

아이언맨 사진을 사람이 본다고 가정하자. 

위 화살표 모양처럼 사진을 보는 방법이 있다. 하지만, 대부분의 사람들은 차례대로 이미지를 읽는 것이 아닌 주요한 객체를 중심으로 살펴볼 것이다.

이것이 인공지능을 만드는 핵심이다. 이때까지 우리의 모델은 모든 부분을 중심으로 보려고 했기 때문에 느려지는 문제점이 발생했다. 우리는  중요한 객체에 '집중' 해야한다. 

 

Understanding Attention with Search

검색 상황에서의 attention을 살펴보자. 

Query에 deep learning을 검색했을 때 여러 동영상이 나왔다고 가정하자. 

첫번째 영상(K1)은 바다거북이 나왔다. 이것은 Q와 다르기 때문에 제외를 시켜야한다. 두번째 영상(K2)는 deep learning 강의가 나왔다. 이는 Q와 관련이 있다. 결국 각 영상의 title 등 내용에서 어떤 것이 중요한지를 분석해서 Q와 매칭해서 올바른 결과로 이끌어야한다는 것을 알 수 있다. 

 

말이 길어졌다. 위 내용을 요약하자면 우리가 모델을 통해 구현해야하는 것은 아래와 같다. 

Identify and attend to most important features in input

 

Learning Self-Attention with Neural Networks

우리는 입력에서 가장 중요한 특징을 추출하여 확인하면 된다. 이 것을 실현시키는 방법에 대해 알아보자. 

1. Encode position information  

우리는 input을 동시에 넣어야한다. 하지만, 동시에 넣다보니 시간 정보가 사라지기 때문에, position 정보를 encode해서 단어의 순서를 알려준다. 

 

2. Extract query, key, value for search

우리가 찾고자 하는 Q와 검색결과 K, 실제 원하는 결과 V가 있다고 하자. 각각의 positional embedding을 linear layer를 곱해서 output을 생성한다. 우리는 이렇게 생성된 결과인 Q와 K가 얼마나 유사한지를 알아볼 것이다.  

3. Compute attention weighting

Q와 K는 결국 벡터이다. 수학적으로 두 벡터가 얼마나 유사한지를 알아보기 위해서는 dot product를 진행하면 된다. 

이 결과를 모든 조합에 대해 진행하면 얼마나 두 단어간 상관성이 있는지 알 수 있다. 

이를 통해 우리는 어디에 집중해야하는지를 알 수 있다. 

 

4. Extract features with high attention

 위에서 구한 attention weighting에 value를 최종적으로 넣어서 실제 중요한 feature을 출력할 수 있다. 

 

위 과정을 하나의 도표로 나타내면 아래와 같이 된다. 

 

Self-Attention Applied

 

Summary

1. RNNs are well suited for sequence modeling tasks

2. Model sequences via a recurrence relation

3. Training RNNs with backpropagation through time

4. Models for music generation, classification, machine translation, and more

5. Self-attention to model sequences without recurrence

 

 

BELATED ARTICLES

more