人工智能之深度学习笔记——快速掌握深度学习理论

发表时间:2024-04-18 13:45

本文会对深度学习以及深度学习搭建技巧做一个详尽的介绍,相信大家阅读完本专栏之后,深度学习已经不是一个遥不可及的名词,我们会知道它究竟是什么,本文尽可能地简单详细地介绍每一个深度学习知识,帮助每天只用很少的时间就可以掌握它。

深度学习的概述

深度学习和机器学习有什么区别呢?最主要的区别就是模型的不同,深度学习主要使用神经网络算法模型,而机器学习就不是了,我们前面学习过逻辑回归就是机器学习算法模型。所以我们学习深度学习最主要的就是学习神经网络。

我们首先简单的介绍了一下深度学习这门课程要学习什么?然后从房价预测例子入手引出什么是神经网络?然后我们可以知道使用神经网络进行监督学习。

神经网络的基础

从这里我们开始学习神经网络了,但是我们必须要学习一下相关的基础,比如我们要学习神经网络中常用的符号表示,以及图片这种非结构化的数据如何在计算机中向量化表示,以及我们输入到神经网络中的样本X如何矩阵表示,以及标签y应该如何表示。

神经网络和逻辑回归算法有着很大的关联,所以我们从逻辑回归开始引入神经网络,所以我们温习一下机器学习算法——逻辑回归算法,然后神经网络优化也需要梯度下降,所以我们要温习一下梯度下降算法,这些算法在机器学习专栏中都进行了介绍,这里只是简单的回顾。

要想优化神经网络需要一个算法叫做反向传播,反向传播的核心就是链式求导,所以这里我们学习一下数学中的导数。然后反向传播是按照什么规则反向传播的呢?核心就是计算图,这里我们介绍计算图以及如何按照计算图完成梯度下降,你就知道神经网络反向传播的原理了。

如果一个样本一个样本的直接进行梯度下降计算速度会太慢,那么是否可以同时多个样本完成呢?当然可以,这里我们会学习到向量化技术,可以帮助我们完成多个样本的梯度下降任务,当然在实际深度学习框架中,也是这么做的,这里会介绍一些公式,但是我的意思就是想让大家理解,不要害怕,因为在实际的使用中,深度学习框架都帮助我们做好了。

要想学习深度学习,理论是一方面,另外一方面就是实践了,所以我们需要学习一门语言,python,有兴趣的可以看《每天五分钟python专栏》,这里会对python和numpy以及jupyter notebook进行简单的介绍

浅层神经网络

我们前面学习了神经网络基础,那么从这一章节开始,我们需要学习神经网络了,不过我们本章节学习的神经网络都是浅层的神经网络,什么是浅层的神经网络呢?就是层数不超过两层的神经网络(神经网络的层数不包括输入层)。

我们说过神经网络和逻辑回归充满着联系,所以我们通过逻辑回归引出了神经网络,我们可以简单的理解神经网络就是多个逻辑回归的叠加,我们可以通过逻辑回归的前向传播算法推导出神经网络的前向传播算法,我们也可以通过逻辑回归的反向传播算法推导出神经网络的反向传播算法。

下面我们将会学习神经网络的前向传播(从单样本到多项本向量化逐级开始)

本节课程详细介绍了神经网络的前向传播算法,更加具体的说是单样本的前向传播的过程的介绍

在神经网络中有一个强大的函数叫做激活函数,我们将介绍几种经典的神经网络的激活函数,并且介绍每种激活函数的优缺点,并且介绍什么时候使用哪种激活函数更加适合我们的需求。

我们构建神经网络的时候不使用激活函数不行吗?为什么非要使用非线性激活函数呢?本节课程将告诉你我们的神经网络中使用激活函数的原因。

我们在进行神经网络的反向传播过程中,使用链式求导法则,其中就要对激活函数对z求导,所以激活函数的求导是我们必须要掌握的内容,本节课程我们将介绍一些经典的激活函数的导数是什么?

前向传播介绍完了,不要忘记还有反向传播和梯度下降,这里我们将学习神经网络的反向传播和梯度下降,其实当你掌握逻辑回归的时候,神经网络也就掌握了。

当我们构建神经网络的时候,我们需要进行参数初始化的工作,那么我们是否可以将参数初始化为0呢?答案是不可以,为什么会不可以呢?本节课程告诉你。

深层神经网络

面我们介绍了神经网络,不过是浅层的,我们本章更近一步,我们介绍深层神经网络,我们可以暂时简单的理解为超过两个隐藏层的神经网络,我们称它为深层神经网络

