进行非线性变换,假如我们构建了一个多层的神经网络,那它每一层做的其实都是一个线性加权求和的运算,因此这个神经网络就只能做线性分类。当我们对每层网络中的各个节点都做非线性变换(使用**函数)时,那么这个神经网络就可以做非线性分类任务了。
下面我列举了的三种常用的**函数:
Sigmoid**函数
Sigmoid函数介于0~1之间,多用于输出层。
tanh**函数
tanh函数(双曲正切函数)比Sigmoid函数表现得更好,它介于-1~1之间,**函数的平均值就更接近0,从数学上看tanh函数其实是Sigmoid函数向下平移后得到的,多用于隐藏层。
ReLu**函数
Sigmoid函数和tanh函数都有一个缺点,当自变量 x 非常大或非常小时,那么导数的梯度或者说这个函数的斜率可能就很小,接近于0,这样会拖慢梯度下降算法。ReLu函数(线性修正单元)解决了这个问题,当x大于0时,斜率为1;当x小于0时,斜率为0;当x等于0时,倒数没有意义。
在选择**函数有一些经验,当输出值为0和1或在做二分类时,那么Sigmoid函数很适合作为输出层的**函数,其他所有层都用ReLu函数,ReLu**函数的斜率和0差的很远,这样构成的神经网络的学习速度会快很多。
是神经网络优化的目标函数,相当于预测值和真实值之间的误差,神经网络训练或者优化的过程就是最小化损失函数的过程,损失函数值小了,对应的预测结果和真实结果的值就越接近。
神经网络有三种较为常用的损失函数:
1.均方误差损失函数(MSE)
其中y是真值,y′是预测值,y′=wx+b。
2.交叉熵损失函数(cross-entropy)
3.对数似然损失函数
其中
表示网络的输出值,yk表示真值,取0或1。
优化函数起到优化算法的功能,是通过改善训练方式,来最小化(或最大化)损失函数。一般最基础的优化函数是梯度下降算法。