본문 바로가기
코딩/데이터 분석 이론 & 응용

[13] Deep Learning - Gradient clipping

반응형

[13] Deep Learning - Gradient clipping

 

 

 

Gradient clipping

 

Gradient clipping 이란 , 경사 폭주 문제를 해결하는 한 가지 방법이다. Gradient clipping은 Backpropagation 과정에서 경사값이 특정 임계값을 넘으면 그 이상의 경사 값을 잘라내는 것을 의미한다. 대부분의 Network 구조에서는 배치 정규화 만을 사용해도 충분하지만 , Network의 구조에 따라 배치 정규화를 사용하기 어려운 경우들이 존재한다. 그런 경우 Gradient clipping을 통해 경사 폭주 문제를 해결할 수 있다.

 

 

 

 

[12] Deep Learning - Batch normalization

 

[12] Deep Learning - Batch normalization

[12] Deep Learning - Batch normalization Batch normalization 이전 글에서는 경사 소실 문제와 폭주 문제를 해결하기 위한 activation function들과 initialization 방법들을 살펴보았다. [11] Deep Lear..

ddggblog.tistory.com

 

 

 

keras에서 Gradient clipping을 구현하는 방법은 다음과 같다.

 

 

 

#keras에서 Gradient clipping 사용하기

optimizer = keras.optimizers.SGD(clipvalue=1.0)
model.compile(loss="mse", optimizer=optimizer)

 

 

 

 

위처럼 optimizer 객체를 만들 때 , 안에 clipvalue 혹은 clipnorm을 통해서 Gradient clipping을 구현할 수 있다. 만약 clipnorm과 clipvalue가 함께 사용되었다면 , clipnorm이 먼저 적용된다. 위의 코드의 경우 clipvalue를 사용했고 값이 1.0 이므로 경사 벡터의 모든 원소를 -1.0 ~ 1.0으로 잘라낸다. 하지만 위와 같이 value를 사용하는 방식으로는 벡터의 방향을 바꿀 수 있다.

 

 

예를 들어 [0.1 , 100] 벡터의 방향은 100 쪽에 치우치게 표현될 것이다. [0.1 , 100] 벡터를 위의 코드처럼 Gradient clipping 한다면  [0.1 , 1] 벡터가 될 것이다. 이는 당연하게도 Gradient clipping 이전의 방향과 완전히 다른 방향일 것이다. 이처럼 clipvalue를 통해 경사를 깎아낸다면 벡터의 방향이 변할 수 있다. 이를 막으려면 clipnorm을 사용해 norm 기준으로 Gradient clipping을 진행해야 한다.

 

 

clipnorm의 경우 , 예를 들어 [0.1 , 100] 벡터를 clipnorm = 1.0 으로 Gradient clipping 한다면 , 방향은 유지한채 norm이 1이 되도록 경사를 깎는다. 따라서 0.1과 100 모두 값이 깎여 나갈 것이다. 여기서 이야기하는 norm은 유클리드 길이 즉 , L2norm을 의미하고 , 벡터의 길이가 1이 되도록 벡터 값을 변경하는 것을 의미한다. 즉 방향은 유지한채 벡터의 길이가 clipnorm 값이 되도록 Gradient clipping 하는 것이다.

 

 

 

 

 

 

 

ref. "Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition"

 

 

반응형