代码是我遇到的问题的简化复制。对于这个非常简单的任务,损失迅速减少(在2000多次情节之后),降至e-10级。但是,此后损失突然开始增加,从e-02到e-04的水平,在那里停留了片刻,然后又一次又一次地降低到e-10。
我的第一个猜测是这是由于学习率太高(虽然我的学习率下降了),但后来我觉得这不太正确。损失函数在本例中是完美的凸且对称的,因此,由于学习率高,它应该保持在一定水平附近,而不是先升高后降低。
附带的代码也可以重现类似的结果。我还附上了张量板的图形下方,小脉冲很常见,在大多数情况下都可以重现,但是大跳动可能无法重现,因为我在自己的跑步中只看到了一次或两次。该图不是很清楚,但是根据打印结果,损失将在数十集中保持高水平,而不仅仅是一集。
这背后有数学上的原因吗?谢谢。
import numpy as np
import tensorflow as tf
import time
def generate_data(batch_size,size):
x_val=np.random.rand(batch_size,size)
y_val=np.mean(x_val,axis=1,keepdims=True)
return x_val,y_val
#-------------------------------------------Initialize-----------------------------------------------------
tf.reset_default_graph()
gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.15)
sess=tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
batch_size=8192
size=100
inputs=tf.placeholder(dtype=tf.float32, shape=[None,size])
label=tf.placeholder(dtype=tf.float32, shape=[None,1])
loss_summary = tf.Variable(0.)
summary_ops=tf.summary.scalar("Loss", loss_summary)
writer= tf.summary.FileWriter(logdir="tensorboard", graph=sess.graph)
#-------------------------------------------Model-----------------------------------------------------
net=tf.layers.dense(inputs,100)
net=tf.layers.dense(net,1)
loss=tf.reduce_mean(tf.square(net-label))
global_step=tf.get_variable(name='global_step',shape=(),trainable=False,dtype=tf.int16,initializer=tf.zeros_initializer)
lr= tf.train.exponential_decay(learning_rate=0.001,global_step=global_step,
decay_steps=500,decay_rate=0.99,name="lr")
opt=tf.train.AdamOptimizer(lr).minimize(loss,global_step=global_step)
#-----------------------------------------Run-------------------------------------------------------
sess.run(tf.global_variables_initializer())
for i in range(10000):
t=time.time()
x_val,y_val=generate_data(batch_size=batch_size,size=size)
loss_val,_=sess.run([loss,opt],{inputs:x_val,label:y_val})
summary=sess.run(summary_ops,feed_dict={loss_summary:loss_val})
writer.add_summary(summary,i)
writer.flush()
print('Episode {}, loss {}, time {}'.format(i,loss_val,time.time()-t))