래빗 챌린지 - 심층 학습 Day1 Section5 오차 역전파법
0. 개요
본 기사는 일본 딥 러닝 협회 인정의 강좌 프로그램인 「래빗 챌린지」가 제공하고 있는 과목의 하나인 심층 학습의 리포트이다.
기사 타이틀에 기재된 바와 같이, Day1 Section5 오차 역전파법에 대해서 이하에 정리한다.
1. 오차 역전파법
산출 된 오차를 출력층 측으로부터 차례로 미분하고, 전층으로 전파시킨다.
최소한의 계산으로 각 파라미터의 미분값을 해석적으로 계산한다.
즉, 순전파에 의해 산출된 오차(얼마나 목적과 어긋나는가)를 미분하여 앞으로 되돌려 가는 것으로 가중치와 바이어스를 수정해 간다.
1.1. 계산 흐름
입력 레이어, 중간 레이어 하나, 출력 레이어의 3 레이어 신경망의 경우, 중간 레이어까지의 계산은 다음과 같습니다 (중간 레이어에서 입력 레이어로도 동일한 흐름).
1. 오차 함수 (제곱 오차) $E$를 $y$에 대한 미분.
목적 변수와의 어긋남을 보는 오차의 계산에서 활성화 함수로 되돌아가는 부분.
\frac{\partial E}{\partial y}=\frac{\partial}{\partial y}\frac{1}{2}||y-d||^2=y-d
2. 이번에는 항등 함수를 활성화 함수로 사양하고 있다(그대로 출력). $y(u)$ 를 $u$ 에 대해 미분.
활성화 함수에서 출력 레이어로의 부분.
\frac{\partial y(u)}{\partial u}=\frac{\partial u}{\partial u}=1
3. 중간층의 출력으로부터 얻어진 입력 $z$를 바탕으로 $w^{(I)}z^{(I-1)}+b^{(I)}$로 산출한 $u$를 $w $에 대한 미분.
출력 레이어에서 입력으로의 부분.
\frac{\partial u}{\partial w_{ji}}=\frac{\partial}{\partial w_{ji}}(w^{(I)}z^{(I-1)}+b^{(I)})=\frac{\partial}{\partial w_{ji}}
\left(
\left[
\begin{array}{rrrrr}
w_{11}z_{i} & +...+ & w_{1i}z_{i} & +...+ & w_{1I}z_{I} \\
& & \vdots & & \\
w_{j1}z_{i} & +...+ & w_{ji}z_{i} & +...+ & w_{jI}z_{I} \\
& & \vdots & & \\
w_{J1}z_{i} & +...+ & w_{Ji}z_{i} & +...+ & w_{JI}z_{I} \\
\end{array}
\right]
+
\left[
\begin{array}{r}
b_{1} \\
\vdots \\
b_{j} \\
\vdots \\
b_{J} \\
\end{array}
\right]
\right)
=
\left[
\begin{array}{r}
0 \\
\vdots \\
z_{j} \\
\vdots \\
0 \\
\end{array}
\right]
4. 미분 연쇄율
\frac{\partial E)}{\partial w_{ji}^{(2)}}=\frac{\partial E}{\partial y}\frac{\partial y}{\partial u}\frac{\partial u}{\partial w_{ji}^{(2)}}=
(y-d)
\left[
\begin{array}{r}
0 \\
\vdots \\
z_{j} \\
\vdots \\
0 \\
\end{array}
\right]
=(y_{i}-d_{i})z_{i}
미분의 연쇄율에 의해 1~3까지의 계산을 곱함으로써 오차 함수 $E$를 가중치 $w$로 미분한 결과를 얻을 수 있다.
$w$ (2)는 두 번째 레이어의 중간 레이어를 나타냅니다.
2. 확인 테스트
2.1. 확인 테스트 1
오차 역전파법에서는 불필요한 재귀적 처리를 피할 수 있다.
"1_3_stochastic_gradient_descent.ipynb"에서 이미 한 계산 결과를 보유한 소스 코드를 추출하라.
답변:
# 誤差逆伝播
def backward(x, d, z1, y):
# print("\n##### 誤差逆伝播開始 #####")
grad = {}
W1, W2 = network['W1'], network['W2']
b1, b2 = network['b1'], network['b2']
# 出力層でのデルタ(誤差関数を微分したもの)
delta2 = functions.d_mean_squared_error(d, y)
# b2の勾配
grad['b2'] = np.sum(delta2, axis=0)
# W2の勾配
grad['W2'] = np.dot(z1.T, delta2)
# 中間層でのデルタ
#delta1 = np.dot(delta2, W2.T) * functions.d_relu(z1)
## 試してみよう
# 誤差関数を微分した結果を前の層の計算にも使って戻していっている。
delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)
delta1 = delta1[np.newaxis, :]
# b1の勾配
grad['b1'] = np.sum(delta1, axis=0)
x = x[np.newaxis, :]
# W1の勾配
grad['W1'] = np.dot(x.T, delta1)
# print_vec("偏微分_重み1", grad["W1"])
# print_vec("偏微分_重み2", grad["W2"])
# print_vec("偏微分_バイアス1", grad["b1"])
# print_vec("偏微分_バイアス2", grad["b2"])
return grad
2.2. 확인 테스트 2
\frac{\partial E}{\partial y}
상기 식에 해당하는 "1_3_stochastic_gradient_descent.ipynb"의 소스 코드는 다음과 같다.
delta2 = functions.d_mean_squared_error(d, y)
다음 두 수식에 해당하는 소스 코드를 찾으십시오.
보충: z1
z1, y = forward(network, x)
수식 1:
\frac{\partial E}{\partial y}\frac{\partial y}{\partial u}
답변 1:
delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)
※이 소스 코드에서는 활성화 함수에 시그모이드 함수가 사용되고 있다.
수식 2:
\frac{\partial E}{\partial y}\frac{\partial y}{\partial u}\frac{\partial u}{\partial w_{ji}^{(2)}}
답변 2:
grad['W1'] = np.dot(x.T, delta1)
X. 래빗 챌린지란?
래빗 챌린지란, 일본 딥 러닝 협회 인정의 강좌 프로그램의 하나.
E 자격을 수험하기 위해서는 이 래빗 챌린지 등, 어느 하나의 강좌 프로그램을 수료해야 한다.
래빗 챌린지의 특징은 "현장에서 파괴가 효과가 있는 딥 러닝 강좌"의 통학 강좌 녹화 비디오를 편집한 교재를 사용한 자습 스타일이라는 점.
서포트는 다른 강좌보다 적고, 수신이 아니라 자주적으로 배워가는 자세가 아니면 진행되지 않지만, 그만큼, 다른 강좌에 비하면 저렴하고, 손이 내기 쉽다.
어느 정도 지식이 있는 사람, 자력으로 노력한다고 하는 녀석이 있는 사람 전용이 아닐까 느낀다.
Reference
이 문제에 관하여(래빗 챌린지 - 심층 학습 Day1 Section5 오차 역전파법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Helvetica822/items/bf655aae5016c695220c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
산출 된 오차를 출력층 측으로부터 차례로 미분하고, 전층으로 전파시킨다.
최소한의 계산으로 각 파라미터의 미분값을 해석적으로 계산한다.
즉, 순전파에 의해 산출된 오차(얼마나 목적과 어긋나는가)를 미분하여 앞으로 되돌려 가는 것으로 가중치와 바이어스를 수정해 간다.
1.1. 계산 흐름
입력 레이어, 중간 레이어 하나, 출력 레이어의 3 레이어 신경망의 경우, 중간 레이어까지의 계산은 다음과 같습니다 (중간 레이어에서 입력 레이어로도 동일한 흐름).
1. 오차 함수 (제곱 오차) $E$를 $y$에 대한 미분.
목적 변수와의 어긋남을 보는 오차의 계산에서 활성화 함수로 되돌아가는 부분.
\frac{\partial E}{\partial y}=\frac{\partial}{\partial y}\frac{1}{2}||y-d||^2=y-d
2. 이번에는 항등 함수를 활성화 함수로 사양하고 있다(그대로 출력). $y(u)$ 를 $u$ 에 대해 미분.
활성화 함수에서 출력 레이어로의 부분.
\frac{\partial y(u)}{\partial u}=\frac{\partial u}{\partial u}=1
3. 중간층의 출력으로부터 얻어진 입력 $z$를 바탕으로 $w^{(I)}z^{(I-1)}+b^{(I)}$로 산출한 $u$를 $w $에 대한 미분.
출력 레이어에서 입력으로의 부분.
\frac{\partial u}{\partial w_{ji}}=\frac{\partial}{\partial w_{ji}}(w^{(I)}z^{(I-1)}+b^{(I)})=\frac{\partial}{\partial w_{ji}}
\left(
\left[
\begin{array}{rrrrr}
w_{11}z_{i} & +...+ & w_{1i}z_{i} & +...+ & w_{1I}z_{I} \\
& & \vdots & & \\
w_{j1}z_{i} & +...+ & w_{ji}z_{i} & +...+ & w_{jI}z_{I} \\
& & \vdots & & \\
w_{J1}z_{i} & +...+ & w_{Ji}z_{i} & +...+ & w_{JI}z_{I} \\
\end{array}
\right]
+
\left[
\begin{array}{r}
b_{1} \\
\vdots \\
b_{j} \\
\vdots \\
b_{J} \\
\end{array}
\right]
\right)
=
\left[
\begin{array}{r}
0 \\
\vdots \\
z_{j} \\
\vdots \\
0 \\
\end{array}
\right]
4. 미분 연쇄율
\frac{\partial E)}{\partial w_{ji}^{(2)}}=\frac{\partial E}{\partial y}\frac{\partial y}{\partial u}\frac{\partial u}{\partial w_{ji}^{(2)}}=
(y-d)
\left[
\begin{array}{r}
0 \\
\vdots \\
z_{j} \\
\vdots \\
0 \\
\end{array}
\right]
=(y_{i}-d_{i})z_{i}
미분의 연쇄율에 의해 1~3까지의 계산을 곱함으로써 오차 함수 $E$를 가중치 $w$로 미분한 결과를 얻을 수 있다.
$w$ (2)는 두 번째 레이어의 중간 레이어를 나타냅니다.
2. 확인 테스트
2.1. 확인 테스트 1
오차 역전파법에서는 불필요한 재귀적 처리를 피할 수 있다.
"1_3_stochastic_gradient_descent.ipynb"에서 이미 한 계산 결과를 보유한 소스 코드를 추출하라.
답변:
# 誤差逆伝播
def backward(x, d, z1, y):
# print("\n##### 誤差逆伝播開始 #####")
grad = {}
W1, W2 = network['W1'], network['W2']
b1, b2 = network['b1'], network['b2']
# 出力層でのデルタ(誤差関数を微分したもの)
delta2 = functions.d_mean_squared_error(d, y)
# b2の勾配
grad['b2'] = np.sum(delta2, axis=0)
# W2の勾配
grad['W2'] = np.dot(z1.T, delta2)
# 中間層でのデルタ
#delta1 = np.dot(delta2, W2.T) * functions.d_relu(z1)
## 試してみよう
# 誤差関数を微分した結果を前の層の計算にも使って戻していっている。
delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)
delta1 = delta1[np.newaxis, :]
# b1の勾配
grad['b1'] = np.sum(delta1, axis=0)
x = x[np.newaxis, :]
# W1の勾配
grad['W1'] = np.dot(x.T, delta1)
# print_vec("偏微分_重み1", grad["W1"])
# print_vec("偏微分_重み2", grad["W2"])
# print_vec("偏微分_バイアス1", grad["b1"])
# print_vec("偏微分_バイアス2", grad["b2"])
return grad
2.2. 확인 테스트 2
\frac{\partial E}{\partial y}
상기 식에 해당하는 "1_3_stochastic_gradient_descent.ipynb"의 소스 코드는 다음과 같다.
delta2 = functions.d_mean_squared_error(d, y)
다음 두 수식에 해당하는 소스 코드를 찾으십시오.
보충: z1
z1, y = forward(network, x)
수식 1:
\frac{\partial E}{\partial y}\frac{\partial y}{\partial u}
답변 1:
delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)
※이 소스 코드에서는 활성화 함수에 시그모이드 함수가 사용되고 있다.
수식 2:
\frac{\partial E}{\partial y}\frac{\partial y}{\partial u}\frac{\partial u}{\partial w_{ji}^{(2)}}
답변 2:
grad['W1'] = np.dot(x.T, delta1)
X. 래빗 챌린지란?
래빗 챌린지란, 일본 딥 러닝 협회 인정의 강좌 프로그램의 하나.
E 자격을 수험하기 위해서는 이 래빗 챌린지 등, 어느 하나의 강좌 프로그램을 수료해야 한다.
래빗 챌린지의 특징은 "현장에서 파괴가 효과가 있는 딥 러닝 강좌"의 통학 강좌 녹화 비디오를 편집한 교재를 사용한 자습 스타일이라는 점.
서포트는 다른 강좌보다 적고, 수신이 아니라 자주적으로 배워가는 자세가 아니면 진행되지 않지만, 그만큼, 다른 강좌에 비하면 저렴하고, 손이 내기 쉽다.
어느 정도 지식이 있는 사람, 자력으로 노력한다고 하는 녀석이 있는 사람 전용이 아닐까 느낀다.
Reference
이 문제에 관하여(래빗 챌린지 - 심층 학습 Day1 Section5 오차 역전파법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Helvetica822/items/bf655aae5016c695220c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# 誤差逆伝播
def backward(x, d, z1, y):
# print("\n##### 誤差逆伝播開始 #####")
grad = {}
W1, W2 = network['W1'], network['W2']
b1, b2 = network['b1'], network['b2']
# 出力層でのデルタ(誤差関数を微分したもの)
delta2 = functions.d_mean_squared_error(d, y)
# b2の勾配
grad['b2'] = np.sum(delta2, axis=0)
# W2の勾配
grad['W2'] = np.dot(z1.T, delta2)
# 中間層でのデルタ
#delta1 = np.dot(delta2, W2.T) * functions.d_relu(z1)
## 試してみよう
# 誤差関数を微分した結果を前の層の計算にも使って戻していっている。
delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)
delta1 = delta1[np.newaxis, :]
# b1の勾配
grad['b1'] = np.sum(delta1, axis=0)
x = x[np.newaxis, :]
# W1の勾配
grad['W1'] = np.dot(x.T, delta1)
# print_vec("偏微分_重み1", grad["W1"])
# print_vec("偏微分_重み2", grad["W2"])
# print_vec("偏微分_バイアス1", grad["b1"])
# print_vec("偏微分_バイアス2", grad["b2"])
return grad
\frac{\partial E}{\partial y}
delta2 = functions.d_mean_squared_error(d, y)
z1, y = forward(network, x)
\frac{\partial E}{\partial y}\frac{\partial y}{\partial u}
delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)
\frac{\partial E}{\partial y}\frac{\partial y}{\partial u}\frac{\partial u}{\partial w_{ji}^{(2)}}
grad['W1'] = np.dot(x.T, delta1)
래빗 챌린지란, 일본 딥 러닝 협회 인정의 강좌 프로그램의 하나.
E 자격을 수험하기 위해서는 이 래빗 챌린지 등, 어느 하나의 강좌 프로그램을 수료해야 한다.
래빗 챌린지의 특징은 "현장에서 파괴가 효과가 있는 딥 러닝 강좌"의 통학 강좌 녹화 비디오를 편집한 교재를 사용한 자습 스타일이라는 점.
서포트는 다른 강좌보다 적고, 수신이 아니라 자주적으로 배워가는 자세가 아니면 진행되지 않지만, 그만큼, 다른 강좌에 비하면 저렴하고, 손이 내기 쉽다.
어느 정도 지식이 있는 사람, 자력으로 노력한다고 하는 녀석이 있는 사람 전용이 아닐까 느낀다.
Reference
이 문제에 관하여(래빗 챌린지 - 심층 학습 Day1 Section5 오차 역전파법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Helvetica822/items/bf655aae5016c695220c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)