乐趣区

关于深度学习:深度学习教程-浅层神经网络

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

珍藏 ShowMeAI 查看更多精彩内容


本系列为吴恩达老师《深度学习专项课程 (Deep Learning Specialization)》学习与总结整顿所得,对应的课程视频能够在 这里 查看。

引言

在 ShowMeAI 前一篇文章 神经网络根底 中咱们对以下内容进行了介绍:

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

本篇内容咱们将从浅层神经网络动手,逐渐拓展到真正的神经网络模型常识学习。

1. 神经网络示意

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

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

留神:当咱们计算网络的层数时,通常不思考输出层。因而图中暗藏层是第一层,输入层是第二层。

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

  • 输出层的激活值为 \(a^{[0]}\),暗藏层产生的激活值,记作 \(a^{[1]}\)。
  • 暗藏层的第一个单元 (或者说节点) 就记作 \(a^{[1]}_1\),输入层同理。
  • 暗藏层和输入层都是带有参数 \(W\)和 \(b\)的,它们都应用上标 [1] 来示意是和第一个暗藏层无关,或者上标 [2] 来示意是和输入层无关。

2. 计算神经网络的输入

2.1 两层神经网络

接下来咱们开始具体推导神经网络的计算过程

咱们仍旧来看看咱们相熟的逻辑回归,咱们用其构建两层神经网络。逻辑回归的前向流传计算能够分解成计算 \(z\)和 \(a\)的两局部。

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

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

在每层计算中,咱们留神对应的上标和下标:

  • 咱们记上标方括号 \(^{[]}\)示意 layer,记下标示意第几个神经元。例如,\(a_i^{[l]}\)示意第 \(l\)层的第 \(i\)个神经元。
  • 留神,\(i\)从 \(1\)开始,\(l\)从 \(0\)开始。

2.2 单个样本计算形式

咱们将 输出层到暗藏层 的计算公式列出来:

后续 从暗藏层到输入层 的计算公式为:

上述每个节点的计算都对应着一次逻辑运算的过程,别离由计算 \(z\)和 \(a\)两局部组成

2.3 向量化计算

咱们引入向量化思维晋升计算效率,将上述表达式转换成矩阵运算的模式,如下所示:

咱们这里特地留神一下数据维度:

  • \(W^{[1]}\)的维度是 \((4,3)\)
  • \(b^{[1]}\)的维度是 \((4,1)\)
  • \(W^{[2]}\)的维度是 \((1,4)\)
  • \(b^{[2]}\)的维度是 \((1,1)\)

2.4 数据集向量化计算

下面局部提到的是单个样本的神经网络正向流传矩阵运算过程。对于 \(m\)个训练样本,咱们也能够应用向量化矩阵运算的模式来晋升计算效率。模式上,它和单个样本的矩阵运算十分相似,比较简单。咱们记输出矩阵 \(X\)的维度为 \((n_x,m)\),则有:

上述公式中,\(Z^{[1]}\)的维度是 \((4,m)\),4 是暗藏层神经元的个数;\(A^{[1]}\)的维度与 \(Z^{[1]}\)雷同;\(Z^{[2]}\)和 \(A^{[2]}\)的维度均为 \((1,m)\)。

咱们能够这样了解上述的矩阵:行示意神经元个数,列示意样本数目 \(m\)

3. 激活函数

3.1 不同的激活函数与抉择

在神经网络中,暗藏层和输入层都须要激活函数 (activation function),后面的例子中咱们都默认应用 Sigmoid 函数 \(\sigma(z)\) 作为激活函数。理论咱们有不同的激活函数能够抉择,而且它们有各自的长处:

(1) tanh 函数

the hyperbolic tangent function,双曲正切函数

$$
a = \frac{e^z – e^{-z}}{e^z + e^{-z}}
$$

长处:函数输入介于 \((-1,1)\),激活函数的平均值就更靠近 0,有相似数据中心化的成果。成果简直总比 Sigmoid 函数好(二元分类的输入层咱们还是会用 Sigmoid,因为咱们心愿输入的后果介于 \((0,1)\))。

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

(2) ReLU 函数

the rectified linear unit,修改线性单元

$$
a=max(0,z)
$$

长处 :当 \(z > 0\) 时,梯度始终为 1,从而进步神经网络基于梯度算法的运算速度,收敛速度远大于 Sigmoid 和 tanh。

毛病 :当 \(z < 0\) 时,梯度始终为 0,然而理论的使用中,该缺点的影响不是很大。

(3) Leaky ReLU

带透露的 ReLU

$$
a=max(0.01z,z)
$$

长处 :Leaky ReLU 保障在 \(z < 0\) 的时候,梯度依然不为 0。

实践上来说,Leaky ReLU 有 ReLU 的所有长处,但在实际操作中没有证实总是好于 ReLU,因而不罕用。

总结

在抉择激活函数的时候,如果在不晓得该选什么的时候就抉择 ReLU。当然也没有固定答案,要根据理论问题在穿插验证汇合中进行验证剖析。留神,咱们能够在不同层选用不同的激活函数。

3.2 应用非线性激活函数的起因

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

假如所有的激活函数都是线性的,为了更简略一点,咱们间接令激活函数 \(g(z)=z\),即 \(a=z\)。那么,浅层神经网络的各层输入为:

$$
z^{[1]}=W^{[1]}x+b^{[1]}
$$

$$
a^{[1]}=z^{[1]}
$$

$$
z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}
$$

$$
a^{[2]}=z^{[2]}
$$

咱们对上述公式中 \(a^{[2]}\)开展计算,得:

