引言
神经网络可以说是这几年最火的机器学习算法了。今天的大数据茶馆,咱们就一起聊聊神经网络那些事儿。
一、神经网络的概念
所谓神经网络就是一个个神经元组成的网络。下面我们看看神经元,大脑神经元和算法神经元有什么相通的地方。
1.1 大脑神经元
大脑神经元结构如图所示,有多个树突和一个轴突,树突用来接收信号,轴突用来输出信号。
神经元从多个树突接收信号,然后综合这些信号激活产生一个输出信号,通过轴突传递给下一个神经元。
1.2 算法神经元
和大脑神经元类似,机器学习中的神经元结构如图所示。
从图中可以看出,算法神经元也有多个输入,输入按权重加和后通过激活函数激活生成输出。大家有没有注意到,图中画的不就是逻辑回归吗?是的,其实逻辑回归就可以看成是一个神经元,只不过神经元的激活函数除了逻辑回归的 sigmoid, 还可以是别的比如 relu,softmax 等。
所以大脑神经元和算法神经元都是把多个输入激活成一个输出,结构是相似的。但除此之外,算法神经网络和人体神经系统的生物科学并没有什么关系。
二、神经网络的结构
如图所示,神经网络由输入层、隐含层(可能有多个)和输出层构成,一般我们说几层神经网络是不包含输入层的,只包含隐含层和输出层,比如图中的网络是两层神经网络。
图中隐含层和输出层的每个节点都是一个神经元,接收多个输入按权重加和,然后用激活函数生成一个输出。
三、关于激活函数
3.1 为什么要有激活函数
我们说每个神经元都是多个输入按权重加和,然后再用激活函数激活来生成输出,为什么要有激活函数呢?
激活函数主要是为了给神经元加入非线性因素。假设没有激活函数,在上图中:
- a1 和 a2 是输入(x1,x2,x3,x4) 的线性组合
- y ^ \hat y y^ 是输入(a1,a2) 的线性组合
- 所以 y ^ \hat y y^ 也是输入(x1,x2,x3,x4) 的线性组合,就和没有隐含层的逻辑回归一样了
而实际中我们的输出与输入可不一定是线性关系,而是任意复杂的函数关系,所以我们在每个神经元处都加上非线性的激活函数,这样多层次多节点的传输下来,多个非线性函数的组合就使得 y ^ \hat y y^ 可以表示 (x1,x2,x3,x4) 的任意复杂的函数关系。然后再经过梯度下降一次次调节每个神经元的权重,就可以让 y ^ \hat y y^ 逼近真实的 y y y。
3.2 有哪些常用的激活函数
常用的激活函数有 sigmoid、tanh、relu、leaky relu 以及 softmax。
3.2.1 sigmoid
sigmoid 主要用于二分类神经网络的输出层。
s i g m o i d : a = 1 1 + e − z s i g m o i d ′ : a ′ = a ( 1 − a ) \begin{aligned} sigmoid: a &= \frac{1}{1+e^{-z}} \\ sigmoid': a' &= a(1-a) \end{aligned} sigmoid:asigmoid′:a′=1+e−z1=a(1−a)
3.2.2 tanh
tanh 将 sigmoid 平移到中心为0上,效果比 sigmoid 好,更容易收敛。
t a n h : a = e z − e − z e z + e − z t a n h ′ : a ′ = 1 − a 2 \begin{aligned} tanh: a &= \frac{e^z - e^{-z}}{e^z + e^{-z}} \\ tanh': a' &= 1-a^2 \end{aligned} tanh:atanh′:a′=ez+e−zez−e−z=1−a2
sigmoid 和 tanh 都有一个缺点: 当变量很大的时候斜率衰减的厉害,减缓了神经网络的优化速度。
3.2.3 relu
relu 的变量为负值时结果为0,变量为正值时结果为 linear,当 Z 很大时斜率仍然没有衰减。
r e l u : a = m a x ( 0 , z ) r e l u ′ : a ′ = { 0 , z < 0 z , z ≥ 0 \begin{aligned} relu: a &= max(0,z) \\ relu': a' &= \begin{cases}0,\quad z<0 \\z,\quad z\geq0\end{cases} \end{aligned} relu:arelu′:a′=max(0,z)={ 0,z<0z,z≥0
缺点:当变量为负数时,结果都为0,相当于负数不起作用。
3.2.4 leaky relu
leaky relu 的变量为负值时 A 不至于是0,但并不常用。
l e a k y r e l u : a = m a x ( 0.01 z , z ) l e a k y r e l u ′ : a ′ = { 0.01 , z < 0 z , z ≥ 0 \begin{aligned} leaky\;relu: a &= max(0.01z, z) \\ leaky\;relu': a' &= \begin{cases}0.01,\quad z<0 \\z,\quad z\geq0\end{cases} \end{aligned} leakyrelu:aleakyrelu′:a′=max(0.01z,z)={ 0.01,z<0z,z≥0
3.2.5 softmax
softmax 主要用于多分类神经网络的输出层。
s o f t m a x ( Z i ) = e Z i