본문 바로가기
Python Library/Keras

[Keras] 컴파일 (Compile)

by goatlab 2021. 12. 20.
728x90
반응형
SMALL

컴파일 (Compile)

 

모델을 학습시키기 이전에, compile 메소드를 통해서 학습 방식에 대한 환경설정을 해야 한다. 다음의 세 개의 인자를 입력으로 받는다.

 

최적화 (optimizer)

 

rmsprp나 adagrad와 같은 기존의 정규화기에 대한 문자열 식별자 또는 Optimizer 클래스의 인스턴스를 사용할 수 있다. 오차역전파로 node의 weight와 bias을 계속 업데이트하여 만들어진 model을 통해 더 나은 결과를 얻는다. 데이터의 양이 늘어나거나 hidden layer의 개수가 늘어날수록 계산이 복잡해지고 시간이 오래 걸린다. 따라서 이 시간을 줄이기 위한 방법이 경사하강법 (Gradient Descent)이다.

 

gradient descent이란 loss function 그래프에서 학습의 반복을 통해 손실된 값의 최저점을 찾는 방식이다. "경사를 탄다"는 것은 해당 손실 함수의 미분 값을 계산하는 것을 의미하며, 이 미분 값이 최소(0)가 되는 지점으로 다가간다는 것을 의미한다. 이 방법은 몇 가지 문제점이 있다. 우선, 정도의 문제가 있다. 학습을 몇 번 반복할 것인지, 학습률 (learning rate)은 어떻게 할 것인지에 따라 드는 시간과 비용이 달라진다. 최적 반복 횟수를 구하기 위해서는 반복 횟수와 학습률을 조절해가면서 시간과 정확도를 비교해보는 수밖에 없다. 다음 문제점은 엉뚱한 최저점을 찾을 수 있다는 것이다. 최저점이 1개라면 문제가 없지만, 만약 극솟점이 여러 개 있고 그 엉뚱한 극소점을 향해 학습되고 있다면, 학습 결과는 아예 달라져버릴 수도 있다. 

 

학습률 (Learning Rate)

 

경사하강법 알고리즘은 기울기에 학습률 또는 보폭 (step size)이라 불리는 스칼라를 곱해 다음 지점을 결정한다. local minimum에 효율적으로 도달할 수 있도록, 너무 크지도 작지도 않은 적절한 learning rate을 세팅해야 한다.

 

https://www.jeremyjordan.me/nn-learning-rate/

 

Adam

 

RMSProp와 Momentum을 합친 알고리즘이다. 일반적으로 사용한다.

 

SGD (Stochastic Gradient Decent)

 

앞서 경사하강법을 그대로 사용하면 연산 횟수가 너무 많아지게 된다. 따라서 일단 대충대충 조금씩만 훑어보고 일단 빨리빨리 가보자는 것이 SGD 방법이다. 전체 학습 데이터(batch) 대신 일부 조그마한 데이터 모음(mini-batch)에 대해서만 학습을 시켜 빠르게 빠르게 조절해 가는 방법이다. 이 방법을 이용해 최종 목적지까지 찾아가는데 조금 많이 헤맬지는 몰라도 아무튼 경사하강법보다 빨리 목적지 근처에 도착할 수 있었다. 하지만 이 방법 역시 무작정 기울어진 방향으로 이동하는 방식이기 때문에 탐색 경로가 비효율적이다. 좀 더 효율적인 방법을 찾기 위해선 어느 방향으로 갈지, 탐색 방향과 얼마나 큰 보폭(학습률)으로 발을 디딜지, 스텝 사이즈를 잘 잡아야 한다. 

 

Momentum

 

이동방향에 관성을 주는 방법이다. 현재 기울기가 향하는 방향과는 별개로 그동안 내려왔던 이동 방식을 기억하면서 그 방향으로 일정 정도를 추가적으로 이동하는 방식이다. 이 방법을 통해 그나마 SGD보다 덜 헤매면서 목적지 근처에 무사히 내려올 수 있다. 

 

NAG (Nesterov Accelerated Gradient)

 

Moment 방법이 현재 기울기가 향하는 방향에 관성 방향을 더하는 것이라면, NAG는 관성 방향을 먼저 고려하여 그 방향으로 이동한 후 그 방향에서 기울기를 구해 기울기 방향으로 이동하는 방법이다. Moment의 경우에는 멈춰야 할 시점에서도 관성에 의해 훨씬 멀리 갈 수 있다는 단점이 존재하지만, NAG에서는 일단 관성으로 이동한 뒤 어떻게 이동해야 할지 결정하므로 제동을 거는데 훨씬 더 용이하다. 

 

Adagrad (Adaptive Gradient)

 

변수들을 업데이트할 때 각각의 변수마다 스텝 사이즈를 다르게 설정해서 이동하는 방식이다. 지금까지 많이 변했던 변수들은 스텝사이즈를 작게하고, 변하지 않았던 변수들은 스텝사이즈를 크게 하자는 것이 기본적인 아이디어이다. 자주 등장했거나 변화를 많이 한 변수들은 그만큼 목적지에 가까이 있을 확률이 높기 때문에 세세하게 조정을 하는 것이고, 그렇지 않은 변수들은 도달하기 위해선 많이 변해야 하기 때문에 큼직큼직하게 조정을 하는 것이다. 다만 학습을 너무 진행하면 스텝 사이즈가 너무 작아져 결국 거의 움직이지 않게 될 문제가 있다. 

 

RMSProp, AdaDelta

 

Adagrad의 단점을 보안하기 위한 방법이다. 둘 다 Adagrad와 비슷하지만 RMSProp 방법의 경우, 상대적인 크기 차이를 유지하면서 이동하기 때문에 스텝 사이즈가 너무 작아져서 멈추는 것을 막는 방법이다. Adagrad가 어떤 단점을 갖는지, 그리고 RMSProp와 AdaDelta는 그것을 어떻게 극복했는지 살펴보려면 수학적으로 접근해야 하기 때문에 이 부분에서는 생략하겠다. 

 

손실 함수 (loss function)

 

model이 최적화에 사용되는 목적 함수이다. categorical_crossentropy 또는 mse와 같은 기존의 손실 함수의 문자열 식별자 또는 목적 함수를 사용할 수 있다.

 

 

기준 (metric)

 

분류 문제에 대해서는 metrics=['accuracy']로 설정한다. 기준은 문자열 식별자 또는 사용자 정의 기준 함수를 사용할 수 있다.

 

sample code

 

# For a multi-class classification problem
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# For a binary classification problem
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# For a mean squared error regression problem
model.compile(optimizer='rmsprop',
              loss='mse')

# For custom metrics
import keras.backend as K

def mean_pred(y_true, y_pred):
    return K.mean(y_pred)

model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy', mean_pred])
728x90
반응형
LIST

'Python Library > Keras' 카테고리의 다른 글

[Keras] model / weight 저장 및 불러오기  (0) 2021.12.21
[Keras] 손실 함수 (Loss Function)  (0) 2021.12.20
[Keras] 학습  (0) 2021.12.20
[Keras] Sequential 모델  (0) 2021.12.20
케라스 (Keras)  (0) 2021.12.20