12- 深度学习神经网络详解 (基础知识) (深度学习)

知识要点

  • 机器学习需要进行特征提取, 深度学习不需要人工提取特征, 适合难提取特征的图像, 语音等.
  • 机器学习主要通过算法直接进行推断, 而深度学习主要通过神经网络对各种算法进行加权, 然后汇总得出结论, 深度学习模型需要训练.
  • 深度学习应用场景: 1.图像识别 (物体识别)  2.自然语言处理技术(机器翻译), 3.语音识别

  • 神经网络的类型:  人工神经网络 (ANN) / 多层感知器 (MLP) / 卷积神经网络 (CNN) / 循环神经网络 (RNN) .
    • 前馈神经网络 (MLP)主要特征,  处理时会将数据转换为一维数据, 丢失数据的空间特征, 常用在图像分类 .
    • RNN 循环神经网络 主要特征是隐藏层有一个循环连接, 主要目的是来处理序列数据的, 如文本, 视频 .
    • CNN 卷积神经网络 主要特征是在空间上共享参数,CNN并不需要为每一个神经元所对应的每一个输入数据提供单独的权重, 主要应用于图像和视频处理项目 .
  • 神经网络的最后一层通常使用 sigmoid 函数进行判定 .
  • 常用的激活函数:
    • tanh函数: 效果比 sigmoid 函数好, 因为函数输出介于 -1 和 1 之间。
    • relu函数: 当 z > 0 时,梯度始终为 1,从而提高神经网络基于梯度算法的运算速度,收敛速度远大于 sigmoid 和 tanh
    • leaky relu函数: Leaky ReLU 有 ReLU 的所有优点,但在实际操作中没有证明总是好于 ReLU,因此不常用

激活函数参考: 激活函数relu、leaky-relu、elu、selu、serlu比较


一 深度学习介绍

1.1 机器学习和深度学习的区别

  • 机器学习的特征工程步骤是要靠手动完成的,而且需要大量领域专业知识。

  • 深度学习通常由多个层组成,它们通常将更简单的模型组合在一起,通过将数据从一层传递到另一层来构建更复杂的模型。通过大量数据的训练自动得到模型,不需要人工设计特征提取环节。

深度学习算法试图从数据中学习高级功能,这是深度学习的一个非常独特的部分。因此,减少了为每个问题开发新特征提取器的任务。适合用在难提取特征的图像、语音、自然语言领域(NLP) 。

1.2 深度学习应用场景

  • 图像识别 (计算机视觉)

    • 物体识别, 场景识别

    • 车型识别, 人脸检测跟踪

    • 人脸关键点定位, 人脸身份认证

  • 自然语言处理技术

    • 机器翻译, 文本识别, 聊天对话

  • 语音技术

    • 语音识别

1.3 深度学习代表算法-神经网络

人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN)。是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)结构和功能的 计算模型。经典的神经网络结构包含三个层次的神经网络。分别输入层,输出层以及隐藏层


其中每层的圆圈代表一个神经元,隐藏层和输出层的神经元有输入的数据计算后输出,输入层的神经元只是输入。神经网络是深度学习的重要算法,用途在图像(如图像的分类、检测)和自然语言处理(如文本分类、聊天等)

神经网络的特点: 

  • 每个连接都有个权值,同一层神经元之间没有连接

  • 神经元当中会含有激活函数

  • 最后的输出结果对应的层也称之为全连接层

神经网络的类型 # 3种重要类型的神经网络,它们构成了深度学习中大多数预训练模型的基础

  • 多层感知器Multi-Layer Perceptron (MLP) / 人工神经网络Artificial Neural Networks (ANN)
  • 卷积神经网络Convolution Neural Networks (CNN)
  • 循环神经网络Recurrent Neural Networks (RNN)

不同循环间的区别:

1.3.1 多层感知器 (MLP)

  • MLP处理的是一维的数据 .

