본문 바로가기
AI/Stanford Univ. cs231n

6강 Training Neural Networks 2

by coco88 2025. 4. 4.

 

미니 배치 확률적 경사 하강법

1. 데이터의 미니배치를 샘플링
2. 그 데이터들을 forward pass 하여 loss를 구함
3. backpropagation을 통해 gradient를 구함
4. gradient들을 통하여 parameter들을 업데이트 

while True:
	data_batch=dataset.sample_data_batch()
    loss=network.forward(data_batch)
    dx=network.backward()
    x+= -learning_rate * dx  #simple gradient descent update

 

Parameter Updates

 
1. Momentum update

v = mu * v - learning_rate * dx
x += v

 
(mu: 마찰계수, v: 속도)
속도를 한 번 더 업데이트해 주고 x를 v를 통해 업데이트 

추가 흔들리듯이 점점 중간으로 모이게 되며 초반에는 오버슈팅이 조금 일어나지만 수렴(convergence)이 빨리 진행된다. 
 
 
2. Nesterov Momentum update (NAG)
 
momentum을 변형한 버전인데, Momentum update보다 convergence rate가 항상 좋다.

momentum update와 차이점은
momentum step을 미리 예상한 종료점에서 gradient step을 evaluate 하는 것이다. 
 

v_prev = v
v = mu * v - learning_rate * dx
x += -mu * v_prev + (1 + mu) * v

 



3. AdaGrad update 

cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + 1e-7)

 
cache라는 개념을 도입하였다. cache는 양수이며 계속해서 증가한다.
cache의 루트 씌운 것으로 나눠주기 때문에, paratmeter별로 다른 learning rate을 제공하는 것이다.  (per parameter adaptive learning rate method)
(1e+7 은 0으로 나누는 것을 방지하기 위함이다.)


cache값이 계속 증가할수록 learning rate는 0에 가까워지며 학습이 종료될 수 있다는 문제가 있다. 
 
 
4. RMSprop update 
 

cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + 1e-7)

 
dacay rate을 이용하여 cache의 값이 최근의 기울기를 반영하도록 하고, step size가 0이 되어 학습이 종료되는 것을 막아준다. 

 

 

 
5. Adam update
 
RMSprop과 momentum을 결합한 형태

 

m,v =
for t in xrange(1, big_number):
	dx = # ... evaluate gradient
	m = beta1*m + (1-beta1)*dx  #momentum, update first moment
	v = beta2*v + (1-beta2)*(dx**2)  #RMSprop-like, update second moment
    mb = m/(1-beta1**t)  #bias correction
    vb = v/(1-beta2**t)  #bias correction
	x += - learning_rate * mb / (np.sqrt(vb) + 1e-7)  #RMSprop_like

bias correction은 m과 v가 0의 값이 나왔을 때, warm up 해주기 위한 과정이다. 
 
위의 1~5번까지의 방법은 loss function을 구할 때 gradient의 정보만 사용하는 1st order optimization method이다. 
 

학습이 진행됨에 따라 learning rate를 점점 줄여나가는 여러 가지 기법을 사용한다. 
 
 
2nd order optimization method에서는 Hessian이라는 방법을 도입해 경사뿐만 아니라 곡면이 어떻게 구성되어 있는지를 알 수 있다. 굳이 학습할 필요 없이 바로 최저점으로 진행할 수 있게 돼서 수렴이 매우 빨라진다. learning rate로 단계적으로 진행하는 것이 아니라 learning rate도 필요 없게 된다. 
하지만 현실적으로 실행이 불가능하다. 
가장 기본적으로 Adam을 많이 사용한다. 

Full batch를 사용하는 환경이라면 L-BFGS도 시도해 볼 수 있다.
 
 

Evaluation: Model Ensembles

단일 모델 대신에 여러 개의 독립적인 모델의 예측을 결합하여 평균을 내주어 성능을 향상하는 방법이다. 성능이 2% 정도 향상된다.
한 가지 모델 안에서 에포크마다 앙상블을 진행(checkpoint ensemble)하거나 파라미터들 내에서 앙상블을 진행하여도 성능이 향상된다. 

 

