오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Data Analysis and ML, DL/Tensorflow

Tensorflow 가중치 발산 문제

junha6316 2020. 11. 12. 09:24
import tensorflow.compat.v1 as tf
from tensorflow.python.framework import ops
import numpy as np
from sklearn.datasets import load_iris

ops.reset_default_graph()

def regulRegresor(y, X, RegType, Rconst):
  regression_type = RegType # LASSO, Ridge
  num_cols = X.shape[1]
  x_data = tf.placeholder(shape=[None, num_cols], dtype=tf.float32)
  y_target = tf.placeholder(shape=[None,1],dtype=tf.float32)
  A = tf.Variable(tf.random_normal(shape=[num_cols,1])) # Weight Vector
  b = tf.Variable(tf.random_normal(shape=[1, 1])) # bias Vector

  with tf.Session() as sess:
      fomula = tf.add(tf.matmul(x_data,A), b)
      if regression_type == 'LASSO':
          lasso_params = tf.constant(0.9, dtype=tf.float32) # limit slope
          heavyside_step = tf.truediv(1., tf.add(tf.exp(tf.multiply(tf.subtract(A, lasso_params), -50)), 1))
          regularization = tf.multiply(99., heavyside_step)
          loss = tf.add(tf.reduce_mean(tf.square(y_target-fomula)), regularization)
          
      elif regression_type == 'Ridge':
          ridge_params = tf.constant(Rconst, dtype=tf.float32)
          ridge_loss = tf.reduce_mean(tf.square(A))
          loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target-fomula)), tf.multiply(ridge_params, ridge_loss)), 0) 
      
      opt = tf.train.GradientDescentOptimizer(learning_rate=0.0001)
      train_step = opt.minimize(loss) #optimizer를 이용해 loss값을 최소화 시키는 A, b를 찾는다.
      init = tf.global_variables_initializer()
      init.run()
      
      loss_vec = []
      preloss =0

      for i in range(100):
          rnd_idx = np.random.choice(len(X), size = 2500000)
          rnd_x = X.iloc[rnd_idx].values.reshape(-1,num_cols)
          rnd_y = y_return.iloc[rnd_idx].values.reshape(-1,1)
          my_dict = {x_data:rnd_x, y_target:rnd_y}
          sess.run(train_step, feed_dict=my_dict)
          temp_loss = sess.run(loss, feed_dict=my_dict)
          loss_vec.append(temp_loss[0])
          if i % 50 == 0:
            print('step={}: A={}, b={}, Loss={}'.format(i+1, A.eval(), b.eval(), temp_loss))

          if abs(preloss - temp_loss[0]) <= 0.001:break
          else:
            preloss = temp_loss[0]
         
          
      slope = A.eval()
      cept = b.eval()
      return slope, cept, loss_vec

코드 설명:위 코드는 텐서플로우로 구현한 Lasso와 Ridge의 Regularization code이다.

 

문제 : 가중치 벡터와 loss 값이 발산하는 문제를 겪었다. 가중치값이 일정한 값까지 표기되다가 지속적으로 nan이 뜨는 문제

 

해결방법:  이는 learning rate가 지나치게 커서 발생하는 현상으로 learning rate를 더 작게 줄여 해결할 수 있다.