单个感知器(或神经元)可以被想象成逻辑回归。多层感知器(MLP),是每一层上的一组多个感知器。因为输入仅单方向地向前处理,所以MLP也被称为前馈神经网络

  • MLP由三层组成——输入层、隐藏层和输出层。输入层仅接收输入,隐藏层处理输入,输出层生成结果。基本上,每一层都要训练权值。
  • 在利用MLP解决图像分类问题时,首先要将二维图像转换成一维向量,然后再对模型进行训练。
  • 常用在: 图像分类.

优势:

  • 多层感知器能够学习任意非线性函数。因此,这些网络被普遍称为通用函数逼近器(Universal Function Approximator)。MLP能够学习将任何输入映射到输出的权重。
  • 通用逼近背后的主要原因之一是激活函数(activation function)。激活函数将非线性特征引入网络中,有助于网络学习输入和输出之间的复杂关系。
  • 每个神经元的输出都是输入加权和的激活。但是,如果没有激活函数会怎样呢?该网络仅学习线性函数,但不学习复杂关系,原因是:激活函数是多层感知器的核心!

缺点:

  • 随着图像尺寸的增大,可训练参数的数量会急剧增加
  • MLP会丢失图像的空间特征。空间特征指的是图像中像素的排列。
  • 在所有这些神经网络中,存在一个共同问题:梯度消失与爆炸。

1.3.2 循环神经网络(RNN)

RNN出现的目的是来处理序列数据的。我们先从架构角度了解一下RNN和MLP之间的区别:

MLP隐藏层上的环形约束转向RNN: (下图前一个为RNN, 后一个为MLP)

如上图所示,RNN在隐藏状态上有一个循环连接,此循环约束能够确保在输入数据中捕捉到顺序信息。循环神经网络能够帮助我们解决以下相关问题:

  • 时间序列数据

  • 文本数据

  • 音频数据

优势:

  • RNN能够捕捉数据中出现的顺序信息例如,预测时文本中单词之间的依赖关系.
  • RNN跨不同的时间步长共享参数。这通常被称为参数共享(Parameter Sharing)。这将减少训练参数并降低计算成本。

缺点:

  • 深度RNN(具有大量时间步长的RNN)也存在梯度消失和爆炸问题

1.3.3 卷积神经网络(CNN)

卷积神经网络(CNN)目前在深度学习领域非常热门。这些CNN模型被应用于不同的应用和领域,在图像和视频处理项目中尤其普遍。CNN是 在空间上共享参数,RNN是在时间上(顺序上)共享参数。

CNN并不需要为每一个神经元所对应的每一个输入数据提供单独的权重。与池化(pooling)相结合,CNN可以被理解为一种公共特征的提取过程,不仅是CNN大部分神经网络都可以近似的认为大部分神经元都被用于特征提取。

CNN的构建块是过滤器,也就是内核。内核的作用是利用卷积运算从输入中提取相关特征。我们可以试着了解一下使用图像作为输入数据的过滤器的重要性。将图像与过滤器进行卷积会生成一个特征图(feature map)。

CNN从图像中捕捉空间特征(spatial features)。空间特征指的是像素在图像中的排列以及它们之间的关系。它们能够帮助我们准确地识别物体、物体位置、以及它与图像中其他物体的关系。

优势:

  • CNN能够自动学习过滤器。这些过滤器有助于从输入数据中提取正确的相关特征。可以通过查看特定的特征(例如眼睛、鼻子、嘴巴等)轻松识别出图像是一张人脸。我们还可以看到这些特征在图像中的排列方式。这正是CNN能够捕捉的内容。
  • 尽管引入卷积神经网络的初衷是要解决与图像数据相关的问题,但它们在顺序输入上的表现也十分出色。

二 神经网络基础

2.1 Logistic回归

逻辑回归是一个主要用于二分类的算法。那么逻辑回归是给定一个 x , 输出一个该样本属于1对应类别的预测概率 ​\hat{y}=P(y=1|x)

