tensorflow学习笔记(三)–前向传播与反向传播
今天,主要学习的是神经网络中的前向传播和反向传播,先以单变量单神经元为例,进行解释,再结合到多变量多神经元的情况。博文为原创,转载需要注明出处,谢谢~
单个神经元网络
对于单变量,其前向传播很简单,为一元线性回归h(x) = W*x + B,其中参数W为权重,B为偏置项。那么其反向传播又是怎么的??
首先,反向传播主要是根据预测值与真实值之间的误差来调整参数w和b的。而衡量预测值与实际值之间的误差的函数为代价函数(也称损失函数),单变量的线性回归其代价函数J(W, B)的表达式为:
其中,n为样本数量,h(x)为预测值,y为实际值。
那么,为了使得实际值与预测值之间的损失最小,即代价函数达到最小值,一般使用梯度下降算法。
梯度下降算法
梯度下降算法是一个用来求函数最小值的算法,在机器学习中,用于优化单个参数的取值;在反向传播中,对所有的参数使用梯度下降算法,能使得神经网络模型在训练数据上的损失函数尽可能取到最小值。
损失函数
假设,用a表示神经网络中的参数,J(a)表示在给定的参数取值下训练数据集上的损失函数的大小。
曲线表示了在参数a取不同值时,对应损失函数J(a)值的大小,参数的梯度是通过求偏导得到的
拿上面一元线性回归方程h(x)=Wx+B,作为例子,假设n=1,其代价函数为J(W,B)=1/2(Wx+B-y)²:
在反向传播中,我们需要知道参数W和B对h(x)的贡献,故分别对W和B求偏导,得到:
如果需要知道参数x的梯度,那么对x求偏导,得到:
那么使用梯度下降算法每次对参数x的更新公式为
假设参数的初始值为5,学习率为0.01,W=2,B=1,y=(1,2,3,4,5)那么整个优化过程总结为:
轮数 | 当前轮的参数值 | 梯度*学习率 | 更新后的参数 |
---|---|---|---|
1 | 5 | 0.01x(25x5-5x1-5x1) =1.15 | 5-1.15=3.85 |
2 | 3.85 | 0.01x(25x3.85-5x1-5x2)=0.8125 | 3.85-0.8125=3.0375 |
3 | 3.0375 | 0.01x(25x3.0375-5x1-5x3)=0.5594 | 3.0375-0.5594=2.4781 |
4 | 2.4781 | 0.01x(25x2.4781-5x1-5x4)=0.3695 | 2.4781-0.3695=2.1085 |
5 | 2.1085 | 0.01x(25x2.1085-5x1-5x5)=0.2271 | 2.1085-0.2271=1.8814 |
从上表可以看到,经过5次迭代之后,参数x的值变成了1.8814。
需要注意的:梯度下降算法不能保证被优化的函数达到全局最优解,只能是局部最优。只有当损失函数为凸函数时,梯度下降算法才能达到全局最优。
多元神经网络
对于多变量,其前向传播就为多元线性回归h(x) = W0 + W1 * x1 + W2 * x2 +… +Wn*xn + B;同样地,其代价函数为:
同样对每个参数的梯度下降更新公式与上述类似推导,这里就不演示了。
上面,我只采用了线性回归作为例子,来解释反向传播和梯度下降算法,在实际中应用,每个参数的偏导要根据具体代价函数来求得。
在tensorflow中的实现
在tensorflow中,学习率的设置方式一般为指数衰减法,其代码为:
learning_rate = tf.train.exponential_decay(
0.1, global_step, 100, 0.96, staircase=True)
通过梯度下降算法更新所有参数与学习率:
learning_rate = tf.train.GradientDesentOptimizer(learning_rate).minimizer(..loss函数., global_step=globel_step)
以上为反向传播和梯度下降的笔记,本博客为原创,转载需要注明出处!