深度学习系列3:神经网络那些事儿

引言

神经网络可以说是这几年最火的机器学习算法了。今天的大数据茶馆,咱们就一起聊聊神经网络那些事儿。

一、神经网络的概念

所谓神经网络就是一个个神经元组成的网络。下面我们看看神经元,大脑神经元和算法神经元有什么相通的地方。

1.1 大脑神经元

大脑神经元结构如图所示,有多个树突和一个轴突,树突用来接收信号,轴突用来输出信号。

深度学习系列3:神经网络那些事儿
神经元从多个树突接收信号,然后综合这些信号**产生一个输出信号,通过轴突传递给下一个神经元。

1.2 算法神经元

和大脑神经元类似,机器学习中的神经元结构如图所示。

深度学习系列3:神经网络那些事儿

从图中可以看出,算法神经元也有多个输入,输入按权重加和后通过**函数**生成输出。大家有没有注意到,图中画的不就是逻辑回归吗?是的,其实逻辑回归就可以看成是一个神经元,只不过神经元的**函数除了逻辑回归的 sigmoid, 还可以是别的比如 relu,softmax 等。

所以大脑神经元和算法神经元都是把多个输入**成一个输出,结构是相似的。但除此之外,算法神经网络和人体神经系统的生物科学并没有什么关系。

二、神经网络的结构

深度学习系列3:神经网络那些事儿

如图所示,神经网络由输入层、隐含层(可能有多个)和输出层构成,一般我们说几层神经网络是不包含输入层的,只包含隐含层和输出层,比如图中的网络是两层神经网络。

图中隐含层和输出层的每个节点都是一个神经元,接收多个输入按权重加和,然后用**函数生成一个输出。

三、关于**函数

3.1 为什么要有**函数

我们说每个神经元都是多个输入按权重加和,然后再用**函数**来生成输出,为什么要有**函数呢?

**函数主要是为了给神经元加入非线性因素。假设没有**函数,在上图中:

  1. a1 和 a2 是输入(x1,x2,x3,x4) 的线性组合
  2. y^\hat y 是输入(a1,a2) 的线性组合
  3. 所以 y^\hat y 也是输入(x1,x2,x3,x4) 的线性组合,就和没有隐含层的逻辑回归一样了

而实际中我们的输出与输入可不一定是线性关系,而是任意复杂的函数关系,所以我们在每个神经元处都加上非线性的**函数,这样多层次多节点的传输下来,多个非线性函数的组合就使得 y^\hat y 可以表示 (x1,x2,x3,x4) 的任意复杂的函数关系。然后再经过梯度下降一次次调节每个神经元的权重,就可以让 y^\hat y 逼近真实的 yy

3.2 有哪些常用的**函数

常用的**函数有 sigmoid、tanh、relu、leaky relu 以及 softmax。

3.2.1 sigmoid

sigmoid 主要用于二分类神经网络的输出层。

深度学习系列3:神经网络那些事儿

sigmoid:a=11+ezsigmoid:a=a(1a) \begin{aligned} sigmoid: a &= \frac{1}{1+e^{-z}} \\ sigmoid': a' &= a(1-a) \end{aligned}

3.2.2 tanh

tanh 将 sigmoid 平移到中心为0上,效果比 sigmoid 好,更容易收敛。

深度学习系列3:神经网络那些事儿

tanh:a=ezezez+eztanh:a=1a2 \begin{aligned} tanh: a &= \frac{e^z - e^{-z}}{e^z + e^{-z}} \\ tanh': a' &= 1-a^2 \end{aligned}

sigmoid 和 tanh 都有一个缺点: 当变量很大的时候斜率衰减的厉害,减缓了神经网络的优化速度。

3.2.3 relu

relu 的变量为负值时结果为0,变量为正值时结果为 linear,当 Z 很大时斜率仍然没有衰减。

深度学习系列3:神经网络那些事儿

