Search
🌑

[Vanilla Nueral Networks] 1. 신경망이란 무엇인가

다음은 3blue1brown Neural Networks 시리즈 1장 을 기반으로 작성하였습니다.

목표

각 뉴런과 레이어가 무엇을 수행하는지를 직관적으로 알 수 있다.

요약

신경망(모델)은 결국 입력 이미지를 입력으로 받아 확률값을 내놓는 ‘함수’이다.
신경망 구조는 레이어 측면에서 input layer, hidden layer, output layer로 구성되어 있다.
뉴런일부는 강하게 발현되고(큰 숫자) 일부는 약하게 발현된다(작은 숫자).
레이어1, 2, 3, 4 는 각각 pixel, edge, pattern, label 를 표현한다.
connection에서 weight이전 레이어 뉴런을 얼마나 활성화시킬건지를 나타낸다.
connection에서 bias역치값을 의미한다.

 Introduction

딥러닝을 배운다고 한다면 무엇을 가장 먼저 배우는 것이 좋을까.
나는 3blue1brown 의 Neural Networks 시리즈를 먼저 보는 것을 추천한다. 그 이유는 단순히 신경망 구조가 뉴런과 레이어로 구성되어있다고 아는 것을 넘어서서 각 뉴런과 레이어가 의미하는 바가 무엇인지를 직관적으로 알려주기 때문이다.
다만, Vanilla(Plain) Nueral Networks 는 Linear Regression의 확장이므로 Linear Regression 을 몰랐다면 따로 공부해보는 것을 권한다. 그러나 Linear Regression 을 모른 채 이 글을 본다고 하더라도 큰 문제는 없다.

Nueral Networks

뇌가 인식하는 “3”

Figure 1 — 28x28 이미지
위처럼 28x28 픽셀 밖에 안되는 저해상도 이미지임에도 불구하고 우리 뇌는 간단히 위 이미지를 3 이라고 인식한다.
Figure 2 — 같은 3이지만 다른 이미지들
또한, 각 픽셀들 밝기가 이미지마다 서로 다른데 우리 뇌는 모두 3이라고 인식한다.
왜 그런 것일까? 그 이유는 눈 안의 시지각 세포들이 빛 신호를 받아들이는 방식이 이미지 A를 볼 때와 이미지 B를 볼 때 서로 다르게 작용하기 때문이다.
하지만 뇌의 시각피질(visual cortex)은 이러한 차이에도 불구하고 두 이미지가 같은 개념을 나타낸다고 판단한다. 즉, 눈으로 받아들인 신호는 다르더라도 뇌를 거치면 의미적으로 같은 ‘3’으로 인식하게 되는 것이다.
Figure 3 — 우리가 원하는 프로그램 모습
여기서 우리의 목표는 위와 같이 컴퓨터로 28x28개의 입력값들을 받아 0에서 9범위의 정수 값 하나를 내놓는 프로그램을 만드는 것이다. 이는 Vanilla(Plain) Nueral Networks 만으로 구현할 수 있다.
Figure 4 — 전체적인 Nueral Networks 구조. 출처: Michael Nielsen
전체적인 신경망의 구조는 위와 같다. 뉴런은 동그라미로 표시되며, 세로로 배열된 각 그룹을 레이어라고 부른다. 이 레이어는 input layer, output layer, 그리고 이 둘 사이에 위치한 hidden layer들로 구성되어 있는 것을 볼 수 있다.

Neuron

Nueral Network 라는 이름에서 던질 수 있는 질문은 다음과 같다.
Nueral : 뉴런이 무엇인가?
Network : 그들을 어떻게 연결하는가?
Figure 5 — 0.0부터 1.0까지 뉴런 예시이다. 출처: 3blue1brown
여기서 뉴런0.0에서 1.0까지 하나의 숫자를 담는 존재이다. 각각의 값들은 픽셀의 밝기를 나타내며, 예를 들면 0.0은 검은 픽셀 그리고 1.0은 하얀 픽셀이다.

Layer

Input Layer

