본문 바로가기
교재 리뷰/케라스 창시자에게 배우는 딥러닝

케라스 창시자에게 배우는 딥러닝 - 2. 시작하기 전에: 신경망의 수학적 구성 요소

by 펄서까투리 2020. 8. 18.

# 세줄요약 #

  1. 텐서(Tensor)는 머신러닝의 기본구성요소로 다차원 넘파이(NumPy) 배열에 데이터를 저장하는 것을 의미하며, 심층신경망(DNN)의 각 층에서 수치 데이터 텐서를 텐서 연산을 통해 새로운 표현으로 변환하는 것이 딥러닝의 학습과정이다.
  2. 머신러닝에서 훈련은 데이터 샘플과 타깃의 배치를 랜덤하게 뽑고 이 배치에서 손실에 대한 파라미터의 그래디언트(Gradient)를 계산해 반대방향으로 가중치를 업데이트하는 과정이 반복되는 것을 의미한다.
  3. 훈련과정에서 사용되는 핵심 개념은 손실(훈련하는 동안 최소화 해야할 양)과 옵티마이저(Optimizer: 손실에 대한 그래디언트가 파라미터를 업데이트하는 방식)이다.

 

# 상세 리뷰 #

1. 텐서(Tensor)

- 머신러닝 시스템에서 일반적으로 사용하는 기본 데이터 구조로 다차원 넘파이(NumPy) 배열을 의미한다. 그 데이터가 1차원 Signal 데이터이든, 2차원 영상 데이터이든 텐서라는 형태로 저장하여 머신러닝에 사용한다.

 

* 텐서의 실제 사례

  • 벡터 데이터: (samples, features) -> 2D Tensor
  • 시계열 또는 시퀀스(Sequence) 데이터: (samples, timesteps, features) -> 3D Tensor
  • 이미지 데이터: (samples, height, width, channels) or (samples, channels, height, width) -> 4D Tensor
  • 동영상 데이터: (samples, frames, height, width, channels) or (samples, frames, channels, height, width) -> 5D Tensor

그림 1. 아주 단순화된 형태의 이미지 데이터를 텐서로 저장할 때의 예시. 왼쪽의 이미지는 컬러 채널이 없는 흑백 영상, 오른쪽의 이미지는 RGB 컬로 채널을 가진 컬러 영상이다.

2. 신경망의 엔진: Gradient Optimization

 일반적으로 신경망의 각 층에서는 받아들인 입력데이터를 예시로 아래의 식(eq.1)과 같이 연산하여 결과값을 얻고 다음 층으로 출력한다.

output = relu(dot(W, input) + b)     [eq.1]

(* 활성화 함수 Relu를 연산하는 층)

 위의 식에서 텐서 W, b는 층의 속성처럼 볼 수 있는데 이 둘을 가중치(weight)와 편향(bias)라고 부른다. 초기에는 이러한 가중치들이 작은 난수(무작위 초기화: random initialization)들로 무작위하게 배열되어 있으나, 훈련 데이터를 신경망에 학습시키면서 훈련 데이터의 정보를 받아들여 가중치 값들이 신경망의 출력값이 정답을 잘 예측할 수 있도록 조정되어간다. 결국 이러한 가중치 조정 과정이 곧 머신러닝에 있어 훈련(Training)이라 불리는 핵심 과정인 것이다.

 훈련은 다음과 같은 훈련 반복 루프(training loop) 안에서 일어난다.

 

* 훈련 반복 루프(Training Loop)

  1. 훈련 샘플 x와 이에 상응하는 타깃 y의 배치를 추출한다.
  2. x를 사용하여 네트워크를 실행하고(foward pass: 정방향 단계), 예측 y_pred를 구한다.
  3. y_pred와 y의 차이를 측정하여 이 배치에 대한 네트워크의 손실을 계산한다.
  4. 배치에 대한 손실이 조금 감소되도록 네트워크의 모든 가중치를 업데이트한다.

위의 반복 루프에서 가장 어려운 과정은 바로 4단계로 '가중치를 어떻게 업데이트 하는가?'가 핵심이다. 가장 적합한 방법은 신경망의 모든 연산은 미분 가능하기 때문에 신경망의 가중치(Weight)에 대한 손실(Loss)의 그래디언트(Gradient)를 계산한 후 손실이 적어지는 방향, 즉 그래디언트의 반대 방향으로 가중치를 업데이트하면 된다.

 

  • 손실(Loss): 훈련하는 동안 최소화해야 할 양, 해결하려는 문제의 성공의 척도
  • 그래디언트(Gradient): 텐서 연산의 변화율, 여기서는 가중치에 대한 손실값이 매핑(Mapping)된 스페이스에서 변화율로 가중치가 변화될 때 손실값이 변하는 방향과 크기를 나타낸다. 즉 그래디언트의 반대방향으로 가중치를 변화시키면 손실값이 감소한다.
    • y_pred = dot(W, x)                          [W: 가중치, x: 입력 데이터, y_pred: 예측값]
    • loss_val = loss(y_pred, y)                   [y: 정답 데이터, loss_value: 손실값]
    • loss_val = f(W)     ->     gradient(f) = 가중치 W에서 손실값 loss_val의 변화율
  • 옵티마이저(Optimizer): 손실에 대한 그래디언트가 파라미터를 업데이트하는 정확한 방식(예. SGD, RMSProp, Adam)

그림 2. 그래디언트 최적화(Gradient Optimization)

* 확률적 경사 하강법(Stochastic Gradient Descent; SGD)

  1. 훈련 샘플 배치 x와 이에 상응하는 타깃 y를 추출합니다.
  2. x로 네트워크를 실행하고 예측 y_pred를 구합니다.
  3. 이 배치에서 y_pred와 y 사이의 오차를 측정하여 네트워크의 손실을 계산합니다.
  4. 네트워크의 파라미터에 대한 손실 함수의 그래디언트를 계산합니다(Backward pass).
  5. 그래디언트의 반대 방향으로 파라미터를 조금 이동시킵니다. -> 손실 감소

 

* 출처: 케라스 창시자에게 배우는 딥러닝 / 프랑소와 숄레 / 길벗

728x90
728x90

댓글