summ의 블로그

자연어처리 (3) RNN 본문

자연어처리

자연어처리 (3) RNN

summ._ 2024. 10. 15. 23:00

https://www.boostcourse.org/ai330/joinLectures/370180?isDesc=false

 

자연어 처리의 모든 것

부스트코스 무료 강의

www.boostcourse.org

 

 

RNN(Recurrent Neural Network)


각각의 time step 마다 동일한 A 활성화 함수를 지난 module의 출력이 다음 step 의 입력으로 들어가는 형식

이전의 hidden state와 현재의 입력을 기반으로 다음 hidden state를 계산하여, 시간의 흐름에 따라 정보를 처리함

 

x --> RNN hidden state vector --<-->  y

 

  • hidden state: 메모리 셀이 출력층 방향 또는 다음 시점인 t+1의 자신에게 보내는 값
  • t: 현재의 time step
  • weight: 가중치
  • x_t input vector 
  • f_w rnn function 
  • h_t-1 old hidden state vector
  • y_t output vector 
  • w_xh 입력과 hidden state를 연결하는 가중치

 

최종 output은 h_t 를 바탕으로 한 y_t


hidden state: hp

 

수식

 

 h_t = f_w(h_t-1,x_t)

: 으로 time step을 구함

 

h_t = tanh(w_hh h_t-1+w_xh x_t

: hidden state가 다음 시점이나 출력층으로 전달될 때 적용

y_t = w_hy h_t

: output

 

w_ht->y_t

 

w_xh w_hh 과 x_t h_t-1 행렬곱으로 h_t 

h_t = w_xh x_t + w_hh h_t-1

 

 

입력과 출력의 길이를 다르게 설정 가능함 

  • one to one : 분류 task 
  • one to many : 이미지를 주면 설명글을 생성하는 task 
  • many to one : 감성분석, 스팸 분류 task .. 
  • many to many : 기계번역, 영상 프레임, 품사 태깅 ... 

 

 

Character-level Language Model

언어모델 task: 주어진 문자열이나 단어들의 순서를 바탕으로 다음 단어가 무엇인지를 맞추는 task

word character level 에서 사용 가능

 

ex)

character level - hello  'many to many task 에 해당' 

1. hello 의 사전을 구축 → unique한 character 를 중복 없이 모아 사전 구축 

 

2. 각각의 character는 총 사전의 개수만큼의 dimension을 가지는 one hot vector

h [1,0,0,0]t    e [0,1,0,0] l     [0,0,1,0]t    o [0,0,0,1]t

 

3. hidden state 학습

   첫 번째 time step h로 e 예측 

   두 번째 time step h, e로 l 예측...

 

4. 선형결합 

h_t-1을 선형결합하여 h_t 

t dimension 3으로 지정 

b bias 

fully connected의 기본적인 layer에서 tanh 통과 : h_t 

h_0 default [0,0,0]

 

5. output layer 

각 time step 별로 output layer를 통해 벡터 logit 출력 

Logit = W_hy·h_t+b 

softmax 통과하여 원핫 벡터 형태의 출력 결과값을 가짐. 확률분포 중 제일 큰 값을 가진 게 실제 ground truth와 동일해야.

hello 뿐만이 아니라 character 늘려서 문단에 대해서도 학습 가능

 

 

 

BPTT and Long-Term-Dependency

Backpropagation through time

 

매 time step 마다 주어진 character 가 존재하고

발생된 hidden state vector 를 통해 output layer 를 각자 통과 시킨 후

이로 인한 예측값, 각 time step에서 나와야 하는 다음 character 에 해당하는 ground truth 와 비교를 통해 loss function 으로 학습 

 

W_xh input vector 가 hidden state vector 로 변환될 때 사용 

W_hh 전 time step 의 hidden state vector가 현재 time step 의 변화로 사용

W_hy W_xh W_hh 계산된 h_t가 output vector로 변환될때 사용 

 

전체적으로 Backpropagation 으로 학습됨

 

output 을 계산하고 loss 를 적용한 후 backpropagation 

 

데이터를 처리할 수 있는 한정된 gpu memory가 존재하기에 길이가 길어지면 학습이 잘 되지 않음 

따라서 제한된 길이의 sequence, dimension, space ,,,  지정 

 

