1. 순환 신경망(Recurrent Neurl Network, RNN)
- 시계열 또는 자연어와 같은 Sequence 데이터를 모델링하는 데 강력한 신경망. 시계열 데이터나 시퀀스 데이터를 잘 처리
- 예) 주식 가격, 텍스트 데이터, 오디오 데이터
- SeQuence: 단어의 문장. 연결되어 있는 정보
1-1. RNN 동작방식
- 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 다시 출력층 방향으로 보내면서 은닉층 노드의 다음 계산의 입력으로 보내는 것이 특징
- 셀(Cell): 은닉층에서 활성화 함수를 통해 나온 결과를 내보내는 역할을 하는것. 이전의 값을 기억하려고 하는 일종의 메모리 역할을 수행
- 은닉 상태(hidden state): 셀이 출력층 방향 또는 다음 시점으로 자신에게 보내는 값
runn = torch.nn.RNN(input_size, hidden_size)
iutputs, stae = rnn(input_data)
# state: hidden state
1-2. RNN 동작방식
- 단어가 입력되면 각 글자를 벡터의 형태로 변환하여 원 핫 인코딩 해주는 과정이 필요
- "hello"
- h = [1, 0, 0, 0]
- h = [0, 1, 0, 0]
- h = [0, 0, 1, 0]
- h = [0, 0, 0, 1]
- input_size = 4
- input_data의 세번째 차원으로 입력
1-3. hidden state size
- hidden state의 size는 output의 세번째 차원
- output size와 같음
- 셀에서 연산된 결과를 두 가지로 나눠 하나는 output으로 출력되고, 다른 하나는 hidden state로 다음 step에 그대로 저장하고 전해짐
1-4. Sequence Length
- 총 Sequence가 몇 개인지를 나타냄
- "hello"를 입력으로 보내면 sequence length는 5
- 파이토치에서는 모델이 Sequence Length를 알아서 파악하기 때문에 파라미터로 전달해 줄 필요는 없음
1-5. Batch Size
- 여러 데이터를 묶어 하나의 batch로 만들어 학습을 진행
- h, e, l, o를 가지고 만들 수 있는 데이터 중 배치사이즈로 정한 크기로 묶어 학습을 진행
- batch size를 모델에서 파악하고 output data, input data에서 첫번째 파원에 위치함
.
import torch
from torch.nn import RNN
import numpy as np
import torch.nn as nn
input_size = 4
hidden_size = 2
h=[1,0,0,0]
e=[0,1,0,0]
l=[0,0,1,0]
o=[0,0,0,1]
input_data_np = np.array([[h,e,l,l,o],
[e,o,l,l,l],
[l,l,e,e,l]], dtype=np.float32)
input_data = torch.Tensor(input_data_np)
rnn = RNN(input_size, hidden_size)
outputs, state=rnn(input_data)
state
test='hello! word'
string_set=list(set(test))
print(string_set)
string_dic={c: i for i, c in enumerate(string_set)}
print(string_dic)
input_size = len(string_dic)
print(input_size)
hidden_size = len(string_dic)
print(hidden_size)
test_idx = [string_dic[c] for c in test]
print(test_idx)
x_data = [test_idx[:]]
print(x_data)
x_data = [test_idx[:]]
print(x_data)
x_one_hot = [np.eye(input_size)[x] for x in x_data]
print(x_one_hot)
y_data = [test_idx[:]]
print(y_data)
X = torch.Tensor(x_one_hot)
y= torch.LongTensor(y_data)
rnn = RNN(input_size, hidden_size)
loss_fun=torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(rnn.parameters(), lr=0.1)
# outputs, state = rnn(X)
# loss: x, predition: x(idx), predition_str: x(str)
for i in range(100):
optimizer.zero_grad()
outputs, state = rnn(X)
# (배치사이즈, 시퀀스길이, 히든사이즈)
# outputs: (1, 12, 12) -> (12, 12)
# y: (1, 12) -> (12,)
loss = loss_fun(outputs.view(-1, input_size), y.view(-1))
loss.backward()
optimizer.step()
result = outputs.data.numpy().argmax(axis=2)
result_str = ''.join([string_set[ch] for ch in np.squeeze(result)])
print(i, 'loss: ', loss)
print('prediction: ', result, ' prediction_str: ', result_str)
'자연어 처리(NLP)' 카테고리의 다른 글
8. CNN text classification (0) | 2024.06.21 |
---|---|
7. cbow text classification (0) | 2024.06.21 |
5. 워드임베딩 시각화 (0) | 2024.06.21 |
4. 워드 임베딩 (1) | 2024.06.17 |
3. 임베딩 (0) | 2024.06.17 |