深度学习教程 | 浅层神经网络

简介: 本文从浅层神经网络入手,讲解神经网络的基本结构(输入层,隐藏层和输出层),浅层神经网络前向传播和反向传播过程,神经网络参数的梯度下降优化,不同的激活函数的优缺点及非线性的原因

ShowMeAI研究中心

作者:韩信子 @ShowMeAI
教程地址http://www.showmeai.tech/tutorials/35
本文地址http://www.showmeai.tech/article-detail/214
声明:版权所有,转载请联系平台与作者并注明出处

收藏ShowMeAI 查看更多精彩内容


第1门课 神经网络和深度学习,第3周:浅层神经网络
本系列为吴恩达老师《深度学习专项课程 (Deep Learning Specialization) 》学习与总结整理所得,对应的课程视频可以在这里 查看。


引言

ShowMeAI 前一篇文章 神经网络基础 中我们对以下内容进行了介绍:

  • 二分类问题、逻辑回归模型及损失函数。
  • 梯度下降算法。
  • 计算图与正向传播及反向传播。
  • 向量化方式并行计算与提效。

本篇内容我们将从浅层神经网络入手,逐步拓展到真正的神经网络模型知识学习。

1.神经网络表示

神经网络的表示 Neural Network Representation

图示为两层神经网络,也可以称作单隐层神经网络 (a single hidden layer neural network) 。这就是典型的浅层 (shallow) 神经网络,结构上,从左到右,可以分成三层:

  • 输入层 (input layer) :竖向堆叠起来的输入特征向量。
  • 隐藏层 (hidden layer) :抽象的非线性的中间层。
  • 输出层 (output layer) :输出预测值。

注意:当我们计算网络的层数时,通常不考虑输入层。因此图中隐藏层是第一层,输出层是第二层。

神经网络表示

有一些约定俗成的符号表示,如下:

  • 输入层的激活值为 equation?tex=a%5E%7B%5B0%5D%7D ,隐藏层产生的激活值,记作 equation?tex=a%5E%7B%5B1%5D%7D
  • 隐藏层的第一个单元 (或者说节点) 就记作 equation?tex=a%5E%7B%5B1%5D%7D_1 ,输出层同理。
  • 隐藏层和输出层都是带有参数 equation?tex=Wequation?tex=b 的,它们都使用上标[1]来表示是和第一个隐藏层有关,或者上标[2]来表示是和输出层有关。

2.计算神经网络的输出

2.1 两层神经网络

计算一个神经网络的输出 Computing a Neural Network's Output

接下来我们开始详细推导神经网络的计算过程

我们依旧来看看我们熟悉的逻辑回归,我们用其构建两层神经网络。逻辑回归的前向传播计算可以分解成计算 equation?tex=zequation?tex=a 的两部分。

如果我们基于逻辑回归构建两层神经网络,前向计算从前往后要做2次计算:

  • 从输入层到隐藏层,对应一次逻辑回归运算。
  • 从隐藏层到输出层,对应一次逻辑回归运算。

神经网络前向计算

在每层计算中,我们注意对应的上标和下标:

  • 我们记上标方括号 equation?tex=%5E%7B%5B%20%5D%7D 表示layer,记下标表示第几个神经元。例如, equation?tex=a_i%5E%7B%5Bl%5D%7D 表示第 equation?tex=l 层的第 equation?tex=i 个神经元。
  • 注意, equation?tex=iequation?tex=1 开始, equation?tex=lequation?tex=0 开始。

2.2 单个样本计算方式

我们将输入层到隐藏层的计算公式列出来:

神经网络前向计算

后续从隐藏层到输出层的计算公式为:

神经网络前向计算

上述每个节点的计算都对应着一次逻辑运算的过程,分别由计算 equation?tex=zequation?tex=a两部分组成

2.3 向量化计算

多样本向量化 Vectorizing across Multiple Examples

我们引入向量化思想提升计算效率,将上述表达式转换成矩阵运算的形式,如下所示:

神经网络前向计算

