지금까지 모든 학습 데이터들은 time과 연관이 없었음
만약, H E L L O 자동완성 프로그램을 만든다면
H->E
E->L
L->L
L->O
가 나와야하는데
L이 입력됐을때 출력값이 L 혹은 O가 나오도록 해야한다.
즉, 똑같은 Input에 다른 output이 존재하는 것이다.
앞으로 L이 2번 연속 나왔을때는 O라는 결과값을 줘라~
이것이 시계열 데이터(과거의 값이 현재의 값에 영향을 미친다.)
: 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델
x : 입력층의 입력벡터
y : 출력층의 출력벡터
cell(셀) : 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할(= 메모리 셀, RNN 셀)
t : 현시점
은닉층 : 결과값 출력층으로 보내기 or 다시 은닉층 노드의 다음 계산의 입력으로 보냄
은닉상태 : 메모리 셀이 다음 시점인 t+1의 자신에게 보내는 값
(t시점 메모리 셀은 t-1시점의 메모리 셀이 보낸 은닉 상태값을 사용한다)
일 대 다(one-to-many)
다 대 일(many-to-one)
다 대 다(many-to-many)
(출처:https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/)
https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/
⛔ 여기서 왜 tanh을 사용하는가?
sigmoid는 Deep 해질수록 Vanishing Gradient 발생
ReLU는 RNN 특성상 계속 순환하는 구조이기 때문에 값이 1보다 크게되면 ReLU 특성상 값이 발산할 수도 있어서 적합하지 않음
즉, ReLU는 양수일때 기울기가 항상 일정한 값을 가지므로 RNN의 학습 특성과는 맞지 않기 때문에(계속 순환해서 값을 갱신해나가야하는데 양수일때 1이 되어버리면 순환 학습이 의미가 없음) tanh을 사용하는듯
sigmoid VS tanh
ReLU
RNN에서는 비선형 함수를 사용하는 이유
word2vec에서는 선형함수를 사용하였다.
하지만 RNN에서 비선형함수를 사용하는데
이 모델이 시퀀스 데이터의 복잡한 관계를 처리하고 장기적인 의존성을 학습할 수 있도록 하기 위해서 비선형 함수를 사용한다.
⛔ 계산방법이 아직은 정확하게 이해가 안감
⛔ 그리고 밑 코딩부분 아직 안함~~