본문 바로가기
자연어 처리(NLP)

6. Rnn 기초

by 곽정우 2024. 6. 21.

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. 워드 임베딩  (0) 2024.06.17
3. 임베딩  (0) 2024.06.17