오늘은 뉴럴 넷 (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 개만 생각해보기
그림에서 \(\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\) 벡터를 통해 웨이트를 부여하는 것이다.
이 과정을 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을 구현해보도록 하자.
아래는 현재 검색 가능한 파이토치 딥러닝 책 광고입니다! 파트너스 활동을 통해서 일정액의 수수료를 받을 수 있다고 하네요.ㅎㅎ 언젠가 제가 쓰는 이 블로그도 저 자리에 끼어있었으면 좋겠네요ㅎㅎ 밑에 책들은 한번 사서 읽어보고, 리뷰를 올려보도록 하겠습니다. =]
'R' 카테고리의 다른 글
[PoliscieR] 정치학과에서 R로 연구하기 (13) | 2021.01.31 |
---|---|
Rstudio 시작시 특정 R패키지 실행하기 - .Rprofile 파일에 대하여 (0) | 2021.01.25 |
ggplot 그래프 3D 렌더링 하기 (0) | 2021.01.23 |
Rmd파일로 티스토리 포스트용 html 만들기 (6) | 2021.01.13 |
R패키지 설치시 00LOCK 폴더 오류해결법 (3) | 2021.01.06 |
댓글