import numpy as nptimesteps =10# 시점의 수. NLP에서는 보통 문장의 길이가 된다.input_size =4# 입력의 차원. NLP에서는 보통 단어 벡터의 차원이 된다hidden_size =8# 은닉 상태의 크기 (= 메모리 셀의 용량)inputs = np.random.random((timesteps, input_size))# 2D 텐서hidden_state_t = np.zeros((hidden_size))# 초기 상태는 0벡터로 초기화# 은닉 상태의 크기는 hidden_size로 생성
print(hidden_state_t)# [0. 0. 0. 0. 0. 0. 0. 0.]
Wx = np.random.random((hidden_size, input_size))# (8,4)크기의 2D 텐서로 입력에 대한 가중치Wh = np.random.random((hidden_size, hidden_size))# (8,8)크기의 2D 텐서로 은닉 상태에 대한 가중치b = np.random.random((hidden_size))# (8,) 크기의 1D 텐서 생성. 이 값은 biasprint(np.shape(Wx))print(np.shape(Wh))print(np.shape(b))# (8, 4)# (8, 8)# (8,)
total_hidden_states = []# 메모리 셀 동작for input_t in inputs: output_t = np.tanh(np.dot(Wx, input_t) + np.dot(Wh, hidden_state_t) + b) total_hidden_states.append(list(output_t))print(np.shape(total_hidden_states))# 각 시점인 t별 메모리 셀의 출력 크기는 (timestep, output_dim) hidden_state_t = output_ttotal_hidden_states = np.stack(total_hidden_states, axis=0)print(total_hidden_states)# total_hidden_states는 (10, 8)의 모양을 가진
cell = nn.RNN(input_size, hidden_size, batch_first=True)# batch_First=True로 입력 텐서의 첫번째 차원이 배치 크기임을 알려준다# RNN은 num_layers, bidirectional와 같은 parameter 또한 존재한다
outputs, _status =cell(inputs)# RNN 셀은 두 개의 입력값을 리턴한다# 첫번째는 모든 시점의 hidden state, 둘째는 마지막 timestep의 은닉상태이다.
print(outputs.shape)# 10번의 t동안 8차원의 hidden state가 출력되었다는 의미# ([1, 10, 8])# 여기에서 1은 이 RNN의 층이 1이였음을 나타낸
print(_status.shape)# 마지막 시점의 hidden state는 (1, 1, 8)의 크기를 가짐
다음 페이지에서는 앞서 언급 내용을 토대로, 데이터 전처리 과정부터 시작하여 '네이버 영화 데이터 리뷰 데이터셋'을 이용하여 감정 분석(Sentimental Classification) task를 다뤄보고자 한다.