Figure 6 — 28x28 이미지. 출처: 3blue1brown
Figure 7 — flatten되어 784개의 뉴런이 있는 모습이다. 출처: 3blue1brown
기본적으로 Vanila Nueral Networks 는 이미지를 flatten 하여 input layer 를 구성한다. 위 이미지의 경우 28x28 이미지이므로 flatten 된다면 총 784개의 뉴런이 구성되는 것이다.
신경망 안에서 이러한 숫자들은 입력값 activation이라고 불리는데, 큰 입력값이 주어질수록 각각의 신경망이 더 큰정도로 활성화된다. 이에 대해 이해하기 위해서는 전체적인 신경망에서 여러 layer 를 살펴보고 어떻게 동작하는지를 알 필요가 있다.

Output Layer

출력층의 뉴런 개수는 클래스의 개수에 따라서 정해진다. 예를 들어 MNIST 데이터처럼 0~9까지의 라벨이 있을 경우 출력층의 뉴런 개수가 10개가 되는 것이다.
출력층의 각 뉴런 값은 해당 라벨일 확률을 나타낸다.
[0.1, 0.1, 0.5, 0.01, 0.09, 0.01, 0.09, 0.1, 0.01, 0.0]
Python
복사
예를 들어 위와 같이 Output Layer 로 구성된 경우 대상 이미지가 라벨 0일 확률이 0.1, 라벨 1일 확률은 0.1, 라벨 2일 확률은 0.5 인 것이다. 여기서는 0.5가 제일 높은 값으로 나왔기 때문에 숫자 2로 예측하게 된다.

Hidden Layers

Figure 8 — 2 hidden layers 와 16 neurons 로 구성된 신경망. 출처: 3blue1brown
입력층과 출력층 사이에 존재하는 layer 들을 hidden layers 라고 한다. 히든 레이어 개수와 각 히든 레이어의 뉴런 개수는 정해진 것이 없으며 개수를 늘릴 수도 줄일 수도 있다.

 일부는 강하게, 일부는 약하게

Figure 9 — 활성화가 전파되는 과정. 출처: 3blue1brown
신경망은 기본적으로 한 layer 의 활성화가 다음 layer 의 활성화를 유도하는 방식으로 작동한다. 위 GIF를 살펴보면, 784개의 뉴런으로 이루어진 input layer에 따라 첫 번째 hidden layer에서 활성화되는 뉴런이 결정되는 것을 볼 수 있다. 이어서 두 번째 hidden layer에서 활성화되는 뉴런이 결정되며, 마지막으로 가장 높은 값을 가지는 라벨 7에 해당하는 뉴런이 활성화된다.
즉, 신경망의 작동 방식의 핵심일부는 강하게 활성화하고 일부는 약하게 활성화함으로써 연결의 강도를 결정한다는 점이다.

pixeledgepatternlabel

Figure 10 — 신경망이 숫자 '9'를 인식하기 위해 여러 요소로 쪼갠 모습이다. 출처: 3blue1brown
신경망은 숫자 ‘9’를 어떻게 인식할까? 바로 Figure 10과 같이 여러 요소로 쪼갠다. 우선 9를 동그라미 o와 l로 쪼갠다. 거기서 더 나아가서 여러 하위 요소로 쪼개서 생각하는 것이다.

2nd Hidden Layer — “pattern

Figure 11 — 숫자 ‘9’, ‘8’ 이미지를 하위 구성 요소로 나눈 모습. 출처: 3blue1brown
두 번째 히든 레이어는 위와 같이 패턴(pattern)을 인식한다.
예를 들어, 숫자 9는 'o'와 'l'로 나뉘고, 숫자 8은 'o'와 'o'로 나뉜다. 이렇게 분해하면 서로 다른 숫자라도 하위 구성 요소 중 일부가 겹치는 경우가 있다. 예를 들어, 숫자 9와 8은 하위 구성 요소 중 노란색 'o'를 공통으로 가지고 있음을 알 수 있다.
Figure 12 — 숫자 9일 때 활성화 되는 하위 구성요소 모습. 출처: 3blue1brown
이러한 하위 구성 요소 하나가 하나의 뉴런을 나타낸다. 예를 들어, 'o'와 'l' 각각이 하나의 뉴런을 의미한다. 숫자 9는 'o'와 'l'에 해당하는 뉴런이 활성화되어야 한다.
따라서 각 레이어의 뉴런 개수를 정할 때, 하위 구성 요소가 몇 개 있어야 0부터 9까지의 숫자를 나타낼 수 있을지 상상해볼 수 있다. 하지만 이를 정확히 예측하는 것은 어렵다. 그래서 다양한 뉴런 개수를 설정해보고, 높은 정확도를 보이는 뉴런 개수를 찾아내는 방식을 사용한다.

