CNN에서 역 전파


15

다음과 같은 CNN이 있습니다.

네트워크 layour

  1. 5x5 크기의 입력 이미지로 시작합니다.
  2. 그런 다음 2x2 커널과 stride = 1을 사용하여 회선을 적용하여 크기가 4x4 인 기능 맵을 생성합니다.
  3. 그런 다음 stride = 2로 2x2 최대 풀링을 적용하여 기능 맵을 크기 2x2로 줄입니다.
  4. 그런 다음 로지스틱 시그 모이 드를 적용합니다.
  5. 그런 다음 2 개의 뉴런이있는 하나의 완전히 연결된 레이어.
  6. 그리고 출력 레이어.

간단하게하기 위해 이미 전달 패스를 완료하고 δH1 = 0.25 및 δH2 = -0.15를 계산 했다고 가정하겠습니다.

따라서 전체 정방향 통과 및 부분적으로 완료된 역방향 통과 후 내 네트워크는 다음과 같습니다.

정방향 통과 후 네트워크

그런 다음 비선형 레이어 (로지스틱 시그 모이 드)에 대한 델타를 계산합니다.

δ11=(0.25∗0.61+−0.15∗0.02)∗0.58∗(1−0.58)=0.0364182δ12=(0.25∗0.82+−0.15∗−0.50)∗0.57∗(1−0.57)=0.068628δ21=(0.25∗0.96+−0.15∗0.23)∗0.65∗(1−0.65)=0.04675125δ22=(0.25∗−1.00+−0.15∗0.17)∗0.55∗(1−0.55)=−0.06818625

그런 다음 델타를 4x4 레이어로 전파하고 최대 풀링으로 필터링 된 모든 값을 0으로 설정하고 그라디언트 맵은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

거기에서 커널 가중치를 어떻게 업데이트합니까? 네트워크에 5x5 이전에 또 다른 컨볼 루션 레이어가 있다면 커널 가중치를 업데이트하기 위해 어떤 값을 사용해야합니까? 그리고 전반적으로 내 계산이 정확합니까?


혼란스러운 점을 명확히하십시오. 이미 최대의 미분을 수행하는 방법을 알고 있습니다 (값이 최대 인 경우를 제외하고 모두 0 임). 따라서 최대 풀링을 잊어 봅시다. 컨볼 루션에 문제가 있습니까? 각 컨볼 루션 패치에는 자체 파생물이 있으며 계산 프로세스가 느립니다.
— Ricardo Cruz

가장 좋은 소스는 딥 러닝 북입니다 -쉽게 읽을 수는 없습니다 :). 첫 번째 회선은 이미지를 패치로 나누고 일반 신경망을 적용하는 것과 같습니다. 여기서 각 픽셀은 가중치를 사용하는 "필터"수에 연결됩니다.
— Ricardo Cruz

1
본질적으로 질문은 역 전파를 사용하여 커널 가중치를 어떻게 조정합니까?
— JahKnows

@JahKnows .. 및 해당 예를 고려하여 컨볼 루션 레이어의 그라디언트 계산 방법.
— koryakinp

컨볼 루션 레이어와 관련된 활성화 기능이 있습니까?
— JahKnows

답변:


9

컨볼 루션은 가중치 공유 원리를 사용하여 수학을 크게 복잡하게 만들지 만 잡초를 통과하려고합시다. 나는 이 소스 에서 대부분의 설명을 그리고 있다 .


포워드 패스

컨볼 루션 레이어의 순방향 패스는 다음과 같이 표현할 수 있습니다.

xi,jl=∑m∑nwm,nloi+m,j+nl−1+bi,jl

k1k2k1=k2=2x0,0=0.25mn

역 전파

다음과 같이 정의 된 평균 제곱 오차 (MSE)를 사용한다고 가정합니다.

E=12∑p(tp−yp)2

우리는 결정하고 싶다

∂E∂wm′,n′lm′n′w0,01=−0.13HK

(H−k1+1)(W−k2+1)

44w0,01=−0.13x0,01=0.25

∂E∂wm′,n′l=∑i=0H−k1∑j=0W−k2∂E∂xi,jl∂xi,jl∂wm′,n′l

이는 전체 출력 공간에서 반복되고 출력이 기여하는 오류를 결정한 다음 해당 출력에 대한 커널 가중치의 기여 요인을 결정합니다.

단순성을 위해 출력 공간 델타의 오류에 대한 기여를 호출하고 역 전파 된 오류를 추적하도록하겠습니다.

∂E∂xi,jl=δi,jl

가중치의 기여

컨볼 루션은

xi,jl=∑m∑nwm,nloi+m,j+nl−1+bi,jl

그러므로,

∂xi,jl∂wm′,n′l=∂∂wm′,n′l(∑m∑nwm,nloi+m,j+nl−1+bi,jl).

By expanding the summation we end up observing that the derivative will only be non-zero when m=m′ and n=n′. We then get

∂xi,jl∂wm′,n′l=oi+m′,j+n′l−1.

Then back in our error term

∂E∂wm′,n′l=∑i=0H−k1∑j=0W−k2δi,jloi+m′,j+n′l−1.

Stochastic gradient descent

w(t+1)=w(t)−η∂E∂wm′,n′l

Let's calculate some of them

import numpy as np
from scipy import signal
o = np.array([(0.51, 0.9, 0.88, 0.84, 0.05), 
              (0.4, 0.62, 0.22, 0.59, 0.1), 
              (0.11, 0.2, 0.74, 0.33, 0.14), 
              (0.47, 0.01, 0.85, 0.7, 0.09),
              (0.76, 0.19, 0.72, 0.17, 0.57)])
d = np.array([(0, 0, 0.0686, 0), 
              (0, 0.0364, 0, 0), 
              (0, 0.0467, 0, 0), 
              (0, 0, 0, -0.0681)])

gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')

array([[ 0.044606, 0.094061], [ 0.011262, 0.068288]])

Now you can put that into the SGD equation in place of ∂E∂w.


Please let me know if theres errors in the derivation.


Update: Corrected code


How ∂E∂wm′,n′l will look like in case my filter has multiple channels ?
— koryakinp

1
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
— Sun Bee

I would like suggest to review this answer. In particular, the provided code in python might be checked
— Duloren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.