relu:a=max(0,z)relu:a={0,z<0z,z0 \begin{aligned} relu: a &= max(0,z) \\ relu': a' &= \begin{cases}0,\quad z<0 \\z,\quad z\geq0\end{cases} \end{aligned}

缺点:当变量为负数时,结果都为0,相当于负数不起作用。

3.2.4 leaky relu

leaky relu 的变量为负值时 A 不至于是0,但并不常用。

深度学习系列3:神经网络那些事儿

leaky  relu:a=max(0.01z,z)leaky  relu:a={0.01,z<0z,z0 \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}

3.2.5 softmax

softmax 主要用于多分类神经网络的输出层。

深度学习系列3:神经网络那些事儿

softmax(Zi)=eZij=1neZj softmax(Z_i) = \frac{e^{Z_i}}{\sum_{j=1}^{n}e^{Z_j}}

在实际应用中,通常隐含层使用 relu 作为**函数,输出层二分类时采用 sigmoid、多分类时采用 softmax 作为**函数。

四、神经网络的矩阵化表示

深度学习系列3:神经网络那些事儿

图中样本有四个维度:(x1,x2,x3,x4), 隐含层有两个节点。

先考虑一个样本的情况

z1=[w11  w12  w13  w14][x1x2x3x4]+b1 z_1 = \begin{bmatrix}w_{11}\;w_{12}\;w_{13}\;w_{14}\end{bmatrix} \begin{bmatrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4}\end{bmatrix} + b_1

z2=[w21  w22  w23  w24][x1x2x3x4]+b2 z_2 = \begin{bmatrix}w_{21}\;w_{22}\;w_{23}\;w_{24}\end{bmatrix} \begin{bmatrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4}\end{bmatrix} + b_2

将两个公式合为矩阵:
[z1z2]=[w11  w12  w13  w14w21  w22  w23  w24][x1x2x3x4]+[b1b2] \begin{bmatrix}z_1 \\ z_2\end{bmatrix}= \begin{bmatrix}w_{11}\;w_{12}\;w_{13}\;w_{14} \\ w_{21}\;w_{22}\;w_{23}\;w_{24}\end{bmatrix} \begin{bmatrix}x_{1} \\ x_{2} \\ x_{3} \\ x_{4}\end{bmatrix} + \begin{bmatrix} b_1 \\ b_2 \end{bmatrix}

再考虑 m 个样本的情况:

[z11z1mz21z2m]=[w11  w12  w13  w14w21  w22  w23  w24][x11x1mx21x2mx31x3mx41x4m]+[b1b2] \begin{bmatrix}z_{11} \dots z_{1m}\\ z_{21} \dots z_{2m}\end{bmatrix}= \begin{bmatrix}w_{11}\;w_{12}\;w_{13}\;w_{14} \\ w_{21}\;w_{22}\;w_{23}\;w_{24}\end{bmatrix} \begin{bmatrix}x_{11} \dots x_{1m}\\ x_{21} \dots x_{2m} \\ x_{31} \dots x_{3m} \\ x_{41} \dots x_{4m}\end{bmatrix} + \begin{bmatrix} b_1 \\ b_2 \end{bmatrix}

矩阵简化为

Z2m=W24X4m+b21 Z_{2*m} = W_{2*4} * X_{4*m} + b_{2*1}

最后一般化,把输入层的维度由 4 改成 in,隐含层的维度由 2 改成 out, 矩阵为

Zoutm=WoutinXinm+bout1 Z_{out*m} = W_{out*in} * X_{in*m} + b_{out*1}

总结一下:

  • 输入矩阵 XinmX_{in*m}: in 行表示维度,m 列表示样本个数
  • 参数矩阵 WoutinW_{out*in}: out 行表示输出的维度,in 列表示输入的维度
  • 参数向量 bout1b_{out*1}: out 行表示输出的维度,1 列表示列向量,计算时维度自适应
  • 输出矩阵 ZoutmZ_{out*m}: out 行表示输出的维度,m 列表示样本个数
  • **矩阵 AoutmA_{out*m}: 维度与 Z 一致。既是上一层的输出,同时也是下一层的输入

五、求解神经网络

神经网络的求解仍然采用梯度下降的方法。

深度学习系列3:神经网络那些事儿

5.1 正向传播

  • 隐含层
    Z[1]=W[1]X+b[1]A[1]=relu(Z[1]) \begin{aligned} Z^{[1]} &= W^{[1]} * X + b^{[1]} \\ A^{[1]} &= relu(Z^{[1]}) \end{aligned}
  • 输出层
    Z[2]=W[2]A[1]+b[2]Y^=A[2]=sigmoid(Z[2]) \begin{aligned} Z^{[2]} &= W^{[2]} * A^{[1]} + b^{[2]} \\ \hat Y &= A^{[2]} = sigmoid(Z^{[2]}) \end{aligned}
  • 损失函数
    Loss=(YlogY^+(1Y)log(1Y^)) Loss = -(Y\,log\,\hat Y + (1-Y)\,log(1-\hat Y))

这里隐含层的**函数为 relu, 输出层的**函数为 sigmoid。

5.2 反向传播

反向传播中主要利用链式求导法则,即 zx=zyyx\frac{\partial z}{\partial x} = \frac{\partial z}{\partial y}\,\frac{\partial y}{\partial x}

dA[2]=YA[2]+1Y1A[2]dZ[2]=A[2]YdW[2]=1mdZ[2]XTdb[2]=1msum(dZ[2])dA[1]=W[2]TdZ[2]dZ[1]=dA[1]dRelu(Z[1])dW[1]=1mdZ[1]XTdb[1]=1msum(dZ[1]) \begin{aligned} dA^{[2]} &= -\frac{Y}{A^{[2]}} + \frac{1-Y}{1-A^{[2]}} \\ dZ^{[2]} &= A^{[2]}-Y \\ dW^{[2]} &= \frac 1m dZ^{[2]}X^T \\ db^{[2]} &= \frac 1m \,sum(dZ^{[2]}) \\ dA^{[1]} &= W^{[2]T}dZ^{[2]} \\ dZ^{[1]} &= dA^{[1]}dRelu(Z^{[1]}) \\ dW^{[1]} &= \frac 1m dZ^{[1]}X^T \\ db^{[1]} &= \frac 1m \,sum(dZ^{[1]}) \end{aligned}

在 dW 和 db 中都有一个 1m\frac 1m, 这是因为正向计算时有 m 个样本,所以这里需要除以 m

5.3 更新参数

W[1]:=W[1]αdW[1]b[1]:=b[1]αdb[1]W[2]:=W[2]αdW[2]b[2]:=b[2]αdb[2] \begin{aligned} W^{[1]}:&=W^{[1]} - \alpha\,dW^{[1]} \\ b^{[1]}:&=b^{[1]} - \alpha\,db^{[1]} \\ W^{[2]}:&=W^{[2]} - \alpha\,dW^{[2]} \\ b^{[2]}:&=b^{[2]} - \alpha\,db^{[2]} \end{aligned}

其中 α\alpha 为学习率

经过多轮迭代即可得到最优的(W,b)。

后记

神经网络先聊到这里,下次 我们将探索多隐含层多节点的深度神经网络(DNN)及其一般推导过程。

欢迎关注本人公众号《大数据茶馆》,用大白话畅聊大数据。

来的都是客,欢迎您常来坐坐~

深度学习系列3:神经网络那些事儿