文章目录

  1. 1. 参考资料

梯度下降法的核心思路:在函数的曲线(曲面)上初始化一个点,然后让它沿着梯度下降的方向移动,直到移动到函数值极值的位置,这个位置视具体的问题而定,可能是极小值也可能是极大值。因为如果是凹函数那就是梯度上升的方向了。

梯度可以通过求偏导的方式计算,因为一个函数在某一点的导数描述了这个函数在这一点附近的变化率。导数的本质是通过极限的概念对函数进行局部的线性逼近。

有了梯度,还需要定义一个学习率 η 来定义每次参数更新的幅度。从直观上理解,可以认为学习率定义的就是每次参数移动的幅度。

# 梯度下降法
train = tf.train.GradientDescentOptimizer(0.2).minimize(loss)

神经网络的优化过程可以分成两个阶段,第一个阶段线通过前向传播算法计算得到预测值,并将预测值和真实值对比得出两者之间的差距。然后,在第二阶段通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。

需要注意的是,梯度下降法并不能保证被优化的函数达到全局最优解,它只能保证局部最优解。事实上,只有当损失函数为凸函数时,梯度下降法才能保证达到全局最优解。

梯度下降是通过不停的迭代,直到移动到函数值极值的位置。但是,这个过程计算时间太长,因为传统的批量梯度下降将计算整个数据集梯度,在处理大型数据集时速度很慢且难以控制,甚至导致内存溢出。

为了,加速训练过程,可以使用随机梯度下降法(SDG)。这个算法在每一轮迭代中,随机优化某一条训练数据上的损失函数。这样每一轮参数更新的速度就加快很多了。但是,随机梯度下降法(SDG),这种“以偏概全”的方案是有代价的,它的问题是,在某一条数据上损失函数更小并不代表在全部数据上损失函数更小,于是使用随机梯度下降法(SDG)得到的神经网络甚至可能无法达到局部最优。

为了综合梯度下降法和随机梯度下降法的优缺点,在实际应用中,我们一般采用小批量梯度下降,换句话说,每次计算一小部分训练数据的损失函数。这一小部分数据被称之为一个 batch。通过矩阵运算,每一次在一个 batch 上优化神经网络的参数并不会比单个数据慢太多。另一方面,每次使用一个 batch 可以大大减少收敛所需要的迭代次数,同时可以使得收敛到的结果更加接近梯度下降的效果。

batch_size = n

# 每一次读取一小部分数据作为当前的训练数据来执行反向传播算法
x = tf.placeholder(tf.float32, shape=(batch_size, 2), name="x-input")
y_ = tf.placeholder(tf.float32, shape=(batch_size, 1), name='y-input')

参考资料

(完)

微信公众号

文章目录

  1. 1. 参考资料