Logistic 回归中使用的参数如下:

  • 输入的特征向量:x \in R^{n_x}​,​x是一个 ​nx维的特征数量,用于训练的标签:​y \in 0,1

  • 参数:权重:w \in R^{n_x}​, 偏置:​b \in R

  • 输出预测结果:​\hat{y} = \sigma(w^Tx+b)=\sigma(w_1x_1+w_2x_2+...+b)=\sigma(\theta^Tx)

    • Sigmoid 函数: ​s = \sigma(w^Tx+b) = \sigma(z) = \frac{1}{1+e^{-z}}

    • 如果z的结果非常大,那么S的结果接近于1

    • 如果z的结果较小或者是非常大的负数,那么S的结果接近于0

 
逻辑回归损失函数 :

损失函数(loss function)用于衡量预测结果与真实值之间的误差。最简单的损失函数定义方式为平方差损失:L(\hat{y},y) = \frac{1}{2}(\hat{y}-y)^2

​逻辑回归一般使用​: L(\hat{y},y) = -(y\log\hat{y})-(1-y)\log(1-\hat{y})

该式子的理解:

  • 如果y=1,损失为​- \log\hat{y},那么要想损失越小,\hat{y}​的值必须越大,即越趋近于或者等于1

  • 如果y=0,损失为1\log(1-\hat{y})​,那么要想损失越小,那么​\hat{y}​的值越小,即趋近于或者等于0

损失函数是在单个训练样本中定义的,它衡量了在单个训练样本上的表现。代价函数(cost function)衡量的是在全体训练样本上的表现,即衡量参数 w 和 b 的效果,所有训练样本的损失平均值 : J(w,b) = \frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})


2.2 梯度下降算法

目的:使损失函数的值找到最小值.

方式:梯度下降.

函数的梯度(gradient)指出了函数的最陡增长方向。梯度的方向走,函数增长得就越快。那么按梯度的负方向走,函数值自然就降低得最快了。模型的训练目标即是寻找合适的 w 与 b 以最小化代价函数值。

可以看到,成本函数 J 是一个凸函数,与非凸函数的区别在于其不含有多个局部最低。

参数w和b的更新公式为:w := w - \alpha\frac{dJ(w, b)}{dw}, b := b - \alpha\frac{dJ(w, b)}{db}
通过平面来理解梯度下降过程:

2.3 向量化编程

每更新一次梯度时候,在训练期间我们会拥有m个样本,那么 这样每个样本提供进去都可以做一个梯度下降计算。所以我们要去做在所有样本上的计算结果、梯度等操作.
        J(w,b) = \frac{1}{m}\sum_{i=1}^mL({a}^{(i)},y^{(i)})

由于在进行计算的时候,最好不要使用for循环去进行计算,因为有Numpy可以进行更加快速的向量化计算。

在公式 z = w^Tx+b ​中​,​都可能是多个值,也就是:
        ​ \bar w = \left( \begin{array}{c}w_{1} \\ \vdots \\w_{n}\end{array}\right), \bar x= \left(\begin{array}{c}x_{1} \\\vdots \\x_{n} \end{array}\right)
向量化的好处, 不用对每个特征都使用for循环, 速度更快.  前面我们所做的整个过程分为两个部分,一个是从前往后的计算出梯度与损失,另外一部分是从后往前计算参数的更新梯度值。所以在神经网络当中会经常出现两个概念,正向传播与反向传播。
 

三 浅层神经网络

3.1 浅层神经网络表示

对于这个网络我们建立一个简单的图示?我们对第一个隐藏层记为[1],输出层为[2]。如下图

计算图如下 :

  • 每个神经元的计算分解步骤如下:

        

  • 第一层中的第一个神经元
    •  z _1^{[1]} = (W _1^{[1]})^Tx+b _1^{[1]}
    • a _1^{[1]} = \sigma(z _1^{[1]})
  • 第一层中的第二个神经元
    • z _2^{[1]} = (W _2^{[1]})^Tx+b _2^{[1]}
    • a _2^{[1]} = \sigma(z _2^{[1]})
  • 得出第一层的计算:

        

