1.神经网络的主要功能
1)回归(Regression)
回归也可以叫做拟合(Fitting),是给出x值输出y值的过程,并且让y值与样本数据形成的曲线的距离尽量小,可以理解为是对样本数据的一种骨架式的抽象。
单层的神经网络能够模拟一条二维平面上的直线,从而可以完成线性分割任务。而理论证明,两层神经网络可以无限逼近任意连续函数。
-
一元线性回归
-
由大体上有线性关系的一个自变量和一个因变量组成。
- X是自变量(样本特征值),Y 是因变量(样本标签值),ε 是随机误差,a 和 b 是参数,在线性回归模型中,a,b 是我们要通过算法学习出来的。
-
2)分类(Classification)
分类是通过神经网络训练出来的分界线,把两类或多类样本分开。可以理解为是对两类或多类样本数据的边界的抽象。
2.神经网络的训练过程
1)初始化权重矩阵
以单层神经网络模型为例,有 m 个输入,有 n 个输出。在神经网络中,b 到每个神经元的权值来表示实际的偏移值(把偏移值看做是神经元的一个输入)。
(x1,x2,x3) 是一个样本数据的三个特征值
(w11,w21,w31) 是 (x1,x2,x3) 到 n1 的权重
(w12,w22,w32) 是 (x1,x2,x3) 到 n2 的权重
b1 是 n1 的偏移
b2 是 n2 的偏移
2)循环训练
抽取训练样本x和对应目标y组成的数据批量。
在x上运行网络(即正向传播),得到预测值y_pred。
-
计算网络在这批数据上的损失,用于衡量y_pred与y之间的距离。
- 通过损失函数进行计算
-
更新网络的所有权重,使网络在这批数据的损失略微下降。
-
方法1:保持网络中其他权重不变,只考虑某个参数,让其尝试不同取值。(对网络中的所有系数都重复这一过程)
- 非常低效。
-
方法2:利用网络中所有运算都可微,计算损失相对于每一个网络系数的梯度(即反向传播),然后向梯度的反方向改变系数,从而降低损失。
可微:一个函数在其定义域中所有点都存在导数,则它是可微的。
导数:函数f在p点的斜率。
-
3)梯度下降法则
https://www.cnblogs.com/dztgc/archive/2013/05/02/3050315.html
“梯度下降”包含了两层含义:
梯度:函数当前位置的最快上升点;
下降:与导数相反的方向,用数学语言描述就是那个减号,亦即与上升相反的方向运动,就是下降。
-
假设训练一个线性单元,它的输出o如下:
-
损失E相对于向量w可表示为:
- 其中D是训练样例集合,td 是训练样例d的目标输出,od是线性单元对训练样例d的输出,E(w)是目标输出td和线性单元输出od的差异的平方在所有的训练样例上求和后的一半。
梯度(gradient)是指:损失函数E相对向量w的的每个分量的导数,计作ΔE(w),指示了最陡峭的下降方向。
-
梯度下降法则:即让损失函数E向下降的方向移动可以表示为
,η是一个正的常数叫做学习速率,它决定梯度下降搜索中的步长。
-
对于每个分量wi可以表示为:
-
-
因此得到梯度下降权值更新法则:
-
训练线性单元的梯度下降算法步骤:
选取一个初始的随机权向量;
应用线性单元到所有的训练样例;
根据梯度下降权值更新法则计算每个权值的Δwi;
通过加上Δwi来更新每个权值,然后重复这个过程。
4)随机梯度下降
-
应用梯度下降的主要实践问题:
有时收敛过程可能非常慢;
如果在误差曲面上有多个局部极小值,那么不能保证这个过程会找到全局最小值。
常见的梯度下降变体被称为增量梯度下降算法(incremental gradient descent)或者随机梯度下降(stochastic gradient descent)。
-
随机梯度下降的思想是根据每个单独样例的误差增量计算权值更新,得到近似的梯度下降搜索。
-
,td和od是训练样例d的目标输出值和单元输出值。
-
,t、o和xi分别是目标值、单元输出和第i个训练样例的输入。
-
-
关键区别:
标准的梯度下降是在权值更新前对所有的样例汇总误差,而随机梯度下降的权值是通过考查每个训练样例来更新的。
在标准的梯度下降中,权值更新的每一步对多个样例求和,这需要大量的计算。
-
如果
5)反向传播
主要思想:
数据集输入神经网络,经过隐藏层,最终达到输出层。该过程是前向传播过程。
计算输出结果与真实结果存在误差,因此计算出误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层。
在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。
反向传播求偏导
偏导求解过程可以应用链式法则。假设有一个函数:z = x dot y,其中 x = 2w + 3b,y = 2b + 1。
z对w求偏导
-
假设当前参数w=3,b=4,可得:
而z的变化相对于w的变化可以表示为:
假设z的目标值是150,当前值是162,可以求得delta w的值如下:
z对b求偏导
-
而z的变化相对于b的变化可以表示为:
假设z的目标值是150,当前值是162,可以求得w需要变化的值如下:
由于网络中的参数比较多,一个参数w改变一次值,并不能让z直接达到目标值,因此需要对每个参数多次迭代训练。
# double variable new: w, b -----
w=3.000000,b=4.000000,z=162.000000,delta_z=12.000000
factor_b=63.000000, factor_w=18.000000, delta_b=0.095238, delta_w=0.333333
w=2.666667,b=3.904762,z=150.181406,delta_z=0.181406
factor_b=60.523810, factor_w=17.619048, delta_b=0.001499, delta_w=0.005148
w=2.661519,b=3.903263,z=150.000044,delta_z=0.000044
factor_b=60.485234, factor_w=17.613053, delta_b=0.000000, delta_w=0.000001
w=2.661517,b=3.903263,z=150.000000,delta_z=0.000000
done!
final b=3.903263
final w=2.661517
- 让批量数据的损失最小,就是求损失函数极限的过程,而损失函数的极限点,就是它的导数为0的点。