[리뷰] 신경 네트워크와 심층 학습 CH.2~역방향 전파 메커니즘~
14523 단어 DeepLearning
신경 네트워크가 심층 학습으로 진화하는 과정
② 학습 배경
자습의 일환으로 지금까지 심층학습을 배웠지만 어떤 문제에서 비롯된 수법의 원점으로 돌아갈 필요가 있다고 생각합니다.
③ 학습 방법
나는 이 링크에 실린 작가의 훌륭한 자원을 빌려 썼다
http://nnadl-ja.github.io/nnadl_site_ja/chap2.html
④ 기대되는 성과
심층 학습이 생기는 계기를 잡아 근본적으로 문제를 해결하는 새로운 방법을 찾다
CH.1여기 있습니다.
프로비저닝
앞좌석
역방향 전파 알고리즘은 원래 1970년대에 도입되었다.그러나 역전파는 데이비드 루멜하트 제프리 힌튼 로널드 윌리엄스의 1986년 저명한 논문이 등장한 직후로 평가된다.그 논문에서 몇 개의 신경 네트워크에 대해 역방향 전파를 사용하면 기존의 학습 방법보다 훨씬 빨리 공부할 수 있다는 사실을 보여 주었고 그 전에 신경 네트워크로 해결할 수 없었던 문제를 해결할 수 있었다.오늘날 역방향 전파는 신경 네트워크를 학습하는 간편한 알고리즘이다.
1. 예열: 신경 네트워크 출력 매트릭스로 빠른 계산
우선, 고정 권한의 기술 방식입니다. $W^l_{jk}$
여기서 말하는 $l$는 층의 번호입니다. $jk$는 이전 층의 $k$개 신경원에서 $j$개 신경원까지의 권한을 가리킵니다.
이러한 표기를 사용하면 l층의 j번째 신경원의 활성alj와 (l-1)층의 활성은 하식을 통해 관련이 있다.
a^l_j=σ(∑_k w^l_{jk} a^{l−1}_k + b^l_j)
또 신호 함수 등 활성 함수에 대해서도 벡터 표현화를 한다.예를 들어 $f(x) = x^2$라고 가정하면 다음과 같이 기술할 수 있다.
f \biggl(
\begin{bmatrix}
2\\
3
\end{bmatrix}
\biggl )
\space = \space
\begin{bmatrix}
f(2)\\
f(3)
\end{bmatrix}
\space = \space
\begin{bmatrix}
4\\
9
\end{bmatrix}
2. 원가 함수에 필요한 두 가지 가설
나는 이전 장에서 정의한 원가 함수를 되돌아보고 싶다.
C = \frac{1}{2n}\sum_x \space || y(x) - a^L(x)||^2
여기서 n은 훈련례의 총수이고 각 훈련례 x에 대한 더하기이며 y=y(x)는 대응하는 목표의 출력이고 L은 신경망의 층수이며 aL=aL(x)는 x를 입력할 때의 신경망의 출력 벡터이다.가설원가 함수는 이 훈련 데이터의 평균 원가 함수입니다. $C=\frac{1}{n}\sum_xC_x$로 쓰여 있습니다.
따라서 정확한 역방향 전파를 통해 오류는 모든 훈련 데이터에 따라 전파된다는 것을 깨닫고 싶다.
가설원가 함수는 신경 네트워크의 출력 함수로 쓴 것이다
이것은 당연한 가설이다. 즉, 출력이 신경 네트워크에 잘 맞는 구조로 진행되었다는 것이다.
3. 아다마적s⊙t
앞으로의 토론을 전개할 때 상당히 중요한 방식이다.
이 이해는 수학적으로 매우 간단하지만 이 신경 네트워크에서 오차가 왼쪽에서 오른쪽으로 전파되는 것을 직관적으로 이해하는 작용을 한다.
\begin{bmatrix}
1\\
2
\end{bmatrix}
⊙
\begin{bmatrix}
3\\
4
\end{bmatrix}
\space = \space
\begin{bmatrix}
1 * 3\\
2 * 4
\end{bmatrix}
\space = \space
\begin{bmatrix}
3\\
8
\end{bmatrix}
4. 역방향 전파의 네 가지 표현식
여기서 멈추면 다층신경망이 되면 각 신경원이 얼마나 중요한지 생각해 보자.
왜 신경 네트워크의 모든 신경원이 네트워크에 미치는 영향이 얼마나 큰지 말이다.
이제 $l$, $j$의 신경원 각도에서 봅시다.
데이터가 신경원에 도달했을 때 소음을 약간 넣어 다음 층으로 보낸다고 가정하자.
즉, $\sigma(z^l_j)$대신, $\sigma(z^l_j+z^l_j)$대신
맞아요. 이런 변화가 인터넷의 뒷부분에 영향을 미쳤다고 할 수 있어요.
따라서 이 변화의 방법을 점차적으로 바꾸고 원가 함수를 최소화할 수 있는 값을 찾아낸다.
\delta^l_j = \frac{∂C}{∂z^l_j}
이 점을 증명하기 위해서 우리는 심오한 반향 전파의 네 가지 중요한 방정식을 볼 수 있을 것이다.\begin{align}
\delta^L_j &= \frac{∂C}{∂z^l_j}\\
&= \sum_k \frac{∂C}{∂a^L_k} \frac{∂a^L_k}{∂z^L_j} \\
& where \space if \space k≠j \space then \space \frac{∂a^L_k}{∂z^L_j} = 0\\
&= \frac{∂C}{∂a^L_k} \frac{∂a^L_k}{∂z^L_j}\\
&= \frac{∂C}{∂a^L_j} \space \sigma'(z^L_j)
\end{align}
$\frac {æC} {æa^L_j}$에서 활성 함수의 변화가 민감하게 변화하는 정도를 출력합니다.즉, 만약 C가 출력층의 특정 신경원 (예를 들어 j개) 에 그렇게 의존하지 않는다면, $\delta^L$는 우리가 기대하는 대로 작아질 것이다.한편, 오른쪽 두 번째 항목의 $\sigma'(z^L_j)$는 활성 함수입니다.σ$z^L_j$의 변화에 대해 얼마나 민감하게 반응하는지를 나타낸다.
여기에 방금 나타난 아다마르 적을 사용하여 표시한다.
\delta^L = \nabla_a C ⊙ \sigma'(z^L)\\
C = \frac{1}{2} \sum_j(y_j−a_j) \leftrightarrow \frac{∂C}{∂a^L_j} = (a_j−y_j)\\
\delta^L = (a^L - y) ⊙ \sigma' (z^L)
설치 후 아래와 같습니다.# where L means current layer
delta_L = cost_function_derivative(activations[L], y) * sigmoid_derivative(z[L-1])
이것은 실제 Micheal Nielsen의 설치가 약간 바뀐 것이다.그의 설치에 관해서는 본문의 끝을 참조하십시오.실제로backprop 함수에서 사용됩니다.
\delta^L = ((w^{l+1})^T \delta^{L+1}) ⊙ \sigma'(z^l)
하면, 만약, 만약...\begin{align}
\delta^l_j &= \frac{∂C}{∂z^l_j}\\
& = \sum_k \frac{∂C}{∂z^{l+1}_k} \frac{∂z^{l+1}_k}{∂z^{l}_j}\\
& = \sum_k \frac{∂z^{l+1}_k}{∂z^{l}_j} \delta^{l+1}_k \\
& Also, \\
z^{l+1} &= \sum_j w^{l+1}_{kj}a^l_j + b^{l+1}_j\\
&= \sum_j w^{l+1}_{kj} \sigma(z^l_j) + b^{l+1}_j\\
&Hence\\
\frac{∂z^{l+1}_k}{∂z^{l}_j} &= w^{l+1}_{kj} \sigma'(z^l_j)\\
&Finally,\\
\delta^l_j &= \sum_k w^{l+1}_{kj} \delta^{l+1}_k \sigma'(z^l_j)\\
\delta^L &= ((w^{l+1})^T \delta^{L+1}) ⊙ \sigma'(z^l)
\end{align}
이 식의 의미는 그것이 후층의 오차를 잘 전파할 수 있는지를 증명하는 데 있다.$((((w^{l+1})^T) $의 전치 행렬은 오차가 네트워크와 상반된 방향에서 전파된다고 직관적으로 생각할 수 있다.그리고 아다마적 전파 오차를 사용한다.
# where L means current layer
delta_L = np.dot(weight[L].T, delta_L+1) * sigmoid_derivative(z)
\frac{∂C}{∂b^l_j} = \delta^l_j
\frac{∂C}{∂w^l_{jk}} = a^{l-1}_k \delta^l_j
이 공식에서 알 수 있듯이 활성신경원의 값은 오차의 전파에 매우 중요하다.어느 정도 활성화될 수 있는지, 즉 이 신경원의 중요성에 비해 오차의 전파 방식도 달라진다는 것이다.
한 마디로 하면 입력신경원이 저활성 상태나 출력신경원이 포화상태(저활성 또는 고활성 상태)에 있을 때 권중의 학습이 비교적 느리다고 할 수 있다.
여기에 실제 마이클의 설치를 놓아라.
def backprop(self, x, y):
"""コスト関数の勾配を表すタプル"(nabla_b, nabla_w)"を返却する。
"self.biases" and "self.weights"と同様に、
"nabla_b"と"nabla_w"はnumpyのアレイのリストで
各要素は各層に対応する。"""
nabla_b = [np.zeros(b.shape) for b in self.biases]
nabla_w = [np.zeros(w.shape) for w in self.weights]
# 順伝播
activation = x
activations = [x] # 層ごとに活性を格納するリスト
zs = [] # 層ごとにzベクトルを格納するリスト
for b, w in zip(self.biases, self.weights):
z = np.dot(w, activation)+b
zs.append(z)
activation = sigmoid_vec(z)
activations.append(activation)
# 逆伝播
delta = self.cost_derivative(activations[-1], y) * \
sigmoid_prime_vec(zs[-1])
nabla_b[-1] = delta
nabla_w[-1] = np.dot(delta, activations[-2].transpose())
# 下記のループ変数lは第2章での記法と使用方法が若干異なる。
# l = 1は最終層を、l = 2は最後から2番目の層を意味する(以下同様)。
# 本書内での方法から番号付けのルールを変更したのは、
# Pythonのリストでの負の添字を有効活用するためである。
for l in xrange(2, self.num_layers):
z = zs[-l]
spv = sigmoid_prime_vec(z)
delta = np.dot(self.weights[-l+1].transpose(), delta) * spv
nabla_b[-l] = delta
nabla_w[-l] = np.dot(delta, activations[-l-1].transpose())
return (nabla_b, nabla_w)
5. 역방향 전파 알고리즘
Pseudo Code
\frac{∂ C}{∂ w^l_{jk}} = a^{l−1}_k δ^l_j\\
\frac{∂ C}{∂ b^l_j} = δ^l_j
여기서도 훈련 데이터와 실제 제시된 부분을 고려해 보자.l=L,L−1,…,2\\
w^l → w^l − η m∑_xδ^{x,l} (a^{x,l−1})^T\\
b^l → b^l − ηm ∑_x δ^{x,l}
Reference
이 문제에 관하여([리뷰] 신경 네트워크와 심층 학습 CH.2~역방향 전파 메커니즘~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Rowing0914/items/fb55082a4fd636a816a1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)