일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 모수
- jupyter notebook
- 표본공간
- 기본행연산
- 행사다리꼴
- 이산확률질량함수
- Anaconda
- 이산형
- 절삭평균
- 조건부확률
- 사조사
- 누적분포함수
- 피어슨상관계수
- 균일분포
- 통계학입문
- 연속확률변수
- pmf
- 표본평균
- 이변량자료
- 범주형자료
- 확률밀도함수
- 베르누이분포
- 이항분포
- 수치형자료
- 기댓값과 분산
- 첨가행렬
- 통계학개론
- 수학적확률
- 포아송분포
- 모평균
- Today
- Total
summ의 블로그
자연어처리 (3) RNN 본문
https://www.boostcourse.org/ai330/joinLectures/370180?isDesc=false
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 |