시계열 데이터 내용은 다음 포스팅을 참고 바랍니다.
https://sungwoony.blogspot.com/2020/05/blog-post.html
RNN
RNN은 시계열 데이터를 처리하기 위해 사용되는 Deep Learning Network입니다. 시퀀스의 모든 요소에 동일한 작업(변수)을 수행하고, 출력은 이전 계산에 의존적입니다. 지금까지 계산 된 정보는 메모리 저장합니다.RNN 은 입력층, 은닉층, 출력층 으로 구성되있다. hidden state는 현재 입력값 x와 이전 hidden state값에 영향을 받습니다. 활성함수는 Hyperbolic Tangent(tanh)를 사용합니다.
이를 식으로 표현하면 다음과 같습니다.
RNN은 행렬 연산으로 수행되며 각 벡터와 행렬의 크기는 다음과 같습니다.
RNN 셀은 두 개의 입력을 리턴하는데, 첫번째 리턴값은 모든 시점(timesteps)의 은닉 상태들이며, 두번째 리턴값은 마지막 시점(timestep)의 은닉 상태입니다.
다음 GIT에서 RNN 소스 확인할 수 있습니다.
RNN Back Propagation (Through Time)
- 순방향 계산이 완료 되면, 비용함수로 예측값과 정답을 비교해 Loss를 구함
- 이 Loss값을 trainable variable로 미분하여 가중치를 갱신함.
가중치 갱신 방법은 다음 포스티을 참고 바랍니다.
https://sungwoony.blogspot.com/b/post-preview?token=APq4FmDDOJ4dTYtjdTq4oBg1DdEXIMwHDxvqR43wRk6_kdF1fLtodGA64Td5HVdD5tG00nUEmzwa-_Fa5IrZk4cJcuT8wXsxXGp5HOnikhFR7esCM8Ey_t7n-O6DDMT3l6agbYPHYBzJ&postId=5936716516921891524&type=POST
RNN 문제점; Vanishing Gradient
Back propagation을 위해 미분을 할때, 미분의 기울기가 0에 가까워지면, 값을 소실하여 Back propagation 학습에 문제점이 있습니다.
RNN에서 Tensor
- N: 데이터 Sample 갯수
- B: Batch 수
- L: Sequence 길이
- I: Feature의 dimension
일반 전결합 계층의 데이터는 배치크기*입력벡터길이(B*I)의 형태로 구성되어 있습니다(2D Tensor). NLP분야에서는 문장의 길이 L이 추가됩니다(3D Tensor).
비고)
- 비젼 분야는 배치*가로*세로(Batch, Width, Height) 형태입니다.
- 파이토치의 nn.RNN()은 기본적으로 3차원 텐서를 입력받습니다. 그렇기 때문에 배치 차원을 추가해줍니다.
RNN의 입력 텐서
RNN의 출력 텐서
Sequence to Sequence
Seq2seq는 번역기에서 사용되는 RNN 방법입니다. 첫 번째 RNN은 Encoder역할을 하고 두 번째 RNN은 Decoder 역할을 합니다.문장 복원 |
Seq2seq 사용 예
- 챗봇(Chatbot): 입력 시퀀스와 출력 시퀀스를 각각 질문과 대답으로 구성
- 기계 번역(Machine Translation): 입력 시퀀스와 출력 시퀀스를 각각 입력 문장과 번역 문장
- 그 외에도 내용 요약(Text Summarization), STT(Speech to Text) 등.
seq2seq는 크게 두 개로 구성된 아키텍처로 구성되는데, 바로 인코더와 디코더입니다. 인코더는 입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에 마지막에 이 모든 단어 정보들을 압축해서 하나의 벡터로 만드는데, 이를 컨텍스트 벡터(context vector)라고 합니다. 컨텍스트 벡터는 디코더 RNN 셀의 첫번째 은닉 상태로 사용됩니다.
번역기 |
Bi-directional RNN
양방향 RNN은 과거와 미래의 정보가 모두 현재 스텝에 영향을 주는 경우입니다.
예: 영어 문제에서 빈칸에 가장 알맞는 단어를 채우기(앞 뒤 문장을 모두 확인해야 함)
Reference
- Fast Campus
- https://wikidocs.net/57168
- https://wikidocs.net/60690
- https://wikidocs.net/64703
- https://wikidocs.net/65154
댓글
댓글 쓰기