3.2 单个样本的向量化表示

那么现在把上面的第一层的计算过程过程用更简单的形式表现出来就是这样的计算

        \left(\begin{array}{cccc}\cdots & (W _1^{[1]})^T & \cdots \\ \cdots & (W _2^{[1]})^T & \cdots \\ \cdots & (W _3^{[1]})^T & \cdots \\ \cdots & (W _4^{[1]})^T & \cdots \end{array}\right) * \left( \begin{array}{c}x_{1} \\ x_{2} \\ x_{3}\end{array}\right) + \left( \begin{array}{c}b_{1}^{[1]} \\ b_{2}^{[1]} \\ b_{3}^{[1]} \\ b_{4}^{[1]} \end{array}\right)

那么对于刚才我们所举的例子,将所有层通过向量把整个前向过程表示出来,并且确定每一个组成部分的形状, 前向过程计算:

  • z^{[1]} = W^{[1]}x+b^{[1]} 形状:(4,1) = (4,3) * (3,1) + (4,1)
  • a^{[1]}=\sigma(z^{[1]}) 形状:(4,1)
  • z^{[2]} = W^{[2]}a^{[1]}+b^{[2]} 形状:(1,1) = (1,4) * (4,1)+(1,1)
  • a^{[2]}=\sigma(z^{[2]}) 形状:(1,1)

那么如果有多个样本,需要这样去做:

  •  多个样本的向量化表示

        
假设一样含有M个样本,那么上述过程变成 :

  • Z^{[1]} = W^{[1]}X+b^{[1]} 形状:(4,m) = (4,3) * (3,m) + (4,1)
  • {A}^{[1]}=\sigma(Z^{[1]}) ​形状:(4,m)
  • Z^{[2]} = W^{[2]}A^{[1]}+b^{[2]} 形状:(1,m) = (1,4) * (4,m)+(1,1)
  • A^{[2]}=\sigma(Z^{[2]}) ​形状:(1,m)

3.3 激活函数的选择

涉及到网络的优化时候,会有不同的激活函数选择有一个问题是神经网络的隐藏层和输出单元用什么激活函数。之前我们都是选用 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,因此不常用

        

3.4 为什么需要非线性的激活函数

使用线性激活函数不使用激活函数、和直接使用 Logistic 回归没有区别,那么无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,就成了最原始的感知器了。

  • 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]}(W^{[1]}x+b^{[1]})+b^{[2]}=(W^{[2]}W^{[1]})x+(W^{[2]}b^{[1]}+b^{[2]})=wx+b

四 深层神经网络

为什么使用深层网络 ?

对于人脸识别等应用,神经网络的第一层从原始图片中提取人脸的轮廓和边缘,每个神经元学习到不同边缘的信息;网络的第二层将第一层学得的边缘信息组合起来,形成人脸的一些局部的特征,例如眼睛、嘴巴等;后面的几层逐步将上一层的特征组合起来,形成人脸的模样。随着神经网络层数的增加,特征也从原来的边缘逐步扩展为人脸的整体,由整体到局部,由简单到复杂。层数越多,那么模型学习的效果也就越精确。

通过例子可以看到,随着神经网络的深度加深,模型能学习到更加复杂的问题,功能也更加强大

4.1 深层神经网络表示


使用浅层网络的时候很多分类等问题得不到很好的解决,所以需要深层的网络。

4.2 四层网络的前向传播与反向传播

在这里首先对每层的符号进行一个确定,我们设置L为第几层,n为每一层的个数,L=[L1,L2,L3,L4], n=[5,5,3,1]

4.2.1 前向传播

