在学习<<Tensorflow实战google学习框架>>这本书中,对于神经网络的误差
反向传播算法中,让我再一次加强了对梯度下降法求解使损失函数J()取得最小的
参数的求解。
关于梯度下降法,在最核心的神经网络结构——BP神经网络中也有应用,这也
说明深度学习是建立在多层神经网络的基础上的,之前看BP神经网络对梯度下降法
不是很理解,就看了吴恩达的斯坦福机器学习视频,里面关于梯度下降算法讲的非
常仔细,在此,我简单的做下笔记。
再联系最经典的神经网络架构
设输入为Xi,权值参数为W,ps:图片是百度找的,大概就是这样的模型。
那么函数h(X)=X0+w1x1+w2x2…
那么评估hw(X)函数 J(w) 然后再对J(w)求偏导,也就是梯度下降,再经过迭代
找出最优解或者局部最优解或者相对最优解
本来想打出来但是很多符号不太好打,所以我在百度找了一份讲的比较清晰的。
大家可以参考一下
http://blog.csdn.net/shijing_0214/article/details/51923547
当然,除了不一定能达到全局最优外,梯度下降算法的另一个缺点就是计算时间
太长。为了加速训练过程,可以使用随机梯度下降算法。这个算法优化的不是在全部
训练数据上的损失函数,而是在每一轮迭代中,随机优化某一条训练数据上的损失函数
。这样每一轮参数更新速度也就大大加快了。但是问题也很明显:在某一条数据上
损失函数更小并不代表在全部数据上损失函数更小,于是使用随机梯度下降优化得到的神经网络甚至可能没法达到局部最优。
为了综合梯度下降算法和随机梯度下降算法的优缺点。。可以采用折中的方法。
每次计算一小部分训练数据的损失函数。这一小部分数据被称为一个batch。通过矩阵
运算,每次在一个batch上优化神经网络的参数并不会比单个数据慢太多。
另一方面,可以大大减小收敛所需的迭代次数。
在Tensorflow中的实现大致遵循以下过程。
batch_size = n
#每次读取一小部分数据作为当前的训练数据来执行反向传播算法。
x = tf.placeholder(tf.float32,shape=(batchsize,2),name=’x-input’)
y = tf.placeholder(tf.float32,shape=(batch_size,1),name=’y-input’)
#定义神经网络结构和优化算法。
loss=…
train_step=tf.train.AdamOptimizer(0.001).minimize(loss)
#训练神经网络。
with tf.Session() as sess:
#参数初始化。
...
#迭代更新参数。
for i in range(steps):
#准备batch_size个训练数据。一般将所有的训练数据随机打乱之后再选取可##以得到的优化效果。
current_X,current_Y = ...
sess.run(train_step,feed_dict={x:current_X,y_:current_Y})
加油,明天继续学习tensorflow.