자 이제까지 데이터를 입력받으면 [1 x 10] 확률 벡터를 만들어 내는 계산을 완료했습니다.
이를 feed forward라 부릅니다. 문제를 풀어본 상태라고 이해하시면 됩니다.
이젠 문제를 맞힐 수 있도록 혼내줄 겁니다. Back propagation!
feed_forward의 결과가 뭐였죠?! 다음과 같습니다.
Cost_function = cross_entropy(Output_layer, true_Label)
= cross_entropy(softmax(np.dot(ReLU(np.dot(Input_layer , W_0)) , W_1)), true_Label)
이 길고 복잡해 보이는 식을 어떻게 건드려야 하나 두렵겠지만 어쨌든 하나씩 풀어가야 됩니다.
지난 포스팅에서 Cost function으로 쓰인 cross entropy함수의 의미가 뭐라고 했었죠?
두 집합의 다른 정도!입니다.
우리는 두 집합이 동일해지길 원합니다. 그러므로 Cost function으로 쓰인 cross entropy 0으로 만들어 주면 됩니다.
다 맞춰서 0이 되도록! 유도를 해 가는 과정이기 때문에 'cross entropy를 최소화한다'라고 생각하시면 됩니다.
근데 우리가 뭘 바꿀 수 있나요? 뭘 바꾸면 Cost_function의 결괏값이 달라질까요?
위에 코드 식을 보시면 바꿀수 있는 게 \(W^0, W^1\) 이거 두 개밖에 없습니다. 사이즈를 유지한 채로 행렬 내부의 값들을 바꿔줘야 합니다.
변화!
Cost의 변화를 알기 위해선 Cost값을 미분해보면 됩니다. 뭐에 대해 미분하면 될까요
우선 \(Cost\) 함수를 먼저 풀어 써보겠습니다.
분해는 조립의 역순이기 때문에 \(W^1\) 에 대해서 먼저 미분하도록 하겠습니다
식은 \(\frac {\partial Cost}{\partial W^1} \)입니다.
뭐 중간 단계들은 복잡하고 이런저런 스킬들이 필요하지만!
최종 결과만 이해하시면 됩니다. 생각보다 쉬운 모습...입니다...ㅎ (어렵긴 한데 손으로 써보시면 이해되실 겁니다.....ㅎ)
너무 힘드셨죠..ㅎ
다음 포스팅에서 \(W^0\) 에 대한 미분도 계산해보도록 합시다..
'Have Done > MLP' 카테고리의 다른 글
MLP from Scratch with Numpy [7 / 7] - 전체 코딩의 흐름 (0) | 2022.01.06 |
---|---|
MLP from Scratch with Numpy [6 / 7] - backpropagation2 (0) | 2022.01.06 |
MLP from Scratch with Numpy [4 / 7] - feed forward 코딩 흐름 (0) | 2022.01.05 |
MLP from Scratch with Numpy [3 / 7] - Activation (0) | 2022.01.04 |
MLP from Scratch with Numpy [2 / 7] - feed forward2 (0) | 2022.01.03 |
댓글