@Chapter
06. Implementing a neural net(NN)

@
딥러닝에서 다뤄지는 개념 중 하나가 신경망이라는 부분이다.

인공지능
머신러닝
딥러닝
신경망

신경망은 신경이라고 생각해도 좋지만 함수라 생각하는게 더 편하다. 입력과 출력을 매개하는 cell을 function으로
보면 됨. 이것을 activation function이라고 부른다. activation function 으로 sigmoid function을 사용한다.

DNN
activation function : sigmoid

CNN

RNN

@
왜 신경망이 사람 신경을 모델링 했다고 하지?

예를들어보자. 통각신경의 경우, 살살치면 통각(아픈느낌, 촉각이랑 다름.)을 못느낀다.

일정세기 이상되면 통각을 느끼기 시작한다. 이 모델을 machine learning 에서는 activation function으로 구현한
것이다.

@
activation function(sigmoid function)에 x_{1}, x_{2}, x_{3} 가 input data로 들어간다고 해보자. 그러면
activation function(sigmoid function)은 y를 출력할 것이다.

sigmoid function의 정의에 따라,
$y = \frac{1}{1 + e^{-(x_{1} + x_{2} + x_{3})}} $

@
그냥 데이터만 입력시키면 재미가 없다. 이전의 linear regression과 logistic regression 모델에서 각각의
hypothesis function에서 weight 를 업데이트 해줬었다. sigmoid function 특성에 따라 weight가 달라지는거고
weight 가 달라지면서 sigmoid function 의 특성이 변했었다. sigmoid의 특성을 결정짓는 요소중 가장 중요한게
weight라고 얘기했다.

신경망에서도 결국 우리가 원하는건 input data를 넣었을 때 학습된 알고리즘(weight들이 업데이트되어 fitting된
hypothesis function)을 통과해 input data를 알맞은 카테고리로 classification하는것이다. classification을
할수 있는 알고리즘을 갖기위해서는 트레이닝 데이터를 통해 학습을 시켜 sigmoid function을 fitting을 해야한다.

그러니까 sigmoid function의 모양을 변화시켜줘야하니까 weight를 하나씩 곱해주자.

@
$x_{1}w_{1}, x_{2}w_{2}, x_{3}w_{3}$

input data에 weight를 곱해서 sigmoid function 에 넣는다.

$y = \frac{1}{1 + e^-{(x_{1}w_{1} + x_{2}w_{2} + x_{3}w_{3})}} $

출력값 y의 범위는 $0 \leq y \leq 1$ 이다.

@
신경하나를 봤으니까 이러한 신경을 여러개를 사용해보자.
예를 들어, 신경 3개(hidden layer)가 input layer 에서 input data를 받아서 hidden layer 나온 output을 다음
신경들 2개(output layer)에 전달한다. output layer에 있는 2개의 신경은 각각 $y_{1}, y_{2}$ 를 output 한다.

@
위의 그래프처럼 많은 신경망을 x와 w의 곱과 합으로 다 표현하기 힘들다.
손쉽게 표현할수있는 기가막힌 좋은 방법이 있다. 행렬과 벡터를 이용하는 것이다.

신경망은 행렬 연산의 연속이다 라고 이해해도 무방할정도다.

input layer, hidden layer, output layer.

위의 layer 들을 행렬과 벡터로 표현할 수 있다.

input layer
$\begin{bmatrix} x_{1}&x_{2}&x_{3} \end{bmatrix}$

hidden layer
$\begin{bmatrix} h_{1}&h_{2}&h_{3} \end{bmatrix}$

output layer
$\begin{bmatrix} y_{1}&y_{2} \end{bmatrix}$

벡터를 표현해줬으니까 이제 행렬로 weight를 표현해 줄수 있다.

아까도 봤지만 각각의 weight들 $w_{1}, w_{2}, w_{3}$ 들이 각각의 input data $x_{1}, x_{2}, x_{3}$에 아래와
같이 곱해진 후 그 합이 hidden layer에 있는 sigmoid function을 activation function으로 하는 하나의 셀 $h_{1}
$에 들어갔다.
$h_{1} = \frac{1}{1 + e^-{(x_{1}w_{1} + x_{2}w_{2} + x_{3}w_{3})}} $

위의 수식에서 $x_{1}w_{1} + x_{2}w_{2} + x_{3}w_{3}$ 부분을 고찰해보면 사실 아래와 같은 행렬곱이다.
$x_{1}w_{1} + x_{2}w_{2} + x_{3}w_{3}$
$= \begin{bmatrix} w_{1}&w_{2}&w_{3} \end{bmatrix} \begin{bmatrix} x_{1}\\x_{2}\\x_{3} \end{bmatrix}$

