728x90
반응형

Affine 계층

  • 신경망의 순전파에서는 가중치 신호의 총합을 계산하기 때문에 행렬의 곱(넘파이에서는 np.dot())을 사용했다.

행렬 계산

# 5.6 Affine/Softmax 계층 구현

X = np.random.rand(2) # 입력
W = np.random.rand(2,3) # 가중치
B = np.random.rand(3) # 편향

X.shape
W.shape
B.shape

Y = np.dot(X,W) + B

print(Y) 
  • X,W,B는 각각 형상이 (2,), (2,3), (3,)인 다차원 배열이다.
  • 뉴런의 가중치 합은 Y = np.dot(X,W) + B처럼 계산한다.
  • Y를 활성화 함수로 변환해 다음 층으로 전파하는 것이 신경망 순전파의 흐름
  • 행렬의 곱은 대응하는 차원의 원소 수를 일치시키는 것이 핵심이다.

 

[그림1] 행렬 곱 대응하는 차원의 원소 수 일치

 

어파인 변환(affine transformation)

  • 기하학에서 신경망의 순전파 때 수행하는 행렬의 곱은 어파인 변환
  • 어파인 변환을 수행하는 처리 'Affine 계층'이라는 이름으로 구현

 

 

Affine 계층의 계산 그래프

[그림2] Affine 계층 계산 그래프

 

  • 원래 계산 그래프는 노드 사이에 '스칼라값'이 흘렀지만 이 예제는 '행렬'이 흐르고 있다.

그림2의 역전파

[그림3] 그림2 역전파

  • W^T의 T는 전치 행렬을 의미한다. W의 (i,j) 위치의 원소를 (j, i)위치로 바꾼 것을 말한다.
  • W의 형상이 (2,3)이였다면 전치행렬 W^T의 형상은 (3,2)가 된다.

[그림4] 전치행렬 변환

 

Affine 계층의 역전파

  • 행렬 곱(dot노드)의 역전파는 행렬의 대응하는 차원의 원소 수가 일치하도록 곱을 조립해 구할 수 있다.

[그림5] Affine 계층의 역전파

 

 

배치용 Affine 계층

  • 지금까지는 X 하나만을 고려한 것이었다면
  • 데이터 N개를 묶어 순전파하는 경우, 배치용 Affine 계층을 구상해보기

[그림6] 배치용  Affine 계층의 계산 그래프

 

  • 입력인 X의 형상이 (N,2)가 된 것 뿐
# 배치용 Affine 계층 계산 그래프

X_dot_W = np.array([[0,0,0], [10,10,10]])
B = np.array([1,2,3])

print("X_dot_W : ",X_dot_W)

print("X_dot_W+B : ",X_dot_W + B)

# 역전파 각 데이터 역전파의 값이 편향의 원소에 모여야 한다.
dY = np.array([[1,2,3],[4,5,6]])
print("dY : ",dY)

dB = np.sum(dY, axis = 0)
print("dB : ",dB)

 

Affine 구현

class Affine:
    def __init__(self, W, b):
        self.W = W
        self.b = b
        self.x = None
        self.dW = None
        self.db = None
        
    def forward(self, x):
        self.x = x
        out = np.dot(x, self.W ) + self.b
        
        return out
    
    def backward(self, dout):
        dx = np.dout(dout, self.W.T)
        self.dW = np.dot(self.x.T, dout)
        self.db = np.sum(dout, axis = 0)
        
        return dx

 

 

Softmax-with-Loss 계층

  • 출력층에서 사용한다.
  • 소프트맥스 함수는 입력 값을 정규화해 출력한다.

[그림7] Softmax 계층 출력까지의 과정

  • 마지막 Softmax 계층에 의해서 10개의 입력이 정규화된다.
  • 숫자 '0'의 점수는 5.3이며 Softmax계층에 의해서 0.008(0.8%)로 변환된다.
  • '2'의 점수는 10.1에서 0.991(99.1%)로 변환된다.
  • 손글씨 숫자는 가짓수가 10개(10클래스 분류)이므로 Softmax 계층의 입력은 10개가 된다.

 

Softmax-with-Loss계층

  • 소프트맥스 계층 구현시 손실 함수인 교차 엔트로피 오차도 포함한 것이 Softmax-with-Loss

[그림8] Softmax-with-Loss

  • 과정이 복잡하다.
  • Cross Entropy Error는 교차 엔트로피 오차

간소화한 Softmax-with-Loss

[그림9] 간소화한 Softmax-with-Loss

 

  • 3클래스 가정으로 3개의 입력(점수)을 받는다.
  • Softmax 계층은 입력(a1,a2,a3)를 정규화해 (y1,y2,y3)를 출력한다.
  • Cross Entropy Error 계층은 Softmax 출력(y1,y2,y3)와 정답 레이블(t1,t2,t3)를 받고, 이 데이터들로부터 손실 L을 출력한다.
  • Softmax계층의 역전파는 (y1-t1, y2-t2, y3-t3)라는 결과를 내놓는다. Softmax계층의 출력과 정답 레이블의 차분
  • 신경망의 역전파에서는 이 차이인 오차가 앞 계층에 전해진다.
  • 신경망의 목적은 신경망의 출력(Softmax의 출력)이 정답 레이블과 가까워지도록 가중치 매개변수의 값을 조정하는 것이다.
  • (y1-t1~~)라는 결과는 바로 Softmax계층 출력과 정답 레이블 차이로, 신경망의 현재 출력과 정답 레이블의 오차를 있는 그대로 드러내는 것이다.

 

Softmax-With-Loss 구현

# Softmax-With-Loss 구현

class SoftmaxWithLoss:
    def __init__(self):
        self.loss = None # 손실
        self.y = None # Softmax의 출력
        self.t = None # 정답 레이블(원-핫 벡터)
        
    def forward(self,x,t):
        self.t = t
        self.y = softmax(x)
        self.loss = cross_entropy_error(self.y, self.t)
        return self.loss
    
    def backward(self, dout = 1):
        batch_size = self.t.shape[0]
        dx = (self.y - self.t) / batch_size
        
        return dx
  • 역전파 때는 전파하는 값을 배치의 수(batch_size)로 나눠서 데이터 1개당 오차를 앞 계층으로 전파한다.

 

출처 : 밑바닥부터 시작하는 딥러닝

https://www.hanbit.co.kr/store/books/look.php?p_code=B8475831198

 

밑바닥부터 시작하는 딥러닝

직접 구현하고 움직여보며 익히는 가장 쉬운 딥러닝 입문서

www.hanbit.co.kr

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기