我们将学习深层神经网络的前向传播和反向传播,其实它和浅层的神经网络的前向传播和反向传播是一样的,只不过它多了几个隐藏层,多传播几层罢了。所以不用担心

我们前面已经学习了浅层神经网络,那么为什么我们需要使用深层神经网络呢?换句话说深层神经网络带给我们的好处是什么呢?本节课程告诉你。

现在神经网络的核心也就是前向传播和反向传播全部完成了,但是我们需要知道的是,神经网络在反向传播和前向传播向量化的时候,每一个矩阵的维度我们都需要特别的注意,因为一旦维度出现问题,那么程序就一定会出现问题,本节课程将总结神经网络中向量化过程中所有矩阵的维度。

最后我们将学习到一个新的概念参数和超参数,深度神经网络中有非常多的参数,我们将决定参数的参数称为超参数,那么超参数有哪些呢?详细课程内容会告诉你。也就是说我们调参就是调这些超参数。

深度学习的应用

神经网络的主要理论前向传播、反向传播、梯度下降介绍完了,下面再神经网络应用的时候,我们有哪些知识需要学习?

首先是数据集的问题,当我们有一个数据集的时候,我们应该如何划分这个数据集中训练集、验证集和测试集的比例。

在神经网络训练的过程中,有可能出现过拟合和欠拟合的问题,那么我们如何判断神经网络出现哪个问题了呢?我们将什么是偏差以及什么是方差,如何使用训练集误差和验证集误差来帮助我们判断我们的算法所出现的高偏差和高方差问题,并如何利用高偏差和高方差来找到一个最好的神经网络,以及如何使用正则化或者dropout技术来结果高方差(过拟合)的问题

数据处理我们需要知道的是,当我们的数据样本中特征差距很大的时候,我们需要进行归一化输入,而且归一化输入还能帮助神经网络更快的训练。

神经网络训练的时候,可能会发生梯度消失还有梯度爆炸的情况,原因是什么?我们可以用初始化的方式来解决,神经网络的权重初始化是不能随便初始化的,这里介绍一种初始化的方式,这种初始化方式可以尽量避免发生神经网络的梯度消失和梯度爆炸的情况。

神经网络的优化

当我们拥有了神经网络模型之后,我们将数据喂入到神经网络中,那么此时就可以让神经网络学习数据了,那么怎么学习呢?也就是如何优化呢?就是通过梯度下降算法,我们需要知道的是梯度下降算法是一种优化方法的统称,它有好多种梯度下降的方式,这里我们会学习到:Mini-batch梯度下降、动量梯度下降法、RMSprop、Adam 优化算法

当我们学习到这里的时候,我们会知道有一个超参数非常的重要,那个超参数就是学习率,学习率是梯度下降的一个非常重要的内容,那么我们如何使用学习率衰减来训练我们的神经网络,我们这里会进行介绍

神经网络经常会遇到局部最优的问题,其实局部最优也不是主要的问题,那么什么才是神经网络训练的时候会遇到的问题。我们如何才能解决这个问题。

调参技巧和归一化技术

本章节我们将学习调参技巧了,在深度学习中会有很多的超参数,我们需要调参从而找到最适合我们数据的参数,本节课程介绍了神经网络中比较重要的超参数,以及如何使用随机选择的方法来进行调参。

在超参数调参的时候,我们不能无限范围内调,这样范围太大,正确的做法是我们应该在一定范围内均匀选择参数。但有些超参数如果在某一范围内均匀调参,那么就会出现问题,比如超参数a,这个应该如何选择参数呢?

之后我们会学习归一化技术,它可以解决神经网络难以训练的问题,从而加快神经网络的训练。然后讲解mini-batch和batch归一化的结合,从而讲解整个神经网络的训练,将 Batch Norm 拟合进神经网络。我们知道batch归一化能够加快神经网络的训练,那么为什么它就能够加快呢?它的原理是什么?使用batch归一化训练好神经网络之后,那么测试的时候我们的样本应该如何处理呢?

我们使用神经网络常常处理多分类问题,那么我们可以使用softmax回归,其实他就是逻辑回归的扩展,我们将学习带有Softmax的分类器的前向传播和反向传播

机器学习策略

如何让我们的模型朝着更好的方向发展呢?我们将学习一些策略,他能够帮助我们的模型朝着更好的方向进行优化。

首先我们先来学习正交化的思想,也就是从四个维度来对算法模型进行优化,这四个维度分别为训练集、开发集、测试集以及用户效果,这四个维度相互之间互不影响,调节一个维度其它维度的效果并不会发生任何影响,这就是正交化的思想。

