Keras Loss == NaN
텐서플로-케라스
모델링을 하면서 혹시 Loss 값에 nan을 본적이 있는가.
단순한 네트워크 계층에서는 쉽게(?) 관찰 할 수 없지만,
조금 복잡한 네트워크(특히, Conv2D + Embedding)에서 가끔 볼 수 있다.
왜? 어떻게 이런 값이 나타나는 것일까?
필자의 경우에는,
activation 함수의 임계값을 넘어가는 경우에 Loss 값이 갈피를 못잡고
갑자기 nan이 나타났다.
activation에 보통 leaky_relu, relu, tanh 등등을 사용한다.
사실 어떤 값을 사용해야 하는지, 내 모델에서는 어떤 값이 더 좋은 효율을 낼 수 있는지에 대해서는 누구나 고민해 보았음직하다.
activation의 중요성을 다시 한 번 깨닫는다.
하지만!
activation 만으로 완벽한 해결이 될 수 없는 경우도 있다.
이떄는,
각 Layer 계층의 학습 가능한 파라미터 수를 확인하고
해당 계층의 활성화 함수(Kernel, Bias, Activation Regularizer)를 실험해 보야야 한다.
예을 들어,
tf.keras.layers.Embedding(len(space_idx.index), num_outputs, trainable=True,
embeddings_initializer='glorot_uniform',
activity_regularizer=tf.keras.regularizers.l2(l=0.001),
embeddings_regularizer=tf.keras.regularizers.l2(l=0.001),
name='space_vector')
에를 들어 * 2,
conv2d_layer = tf.keras.layers.Convolution2D(filters=128, kernel_size=(1, 200), strides=(1, 2), padding='same', kernel_regularizer=tf.keras.regularizers.l2(l=0.001), use_bias=False)(tf.keras.backend.expand_dims(space_vector, 1))
늘... 생각하지만
참 어렵다.