[리뷰] 신경 네트워크와 심층 학습 CH.2~역방향 전파 메커니즘~

14523 단어 DeepLearning
① 학습 주제
신경 네트워크가 심층 학습으로 진화하는 과정
② 학습 배경
자습의 일환으로 지금까지 심층학습을 배웠지만 어떤 문제에서 비롯된 수법의 원점으로 돌아갈 필요가 있다고 생각합니다.
③ 학습 방법
나는 이 링크에 실린 작가의 훌륭한 자원을 빌려 썼다
http://nnadl-ja.github.io/nnadl_site_ja/chap2.html
④ 기대되는 성과
심층 학습이 생기는 계기를 잡아 근본적으로 문제를 해결하는 새로운 방법을 찾다
CH.1여기 있습니다.

프로비저닝

  • 몸풀기: 신경 네트워크 출력 행렬을 이용한 빠른 계산
  • 원가 함수에 필요한 두 가지 가설
  • 아다마적s⊙t
  • 역방향 전파의 기초로 하는 네 가지 식
  • 역방향 전파 알고리즘
  • 역방향 전파의 실현
  • 반전파 빠른 알고리즘은 무슨 뜻입니까?
  • 역방향 전파: 전체 이미지
  • 앞좌석


    역방향 전파 알고리즘은 원래 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}
    
    이 점을 증명하기 위해서 우리는 심오한 반향 전파의 네 가지 중요한 방정식을 볼 수 있을 것이다.
  • 출력층에서 오차 $\delta^L$표현식
  • 오차 $\delta^L$의 다음 오차 $\delta^{L+1}$의 표현식
  • 편향된 원가 변화율 공식
  • 임의의 권중의 원가 변화율 공식
  • 1. 출력 레이어 오차 $\delta^L$표현식
  • \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 함수에서 사용됩니다.
  • 2. 오차 $\delta^L$의 다음 단계 오차 $\delta^{L+1}$의 표현식
  • \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)
    
  • 3. 임의의 편이성 원가 변화율 공식
  • \frac{∂C}{∂b^l_j} = \delta^l_j
    
  • 4. 임의의 가중치 원가 변화율 공식
  • \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
  • 입력x: 입력층에 대응하는 활성 a1
  • 설정
  • 피드백: 각 $l=2, 3,..., L$, $z^l=w^la^{l-1}+b^l$and$a^l=σ(z^l) $
  • 계산
  • 오차 $δ^출력 L$: 오차 벡터 $δL=∇_a C ⊙ σ'(z^L) $계산
  • 역방향 전파 오차: 각 $l=L-1, L-2,..., 2$, $δ^l=((w^{l+1})^T δ^{l+1}) ⊙ σ'(z^l) $
  • 계산
  • 출력: 원가 함수의 경사율
  • \frac{∂ C}{∂ w^l_{jk}} = a^{l−1}_k δ^l_j\\
    \frac{∂ C}{∂ b^l_j} = δ^l_j
    
    여기서도 훈련 데이터와 실제 제시된 부분을 고려해 보자.
  • 훈련 예시 입력
  • 각 훈련 예시 x: 상응하는 활성 $a^ {x, 1}$를 설정하고 다음 절차를 수행합니다.
  • 피드백: $l=2,3,..., L$, $z^{x, l}=w^la^{x, l-1}+b^l$와 $a^{x, l}=σ(z^{x, l}) $
  • 계산
  • 오차 $δ^출력 {x, L}$: 벡터 $δ^{x,L} = ∇_a C_x ⊙ σ'(z^{x, L}) $
  • 계산
  • 역방향 전파 오차: $l=L-1, L-2,..., 2$, $δ^{x,l} = ((w^{l+1})^T δ^{x,l+1} ) ⊙ σ'(z^{x, l}) $
  • 계산
  • 비탈길:
  • 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}
    

    좋은 웹페이지 즐겨찾기