首页 > 解决方案 > 经过一些迭代后,ANN 变得神经质

问题描述

该代码是我遇到的问题的简化复制。对于这个非常简单的任务,损失迅速(在 2000 多集之后)降低到 e-10 水平。但是,在那之后,损失突然开始增加,到e-02到e-04左右的水平,停留片刻,然后一次又一次地减少到e-10。

我的第一个猜测是这是由于学习率太高(尽管我的学习率下降了),但后来我觉得不太正确。在我们的例子中,损失函数是完全凸对称的,所以如果是由于学习率高,它应该保持在一定水平,而不是先增加后减少。

附加的代码也可以重现类似的结果。我还附上了一张来自 tensorboard 的图表,小脉冲很常见,在大多数情况下都可以重现,但大跳跃可能无法重现,因为我在自己的跑步中只看到过一两次。图表不是很清楚,但根据打印的结果,损失将保持在数十集的高水平,而不仅仅是一个。

这背后有什么数学原因吗?谢谢你。

在此处输入图像描述

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))

标签: pythontensorflowmachine-learning

解决方案


推荐阅读