当我们模型进行调参的时候,此时我们相当于得到了一个新的模型,那么如何评估这个模型变好还是变坏呢?我们可以使用单一数字评估的指标来完成这个任务,这个数字提升了,那么我们就可以认为模型变好了,如果这个数字降低了,那么我们就可以认为这个模型变坏了。

但是实际上单一的评估指标可能并不能很好的反应算法的好坏,我们可以需要多个指标来完成评估的任务,但是这么多个指标中肯定有一个最优的指标,所以我们的任务是先确定一个最优的指标,如果两个模型最优指标想接近,那么我们需要让其它的指标尽量满足,这个其它指标就称为满足指标。

我们前面已经学习了数据的分割了,这里我们需要注意的是,而且知道了开发集(交叉验证集)需要和测试集在同一分布下,这里我们将会介绍一下为什么要这样做?

在实际开发过程中,可能你的指标在一直变换,最佳的指标就是最符合用户利益的指标,这就是我们设定指标的核心思想。

算法的性能不会无限的提升,当它们提升到人类的水平的时候,可能就得到了一个天花板,此时,算法的提升就会变得很困难,这就是所谓的贝叶斯最优错误率。怎样定义人类的贝叶斯最优错误率是多少?这个很重要,因为人和人都不一样,团队和团队都不一样,贝叶斯最优错误率的高低直接决定了可避免偏差的大小,这个很重要

训练集上的错误率-贝叶斯最优错误率=可避免偏差

开发集错误率-训练集错误率=方差

我们前面已经知道了,训练集上的错误率-贝叶斯最优错误率=可避免偏差,但是机器学习在某些领域已经全面的超越人类

解决偏差问题:使用更大规模的模型,更久的训练,使用更好的优化算法,比如Adam

寻找新的神经网络架构(卷积神经网络或者循环神经网络),或者说更好的超参数,改变激活函数,改变隐藏层数或者隐藏层神经元的数量

解决方差问题:收集更多的数据,正则化,数据增强,尝试不同的网络架构,不同的超参数

当我们在调试算法模型的时候,我们可以使用高偏差和高方差的两个角度来解决算法所遇到的问题,还有一种方法就是使用误差分析的方法,也就是我们人为的统计出哪些数据出现了问题,出现问题的原因是什么,我们对其进行统计,从而算法模型进行针对性优化操作。

我们知道对于监督学习而言,数据是由样本特征x和标签y来构成的,如果此时样本标签标记错误,我们应该怎么办呢?我们会进行介绍

当搭建一个神经网络的时候,我们首先要做的就是快速建立开发集和测试集还有指标(指标随时可以进行修改),然后使用训练集上训练一下,然后看看在开发集上表现如何(看看开发集上的指标,这个指标决定了当前模型的好坏),然后配合使用偏差方差、分析以及错误分析来确定下一步来干什么,然后快速的进行下一轮的迭代操作,对新模型用指标评价,看看这个模型是否变得好了

我们使用

训练集上的错误率-贝叶斯最优错误率=可避免偏差

开发集错误率-训练集错误率=方差错误率

来判断算法出现为高偏差问题还是高方差问题,但这是训练集、开发集和测试集都在同一分布的方式,要是训练集和开发集以及测试集不在同一分布的时候,我们还需要使用一种其它的技巧来处理这个问题。

此时我们应该在训练集中随机取出一小部分的数据集,我们称它为训练——开发集,这是一个全新的数据子集,这部分不会训练你的神经网络。

此时训练集和训练——开发集在同一分布。开发集和测试集在同一分布。现在我们就可以计算以下几个:

训练集误差-贝叶斯错误率=偏差大小

训练、开发集误差-训练集误差=方差大小

开发集误差-训练、开发集误差=数据不匹配问题的大小

测试集误差-开发集误差=数据对开发集的过拟合程度

我们现在可以构建出一个这样的表格,以语音后车镜为例,这个表格横轴是两个数据(1、2),第一个数据是非专业的后车镜语音数据,这个数据很多,另外一个数据是专业的后车镜数据。

如果我们的算法模型出现了数据不匹配的问题,我们应该如何才能处理这个问题呢?

一般我们需要亲自去看一下训练集和开发集上的具体差异。这里要注意一点,为了避免在测试集过拟合,我们需要看训练集和开发集的具体差异,而不是训练集和测试集之间的差异。

然后我们要针对这个数据差异,专门收集更多的数据,将数据放到训练集中

我们以前建立一个神经网络只是为了解决一个任务,比如识别出这张图片是猫还是狗,本节课程我们将学习多任务学习。

以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。那么它有什么优点和缺点呢?


分享到: