深度学习与神经网络学习笔记(五)
分类:
文章
•
2024-01-01 12:59:16
七、**函数的使用
通过之前的学习我们都了解到了**函数的作用,现在我们将会讲解一下**函数在不同的神经网络中的应用:
1、首先是sigmoid 函数:
a=11+e−z
它的图像可以表示为:
![深度学习与神经网络学习笔记(五) 深度学习与神经网络学习笔记(五)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgyMy8yMDM4NTRiZmEwYjE3YTBmZDc3NDdhMDU2MDVhMTY4Ny5wbmc=)
但是这个**函数多使用在二分分类输出的神经网络,因为需要寻找1和0值,所以在一般的神经网络中我们很少使用这个**函数。对应的导数为:
g′(z)=a(1−a)
这为后面的计算节省了很多时间。
2、然后是Tanh函数:
a=ez−e−zez+e−z
它的图像是:
![深度学习与神经网络学习笔记(五) 深度学习与神经网络学习笔记(五)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE5MS81OTQ2NmFhMjQ1MTUwNzMzY2FhZTAwMWU1OGNiNDc4Zi5wbmc=)
这个**函数相较于上面的更加适用于现在常用的神经网络中,它也称为双切正切函数,取值范围为[-1,1]。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。与 sigmoid 的区别是,tanh 的均值是0,因此实际应用中 tanh 会比 sigmoid 更好,然而,tanh一样具有软饱和性,从而造成梯度消失。它的导数为:
g′(z)=1−a2
3、接下来是ReLU函数:
a=max(0,z)
它的图像为:
![深度学习与神经网络学习笔记(五) 深度学习与神经网络学习笔记(五)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM5OS84OTQ1ZTQzYmYxNDlkMjUxMTE4OTcxODQ0NDkzNjk1Ny5wbmc=)
我们可以看出,在函数中,当z<0时,a的值会持续衡为0,再加上在第一象限的区域里函数的斜率(导数)一直保持为1,因此在寻找最小值时通常要比寻常的速度要快的多,唯一不足的地方就是当z=0时,函数的导数是没有意义的,所以我们可以单独设置其为1或者0。当然我们也可以再做一点饱和性的设置,我们可能会对这个函数做一个很小的泄露:
![深度学习与神经网络学习笔记(五) 深度学习与神经网络学习笔记(五)](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY2Ni80NDVhNjNlNjFjNTJkOGMzM2U2MjgwZDY3OGI3NTgwYS5wbmc=)
而它的函数可以表示为:a=max(0.01z,z),这个的直观表达就是有一个很小的缓和区域,但是具体的使用中并没有看出有太大的差别,因此我们还是使用上面的**函数居多。
上述三个**函数都是比较常用的**函数,当然也有很多其他的**函数,这里吴老大没有讲,所以我也就不提了,具体可以自己百度一下更加清楚。
这里再提一下,为什么我们要一直采用这种非线性的**函数来计算每一个神经元的过程?假设我们不使用非线性的**函数的话,我们可能会得到一个结果就是每一个神经元的值与下一个神经元的值都是线性的关系,那么到最后我们将会输出的y^和输入值x成线性的关系,这样的话我们神经网络无论多少层都相当于只有一层,最终得出的(w,b)可以用一个值表示,这样就会失去我们神经网络的隐层的意义,最终就只有输入层和输出层。所以我们唯一能够使用线性的**函数是在输出层的时候。