1st hidden layer — “edge

Figure 13 — o의 하위 구성 요소. 출처: 3blue1brown
9를 하위 구성 요소인 ‘o’와 ‘l’로 나누는 것으로 끝나는 것이 아니다. 'o'와 'l' 또한 더 작은 하위 구성 요소로 나눌 수 있다. 예를 들어, Figure 13과 같이 쪼갤 수 있다.
Figure 14 — 우리가 최종적으로 원하는 신경망의 모습. 출처: 3blue1brown
따라서 Figure 14와 같이 숫자 9 이미지가 입력되면, 가장 작은 하위 요소들에서 적절한 뉴런들이 활성화된다. 이어서 이 작은 하위 요소들이 결합된 더 큰 하위 요소들에서 적절한 뉴런이 활성화되며, 마지막으로 우리가 원하는 라벨 9에 대한 확률이 높게 나타난다면, 우리가 의도한 신경망이 제대로 구현된 것이다.
pixeledgepatternlabel(number)pixel → edge → pattern → label (number)
즉, 픽셀을 모아 엣지를 만들고, 엣지를 모아 패턴을 형성하며, 패턴을 모아 라벨을 표현하는 메커니즘을 만드는 것이다.

 layer 사이의 connection 들은 어떻게 구현해야할까?

layer 사이의 connection 은 weight 와 bias 를 통해 구현이 되는데, 이를 통해서 정보가 이전 레이어에서 다음레이어로 전달되는 역할을 한다.

Weight

Figure 15 — weights. 출처: 3blue1brown
어떤 뉴런은 활성화되고 어떤 다른 뉴런은 비활성화되는 동작을 어떻게 구현할 수 있을까?
이는 이전 레이어의 각 뉴런에 weight를 곱함으로써 구현할 수 있다. 이때 weight 는 단순히 하나의 숫자에 불과하며, 이전 레이어의 뉴런이 다음 레이어의 새로운 뉴런과 어떠한 상관관계를 나타낸다.
만약 가중치가 양수라면, 이전 레이어의 뉴런 a?a_? 가 활성화된 상태에서 다음 layer의 뉴런 a?a'_?활성화된다. 반대로, 가중치가 음수라면, 이전 레이어의 뉴런 a?a_? 가 활성화된 상태에서 다음 layer의 뉴런 a?a'_?비성화된다.
참고로, 이전 레이어의 뉴런 a?a_? 가 꺼져 있는 상태(값이 0)라면, 가중치가 양수든 음수든 양의 가중치이든 결과는 0이 된다. 따라서 양의 가중치와 음의 가중치의 의미를 정의할 떄는 ‘켜져 있는 상태’ 를 전제로 한다.
Figure 16 — edge에 해당하는 부분은 양의 가중치로 설정하고, 그 테두리는 음의 가중치로 설정한다. 출처: 3blue1brown
이때 구성한 edge가 제대로 동작하는지 확인하기 위해, 위와 같이 3x8 크기의 엣지에 양의 가중치를 주고, edge 주변에는 음의 가중치를 주면 된다. 이렇게 설정하면 파란색 부분이 밝고 주변 픽셀들이 어두울 때, 그 합계(가중치 합)가 가장 크게 나타날 것이다. 만약 값이 크다면, 이는 7에 해당하는 edge라고 판단할 수 있는 것이다.
Figure 17 — 여러 이미지를 학습하면서 가중치는 다음과 같은 형태를 보인다. 출처: 3blue1brown
이때 우리는 숫자 9 이미지만 학습시키는 것이 아니라, 다양한 숫자 이미지와 같은 숫자 9라도 서로 다른 픽셀이 활성화된 이미지를 함께 학습시킨다. 따라서 가중치는 Figure 17과 같이 복잡하고 예측하기 어려운 형태로 나타날 수 있다. 하지만 최종적으로는 우리가 찾고자 하는 하위 요소들을 효과적으로 감지할 수 있는 뉴런일 것이라고 기대할 수 있다.

Bias

