더북(TheBook)

그림 2-6은 훈련 루프가 필요한 만큼 이런 단계를 어떻게 반복하는지 보여 줍니다.

1. 훈련 샘플 x배치(batch)와 이에 상응하는 타깃 y_true를 뽑습니다. 배치는 단순히 하나의 텐서로 묶인 여러 개의 샘플입니다. 배치에 있는 샘플의 개수를 배치 크기(batch size)라고 부릅니다. 실제 딥러닝에서는 배치 크기를 128이나 256과 같이 2의 거듭제곱으로 설정하는 경우가 많습니다. 샘플을 배치로 묶으면 GPU의 병렬 처리 능력을 활용하고 더 안정적인 그레이디언트(gradient)11 값을 계산할 수 있습니다(자세한 내용은 2.2.2절 참조).

2. x에 대해 네트워크를 실행(정방향 계산(forward pass)이라 부릅니다)하여 예측 y_pred를 얻습니다.

3. 이 배치에 대한 네트워크의 손실, y_truey_pred 사이의 오차를 계산합니다. 손실 함수는 model.compile() 메서드를 호출할 때 지정했습니다.

4. 이 배치에 대해 손실이 조금 감소하는 방향으로 네트워크의 모든 가중치(파라미터)를 업데이트합니다. 개별 가중치에 대한 상세한 업데이트는 model.compile() 메서드를 호출할 때 지정한 또 다른 옵션인 옵티마이저에 의해 관리됩니다.

 

매 단계마다 손실을 낮출 수 있다면 결국 훈련 데이터에서 낮은 손실을 내는 네트워크를 얻게 될 것입니다. 이 네트워크는 입력에서 올바른 타깃을 매핑하는 방법을 학습했습니다. 멀리 떨어져서 보면 마술처럼 보일 수 있지만, 개별 단계를 나누어 생각하면 단순한 원리입니다.

유일하게 어려운 부분은 단계 4입니다. 가중치를 증가시킬지 또는 감소시킬지 어떻게 결정할 수 있을까요? 또 그 양은 얼마나 되어야 할까요? 단순하게 추측하고 확인하는 방법으로 실제로 손실을 감소하는 업데이트만 선택할 수 있습니다. 이 예제와 같은 단순한 문제에는 이런 알고리즘이 통할 수 있지만 매우 느립니다. 더 크고 복잡한 문제에서 수백만 개의 파라미터를 최적화할 때 랜덤하게 좋은 방향을 선택할 가능성은 매우 작습니다. 더 좋은 방법은 네트워크에서 사용하는 모든 연산이 미분 가능하다는 사실을 활용하여 네트워크의 파라미터에 대한 손실의 그레이디언트를 계산하는 것입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.