我们这里特别注意一下数据维度:

  • equation?tex=W%5E%7B%5B1%5D%7D 的维度是 equation?tex=%284%2C3%29
  • equation?tex=b%5E%7B%5B1%5D%7D 的维度是 equation?tex=%284%2C1%29
  • equation?tex=W%5E%7B%5B2%5D%7D 的维度是 equation?tex=%281%2C4%29
  • equation?tex=b%5E%7B%5B2%5D%7D 的维度是 equation?tex=%281%2C1%29

2.4 数据集向量化计算

向量化实现的解释 Justification for Vectorized Implementation

上面部分提到的是单个样本的神经网络正向传播矩阵运算过程。对于 equation?tex=m 个训练样本,我们也可以使用向量化矩阵运算的形式来提升计算效率。形式上,它和单个样本的矩阵运算十分相似,比较简单。我们记输入矩阵 equation?tex=X 的维度为 equation?tex=%28n_x%2Cm%29 ,则有:

神经网络前向计算

上述公式中, equation?tex=Z%5E%7B%5B1%5D%7D 的维度是 equation?tex=%284%2Cm%29 ,4是隐藏层神经元的个数; equation?tex=A%5E%7B%5B1%5D%7D 的维度与 equation?tex=Z%5E%7B%5B1%5D%7D 相同; equation?tex=Z%5E%7B%5B2%5D%7Dequation?tex=A%5E%7B%5B2%5D%7D 的维度均为 equation?tex=%281%2Cm%29

我们可以这样理解上述的矩阵:行表示神经元个数,列表示样本数目 equation?tex=m

3.激活函数

激活函数 Activation Functions

3.1 不同的激活函数与选择

在神经网络中,隐藏层和输出层都需要激活函数 (activation function) ,前面的例子中我们都默认使用 Sigmoid 函数 equation?tex=%5Csigma%28z%29 作为激活函数。实际我们有不同的激活函数可以选择,而且它们有各自的优点:

激活函数

(1) tanh 函数

the hyperbolic tangent function,双曲正切函数

equation?tex=a%20%3D%20%5Cfrac%7Be%5Ez%20-%20e%5E%7B-z%7D%7D%7Be%5Ez%20%2B%20e%5E%7B-z%7D%7D

优点:函数输出介于 equation?tex=%28-1%2C1%29 ,激活函数的平均值就更接近0,有类似数据中心化的效果。效果几乎总比 Sigmoid 函数好 (二元分类的输出层我们还是会用 Sigmoid ,因为我们希望输出的结果介于 equation?tex=%280%2C1%29 ) 。

缺点:当 equation?tex=z 趋紧无穷大 (或无穷小) ,导数的梯度 (即函数的斜率) 就趋紧于0,这使得梯度算法的速度大大减缓。这一点和 Sigmoid 一样。

(2) ReLU函数

the rectified linear unit,修正线性单元

equation?tex=a%3Dmax%280%2Cz%29

优点:当 equation?tex=z%20%3E%200 时,梯度始终为1,从而提高神经网络基于梯度算法的运算速度,收敛速度远大于 Sigmoid 和tanh。

缺点:当 equation?tex=z%20%3C%200 时,梯度一直为0,但是实际的运用中,该缺陷的影响不是很大。

(3) Leaky ReLU

带泄漏的ReLU

equation?tex=a%3Dmax%280.01z%2Cz%29

优点:Leaky ReLU保证在 equation?tex=z%20%3C%200 的时候,梯度仍然不为0。

理论上来说,Leaky ReLU有ReLU的所有优点,但在实际操作中没有证明总是好于ReLU,因此不常用。

总结

在选择激活函数的时候,如果在不知道该选什么的时候就选择ReLU。当然也没有固定答案,要依据实际问题在交叉验证集合中进行验证分析。注意,我们可以在不同层选用不同的激活函数。

3.2 使用非线性激活函数的原因

为什么需要非线性激活函数? Why Need a Nonlinear Activation Function?

使用线性激活函数和不使用激活函数、无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,就成了最原始的感知器了。我们以2层神经网络做一个简单推导,如下:

假设所有的激活函数都是线性的,为了更简单一点,我们直接令激活函数 equation?tex=g%28z%29%3Dz ,即 equation?tex=a%3Dz 。那么,浅层神经网络的各层输出为:

equation?tex=z%5E%7B%5B1%5D%7D%3DW%5E%7B%5B1%5D%7Dx%2Bb%5E%7B%5B1%5D%7Dequation?tex=a%5E%7B%5B1%5D%7D%3Dz%5E%7B%5B1%5D%7Dequation?tex=z%5E%7B%5B2%5D%7D%3DW%5E%7B%5B2%5D%7Da%5E%7B%5B1%5D%7D%2Bb%5E%7B%5B2%5D%7Dequation?tex=a%5E%7B%5B2%5D%7D%3Dz%5E%7B%5B2%5D%7D

我们对上述公式中 equation?tex=a%5E%7B%5B2%5D%7D 展开计算,得:

equation?tex=%5Cbegin%7Baligned%7D%20a%5E%7B%5B2%5D%7D%3Dz%5E%7B%5B2%5D%7D%20%26%3DW%5E%7B%5B2%5D%7D%20a%5E%7B%5B1%5D%7D%2Bb%5E%7B%5B2%5D%7D%20%5C%5C%20%26%3DW%5E%7B%5B2%5D%7D%5Cleft%28W%5E%7B%5B1%5D%7D%20x%2Bb%5E%7B%5B1%5D%7D%5Cright%29%2Bb%5E%7B%5B2%5D%7D%20%5C%5C%20%26%3D%5Cleft%28W%5E%7B%5B2%5D%7D%20W%5E%7B%5B1%5D%7D%5Cright%29%20x%2B%5Cleft%28W%5E%7B%5B2%5D%7D%20b%5E%7B%5B1%5D%7D%2Bb%5E%7B%5B2%5D%7D%5Cright%29%20%5C%5C%20%26%3DW%5E%7B%5Cprime%7D%20x%2Bb%5E%7B%5Cprime%7D%20%5Cend%7Baligned%7D

上述推导后,我们可以发现 equation?tex=a%5E%7B%5B2%5D%7D 仍是输入变量 equation?tex=x 的线性组合!后续堆叠更多的层次,也可以依次类推,这表明,使用神经网络,如果不使用激活函数或使用线性激活函数,与直接使用线性模型的效果并没有什么两样!因此,隐藏层的激活函数必须要是非线性的。

不过,在部分场景下,比如是回归预测问题而不是分类问题,输出值 equation?tex=y 为连续值,输出层的激活函数可以使用线性函数。如果输出 equation?tex=y 恒为正值,则也可以使用ReLU激活函数,这些具体情况具体分析。

3.3 激活函数的导数

激活函数的导数 Derivatives of Activation Functions

我们来看一下不同激活函数的导数,这将在我们反向传播中频繁用到。

激活函数

4.神经网络的梯度下降法

神经网络的梯度下降 Gradient Descent for Neural Networks

下面我们来一起看看,神经网络中的梯度计算。

我们依旧以浅层神经网络为例,它包含的参数为 equation?tex=W%5E%7B%5B1%5D%7Dequation?tex=b%5E%7B%5B1%5D%7Dequation?tex=W%5E%7B%5B2%5D%7Dequation?tex=b%5E%7B%5B2%5D%7D

神经网络的梯度下降法

令输入层的特征向量个数 equation?tex=n_x%3Dn%5E%7B%5B0%5D%7D ,隐藏层神经元个数为 equation?tex=n%5E%7B%5B1%5D%7D ,输出层神经元个数为 equation?tex=n%5E%7B%5B2%5D%7D%3D1 。则:

  • equation?tex=W%5E%7B%5B1%5D%7D 的维度为 equation?tex=%28n%5E%7B%5B1%5D%7D%2Cn%5E%7B%5B0%5D%7D%29
  • equation?tex=b%5E%7B%5B1%5D%7D 的维度为 equation?tex=%28n%5E%7B%5B1%5D%7D%2C1%29
  • equation?tex=W%5E%7B%5B2%5D%7D 的维度为 equation?tex=%28n%5E%7B%5B2%5D%7D%2Cn%5E%7B%5B1%5D%7D%29
  • equation?tex=b%5E%7B%5B2%5D%7D 的维度为 equation?tex=%28n%5E%7B%5B2%5D%7D%2C1%29

4.1 神经网络中的梯度下降

上述神经网络的前向传播过程,对应的公式如下图左侧。反向传播过程,我们会进行梯度计算,我们先列出Cost Function对各个参数的梯度,如下图右侧公式。

神经网络的梯度下降法

其中,np.sum使用到python中的numpy工具库,想了解更多的同学可以查看ShowMeAI图解数据分析 系列中的numpy教程,也可以通过ShowMeAI 制作的numpy速查手册 快速了解其使用方法)

4.2 反向传播(拓展补充)

直观理解反向传播 Backpropagation Intuition

我们使用上篇内容 神经网络基础 中的计算图方式来推导神经网络反向传播。回忆我们前面提到的逻辑回归,推导前向传播和反向传播的计算图如下图所示:

神经网络的梯度下降法

因为多了隐藏层,神经网络的计算图要比逻辑回归的复杂一些,如下图所示。

神经网络的梯度下降法

综上,对于浅层神经网络(包含一个隐藏层)而言,「单个样本」和「m个训练样本」的反向传播过程分别对应如下的6个表达式(都是向量化矩阵形式):

神经网络的梯度下降法

5.随机初始化

随机初始化 Random + Initialization

5.1 全零初始化权重问题

我们在很多机器学习模型中,会初始化权重为0。但在神经网络模型中,参数权重 equation?tex=W 是不能全部初始化为零的,它会带来对称性问题 (symmetry breaking problem) ,下面是分析过程。

假设一个浅层神经网络包含两个输入,隐藏层包含两个神经元。

NN权重初始化

如果权重 equation?tex=W%5E%7B%5B1%5D%7Dequation?tex=W%5E%7B%5B2%5D%7D 都初始化为零,这样使得隐藏层第一个神经元的输出等于第二个神经元的输出,即 equation?tex=a_1%5E%7B%5B1%5D%7D%3Da_2%5E%7B%5B1%5D%7D 。容易得到 equation?tex=dz_1%5E%7B%5B1%5D%7D%3Ddz_2%5E%7B%5B1%5D%7D ,以及 equation?tex=dW_1%5E%7B%5B1%5D%7D%3DdW_2%5E%7B%5B1%5D%7D

我们发现:隐藏层两个神经元对应的权重行向量 equation?tex=W_1%5E%7B%5B1%5D%7Dequation?tex=W_2%5E%7B%5B1%5D%7D 每次迭代更新都会得到完全相同的结果, equation?tex=W_1%5E%7B%5B1%5D%7D 始终等于 equation?tex=W_2%5E%7B%5B1%5D%7D ,完全对称!这样隐藏层设置多个神经元就没有任何意义了。

当然,因为中间层每次只会有1个偏置项参数 equation?tex=b ,它可以全部初始化为零,并不会影响神经网络训练效果。

5.2 解决方法

上述提到的权重W全部初始化为零带来的问题就是symmetry breaking problem (对称性) 。解决方法也很简单:在初始化的时候, equation?tex=W 参数要进行随机初始化,不可以设置为0。而 equation?tex=b 因为不存在对称性的问题,可以设置为 0。

以 2 个输入,2 个隐藏神经元为例:

W = np.random.rand (2,2) * 0.01
b = np.zeros ( (2,1) ) 

这里将 equation?tex=W 的值乘以 0.01 (或者其他的常数值) 的原因是为了使得权重 equation?tex=W 初始化为较小的值,这是因为使用 Sigmoid 函数或者 tanh 函数作为激活函数时:

  • equation?tex=W 比较小,则 equation?tex=Z%3DWX%2Bb 所得的值趋近于 0,梯度较大,能够提高算法的更新速度。
  • equation?tex=W 设置的太大,得到的梯度较小,训练过程因此会变得很慢。

NN权重初始化

