목차
순환 신경망(Recurrent Neural Network)


순환 신경망은 시계열 데이터에서 많이 사용
시계열 데이터: 순차적인 시간의 흐름에 따라 기록된 데이터 (ex: 신호, 주가)
RNN은 이전 정보를 가지고 있다가 다음 입력값이 들어오면 반영함

줄지어져 있는 것을 시퀀스라고 함 시퀀스의 길이는 자유롭게 조절 가능
one to many: 데이터 하나가 들어오면 여러 개의 출력값을 뽑아냄
x → h₁ → ŷ₁
h₁이 다음 시점의 계산에 전달되어 h₂ 계산에 사용
many to one: 여러 입력을 통해 하나의 출력 생성

many to many: 여러 입력 시퀀스를 받아서 여러 출력 시퀀스를 생성
입력과 출력이 동시에 진형되는 형태, 모든 입력 처리 후 출력 시퀀스가 나오는 형태

히든스테이트를 여러개 쌓을 수 있음

h: 현재 시점의 히든스테이트는 이전에 있던 히든스테이트의 정보와 지금 현재의 정보를 받아서 계산
이전 시점의 기억과 현재 입력 정보를 압축해서 담은 벡터
o: h(t)를 선형 인공신경망을 거쳐 나온 결과, 각 클래스에 대한 점수,값이 클수록 해당 클래스가 정답일 가능성 높음
h(t)는 rnn 내부에서만 사용하기 좋은 형태로 되어있음 이걸 클래스 차원으로 변환하기 위해 선형 변환을 함
c는 출력층 편향, v는 가중치
y: 인공신경망을 거친 값에 소프트맥스 함수를 씌워서 최종 결과값, 각 클래스에 대한 확률 분포가 나옴

h(t-1)과 x(t)가 만나 합쳐 a(t)를 만듦
a(t)를 활성화 함수 tanh라는 활성화 함수에 넣어 h(t) 만듦
h(t)는 선형 변환과 softmax 함수를 거쳐 ŷ(t)(현재 시점의 예측값) 생성
다음 시점으로 넘어가 h(t+1)에 계산에 사용

w, u,b는 가중치 매트릭스
w는 NxN h(t-1)은 Nx1로 곱하면 Nx1
(RNN은 모든 시점의 h(t) 차원이 동일, 고정된 하나의 은닉층을 사용하기 때문 따라서 h(t)가 Nx1이면 H(t-1)도 Nx1이다.)
u는 NxM x(t)는 Mx1로 곱하면 Nx1
계산된 a(t)를 tanh를 통해 h(t) 계산
인공신경망 하나를 거쳐서 Output, o(t)를 만들어주고
이 아웃풋을 소프트맥스를 거쳐서 실제 출력값 나오게 함
순환 신경망 형태

tanh나 sigmoid 함수는 양끝이 거의 0으로 가는 형태의 미분이 나옴
값이 조금만 커지거나 작아지더라도 미분 값이 거의 0이 나옴
역전파에서 미분값들이 연속적으로 곱해지면 기울기 사라짐 발생

장기 의존성 문제 발생
rnn은 앞쪽에 있는 정보들이 뒤쪽까지 충분히 전달되지 않음

LSTM은 h값만 받는게 아니라 추가적인 게이트 만들어 문제 해결 (이전 정보 현재 정보 얼마나 기억할지 잊을지)
-> s라는 값을 만듦, 이전에 받은 값과 현재값의 가중치를 계산,
f(t)는 forget gate얼마나 잊을 지
i(t)는 input gate 새 정보를 얼마나 넣을지 결정
s~(t)는 이번 시점에 추가하고 싶은 새로운 정보 후보
s(t)=장기 기억+ 현재 시점의 새로운 정보
o(t)는 정보를 얼마나 보여줄지 결정
h(t): s(t)의 값이 커질 수 있어 tanh를 사용하여 범위를 -1~1로 압축

gru
LSTM보다 구조가 단순
u(t): 과거 정보와 현재 정보 얼마나 사용할 것인지 결정 0에 가까우면 현재 후보 완전 유지, 1에 가까우면 과거 완전 유지
r(t): 과거 정보를 얼마나 무시할 건지 결정, 0에 가까우면 이전 내용 반영 거의 안함 1에 가까우면 많이 반영
h~(t): 이번 시점 정보
h(t):

단점
기본적인 rnn형태에서는 출력 길이를 조절할 수 없음
순서를 고려하기 어려움

->seq2seq (출력 길이 조절 가능)
LSTM 모델 2개를 붙여서 사용
인코더가 분석 후 대표되는 context vector를 하나 만들어줌
context vector 안에 입력 문장의 의미가 들어가 있음
벡터 정보를 디코더로 보냄
벡터 길이 제한으로 인해 but 어순 판단 어려움

-> attention mechanism (순서 고려 가능)
- 매 시점마다 디코더가 h₁, h₂, ..., hᵢ 각각에 대해 중요도 점수(score)를 계산
- 이 점수를 Softmax로 변환해서 Attention Weight α1,α2,...,αi를 얻음
- ai와 hi 곱한 후 다 더해줌
- 이렇게 만든 Context Vector가 이번 시점의 디코더 입력으로 들어감
- 제일 높은 확률 단어를 선택해서 예측