"학습할 때는 x로 업데이트하고, 테스트할 때는 x_test(지수이동평균된 파라미터)를 쓰면 성능이 조금 더 좋아질 수 있다"라는 Tip/Trick

while True:
	data_batch = dataset.sample_data_batch()
    loss = network.forward(data_batch)
    dx = network.backward()
    x += -learning_rate * dx
    x+test = 0.995*x_test + 0.005*x #use for test set


 
 

Regularization (Dropout)

Dropout을 적용하면 일부 노드들이 임의로 0으로 설정된다. 

학습 과정에서 매번 구조가 다른 네트워크가 데이터에 맞게 학습되는 것과 같음.

 

' Vanila dropout '
p = 0.5

def train_step(X):

	#forward pass for example 3-layer neural network
	H1 = np.maximum(0, np.dot(W1, X) + b1)
    U1 = np.random.rand(*H1.shape) < p  #drop in forward pass, first dropout mask
    H1 *= U1 #drop!
    H2 = np.maximum(0, np.dot(W2, H1) + b2)  #second dropout mask
    U2 = np.random.rand(*H2.shape) < p # *H2: tuple unpacking
    H2 *= U2 #drop!
    out = np.dot(W3, H2) + b3
    
    #backward pass: compute gradients
    #perform parameter update
    
def predict(X):
	
    H1 = np.maximum(0, np.dot(W1, X) + b1) * p  #scale at test time
    H2 = np.maximum(0, np.dot(W2, H1) + b2) * p 
    out = np.dot(W3, H2) + b3

 

 

train 할 때는 dropout을 적용하여 출력 평균을 낮춰주지만, test 할 때는 dropout은 끄고 대신에 출력에 p를 곱해서 평균 크기를 train과 같게 맞춰준다. 

 

이보다 더 일반적인 방법으로 Inverted dropout을 사용한다. 

' Inverted dropout '
p = 0.5

def train_step(X):

	#forward pass for example 3-layer neural network
	H1 = np.maximum(0, np.dot(W1, X) + b1)
    U1 = (np.random.rand(*H1.shape) < p) / p  #drop in forward pass, first dropout mask
    H1 *= U1
    H2 = np.maximum(0, np.dot(W2, H1) + b2)  #second dropout mask
    U2 = (np.random.rand(*H2.shape) < p) / p
    H2 *= U2
    out = np.dot(W3, H2) + b3
    
def predict(X):
	
    H1 = np.maximum(0, np.dot(W1, X) + b1)  
    H2 = np.maximum(0, np.dot(W2, H1) + b2) 
    out = np.dot(W3, H2) + b3

train time에서 p로 나눠 미리 스케일링해주기 때문에 test time에서 p를 곱하지 않아도 된다. 
 

training 때는 과적합 방지와 robust 학습을 위해 dropout을 적용하지만, 안정적이고 일관된 예측을 위해 test time 때는 적용하지 않는다.
 

Convolutional Neural Networks's History

 

1960s Hubel&Wiesel

고양이의 시각 피질을 연구하면서 시각 뉴런이 계층적으로 반응한다는 것을 발견하였다.

  • Simple cell: 가장 기본적인 자극(예: 특정 방향의 선)에 반응
  • Complex cell: 여러 simple cell의 출력을 종합 → 더 복잡한 패턴 감지
  • Hyper-complex cell: 더 높은 수준(예: 선의 끝, 모서리 등)에 반응

 

1980 Neurocognitron

위 아이디어를 인공 신경망에 구현

 

1998 LeNet

1998년의 논문 “Gradient-Based Learning Applied to Document Recognition” (LeCun et al.)에서 딥러닝이 실제 응용에서 처음으로 큰 성공을 거두었다. LeNet-5라는 CNN 아키텍처를 제안

2012 AlexNet

2012년에 AlexNet이 비약적인 발전을 이루며, 대규모 데이터셋(ImageNet) + GPU 학습 성공하여 딥러닝의 혁명이 시작되었다. 

 

현재는 ConvNet은 거의 모든 시각적 인식 문제의 기본 도구가 되었다.