Bias뉴런이 활성화되기 위해 가중치의 합이 얼마나 더 높아야 하는지를 나타낸다.
w1a1+w2a2+w3a3+w4a4+...+wnan>10w_1a_1 + w_2a_2 + w_3a_3 + w_4a_4 + ... + w_na_n > 10
예를 들어 합이 10보다 클 때 그 뉴런이 활성화되기를 원한다고 가정해볼 수 있다.
w1a1+w2a2+w3a3+w4a4+...+wnan10w_1a_1 + w_2a_2 + w_3a_3 + w_4a_4 + ... + w_na_n - 10
합이 10보다 넘기를 원한다면, 위와 같이 가중치합에서 10을 빼주면 합이 10을 초과해야 뉴런이 활성화되도록 설정할 수 있다.

Activation Function

Figure 18 — (가중치합-bias) 값을 0과 1 사이의 값으로 바꿀 필요가 있다. 출처: 3blue1brown
그런데 가중치합은 Figure 18처럼 0과 1 사이의 값이 아니라 어떤 값이라도 나올 수 있다. 특히, 값이 무한대나 마이너스 무한대에 가까워질 경우, 계산이 불안정해진다. 따라서 가중치합을 0과 1 사이의 숫자로 변환해주는 함수를 사용하며, 이 함수를 활성화 함수(activation function)라고 한다.
Figure 19 — 활성화 함수 중 하나인 sigmoid 함수. 출처: 3blue1brown
활성화 함수 중에는 sigmoid 함수가 있다. sigmoid 함수는 입력된 어떤 값이라도 0과 1 사이의 값으로 변환해주는 함수이다. 매우 작은 값(음수)은 0에 가까운 값으로 변환되고, 매우 큰 값(양수)은 1에 가까운 값으로 변환된다. 또한, 0 주변에서는 값이 점진적으로 증가하는 특성을 가진다.

최종 형태

σ(w1a1+w2a2+w3a3+w4a4+...+wnanb)σ(w_1a_1 + w_2a_2 + w_3a_3 + w_4a_4 + ... + w_na_n - b)
최종적으로 위와 같이 식을 표현할 수 있다. 이전 레이어의 aa에 가중치를 곱한 후 이를 모두 합하고 bias를 더한다. 그 후, sigmoid 함수에 통과시켜 다음 레이어의 한 뉴런 값을 구할 수 있다. 이때, σσ는 sigmoid 기호를 의미한다.

weight 와 bias 총 개수

Figure 20 — 신경망 예시. 출처: 3blue1brown
2개의 히든 레이어에 뉴런이 16개라고 가정했을 때 weight 와 bias 총 개수를 세어보면 다음과 같다.
weight
bias
총 개수
입력층 - 1st layer
784 ×\times 16
16
1st layer - 2nd layer
16 ×\times 16
16
2nd layer - 출력층
16 ×\times 10
10
12960
42
13002
예를 들어, 입력층과 1st layer 에 연결된 weight개수는 입력층 뉴런 개수인 784에 1st layer 뉴런 개수인 16을 곱한 개수에 해당된다. 이는 1st layer의 첫번째 뉴런 값을 구하기 위해서는 784개 weight 가 필요하며, 1st layer 가 16개이기 때문에 총 784 ×\times 16 개가 필요한 것이다.
bias 는 2nd layer의 뉴런 개수가 16개이므로 16개 값이 필요한 것이다.

 Meanings of Learning

학습은 적절한 weight 와 bias 값들을 찾는 것이다.
Figure 21 — blackbox. 출처: 3blue1brown
만약 신경망이 알아서 학습하는 것이 아니라 우리가 직접 weight 와 bias 값들을 설정한다고 하면 어떨까. 상상만 해도 어려운 작업이라는 것을 알 수 있다. 하지만 network 를 그냥 blackbox 로 이해하는 것보다는 낫다. 그 이유는 네트워크가 예상했던 것처럼 작동하지 않을 때, 각각의 가중치와 bias 가 실제로 무엇을 의미하는지 조금이라도 생각해둔다면, 구조를 어떻게 바꿔야 개선시킬 수 있을지 생각해볼 수 있는 첫걸음이 되기 때문이다.

 Notation