ReLU 和 Leaky ReLU 作为激活函数时不存在这种问题,因为在大于 0 的时候,梯度均为 1。如果输出层是 Sigmoid 函数,则对应的权重 equation?tex=W 最好初始化到比较小的值。

参考资料

ShowMeAI 系列教程推荐

推荐文章

ShowMeAI用知识加速每一次技术成长

目录
相关文章
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络:从理论到实践
【10月更文挑战第35天】在人工智能的浪潮中,深度学习技术以其强大的数据处理能力成为科技界的宠儿。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,在图像识别和视频分析等领域展现出了惊人的潜力。本文将深入浅出地介绍CNN的工作原理,并结合实际代码示例,带领读者从零开始构建一个简单的CNN模型,探索其在图像分类任务中的应用。通过本文,读者不仅能够理解CNN背后的数学原理,还能学会如何利用现代深度学习框架实现自己的CNN模型。
|
9天前
|
机器学习/深度学习 人工智能 算法框架/工具
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第36天】探索卷积神经网络(CNN)的神秘面纱,揭示其在图像识别领域的威力。本文将带你了解CNN的核心概念,并通过实际代码示例,展示如何构建和训练一个简单的CNN模型。无论你是深度学习的初学者还是希望深化理解,这篇文章都将为你提供有价值的见解。
|
7天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
30 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
10天前
|
机器学习/深度学习 人工智能 自动驾驶
深入解析深度学习中的卷积神经网络(CNN)
深入解析深度学习中的卷积神经网络(CNN)
27 0
|
13天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习的奇迹:如何用神经网络识别图像
【10月更文挑战第33天】在这篇文章中,我们将探索深度学习的奇妙世界,特别是卷积神经网络(CNN)在图像识别中的应用。我们将通过一个简单的代码示例,展示如何使用Python和Keras库构建一个能够识别手写数字的神经网络。这不仅是对深度学习概念的直观介绍,也是对技术实践的一次尝试。让我们一起踏上这段探索之旅,看看数据、模型和代码是如何交织在一起,创造出令人惊叹的结果。
24 0
|
14天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【10月更文挑战第32天】本文将介绍深度学习中的一个重要分支——卷积神经网络(CNN),以及其在图像识别领域的应用。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库构建一个基本的CNN模型,并对其进行训练和测试。
|
10天前
|
机器学习/深度学习 人工智能 测试技术
深度学习在图像识别中的应用与挑战
本文探讨了深度学习技术,尤其是卷积神经网络(CNN)在图像识别任务中的最新进展和面临的主要挑战。通过分析不同的网络架构、训练技巧以及优化策略,文章旨在提供一个全面的概览,帮助研究人员和实践者更好地理解和应用这些技术。
42 9
|
6天前
|
机器学习/深度学习 人工智能 算法
深度学习在图像识别中的应用与挑战
本文探讨了深度学习技术在图像识别领域的应用,重点分析了卷积神经网络(CNN)的工作原理及其在处理图像数据方面的优势。通过案例研究,展示了深度学习如何提高图像识别的准确性和效率。同时,文章也讨论了当前面临的主要挑战,包括数据不足、过拟合问题以及计算资源的需求,并提出了相应的解决策略。
|
7天前
|
机器学习/深度学习 分布式计算 并行计算
深度学习在图像识别中的应用与挑战
本文深入探讨了深度学习技术在图像识别领域的应用,分析了当前主流的卷积神经网络(CNN)架构,并讨论了在实际应用中遇到的挑战和可能的解决方案。通过对比研究,揭示了不同网络结构对识别准确率的影响,并提出了优化策略。此外,文章还探讨了深度学习模型在处理大规模数据集时的性能瓶颈,以及如何通过硬件加速和算法改进来提升效率。
|
8天前
|
机器学习/深度学习 人工智能 计算机视觉
深度学习在图像识别中的应用与挑战
【10月更文挑战第38天】本文将深入探讨深度学习如何在图像识别领域大放异彩,并揭示其背后的技术细节和面临的挑战。我们将通过实际案例,了解深度学习如何改变图像处理的方式,以及它在实际应用中遇到的困难和限制。

热门文章

最新文章