자연어처리/실습

LSTM 모델 간단 실습

아인슈페너먹고싶다 2022. 9. 11. 22:55

(저작권 관련 코드를 지우고수정 업로드 합니다)

 

 


 

 

구름 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)

 

 

1
lstm = nn.LSTM(33)  
cs

input_size와 hidden_size가 3인 cell을 생성한다.

 

 

LSTM cell 을 생성한 후에는, 입력으로 들어갈 input x, hidden state h, cell state c 를 생성해야 한다.

 

위에서 정한 input_size 와 hidden_size 를 고려하여 inputs 와 hidden (h 와 c) 을 생성하자.

 

 

1
cs

 

ssequence length가 5인 input을 생성하려는데 input_size를 3으로 설정했으므로, 3차원 벡터 5개를 생성해야한다.

 

1
2
hidden = (torch.randn(113),
          torch.randn(113))
cs

 

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
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cs

 

 

모델을 설정하고 loss함수와 optimizer을 선언한다.

 

1
2
3
cs

 

 

모델의 성능을 판단하기 위해 학습 전 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
12
13
14
15
16
17
18
19
cs

 

 

 

이제 tag score를 비교해 보면 된다. 

 

 

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하는 방법을 활용해서 실습을 하면 더 유용하게 나올 것 같다.

 

 

꿑!