본문 바로가기

Programming Project/Pytorch Tutorials

Pytorch 머신러닝 튜토리얼 강의 13 (RNN 2 - Classification)


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

2018/07/02 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 1 (Overview)

2018/07/02 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 2 (Linear Model)

2018/07/03 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 3 (Gradient Descent)

2018/07/03 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 4 (Back-propagation and Autograd)

2018/07/07 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 5 (Linear Regression in the PyTorch way)

2018/07/09 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 6 (Logistic Regression)

2018/07/10 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 7 (Wide and Deep)

2018/07/11 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 8 (PyTorch DataLoader)

2018/07/11 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 9 (Softmax Classifier)

2018/07/13 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 10 (Basic CNN)

2018/07/14 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 11 (Advanced CNN)

2018/07/17 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 12 (RNN 1 - Basics)

음 세상에 갑자기 줄간격이 늘어났다!


이전 강의에서는 기본적인 RNN에 대해서 배워 보았습니다.

RNN의 구성을 그림으로 표현 해 보면 위와 같은데요,

X라는 데이터를 lookup table로 넣어서 임베딩을 시키고, 이것을 RNN모델의 인풋으로 줍니다.

그리고 time t에 대한 hidden output을 linear net을 통과시켜 그 결과를 CELoss로 계산한 loss로 부터 backprop 시킵니다.



이번 강의에서는 RNN Classification에 대해서 배워 볼 것입니다.

여러개의 time series input으로부터 하나의 output을 내보내는 모델 구조인데요,


다음과 같은 데이터를 맞추기 위해서 씁니다.


바로 이름 : 국가 데이터셋인데요,

자유분방한 길이의 이름이 들어오면, 이 이름이 18개의 국가중 어떤 국가 사람의 이름인지를 맞추면 되는 task입니다.



일단 , 우리는 알파벳을 어떻게 입력으로 모델에 줄 것인지에 대해서 고민해야 합니다.



우리가 사용할 방법은 임베딩 레이어를 통해서 넘겨주는것으로 하도록 합시다.

'a'라는 알파벳의 아스키 코드값을 input으로 받으면, embedding layer을 지나서 나온 벡터가 RNN의 인풋으로 들어가는 것입니다.


예시를 통해 한번 더 자세히 알아봅시다.



adylov라는 이름을 가진 사람이 있다고 해 봅시다,

이 이름은 ascii code로 변환이 되면 97 , 100 , 121 , 108 , ... 이런 식으로 변환이 되고, 이를 임베딩 테이블을 거치게 되면 위 그림과 같이 rnn의 입력에 들어갈 고차원의 벡터로 바뀌게 됩니다.

코드로는 다음과 같습니다.

ord()라는 char을 ascii code로 바꿔주는 함수를 사용할 건데요, 


list comprehension 이라는 것을 사용하여 위와 같이 예쁘게 string을 ascii list로 바꿔줄 수 있답니다 ^_^/



그리고 임베딩 쪽의 코드는 다음과 같이 구현이 가능합니다.

self.embedding = nn.Embedding...을 통해서 임베딩 레이어를 선언 해 주고요, 

input_voc_size 는 ascii code를 입력으로 넣어주기 때문에, 128이 들어가야 할 것이구요 (ascii범위가 0~127) rnn_input_size는 rnn으로 들어갈 인풋 차원의 크기가 들어가야 하겠네요.



또한 이번에는 LSTM이 아닌 GRU를 사용해보도록 하겠습니다. (지난시간 참고)



코드 전부를 살펴보면 다음과 같습니다 (클릭하면 커집니다)



왼쪽 상단의 매트릭스 형태가 의미하는 곳의 코드를 화살표로 각각 이어보면 오른쪽과 같습니다.


인풋을 아스키코드로 받아transpose 하구요

그 후 임베딩을 시킨 outputgru의 input으로 넣어줍니다.


하지만 이걸 Batch단위로 여러 input을 묶어서 넣으려면 어떻게 해야 할까요?

문제는 다음과 같습니다.


sequence들의 길이가 다르기 때문에, 묶어서 돌릴 때 matrix에 남는 칸이 생기는 것입니다.

보통은 아래와 같은 zero padding 이라고 하는 방법을 씁니다.

빈 칸에 모두 0을 채우는 것입니다.


그리고 이 과정은 아래의 코드로 간단하게 구현이 가능합니다.



* 작성중