본문 바로가기

implement_ml_models/RNN

implement_RNN

가중치의 종류

W_xh : 입력 값에 대한 가중치, 가중치 연산 결과가 노드 입력이 된다.

W_hy : 노드 출력에 대한 가중치, 예측값이 된다.

W_hh : 노드 출력에 대한 가중치, 다음 노드 입력에 사용된다.

원하는 크기의 입력에 대한 출력의 크기를 지정할 수 있다.

시퀀스 투 시퀀스

시퀀트 투 벡터

벡터 투 시퀀스

벡터 투 벡터

각 종류와 그 크기별로 가중치들의 행렬 크기가 바뀐다.

class RNN:
  """
  순환 신경망의 계산
  """
  # 입력 가중치
  input_w = []

  # 이전 출력에 대한 가중치
  before_w = []

  # 출력 가중치
  result_w = []

  # 편향 값 bais
  bias = []

  # 노드 입력
  node_input = []

  def cal_rnn(self, input, target, input_w, before_w, result_w, bias):
    
    self.input_w = input_w
    self.before_w = before_w
    self.result_w = result_w

    # 이전 노드의 출력, 첫 부분의 경우 이 값이 0이다.
    before = np.zeros((target.shape[0], target.shape[1]))

    self.node_input.append((before_w @ before) + (input_w @ input) + bias)

RNN 클래스와 노드 입력까지의 연산,

해당 노드 입력에 활성화 함수 연산을 통해 노드 출력값을 계산한다.

노드 내 활성화 함수 연산을 위한 activation_function 클래스 호출

# 활성화 함수
class activation_function:
  # 시그모이드 함수
  def sigmoid(self, x):
    return 1 / (1+np.e**-x)
  
  # 시그모이드 함수의 미분 함수
  def sigmoid_diff(self, x):
    return x * (1 - x)

시그모이드 함수를 활성화 함수로 사용한다.

이를 통해 노드 출력값을 계산할 수 있다.

node_output = self.activation.sigmoid(node_input)
self.node_output.append(node_output)

이 노드 출력은 출력 가중치에 의한 행렬곱 연산을 통해 예측값을 계산한다.

    # 예측값 계산
    predict = result_w @ node_output
    self.predict.append(self.activation.sigmoid(predict))

가중치와 행렬곱 연산과 함께 활성화 함수 연산을 통해 예측값을 구할 수 있다.

다음 노드의 입력값은 이전 출력에 대한 가중치를 통해 구할 수 있다.

# 순환 노드의 다음 노드 입력값의 계산
    before = self.before_w @ predict

해당 값에는 활성화 함수 연산을 하지 않는다.

 

'implement_ml_models > RNN' 카테고리의 다른 글

implement_RNN (delta-to-sequence 2)  (0) 2023.02.26
implement_RNN (delta-to-sequence 1)  (0) 2023.02.24
implement_GRU(h)  (0) 2022.12.13
implement_GRU(g)  (0) 2022.12.13
implement_GRU(r)  (0) 2022.12.13