以下内容参考自神经网络的激活函数为什么要使用非线性函数?
如果使用线性函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。加深神经网络的层数就没有什么意义了。线性函数的问题在于不管加深层数到多少,总是存在与之等效的「无隐藏层」的神经网络。为了稍微直观的理解这一点,考虑下面一个简单的例子。
存在一个线性函数f(x)=kx(k≠0)作为激活函数,将y=f(f(f(x)))对应三层的神经网络。很明显可以想到同样的处理可以由y=ax(a=k^3),一个没有隐藏层的神经网络来表示。该例子仅仅是一个近似,实际中的神经网络的运算要比这个例子复杂很多,但不影响结论的成立。也就是说,使用线性激活函数时,无法发挥多层网络带来的优势。
相反如果使用非线性函数,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
原函数图像为
对应的导数图像为
附上在jupyter notebook上绘制图像的程序
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-5,5)
#原函数
y_sigmoid=1/(1+np.exp(-x))
y_tanh=(1-np.exp(-2*x))/(1+np.exp(-2*x))
y_relu = np.array([0*item if item<0 else item for item in x ])
#导函数
y_sigmoid_dao=np.exp(-x)/(1+np.exp(-x))**2
y_tanh_dao=4*np.exp(-2*x)/(1+np.exp(-2*x))**2
y_relu_dao=np.array([0 if item<0 else 1 for item in x])
#画图
plt.figure(1,figsize=(9,3))
plt.subplot(131)
plt.plot(x,y_relu,'ro')
plt.title('relu')
plt.subplot(132)
plt.plot(x,y_sigmoid,'g*')
plt.title('sigmoid')
plt.subplot(133)
plt.plot(x,y_tanh,'b+')
plt.title('tanh')
plt.figure(2,figsize=(9,3))
plt.subplot(131)
plt.plot(x,y_relu_dao,'ro')
plt.title('relu_dao')
plt.subplot(132)
plt.plot(x,y_sigmoid_dao,'g*')
plt.title('sigmoid_dao')
plt.subplot(133)
plt.plot(x,y_tanh_dao,'b+')
plt.title('tanh_dao')
激活函数区别:
回归任务如图3 左部所示,模型输出量yi是连续的实数值,分类任务模型如图3 右半部分所示,模型输出的是离散的类别值。分类是在回归模型的基础上完成的。但分类模型多出一个softmax函数,并且分类和回归模型使用不同的损失函数。
假设存在两个数值,a and b,并且a>b,如果使用max函数取值,那么只能取a的值,不会取到b.这种情况会造成数值小的那个数值饥饿。在某些场景下,我们期望数值大的值能够以较大概率取到,数值小的值也能以较小的概率取到,这个时候我们就需要使用softmax函数。还是同样的两个数值,a>b,如果我们使用softmax函数来计算取a还是取b的概率,那a的softmax值是大于b的,所以a会经常取到,而b偶尔也会取到,取到的概率跟它们本来的数值大小有关。
softmax函数在数学上的定义为:
数组Y中有j个元素,Yi表示Y中第i个元素,那么Yi的softmax值为:
也就是说,是该元素的指数,与所有元素指数和的比值。
相比(−∞,+∞)范围内的分数,概率天然具有更好的可解释性,让后续取阈值等操作顺理成章。经过全连接层,我们获得了K个类别(−∞,+∞)范围内的分数yi,为了得到属于每个类别的概率,先通过e^yi将分数映射到(0,+∞),然后再归一化到(0,1),这便是Softmax的思想。
推导cross entropy函数之前,我们可以先了解一下KL距离的概念。KL距离,是Kullback-Leibler差异(Kullback-Leibler Divergence)的简称,也叫做相对熵(Relative Entropy)。它衡量的是相同事件空间里的两个概率分布的差异情况。其物理意义是:在相同事件空间里,概率分布P(x)的事件空间,若用概率分布Q(x)编码时,平均每个基本事件(符号)编码长度增加了多少比特。我们用D(P||Q)表示KL距离,计算公式如下:
对于分类问题来讲,一个样本对应的网络的输出S(s1,s2,...,sn)是一个概率分布,而这个样本的标注一般为(0,0,...,1,0,0,...0),也可以看作一个概率分布(硬分布)。
cross entropy可以看作是与S之间的KL距离
假设=(0,0,...,1,0,...,0),其中1为它的第k个元素,(索引从0开始)
求得S=()
则D(||S)==(中只有这一项为1,其它项均为0),这就是cross entropy函数的一种理解。
神经网络的最后一层通常是softmax函数,它将计算得到的数值映射到(0,1)的区间内,以概率的形式表达模型预测得到的类别,具体形式如图4所示:
利用梯度来更新参数时最后一层对y求导,有
1. 批量梯度下降法(Batch Gradient Descent,简称BGD)是梯度下降法最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行更新,也就是方程(1)中的m表示样本的所有个数。
优点:全局最优解;易于并行实现;
缺点:当样本数目很多时,训练过程会很慢。
2. 随机梯度下降法:它的具体思路是在更新每一参数时都使用一个样本来进行更新,也就是方程(1)中的m等于1。每一次跟新参数都用一个样本,更新很多次。如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次,这种跟新方式计算复杂度太高。
但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
优点:训练速度快;
缺点:准确度下降,并不是全局最优;不易于并行实现。
从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。
3.小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD):它的具体思路是在更新每一参数时都使用一部分样本来进行更新,也就是方程(1)中的m的值大于1小于所有样本的数量。为了克服上面两种方法的缺点,又同时兼顾两种方法的优点。
三种方法使用的情况:
如果样本量比较小,采用批量梯度下降算法。如果样本太大,或者在线算法,使用随机梯度下降算法。在实际的一般情况下,采用小批量梯度下降算法。