@
hidden layer에 있는 3개의 신경에서 나오는 output $h_{1}, h_{2}, h_{3}$ 를 행렬을 이용해서 모두 표현해보자.

$= \begin{bmatrix} w_{1}&w_{2}&w_{3} \end{bmatrix} \begin{bmatrix} x_{1}\\x_{2}\\x_{3} \end{bmatrix}
\rightarrow$ cell1(sigmoid function as an activation function) $\rightarrow h_{1}$

$= \begin{bmatrix} w_{1}&w_{2}&w_{3} \end{bmatrix} \begin{bmatrix} x_{1}\\x_{2}\\x_{3} \end{bmatrix}
\rightarrow$ cell2(sigmoid function as an activation function) $\rightarrow h_{2}$

$= \begin{bmatrix} w_{1}&w_{2}&w_{3} \end{bmatrix} \begin{bmatrix} x_{1}\\x_{2}\\x_{3} \end{bmatrix}
\rightarrow$ cell3(sigmoid function as an activation function) $\rightarrow h_{3}$

세개의 cell 에서 나온 output h들을 행렬로 묶어서 표현하면,
$\begin{bmatrix} h_{1}\\h_{2}\\h_{3} \end{bmatrix}$


위의 3개 cell의 시도를 따로 하지 말고 행렬을 만들어서 해보자.
$\begin{bmatrix} w_{11}&w_{12}&w_{13} \\ w_{21}&w_{22}&w_{23} \\ w_{31}&w_{32}&w_{33} \end{bmatrix}
\begin{bmatrix} x_{1}\\x_{2}\\x_{3} \end{bmatrix} = \begin{bmatrix} a\\b\\c \end{bmatrix} $
a, b, c는 임의의 실수인 행렬이 나오게 된다. 이것을 cell1에 통과시키면 sigmoid function as an activation
function 으로 인해 각각의 원소가 [0,1]인 $\begin{bmatrix} h_{1}\\h_{2}\\h_{3} \end{bmatrix}$ 행렬이
나온다.
@
hidden layer 에서 output layer로 처리하는 단계를 해보자.

$\begin{bmatrix} w_{11}&w_{12}&w_{13} \\ w_{21}&w_{22}&w_{23} \\ w_{31}&w_{32}&w_{33} \end{bmatrix}
\begin{bmatrix} h_{1}\\h_{2}\\h_{3} \end{bmatrix} = \begin{bmatrix} a\\b\\c \end{bmatrix} $
a, b, c는 임의의 실수인 행렬이 나오게 된다. 이것을 cell1 in output layer 에 통과시키면 sigmoid function as
an activation function 으로 인해 각각의 원소가 [0,1]인 $\begin{bmatrix} y_{1}\\y_{2}\\y_{3} \end{bmatrix}
$ 행렬이 나온다.

gradient descent로 w 값들을 바꿔가며 각각의 sigmoid function as an activation function 을 fitting 한다.


@
수식으로 최종적 정리.

weight 행렬 $\begin{bmatrix} w_{1}&w_{2} \end{bmatrix}$
input data 행렬 $\begin{bmatrix} x_{1}\\x_{2} \end{bmatrix}$
sigmoid function g as an activation function in the cell.
output layer Y and its output y.
hidden layer H and its output h.

$h = g(WX)$
$y = g(WH)$

@
weight in input layer 를 알고 input data x 를 알고있을 때 weight와 input data를 곱해서 sigmoid function에
넣고 나온 h를 다시 weight in output layer 랑 곱해서 나온걸 sigmoid function in output layer 에 넣고 ouput
layer에서 y 까지 나오는 과정을 신경망에서는 순전파(forward propagation ) 이라고 한다.

@
NN을 구성하는 sigmoid function 으로 이루어진 cell 들의 알고리즘을 학습시키기 위해서, 즉, hypothesis
function으로 부터 발생하는 cost를 최소로 만들어주는 weight들을 sigmoid function 에 설정하기 위해서는 역전파
(back propagation) 을 해야한다.
순전파를 한다는것은 데이터 x를 입력시켰을때 내가 원하는 아웃풋을 예측하는, 예측값 (y') 을 얻어내기 위한
과정이다.
순전파를 통해 얻어진 예측값 (y') 을 가지고, 실제값과 얼마나 다른지, hypothesis function 이 얼마나 high
cost를 가지는지 이걸 측정을 해서 역으로 반대로 gradient descent를 해가면서 weight를 업데이트시키는 과정을
back propagation 이라고 한다. 이건 수식이 좀 복잡하다. 다음 동영상에서.