👩‍💻LEARN : ML&Data/Lecture

[CS231n] Lecture4. Backpropagation and Neural Networks

쟈니유 2023. 5. 11. 15:07
728x90

복습 

  • Score function : 카테고리 분류 시 선형식을 통해 score를 계산함으로 이미지의 카테고리를 도출함 
  • SVM Loss : SVM방식으로 해당 분류기의 성능을 확인하기 위해 오차를 계산함. SVM은 정답인 score가 safety margin을 두고 다른 score보다 높으면 되는 방식 
  • Regularization : Data Loss만으로는 train set에 과적합될 수 있기 때문에 가중치 W에 페널티를 줘서 단순하게 만드려는 정규화를 추가함. 이 때 정규화는 L1, L2가 있으며 해결하고자 하는 문제와 데이터에 맞는 방식을 선택하면됨
  • 이를 바탕으로 Loss를 최소화하는 가중치 W를 찾고자 할때 경사하강법을 사용함
  • 경사하강법 사용 시 수치적 gradient는 간단하지만 연산에 시간이 걸리므로 해석적 연산을 시행해야 함 

Backpropagation with Computational graph

  • f : 연산 
  • x,y : 연산의 input
  • z : 연산의 output 
  • local gradient : x-z, y-z처럼 foward propagation때 바로 구할 수 있는 gradient
  • Global gradient : L-z처럼 뒤에서 앞으로 넘어올 때의 gradient 

simple example 

  • 수행하는 연산 : +, *
  • local gradient 
    • dq/dx, dq/dy, df/dq, df/dz 와 같이 forward시 수식으로 바로 연산 가능한 것들 
  • global gradient
    • f 뒤에 더 많은 연산이 있었다고 가정했을 때, 그 결과값을 Loss라고 정의 
    • d Loss / dq와 같이 뒤에서 앞으로 역전파하는 것을 의미 
  • gradient = local gradient * global gradient 
    • chain rule : df/dy = df/dq * dq/dy
      • 합성함수를 미분하는 것을 의미 
      • f(g(x))를 미분하면 f(g(x))' = f'(g(x)) * g'(x) 임을 이용하여 df/dx = df/dg*dg/dx
    • 만약 d Loss / dx(gradient)를 구하고 싶다면
      • dLoss/dq(global gradient) * dq/dx(local gradient) = (-4)*1 = -4 

Another example

  • 0) 맨 처음 global gradient = 1
  • 1) 1/x 
    • 미분 시 -1/(x)**2
    • local gradient : 1.37
    • 미분 식의 x에 local gradient를 넣고 global gradient와 곱함  
    • -1/(1.37)**2 * 1 = -0.53 
  • 이를 매 노드마다 반복 

 

  • 시그모이드에 해당하는 부분을 묶고, 시그모이드에 대한 미분식으로 대체해도 동일한 결과가 나옴
    • 시그모이드 미분 결과 : (1-sig(x))*sig(x)
    • x에 local gradient 넣으면 0.2, global gradient는 1이므로 0.2  

 

Patterns in backward flow

  • add gate 
    • 직전의 gradient를 똑같이 분배해주는 역할 
  • max gate
    • 둘 중에 큰 쪽으로 몰아줌 
  • mul gate
    • 기존 gradient와 local gradient를 곱한 값을 두 노드 간 바꿔줌 

 

Gradients for vectorized code 

  • x,y,z가 모두 벡터일 때 (실제 신경망에서의 상태, gradient는 벡터를 벡터로 미분한 것이 됨
  • Jacobian matrix : 벡터를 벡터로 미분한 결과.
    • 함수가 m개, 각 함수에 있는 변수가 n개 있을 때, 각 함수를 각 변수에 대해 미분하게 되면 m*n 행렬이 됨 
    • 이에 dz/dx를 하게 되면 x의 벡터 개수 * z의 벡터 개수 크기의 매트릭스를 도출할 수 있음 
    • Input의 각 요소는 Output의 해당 요소에만 영향을 줘서 대각 행렬이 됨 

wikipedia

 

Vectorized operations

  • gradient 계산 시, local gradient를 자코비안 행렬이 될 수 있음 
  • 이 때 Output을 input에 대해서 미분한 것이므로, 각 벡터의수를 행렬로 가짐
  • 만약 미니배치를 수행하게 되면 각 행렬에 미니배치수를 곱한 숫자의 행렬을 갖게 됨 

 

A vectorized example 

  • L2노드: f = ||q||**2 (제곱한 후 합하는거) 
  • *노드 : q = W*x
  • df/dq = 2q 
    • L2는 제곱한 값이므로 L2를 미분하게 되면 df/dq = 2q, 이를 local gate인 [[0.22],[0.26]]과 곱함 
  • dq/dw = x 
  • df/dw = df/dq * dq/dw = 2q*x 인데 행렬간 연산이므로 x에 전치를 취해야함 즉 2q*x_t 
  • df/dx = df/dw와 동일하며 w,x만 바꾸면 되어 2q*w_t 
    • *은 곱셈이므로, mul gate처럼 global gradient인 [[0.44],[0.52]]를 각 다른 노드와 곱한 값 (전치행렬)  

 

Modularized implementation: forward / backward API 

  • foward, backward를 객체지향으로 메서드로 각각 구현 
  • forward : 순전파 시 각 결과를 변수에 저장해야함 (나중에 사용함)
  • backward : chain rule을 사용해서 오차 함수의 gradient를 계산 

Neural Networks

  • 함수를 계속 겹쳐나가며 레이어를 쌓아나가는 것 
    • (1) f = W1x  : 선형함수
      • - score를 구할 때 사용했었음 
      • - CIPAR의 예시로 x는 3072*1
      • - W1 : 10*3072
      • - f : 10*1 (class) 
    • (2) f= W2 * max(0,W1x)
      • -  max : 음수인 값을 0으로, 다른 값은 그대로 전달 
      • - x : 3072 * 1 
      • - W1 : 100* 3072
      • - W2 : 10*100
    • (3) f = W3 * max(0,W2*max(0,W1x)) 
      • - 3 layer 신경망 

  • 신경망은 인간 뉴런 구조와 러프하게 유사함 

 

class Neuron : 
	def neuron_tick(inputs):
    	cell_body_sum = np.sum(inputs * self.weights) + self.bias
        firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)
        return firing rate
  • 활성함수 예시들 

 

  • FC layer example 
    • Dense layer(fc)는 아래처럼 모든 노드가 연결됨 
#활성함수 
f = lambda x : 1.0/(1.0 + np.exp(-x))
#input, W는 이미 있다고 가정 
x = np.random.randn(3,1)
#layer
h1 = f(np.dot(W1,x) + b1)
h2 = f(np.dot(W2,h1) + b2)
out = np.dot(W3,h2) + b3