首先还是以单个样本来进行表示,每层经过线性计算和激活函数两步计算

  • z^{[1]} = W^{[1]}x+b^{[1]}, a^{[1]}=g^{[1]}(z^{[1]}), 输入x, ​输出​​​ a^{[1]}
  • z^{[2]} = W^{[2]}a^{[1]}+b^{[2]}, a^{[2]}=g^{[2]}(z^{[2]}),输入a^{[1]}​, 输出​ a^{[2]}
  • z^{[3]} = W^{[3]}a^{[2]}+b^{[3]},a^{[3]}=g^{[3]}(z^{[3]}), 输入a^{[2]}​, 输出​ a^{[3]}
  • z^{[4]} = W^{[4]}a^{[3]}+b^{[4]},a^{[4]}=\sigma(z^{[4]}), 输入a^{[3]}​, 输出​ a^{[4]}

 我们将上式简单的用通用公式表达出来,x = a^{[0]}

  • z^{[L]} = W^{[L]}a^{[L-1]}+b^{[L]}, a^{[L]}=g^{[L]}(z^{[L]}), 输入a^{[L-1]}​, 输出​ a^{[L]}

m个样本的向量表示:

  • Z^{[L]} = W^{[L]}A^{[L-1]}+b^{[L]}
  • A^{[L]}=g^{[L]}(Z^{[L]})
  • 输入a^{[L-1]}​, 输出​ a^{[L]}

4.2.2 反向传播

因为涉及到的层数较多,所以我们通过一个图来表示反向的过程

        

单个样本的反向传播:

  • dZ^{[l]}=\frac{dJ}{da^{[l]}}\frac{da^{[l]}}{dZ^{[l]}}=da^{[l]}
  • dW^{[l]}=\frac{dJ}{dZ^{[l]}}\frac{dZ^{[l]}}{dW^{[l]}}=dZ^{[l]}\cdot a^{[l-1]}
  • db^{[l]}=\frac{dJ}{dZ^{[l]}}\frac{dZ^{[l]}}{db^{[l]}}=dZ^{[l]}
  • da^{[l-1]}=W^{[l]T}\cdot dZ^{[l]}

多个样本的反向传播:

  • dZ^{[l]}=dA^{[l]}*g^{[l]}{'}(Z^{[l]})
  • dW^{[l]}=\frac{1}{m}dZ^{[l]}\cdot {A^{[l-1]}}^{T}
  • db^{[l]}=\frac{1}{m}np.sum(dZ^{[l]},axis=1)
  • dA^{[l]}=W^{[l+1]T}\cdot dZ^{[l+1]}

4.3 参数与超参数

参数即是我们在过程中想要模型学习到的信息(模型自己能计算出来的),例如 W^{[l]}, b^{[l]}。而超参数(hyper parameters)即为控制参数的输出值的一些网络信息(需要人经验判断)。超参数的改变会导致最终得到的参数 W^{[l]}, b^{[l]} 的改变。

典型的超参数有:

  • 学习速率:α

  • 迭代次数:N

  • 隐藏层的层数:L

  • 每一层的神经元个数:n[1],n[2],...

  • 激活函数 g(z) 的选择

当开发新应用时,预先很难准确知道超参数的最优值应该是什么。因此,通常需要尝试很多不同的值。应用深度学习领域是一个很大程度基于经验的过程。

参数初始化 :

  • 为什么要随机初始化权重.

如果在初始时将两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。

在初始化的时候,W 参数要进行随机初始化,不可以设置为 0。b 因为不存在上述问题,可以设置为 0。

  • 初始化权重的值选择

这里将 W 的值乘以 0.01(或者其他的常数值)的原因是为了使得权重 W 初始化为较小的值,这是因为使用 sigmoid 函数或者 tanh 函数作为激活函数时,W 比较小,则 Z=WX+b 所得的值趋近于 0,梯度较大,能够提高算法的更新速度。而如果 W 设置的太大的话,得到的梯度较小,训练过程因此会变得很慢

ReLU 和 Leaky ReLU 作为激活函数时不存在这种问题,因为在大于 0 的时候,梯度均为 1。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值