깊은 인공 신경망을 학습하다보면 계산과정에서 Vanishing gradient problem(기울기 소실)과 반대로
Gradient가 무한히 커지는 Exploding Gradient Problem(폭주)이 발생할 수 있다.
특히, 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 |