LSTM 모델 간단 실습
(저작권 관련 코드를 지우고수정 업로드 합니다)
구름 AI 자연어처리 과정 LSTM 실습은
pytorch를 활용해서 진행되었다.
https://pytorch.org/tutorials/beginner/nlp/sequence_models_tutorial.html
Sequence Models and Long Short-Term Memory Networks — PyTorch Tutorials 1.12.1+cu102 documentation
Note Click here to download the full example code Sequence Models and Long Short-Term Memory Networks At this point, we have seen various feed-forward networks. That is, there is no state maintained by the network at all. This might not be the behavior we
pytorch.org
먼저 필요한 라이브러리를 설치해준다.
1
2
3
4
5
6
|
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
|
cs |
torch.nn을 활용하여 LSTM cell을 생성하는 법은 다음과 같다.
lstm = nn.LSTM(input_size, hidden_size)
LSTM cell 을 생성한 후에는, 입력으로 들어갈 input x, hidden state h, cell state c 를 생성해야 한다.
위에서 정한 input_size 와 hidden_size 를 고려하여 inputs 와 hidden (h 와 c) 을 생성하자.
|
|
hidden states또한 생성해 줘야 함으로 3차원 벡터로 생성하고
입력의 hidden state와 LSTM에 존재하는 cell state가 생성되어야 하기에
3차원 벡터 2개로 구성했다.
LSTM 모델을 통과시키는데 두 가지 방법이 있는데
1) 한 번에 하나의 element를 cell에 통과시키는 방법
1
2
3
4
|
cs |
1
2
|
cs |
tensor([[[-0.3600, 0.0893, 0.0215]]], grad_fn=<StackBackward0>)
(tensor([[[-0.3600, 0.0893, 0.0215]]], grad_fn=<StackBackward0>), tensor([[[-1.1298, 0.4467, 0.0254]]], grad_fn=<StackBackward0>))
2) 전체 sequence를 한번에 통과시키는 방법
1
2
3
4
5
|
cs |
tensor([[[-0.0187, 0.1713, -0.2944]],
[[-0.3521, 0.1026, -0.2971]],
[[-0.3191, 0.0781, -0.1957]],
[[-0.1634, 0.0941, -0.1637]],
[[-0.3368, 0.0959, -0.0538]]], grad_fn=<StackBackward0>)
(tensor([[[-0.3368, 0.0959, -0.0538]]], grad_fn=<StackBackward0>), tensor([[[-0.9825, 0.4715, -0.0633]]], grad_fn=<StackBackward0>))
LSTM을 이용해 PoS Tagging을 해보려고 한다.
그렇기 위해
training_data 에 단어 sequence와 태그를 준비하고
word_to_ix 에는 모델의 입력으로 사용하기 위해 단어를 id로 mapping 한다.
tag_to_ix 에는 품사 태그 또한 id로 mapping한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
cs |
{'The': 0, 'dog': 1, 'ate': 2, 'the': 3, 'apple': 4, 'Everybody': 5, 'read': 6, 'that': 7, 'book': 8}
다음은 LSTMTagger 모듈을 정의해야 한다.
먼저 embeds는 input id를 embedding layer로 encode하여 input에 해당하는 embedding을 생성한다.
lstm_out은 embedding을 LSTM에 통과하여 전체 시퀀스에 대한 hidden state를 저장한다.
tag_space는 LSTM의 output을 이용해 존재하는 tag공간으로 선형변환 한다.
tag_scores는 softmax를 적용하여 tag의 score을 측정한다.
1
2
3
4
|
cs |
tensor([[-1.1389, -1.2024, -0.9693],
[-1.1065, -1.2200, -0.9834],
[-1.1286, -1.2093, -0.9726],
[-1.1190, -1.1960, -0.9916],
[-1.0137, -1.2642, -1.0366]])
모델을 학습시키고 정답 tag와 비교해 loss를 backpropagate하여 모델 파라미터를 업데이트한다.
1
2
3
4
5
6
7
8
9
10
11
|
cs |
tensor([[-0.0462, -4.0106, -3.6096],
[-4.8205, -0.0286, -3.9045],
[-3.7876, -4.1355, -0.0394],
[-0.0185, -4.7874, -4.6013],
[-5.7881, -0.0186, -4.1778]])
이 실습 같은 경우 학습 데이터만 활용해 모델을 평가했기 때문에 모델의 generalization 성능을 평가하긴 어렵다.
새로운 데이터를 이용하거나 데이터를 train, test로 split하는 방법을 활용해서 실습을 하면 더 유용하게 나올 것 같다.
꿑!