教程总体简介:在职高新课-深度学习 要求 目标 环境要求 1.1 深度学习介绍 学习目标 1.1.1 区别 1.1.3 深度学习代表算法-神经网络 1.1.4 为什么深度学习现在效果非常好 深度学习与神经网络 1.2 神经网络基础 循环神经网络 4.2 词嵌入与NLP 4.3 seq2seq与Attention机制 5.1 生成对抗网络(GAN) 高级主题 5.2 自动编码器 5.3 CapsuleNet(了解) 1.3 浅层神经网络 深度学习进阶 2.1 多分类与TensorFlow 2.2 梯度下降算法改进 2.4 BN与神经网络调优 3.1 图像数据与边缘检测 3.2 卷积神经网络(CNN)原理 3.3 经典分类网络结构 3.5 CNN网络实战技巧
完整笔记资料代码:gitee.com/yinuo112/AI…
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
部分文件图片:
深度学习与神经网络
知道深度学习与机器学习的区别
了解神经网络的结构组成
知道深度学习效果特点
知道逻辑回归的算法计算输出、损失函数
知道导数的计算图
知道逻辑回归的梯度下降算法
知道多样本的向量计算
应用完成向量化运算
应用完成一个单神经元神经网络的结构
知道浅层神经网络的前向计算过程
知道选择激活函数的原因
说明浅层网络的反向传播推导过程
应用完成一个浅层神经网络结构进行分类
了解深层网络的前向传播与反向传播的过程
1.3 浅层神经网络
学习目标
-
目标
- 知道浅层神经网络的前向计算过程
- 知道选择激活函数的原因
- 说明浅层网络的反向传播推导过程
-
应用
-
应用完成一个浅层神经网络结构进行分类
-
1.3.1 浅层神经网络表示
之前已经说过神经网络的结构了,在这不重复叙述。假设我们有如下结构的网络
对于这个网络我们建立一个简单的图示?我们对第一个隐藏层记为[1],输出层为[2]。如下图
计算图如下
- 每个神经元的计算分解步骤如下
- 第一层中的第一个神经元
z1[1]=(W1[1])Tx+b1[1]z _1^{[1]} = (W _1^{[1]})^Tx+b _1^{[1]}z1[1]=(W1[1])Tx+b1[1]
a1[1]=σ(z1[1])a _1^{[1]} = \sigma(z _1^{[1]})a1[1]=σ(z1[1])
- 第一层中的第一个神经元
z2[1]=(W2[1])Tx+b2[1]z _2^{[1]} = (W _2^{[1]})^Tx+b _2^{[1]}z2[1]=(W2[1])Tx+b2[1]
a2[1]=σ(z2[1])a _2^{[1]} = \sigma(z _2^{[1]})a2[1]=σ(z2[1])
得出第一层的计算:
1.3.2 单个样本的向量化表示
那么现在把上面的第一层的计算过程过程用更简单的形式表现出来就是这样的计算
无法显示
那么对于刚才我们所举的例子,将所有层通过向量把整个前向过程表示出来,并且确定每一个组成部分的形状
前向过程计算:
z[1]=W[1]x+b[1]z^{[1]} = W^{[1]}x+b^{[1]}z[1]=W[1]x+b[1]
a[1]=σ(z[1])a^{[1]}=\sigma(z^{[1]})a[1]=σ(z[1])
z[2]=W[2]a[1]+b[2]z^{[2]} = W^{[2]}a^{[1]}+b^{[2]}z[2]=W[2]a[1]+b[2]
a[2]=σ(z[2])a^{[2]}=\sigma(z^{[2]})a[2]=σ(z[2])
那么如果有多个样本,需要这样去做
- 多个样本的向量化表示
假设一样含有M个样本,那么上述过程变成
Z[1]=W[1]X+b[1]Z^{[1]} = W^{[1]}X+b^{[1]}Z[1]=W[1]X+b[1]
A[1]=σ(Z[1]){A}^{[1]}=\sigma(Z^{[1]})A[1]=σ(Z[1])
Z[2]=W[2]A[1]+b[2]Z^{[2]} = W^{[2]}A^{[1]}+b^{[2]}Z[2]=W[2]A[1]+b[2]
A[2]=σ(Z[2])A^{[2]}=\sigma(Z^{[2]})A[2]=σ(Z[2])
1.3.4 激活函数的选择
涉及到网络的优化时候,会有不同的激活函数选择有一个问题是神经网络的隐藏层和输出单元用什么激活函数。之前我们都是选用 sigmoid 函数,但有时其他函数的效果会好得多,大多数通过实践得来,没有很好的解释性。
可供选用的激活函数有:
- tanh 函数(the hyperbolic tangent function,双曲正切函数):
效果比 sigmoid 函数好,因为函数输出介于 -1 和 1 之间。
注 :tanh 函数存在和 sigmoid 函数一样的缺点:当 z 趋紧无穷大(或无穷小),导数的梯度(即函数的斜率)就趋紧于 0,这使得梯度算法的速度会减慢。
- ReLU 函数(the rectified linear unit,修正线性单元)
当 z > 0 时,梯度始终为 1,从而提高神经网络基于梯度算法的运算速度,收敛速度远大于 sigmoid 和 tanh。然而当 z < 0 时,梯度一直为 0,但是实际的运用中,该缺陷的影响不是很大。
- Leaky ReLU(带泄漏的 ReLU):
Leaky ReLU 保证在 z < 0 的时候,梯度仍然不为 0。理论上来说,Leaky ReLU 有 ReLU 的所有优点,但在实际操作中没有证明总是好于 ReLU,因此不常用。
1.3.4.1 为什么需要非线性的激活函数
使用线性激活函数和不使用激活函数、直接使用 Logistic 回归没有区别,那么无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,就成了最原始的感知器了。
a[1]=z[1]=W[1]x+b[1]a^{[1]} = z^{[1]} = W^{[1]}x+b^{[1]}a[1]=z[1]=W[1]x+b[1]
a[2]=z[2]=W[2]a[1]+b[2]{a}^{[2]}=z^{[2]} = W^{[2]}a^{[1]}+b^{[2]}a[2]=z[2]=W[2]a[1]+b[2]
那么这样的话相当于
a[2]=z[2]=W2+b[2]=(W[2]W[1])x+(W[2]b[1]+b[2])=wx+b{a}^{[2]}=z^{[2]} = W^{[2]}(W^{[1]}x+b^{[1]})+b^{[2]}=(W^{[2]}W^{[1]})x+(W^{[2]}b^{[1]}+b^{[2]})=wx+ba[2]=z[2]=W[2](W[1]x+b[1])+b[2]=(W[2]W[1])x+(W[2]b[1]+b[2])=wx+b
1.3.5 修改激活函数的前向传播和反向传播
将上述网络的隐层激活函数修改为tanh,最后一层同样还是二分类,所以激活函数选择依然是sigmoid函数
- 前向传播
Z[1]=W[1]X+b[1]Z^{[1]} = W^{[1]}X+b^{[1]}Z[1]=W[1]X+b[1]
A[1]=tanh(Z[1]){A}^{[1]}=tanh(Z^{[1]})A[1]=tanh(Z[1])
Z[2]=W[2]A[1]+b[2]Z^{[2]} = W^{[2]}A^{[1]}+b^{[2]}Z[2]=W[2]A[1]+b[2]
A[2]=σ(Z[2])A^{[2]}=\sigma(Z^{[2]})A[2]=σ(Z[2])
- 反向梯度下降
那么通过这个计算图来理解这个过程,单个样本的导数推导过程:
由于网络已经存在两层,所以我们需要从后往前得到导数结果,并且多个样本的情况下改写成
最后一个输出层的参数的导数:
dZ[2]=A[2]−YdZ^{[2]} = A^{[2]} - YdZ[2]=A[2]−Y
dW[2]=1md