밑바닥부터 시작하는 딥러닝 #3-2 신경망 학습 (배치 학습)

Jake Seo·2020년 3월 16일
1

밑바닥부터 시작하는 딥러닝 #3-2 신경망 학습 (배치 학습)

Prologue

나는 여전히 웹개발자이지만, 회사에 부쩍 딥러닝 과제가 많아져서 딥러닝 공부가 많이 필요하게 됐다. 밑바닥부터 시작하는 딥러닝 책이 좋다고 해서 천천히 하나하나 공부해보려 한다.

배치 학습

이전에 훈련과 손실함수에 대해서 알아봤습니다. 결국 훈련은 손실함수의 값이 최저가 되는 지점을 찾기 위해 진행됩니다.

이전까지는 데이터 한개에 대해서 어떻게 학습하는지 배워봤지만 실무에서는 데이터가 일반적으로 아주 많습니다. 때때로 데이터가 너무 많을 때는 데이터의 일부를 추려 전체의 근사치로 활용하는 경우가 있는데 이를 미니배치 라고 합니다.

미니배치의 원리는 많은 설문조사 등에서 활용되고 있습니다.

훈련 데이터가 100개가 있다면, 100개의 손실함수의 평균 값이 최저가 되는 지점을 찾아야 할 것입니다. 이제 이 방법을 알아보겠습니다.

수식

위는 크로스 엔트로피 함수의 배치 수식입니다. n은 전체 데이터의 개수입니다. 모든 데이터에 대한 손실함수의 합을 구하고 그것을 n으로 나누어 정규화한 것입니다.

코드

np.random.choice 함수는 지정 범위의 값을 랜덤으로 10개 집어줍니다. 위의 경우에는 np.random.choice(60000, 10) 의 뜻은 0 이상, 60000 미만의 숫자를 랜덤하게 10개 고르는 코드입니다.

배치용 크로스 엔트로피 함수 작성하기

이전에 1개만 처리하던 코드와 달라진 점은 크게 2가지 정도가 있다.

  1. y의 ndim이 1일 때 reshape를 해주는 것
    • 1차원 배열이 아닌, 2차원 배열에서 원소가 한개만 들어온 것처럼 처리해준다.
    • 1차원의 배열 [a, b, ...] 이 들어온다면, 결과물로 2차원 배열을 내보낸다. [[a, b, ...]]
    • 결국 모든 배열이 들어왔을 때 [[a, b, ...]]의 형태로 내보내도록 결과를 균일화한다.
  2. batch_size로 나눠주는 부분이 생겼다
    • batch_size 만큼 모든 결과를 더했으니 당연한 것이다.
    • y가 1차원 배열에서 2차원 배열로 변했음에도 코드를 수정할 필요가 없는 것은 numpy의 마법(브로드 캐스팅)덕분이다.

정리

모든 손실함수의 결과를 더하고 총 배치 사이즈로 나누는 것으로 배치학습을 구현해봤습니다. numpy의 마법에 감사하고, 배치 작업은 I/O의 부담을 덜어주고 CPU와 GPU위주의 연산을 하게 도와준다는 것에 주목합시다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글