깊은 인공 신경망을 학습하다보면 계산과정에서 Vanishing gradient problem(기울기 소실)과 반대로

Gradient가 무한히 커지는 Exploding Gradient Problem(폭주)이 발생할 수 있다.

출처 http://www.cs.toronto.edu/~rgrosse/courses/csc321_2017/readings/L15%20Exploding%20and%20Vanishing%20Gradients.pdf


특히, RNN은 순환 연산 구조를 갖기 때문에 이 문제가 발생하기 더 쉽다.

 

하지만 Gradient Clipping이라는 방법론을 통해 손쉽게 해결 가능하다.

Gradient에 threshold(한계점)을 지정해 놓고 이 값을 넘어가는 현상이 발생할 시 gradient값을 threshold로 지정하는 것이다.

 

아래 코드는 1,2,3,4를 넣으면 2,4,6,8의 경향성을 학습해 y=2x의 Linear Regression을 수행하는 예제의 일부이다.

 

grad_clip = 5 # clipping을 적용할 임계치를 설정


# 최적화를 위한 function을 정의
@tf.function
def train_step(model, x, y):
  with tf.GradientTape() as tape:
    y_pred = model(x)
    loss = mse_loss(y_pred, y)
  gradients = tape.gradient(loss, model.trainable_variables) # gradients에는 개별 Layer의 노드 별 gradient 값 저장
  # Gradient Clipping을 적용
  clipped_grads = [] # 빈 리스트
  for grad in gradients: 
    clipped_grads.append(tf.clip_by_norm(grad, grad_clip)) # 임계치보다 커지면 clip
  optimizer.apply_gradients(zip(clipped_grads, model.trainable_variables)) # optimizer에 반영시 clipped된 gradient값을 반영하도록 함

'Study > Deep Learning' 카테고리의 다른 글

Object Detection by Haar cascade  (0) 2021.11.10
TensorFlow 2.0을 이용한 Char-RNN 구현  (0) 2021.10.20
Embedding  (0) 2021.10.20
순환신경망(RNN)  (0) 2021.10.19
Pre-Trained CNN 모델을 이용한 Image Classification  (0) 2021.10.18

+ Recent posts