$$
\begin{aligned}
a^{[2]}=z^{[2]} &=W^{[2]} a^{[1]}+b^{[2]} \\
&=W^{[2]}\left(W^{[1]} x+b^{[1]}\right)+b^{[2]} \\
&=\left(W^{[2]} W^{[1]}\right) x+\left(W^{[2]} b^{[1]}+b^{[2]}\right) \\
&=W^{\prime} x+b^{\prime}
\end{aligned}
$$

上述推导后,咱们能够发现 \(a^{[2]}\)仍是输出变量 \(x\)的线性组合!后续重叠更多的档次,也能够顺次类推,这表明,应用神经网络,如果不应用激活函数或应用线性激活函数,与间接应用线性模型的成果并没有什么两样!因而,暗藏层的激活函数必须要是非线性的。

不过,在局部场景下,比方是回归预测问题而不是分类问题,输入值 \(y\)为间断值,输入层的激活函数能够应用线性函数。如果输入 \(y\)恒为正值,则也能够应用 ReLU 激活函数,这些具体情况具体分析。

3.3 激活函数的导数

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

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

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

咱们仍旧以浅层神经网络为例,它蕴含的参数为 \(W^{[1]}\),\(b^{[1]}\),\(W^{[2]}\),\(b^{[2]}\)。

令输出层的特征向量个数 \(n_x=n^{[0]}\),暗藏层神经元个数为 \(n^{[1]}\),输入层神经元个数为 \(n^{[2]}=1\)。则:

  • \(W^{[1]}\)的维度为 \((n^{[1]},n^{[0]})\)
  • \(b^{[1]}\)的维度为 \((n^{[1]},1)\)
  • \(W^{[2]}\)的维度为 \((n^{[2]},n^{[1]})\)
  • \(b^{[2]}\)的维度为 \((n^{[2]},1)\)

4.1 神经网络中的梯度降落

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

其中,np.sum应用到 python 中的 numpy 工具库,想理解更多的同学能够查看 ShowMeAI 的 图解数据分析 系列中的 numpy 教程,也能够通过 ShowMeAI 制作的numpy 速查手册 疾速理解其应用办法)

4.2 反向流传(拓展补充)

咱们应用上篇内容 神经网络根底 中的计算图形式来推导神经网络反向流传。回顾咱们后面提到的逻辑回归,推导前向流传和反向流传的计算图如下图所示:

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

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

5. 随机初始化

5.1 全零初始化权重问题

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

假如一个浅层神经网络蕴含两个输出,暗藏层蕴含两个神经元。

如果权重 \(W^{[1]}\)和 \(W^{[2]}\)都初始化为零,这样使得暗藏层第一个神经元的输入等于第二个神经元的输入,即 \(a_1^{[1]}=a_2^{[1]}\)。容易失去 \(dz_1^{[1]}=dz_2^{[1]}\),以及 \(dW_1^{[1]}=dW_2^{[1]}\)。

咱们发现:暗藏层两个神经元对应的权重行向量 \(W_1^{[1]}\)和 \(W_2^{[1]}\)每次迭代更新都会失去完全相同的后果,\(W_1^{[1]}\)始终等于 \(W_2^{[1]}\),齐全对称!这样暗藏层设置多个神经元就没有任何意义了。

当然,因为中间层每次只会有 1 个偏置项参数 \(b\),它能够全副初始化为零,并不会影响神经网络训练成果。

5.2 解决办法

上述提到的权重 W 全副初始化为零带来的问题就是 symmetry breaking problem(对称性)。解决办法也很简略:在初始化的时候,\(W\)参数要进行随机初始化,不能够设置为 0。而 \(b\)因为不存在对称性的问题,能够设置为 0。

以 2 个输出,2 个暗藏神经元为例:

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

这里将 \(W\) 的值乘以 0.01(或者其余的常数值)的起因是为了使得权重 \(W\) 初始化为较小的值,这是因为应用 Sigmoid 函数或者 tanh 函数作为激活函数时:

  • 若 \(W\) 比拟小,则 \(Z=WX+b\) 所得的值趋近于 0,梯度较大,可能进步算法的更新速度。
  • 若 \(W\) 设置的太大,失去的梯度较小,训练过程因而会变得很慢。

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

参考资料

  • 图解数据分析
  • numpy 速查手册

ShowMeAI 系列教程举荐

  • 图解 Python 编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解 AI 数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程
  • 图解机器学习算法:从入门到精通系列教程
  • 机器学习实战:手把手教你玩转机器学习系列
  • 深度学习教程 | 吴恩达专项课程 · 全套笔记解读

举荐文章

  • 深度学习教程 | 深度学习概论
  • 深度学习教程 | 神经网络根底
  • 深度学习教程 | 浅层神经网络
  • 深度学习教程 | 深层神经网络
  • 深度学习教程 | 深度学习的实用层面
  • 深度学习教程 | 神经网络优化算法
  • 深度学习教程 | 网络优化:超参数调优、正则化、批归一化和程序框架
  • 深度学习教程 | AI 利用实际策略(上)
  • 深度学习教程 | AI 利用实际策略(下)
  • 深度学习教程 | 卷积神经网络解读
  • 深度学习教程 | 经典 CNN 网络实例详解
  • 深度学习教程 | CNN 利用:指标检测
  • 深度学习教程 | CNN 利用:人脸识别和神经格调转换
  • 深度学习教程 | 序列模型与 RNN 网络
  • 深度学习教程 | 自然语言解决与词嵌入
  • 深度学习教程 | Seq2seq 序列模型和注意力机制

退出移动版