이러한 정보들이 hidden state 에 들어가 있어야 함. 

이를 역추적하며 분석

 

Gradient Problem 

 

여러 time step 에 W_hh 를 곱하기 때문에 등비수열과 같음 

→ 너무 작아지거나 폭발적으로 증가하는 형태 

 

gradient 가 time step을 거쳐가며 모델이 잘 학습되지 않음 

 

 

 

Long Short-Term Memory

cell state: 내가 원하는 정보, 완전한 정보를 포함하고 있는 vector. 정보의 흐름을 기억

c_t-1: 이전 time step의 cell state vector 

h_t-1: 이전 time step의 h_t-1. rnn의 hidden state vector

 

h_t = f_w(x_t, h_t-1)

{c_t, h_t} = LSTM(x_t, c_t-1, h_t-1)

 

W 4h*2h x_t h_t-1 선형 변환을 통해 

4h [sigmoid, sigmoid, sigmoid, tanh]t 

     input, forget, output, gate gate 얻음

 

(i, f, o, g)t = (σ, σ , σ ,tanh) w (h_t-1, x_t)t 

 

Input Gate: 새로운 정보가 얼마나 중요한지 결정하는 역할

Output Gate: cell state로부터 얼마나 많은 정보를 hidden state hth_t로 전달할지 결정

 

forget gate

 

c_t-1 적절하게 변환하는 데 사용 

 

f_t = σ(w_h · [h_t-1, x_t]+b_f)

 

이전 time step에서 넘어온 정보 중 forget gate n프로만 보존 

이전 cell state c_t-1 의 정보를 얼마나 보존할 것인지 결정

 

Gate gate

 

c_t tilda = tanh(w_c · [h_t-1, x_t]+bc) 

tanh 로 -1~1 사이의 값으로 변환 

 

c_t = f_t · c_t-1 + i_t · c_t tilda 

 

input gate 곱한 이유: 한 번의 선형 결합 만으로 원하는 정보를 만들기 어렵기 때문

 

o_t = σ(w_0 · [h_t-1, x_t]+b0)

h_t = o_t · tanh(c_t)

→ 값을 비율 별로 작게 만듦

지금 당장 필요한 정보만을 filtering 한 값 

 

input gate와 forget gate는 중요한 정보를 선택적으로 기억하거나 잊게 하여 단순한 RNN이 겪는 장기 의존성 문제를 해결

 

Gated Recurrent Unit 

 

 

Update Gate: LSTM의 input gate와 비슷한 역할을 하며, 현재 상태에서 새로운 정보를 얼마나 받아들일지를 결정

z_t = σ(w_z · [h_t-1, x_t])

Reset Gate: 이전 상태 ht−1h_{t-1}와 얼마나 많이 새로운 정보를 결합할지를 결정하는 역할

→ r_t = σ(w_r · [h_t-1, x_t])

새로운 hidden state: 필요한 정보만 남기고 불필요한 정보는 제거  

h_t tilda = tanh(w · [r_t h_t-1, x_t])

h_t = (1-z_t) · h_t-1+z_t · h_t tilda

 c.f) c_t=f_t · c_t-1+i_t · c_t tilda in LSTM 

 

input gate 가 커질수록 forget gate에 해당하는 값은 점차 작아짐

h_t는 이전 time step의 h_t-1과 현재 만들어진 정보 h_t tilda gate gate 의 값과 동일 

 

LSTM의 c_t, h_t 두 정보를 하나로

내부의 독립된 두 개의 gate를 하나로 계산

 

계산량, 메모리 요구량 LSTM > GRU 

 

w_hh 행렬곱 계산 x

 

→ 전 time step의 cell state vector 에서 서로 다른 값으로 이루어진 forget gate 곱하고 

필요한 정보는 덧셈을 통해 최종으로 원하는 정보를 만들어 냄

 

 

 

 

*** 까먹지 않게 복습 자주 하자 

'자연어처리' 카테고리의 다른 글

자연어처리 (6) transformer  (1) 2024.11.09
자연어처리 (5) 출력값 생성기법  (1) 2024.10.29
자연어처리 (4) seq2seq with attention  (1) 2024.10.24
자연어처리 (2) w2v & glove  (2) 2024.09.30
자연어처리 (1)  (1) 2024.09.30