σ(w1a1+w2a2+w3a3+w4a4+...+wnanb)σ(w_1a_1 + w_2a_2 + w_3a_3 + w_4a_4 + ... + w_na_n - b)
위 식은 한 뉴런에 대한 표현에 해당한다.
σ([w0,0w0,1...w0,nw1,0w1,1...w1,n............wk,0wk,1...wk,n][a0(0)a1(0)...an(0)]+[b0(0)b1(0)...bk(0)])=[a0(1)a1(1)...ak(1)]σ (\begin{bmatrix} w_{0,0} & w_{0,1} & ... & w_{0,n}\\ w_{1,0} & w_{1,1} & ... & w_{1,n}\\ ... & ... & ... & ... \\ w_{k,0} & w_{k,1} & ... & w_{k,n}\\ \end{bmatrix} \begin{bmatrix} a_0^{(0)} \\ a_1^{(0)} \\ ... \\a_n^{(0)} \\ \end{bmatrix} +\begin{bmatrix} b_0^{(0)} \\ b_1^{(0)} \\ ... \\b_k^{(0)} \\ \end{bmatrix}) = \begin{bmatrix} a_0^{(1)} \\ a_1^{(1)} \\ ... \\a_k^{(1)} \\ \end{bmatrix}
a(1)=σ(Wa(0)+b(0))a^{(1)}=σ(Wa^{(0)}+b^{(0)})
이를 위와 같이 선형대수 표현을 통해 여러 뉴런을 하나의 표현으로 간결히 나타낼 수 있다. 이를 step by step 으로 살펴보자.

위첨자(=레이어 번호)와 아래첨자(=뉴런 번호)

Figure 22 — 간결히 표현하기 전 식. 1st hidden layer 의 첫번째 뉴런 식에 해당한다. 출처: 3blue1brown
우선 선형대수 표현으로 간결히 표현하기 전에 앞서서, 아래첨자와 위첨자를 명확히 나타내야 한다.
위첨자레이어 번호를 의미한다. 예를 들어, (0)(0) 은 input layer 번호를 의미한다. 아래첨자뉴런 번호에 해당한다. 예를 들어 a0a_0 은 첫번째 뉴런을 의미한다.

weight · activation

Figure 23 — input layer 와 1st hidden layer 간의 연결 출처: 3blue1brown
[a0(0)a1(0)...an(0)]\begin{bmatrix} a_0^{(0)} \\ a_1^{(0)} \\ ... \\a_n^{(0)} \\ \end{bmatrix}
Figure 23과 같이 network 가 구성되어 있다고 했을 때 입력(activatinn)층의 뉴런들을 다 모아서 열벡터로 나타내면 위 벡터와 같다.
[w0,0w0,1...w0,nw1,0w1,1...w1,n............wk,0wk,1...wk,n]\begin{bmatrix} w_{0,0} & w_{0,1} & ... & w_{0,n}\\ w_{1,0} & w_{1,1} & ... & w_{1,n}\\ ... & ... & ... & ... \\ w_{k,0} & w_{k,1} & ... & w_{k,n}\\ \end{bmatrix}
weight 또한 모든 값들을 모아서 위와 같은 (k,n)(k, n) 크기를 가진 행렬 형태로 나타낼 수 있다. 이때, 행벡터는 이전 레이어의 모든 뉴런과 다음 레이어의 특정 뉴런 사이의 연결을 의미한다. 열벡터는 이전 레이어의 특정 뉴런과 다음 레이어의 모든 뉴런 사이의 연결을 의미한다.
예를 들어, w0,nw_{0,n} 는 input layer의 n번째 뉴런과 1st hidden layer의 0번째 뉴런 사이의 연결을 의미한다.
[w0,0w0,1...w0,nw1,0w1,1...w1,n............wk,0wk,1...wk,n][a0(0)a1(0)...an(0)]=[a0(1)a1(1)...ak(1)]\begin{bmatrix} w_{0,0} & w_{0,1} & ... & w_{0,n}\\ w_{1,0} & w_{1,1} & ... & w_{1,n}\\ ... & ... & ... & ... \\ w_{k,0} & w_{k,1} & ... & w_{k,n}\\ \end{bmatrix} \begin{bmatrix} a_0^{(0)} \\ a_1^{(0)} \\ ... \\a_n^{(0)} \\ \end{bmatrix} = \begin{bmatrix} a_0^{(1)} \\ a_1^{(1)} \\ ... \\a_k^{(1)} \\ \end{bmatrix}
위와 같이 가중치합을 행렬과 벡터끼리의 곱셈으로 간결하게 표현할 수 있다. 위 경우 (k,n)(k, n) 사이즈를 가진 weight 행렬 WW 에 activation 벡터 aa 를 곱하는 것이다.
다음 레이어의 0번째 뉴런값을 하이라이트한 부분.
이때, 다음 레이어의 0번째 뉴런 a0(1)a_0^{(1)} 은 노란색으로 하이라이트한 부분을 가중치합한 것과 같다.

