이번 글 에서 는 기존 의 RNN Basics 에 이어서 PyTorch 로 RNN 를 구현 하 는 것 에 대해서 심화 적 으로 배워 보 도록 하 겠 습니다 . 이번 글 은 EDWITH 에서 진행 하 는 파이 토치 로 시작 하 는 딥 러닝 기초 를 토대 로 하 였 고 같이 스터디 하 는 팀원 분 들 의 자료 를 바탕 으로 작성 하 였 습니다 . Cross entropy loss 에 대한 이론 적 인 설명 은 hyuwk 님 의 블로그 와 ratsgo 님 의 블로그 를 참고 하 였 습니다 . 
 ' Hihello ' problem 
 ' longseq ' example 
 RNN timeseries 
 문제 : hihello 라는 문자열 을 예측 하 는 모델 을 만드 는 것 
 목적 : 다음 에 오 는 character 를 예측 해야 함 ( h 가 들어오 면 i , i 가 들어오 면 h 를 예측 해야 함 ) 
 How can we represent Characters ? 
 문제 : Chracters 를 컴퓨터 에서 표현 하 는 방식 
 이 를 컴퓨터 가 인식 하 는 방법 을 Embedding 이 라 하 고 대표 적 으로 는 One - hot Encoding 이 있 다 . 
 그 외 에 는 LSA , Word 2 Vec , GloVe , FastText 이 있 다 . 
 LSA ( Latent Semantic Analysis ) : DTM ( 문서 - 단어 행렬 ) 에 SVD 를 적용 해서 단어 의 의미 를 고려 해 주 는 기법 
 Word 2 Vec : 주변 단어 를 통해서 단어 의 의미 를 파악 하 는 기법 
 Glove : LSA 와 Word 2 Vec 의 단점 을 개선 한 기법 . ( 임 베 딩 된 두 단어 벡터 의 내적 이 말뭉치 전체 에서 의 동시 등장 확률 로그 값 이 되 도록 목적 함수 를 정의 ) 
 FastText : 페이스북 에서 개발 한 모델 로 Word 2 vec 에 기반 을 두 고 부분 단어 들 을 Embedding 하 는 기법 . 속도 가 매우 빠름 
 Embedding 기법 에 대한 자세 한 내용 은 임 베 딩 기법 ( Embedding ) 을 참고 하 시 기 바랍니다 . 
 각 단어 에 index 를 부여 하 는 방식 
 h 의 경우 [ 1 , 0 , 0 , 0 , 0 ] 으로 자기 index 의 값 만 1 을 가지 는 방식 
 Categorical Output 을 예측 하 는 데 사용 하 는 loss 
 criterion ( 모델 의 Output , 실제 값 ) 
 hidden _ size 는 임의 로 설정 
 torch . FloatTensor 로 one _ hot vector 를 Floattensor 형태 로 변환 
 이전 과 다르 게 dictionary 형태 로 저장 
 np . eye : 대각 성분 은 ' 1 ' 이 고 나머지 성분 은 ' 0 ' 으로 구성 된 정방 행렬 인 항등 행렬 ( identity matrix ) 혹은 단위행렬 ( unit matrix ) 을 만 듬 
 목적 : longer dataset 을 사용 
 문제 : bigger chunks 에서 학습 을 해야함 , 아주 긴 문장 을 어떻 게 input 으로 사용 할 지 
 특정 window size 내 에서 오른쪽 으로 한 칸 씩 이동 하 면서 chunk 를 나눔 
 모델 을 좀 더 크 게 만들 고 싶 을 때 , FC layer 과 stacking RNN 을 더 할 수 있 음 
 num _ layers 가 2 이 기에 torch . nn . RNN 이 2 개 의 층 을 가지 는 구조 가 됨 
 RNN 2 개 의 층 을 지나 고 FC 를 거치 면서 학습 이 종료 
 ' TimeSeries ' example 
 대표 적 인 시계열 데이터 로 는 주가 데이터 가 있 습니다 . 아래 의 모습 은 8 일 차 의 주가 를 예측 하 기 위해서 이전 7 일 간 의 데이터 를 보 는 모델 입니다 . 비록 주가 는 코스피 , 경제 , 호재 등 예상 치 못한 변수 들 이 많이 숨 어 있 습니다 . 그렇 기에 정확 한 주가 는 예측 할 수 없 지만 , 기본 적 인 모델 을 만들 어 보 도록 하 겠 습니다 . 
 위 의 모델 은 5 개 의 인풋 이 들어오 면 , 이 를 처리 한 다음 에 하나 의 정보 로 압축 ( 예측 해야 하 는 값 - 예 : 다음 날 의 종가 ) 시켜서 다음 의 hidden state 에 넘겨 주 게 됩니다 . 하지만 이러 한 방식 은 모델 에 굉장히 부담 스럽 게 됩니다 . 5 개 의 정보 를 처리 하 는 것 도 부담 스럽 지만 , 하나 의 정보 로 압축 시키 는 것 도 힘들 기 때문 입니다 . 그렇 기에 마지막 에 FC 을 연결 해서 Fully Connected Layer 가 종가 를 예측 하 도록 설계 하 는 것 이 일반 적 입니다 . 이렇게 하 면 데이터 를 유통 하 는 부분 과 레이블 을 맞추 는 부분 을 나눠서 특정 네트워크 에 가해 지 는 부담 을 분산 시키 는 장점 이 있 습니다 . 
 데이터 를 다시 보 면 , Volume 과 다른 값 들 간 의 차이 가 큰 것 을 볼 수 있 습니다 . 이러 한 경우 모델 은 둘 의 스케일 의 차이 또한 인식 해 줘야 하 는데 , 이러 한 부담 을 줄이 기 위해서 모든 변수 를 0 ~ 1 로 스케일 함 으로써 모델 에 가해 지 는 부담 을 줄일 수 있 습니다 . 
 모델 을 보 면 , 굉장히 잘 예측 이 된 것 처럼 보입니다 . 하지만 , 이 모델 을 가지 고 주식 시장 에 뛰 어 들 면 패가망신 할 가능 성 이 99 % 이상 입니다 . 그 이유 는 주식 시장 에 는 변동 을 끼치 는 요소 가 많 아서 위 의 5 가지 변수 만 을 가지 고 는 불 가능 합니다 . 그리고 위 의 값 을 잘 보 면 , 예측 값 과 실제 값 이 모양 은 같 지만 original 값 이 조금 왼쪽 에 있 는 것 을 볼 수 있 습니다 . 즉 , 예측 값 은 전 날 의 값 을 예측 한 것 이 지 당일 의 값 을 예측 했 다고 보 기 에 는 무리 가 있 습니다 . 
 [ 파이 토치 로 시작 하 는 딥 러닝 기초 ] 4 . 2 RNN Advanced ( 0 ) 
 HIHELLO , longseq , pytorch , RNN , Timeseries