본문 바로가기
R

Forward propagation, R 버전

by 슬통이 2020. 7. 17.
반응형

오늘은 뉴럴 넷 (Neural network)을 공부하기 위해서 앞으로 우리가 다룰 뉴럴넷 중 가장 현실적이고, 어떤 일이 벌어지고 있는지 상상이 가능한 뉴럴 넷을 정의하는 것을 목표로 하자. 우리가 오늘 예로 생각할 뉴럴 넷은 다음과 같다.

2단 레이어이고, 2개의 녹색 노드(node)는 input 레이어를 형성하고 있고, 빨강색의 노드는 output 레이어를 형성하고 있으며, 회색의 3개 노드는 히든 레이어를 형성한다.

뉴럴넷 예제

자 이제부터, 녹색 노드에는 무엇이 들어가는지, 그리고, 어떤 과정을 거쳐서 빨강색의 값이 나오는지에 대하여 알아보자. 이러한 전 과정을 Forward propagation이라고 부른다. propagation의 뜻은 증식, 혹은 번식인데, 식물이나 동물이 자라나는 것을 의미하는데, 녹색의 입력값들이 어떠한 과정을 거쳐 빨간색으로 태어나는지 한번 알아보자.

Forward propagation

우리의 데이터는 역시 아주 간단하다. 가로 행이 하나의 데이터 포인트를 의미하고, 세로 열은 변수를 의미한다. 즉, 다음의 데이터 매트릭스는 2개의 변수 정보가 들어있는 세 개의 데이터 포인터들이 있는 데이터셋을 의미한다.

\[ X =\left(\begin{array}{cc} 1 & 2\\ 3 & 4\\ 5 & 6 \end {array}\right) \]

주의할 것은, 우리가 그려놓은 뉴럴넷의 인풋 레이어의 노드는 2개이고, 데이터는 3 by 2 행렬이라는 것이다. 우리가 그려놓은 뉴럴 넷으로 데이터 포인트가 인풋 레이어에 각각 입력되어 포인트별 아웃풋이 생성되는 것. 먼저 다음과 같은 경로를 생각해보자. 데이터 매트릭스를 위에 색칠된 루트로 보낸다는 의미는 다음과 같은 계산과정을 거친다는 것이다.

경로 1 개만 생각해보기

1번째 경로

그림에서 \(\beta\)는 노드와 노드 사이를 지나갈 때 부여되는 웨이트들을 의미하고, \(\sigma()\) 함수는 sigmoid 함수를 의미한다.

\[ \sigma(x) = \frac{1}{1+e^{-x}} = \frac {e^x}{e^x+1} \]

set.seed(1234)

# 데이터 매트릭스 
# 3 by 2
X <- matrix(1:6, ncol = 2, byrow = T)
X
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
# beta_1 벡터 
# 2 by 1
# 1번째 레이어에 관한 웨이트 (베타) 중 
# 다음 레이어의 1번째 노드에 대한 베타 벡터에 부여
# beta_1 = (beta_11, beta_12)
beta_1 <- matrix(runif(2), ncol = 1) 
beta_1
##           [,1]
## [1,] 0.1137034
## [2,] 0.6222994
# 2번째 레이어 1번째 노드
# 3 by 1
z_21 <- X %*% beta_1
z_21
##          [,1]
## [1,] 1.358302
## [2,] 2.830308
## [3,] 4.302313
# 2번째 레이어 1번째 노드에서의 시그모이드 함수 통과
# 3 by 1
library(sigmoid)
a_21 <- sigmoid(z_21)
a_21
##           [,1]
## [1,] 0.7954836
## [2,] 0.9442918
## [3,] 0.9866436
# 2번째 레이어에 관한 웨이트 (감마) 중 
# 다음 레이어의 1번째 노드에 대한 베타값에 임의의 값을 부여
# beta_1 상수 1 by 1
gamma_1 <- runif(1)

# 3번째 레이어 1번째 노드
# 3 by 1
z_31 <- a_21 * gamma_1
z_31
##           [,1]
## [1,] 0.4846681
## [2,] 0.5753331
## [3,] 0.6011370
# 마지막 레이어에서 시그모이드 함수 통과
# 3 by 1
y_hat <- sigmoid(z_31)
y_hat
##           [,1]
## [1,] 0.6188496
## [2,] 0.6399929
## [3,] 0.6459164

즉, 두번째 레이어의 각 노드마다 각 데이터셋에 대한 예측값을 생성하게 되는 것이다.

경로 한꺼번에 생각하기

두 번째 레이어의 각각의 노드들이 예측 모델들이라고 생각하면, 각 모델들이 예측한 각 데이터셋의 예측값들을 마지막 노드에서 합치면서 \(\gamma\) 벡터를 통해 웨이트를 부여하는 것이다.

3가지 경로

이 과정을 R에서 매트릭스를 써서 깔끔하게 나타내 보자.

# 데이터 매트릭스 
# 3 by 2
X <- matrix(1:6, ncol = 2, byrow = T)
X
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
# 베타벡터가 세 개 존재함.
# 2 by 3
beta_2 <- matrix(runif(2), ncol = 1)
beta_3 <- matrix(runif(2), ncol = 1) 
beta <- cbind(beta_1, beta_2, beta_3)

# 2번째 레이어 z_2
# 3 by 3
z_2 <- X %*% beta
z_2
##          [,1]    [,2]      [,3]
## [1,] 1.358302 2.34521 0.6593021
## [2,] 2.830308 5.31380 1.9589148
## [3,] 4.302313 8.28239 3.2585276
# 2번째 레이어 sigmoid 함수 통과
# 3 by 3
a_2 <- sigmoid(z_2)

# 2번째 레이어에 관한 웨이트 (감마) 벡터 
# 다음 레이어의 1번째 노드에 대한 베타값에 임의의 값을 부여
# gamma vector 3 by 1
gamma_2 <- runif(1)
gamma_3 <- runif(1)
gamma <- matrix(c(gamma_1, gamma_2, gamma_3), ncol = 1)

# 3번째 레이어 z_3
# 3 by 1
z_3 <- a_2 %*% gamma
z_3
##          [,1]
## [1,] 1.135901
## [2,] 1.390510
## [3,] 1.475053
# 마지막 레이어에서 시그모이드 함수 통과
# 3 by 1
y_hat <- sigmoid(z_3)
y_hat
##           [,1]
## [1,] 0.7569262
## [2,] 0.8006737
## [3,] 0.8138242

다음 시간에는 파이 토치를 사용해서 Forward propagation을 구현해보도록 하자.


아래는 현재 검색 가능한 파이토치 딥러닝 책 광고입니다! 파트너스 활동을 통해서 일정액의 수수료를 받을 수 있다고 하네요.ㅎㅎ 언젠가 제가 쓰는 이 블로그도 저 자리에 끼어있었으면 좋겠네요ㅎㅎ 밑에 책들은 한번 사서 읽어보고, 리뷰를 올려보도록 하겠습니다. =]

 

파이토치 첫걸음:딥러닝 기초부터 RNN 오토인코더 GAN 실전 기법까지, 한빛미디어 펭귄브로의 3분 딥러닝 파이토치맛:PyTorch 코드로 맛보는, 한빛미디어 딥러닝에 목마른 사람들을 위한 PyTorch:개인용 GPU 학습 서버 구축부터 딥러닝까지, 비제이퍼블릭 PyTorch로 시작하는 딥러닝:딥러닝 기초에서 최신 모던 아키텍처까지, 에이콘출판 [제이펍] 파이토치 첫걸음

반응형

댓글