weight · activation + bias

[b0(0)b1(0)...bk(0)]\begin{bmatrix} b_0^{(0)} \\ b_1^{(0)} \\ ... \\b_k^{(0)} \\ \end{bmatrix}
bias 또한 독립적으로 각각의 값을 더하는 것으로 표현하는 대신 전부 모아서 열벡터로 표현할 수 있다. 이때 kk 는 다음 레이어의 뉴런 개수를 의미한다.
[w0,0w0,1...w0,nw1,0w1,1...w1,n............wk,0wk,1...wk,n][a0(0)a1(0)...an(0)]+[b0(0)b1(0)...bk(0)]=[a0(1)a1(1)...ak(1)]\begin{bmatrix} w_{0,0} & w_{0,1} & ... & w_{0,n}\\ w_{1,0} & w_{1,1} & ... & w_{1,n}\\ ... & ... & ... & ... \\ w_{k,0} & w_{k,1} & ... & w_{k,n}\\ \end{bmatrix} \begin{bmatrix} a_0^{(0)} \\ a_1^{(0)} \\ ... \\a_n^{(0)} \\ \end{bmatrix} +\begin{bmatrix} b_0^{(0)} \\ b_1^{(0)} \\ ... \\b_k^{(0)} \\ \end{bmatrix} = \begin{bmatrix} a_0^{(1)} \\ a_1^{(1)} \\ ... \\a_k^{(1)} \\ \end{bmatrix}
가중치합에 bias 벡터를 더한 형태는 위와 같다.
다음 레이어의 0번째 뉴런값을 하이라이트한 부분.
뉴런 a0(1)a_0^{(1)} 은 노란색으로 하이라이트한 부분을 가중치합한 것에다가 bias 를 더한 것으로 다시 정의할 수 있다.

sigmoid(weight · activation + bias)

σ([w0,0w0,1...w0,nw1,0w1,1...w1,n............wk,0wk,1...wk,n][a0(0)a1(0)...an(0)]+[b0(0)b1(0)...bk(0)])=[a0(1)a1(1)...ak(1)]σ (\begin{bmatrix} w_{0,0} & w_{0,1} & ... & w_{0,n}\\ w_{1,0} & w_{1,1} & ... & w_{1,n}\\ ... & ... & ... & ... \\ w_{k,0} & w_{k,1} & ... & w_{k,n}\\ \end{bmatrix} \begin{bmatrix} a_0^{(0)} \\ a_1^{(0)} \\ ... \\a_n^{(0)} \\ \end{bmatrix} +\begin{bmatrix} b_0^{(0)} \\ b_1^{(0)} \\ ... \\b_k^{(0)} \\ \end{bmatrix}) = \begin{bmatrix} a_0^{(1)} \\ a_1^{(1)} \\ ... \\a_k^{(1)} \\ \end{bmatrix}
Wa+bWa+b 에서 끝이 아니라 sigmoid 와 같은 activation function 까지 거쳐야 한다. 이를 위와 같이 표현할 수 있다.
σ([xyz])=[σ(x)σ(y)σ(z)]σ( \begin{bmatrix} x \\ y \\ z \end{bmatrix}) = \begin{bmatrix} σ(x) \\ σ(y) \\ σ(z) \end{bmatrix}
이때, 원소 값이 x, y, z 인 열벡터에 sigmoid 함수를 취한 것은 각 원소 값에 sigmoid 를 취한 것과 같다. 따라서, 각 뉴런에 대해서 sigmoid 를 취한 것을 잘 표현한다.
최종적으로, 가중치 행렬과 벡터들을 각각 기호로 나타내면 다음과 같다.
a(1)=σ(Wa(0)+b(0))a^{(1)}=σ(Wa^{(0)}+b^{(0)})

Conclusion

Neuron — 한 숫자가 아니라 ‘Function’ : σ(Wa+b)σ(Wa+b) Network — ‘Function’ : f(a0,...,a783)=[y0 ... y9].Tf(a_0, ..., a_{783})= [y_0\ ...\ y_9].T
Loading PDF…
정리본

Reference