一、深度学习的概念
如上所示,人工智能包含了机器学习和深度学习,其中深度学习是机器学习的一种特殊的学习方法,人工智能的核心是深度学习
1、深度学习
深度学习需要用到大量的神经网络构建和运算模块,故出现了很多的深度学习框架:Caffe、MxNet、PyTorch和TensorFlow等,这些框架极大的简化了深度学习网络的构建过程
【深度学习本质上是一个前馈神经网络】
深度学习的历史可以追溯到人工神经网络,人工神经网络主要通过模拟动物的畲景源的运行模式来对显示数据进行拟合和预测,通过函数来模拟信息在神经元中的变化和传输
最早的人工神经网络是20实际60年代的Rosenblatt发明的感知机,通过对输入进行单层的线性变换来完成分类,但这个模型不能解决线性不可分的问题,现实中很多问题并不适用,后面80年代出现了多层感知机,相比简单的一层感知机,多层感知由于增加了人工神经网络的深度,对于复杂的函数的你和效果更好——对于多层感知机来说,只要参数和隐含层的数量足够,就能拟合任意的函数
同时出现了反向传播算法,用以优化多层感知机模型,但仍不适用于神经网络层数较多的时候——在较深的网络中使用反向传播算法会导致梯度消失和梯度爆炸
后来出现了深度信念网络:叠加了多层神经网络或者自编码器,并逐层训练这些神经网络单元,最后进行微调训练可以训练很深的神经网络。同时,通过调整神经元的连接和激活,出现了卷积神经网络CNN、循环神经网络RNN、残差网络RNN等。通过使用这些特殊结构的神经网络,能使梯度在神经网络内部进行有效传播,不仅能训练多层的神经网络,而且能提高模型的准确率
人们一般把现阶段的神经网络模型称为深度学习,反映了这些神经网络具有很多隐含层的特点
2、机器学习
机器学习的主要任务是在给定的现实中获取一系列数据来构建一个模型,用于描述数据的具体分布及出现的可能性
数据是人们对周围发生的一些现象的数字化描述,如图片、文本、音频等。这些数据可以分为有标签的和没有标签的,根据能够处理的数据类型,机器学习的任务大致分为两类:监督学习和无监督学习
- 监督学习:有具体的数据和预测目标,需要从数据出发构建具体的模型和预测这些目标,其代表任务有——回归和分类
- 无监督学习:只有数据,但是没有预测目标,需要构造具体的模型来找出数据的具体规律,代表任务为聚类
大多数的机器学习的任务都可以归结为一个模型,用这个模型描述给定的数据,得到这个模型的过程为机器学习模型的训练过程
可以认为机器学习是一个概率模型,机器学习的任务就是求解最优参数,使得概率分布最大
对训练集来说,有输入的数据 X 及其对应的标签 Y,最后求的应该是包含了 X 和 Y 的一个概率分布,概率分布有联合概率分布和条件概率分布
- 联合概率就是所有的条件联合起来,都成立
- 条件概率就是在一个条件成立的前提下,另一个条件也成立的概率
- 边缘概率是仅与单个随机变量有关的概率
联合概率及其分布、边缘概率及其分布、条件概率分布和贝叶斯定理_贝叶斯联合分布-CSDN博客
一般来说,概率密度分布相对集中,意味着概率密度包含的信息较少,信息熵就比较小,反之信息熵就比较大。条件分布的信息熵小于联合分布,也就是说,判别式模型比生成式模型在大多数情况下效果好
3、损失函数和模型拟合
回归模型可以简单的认为是你和一个函数,使得输入一个值,可以给出对应的值,当模型的预测值和目标值的差值服从高斯分布,就可以使用极大似然估计的方法,代入高斯分布概率函数,计算使模型最后的参数
需要拟合最优的函数之前的函数称为损失函数,也称为方均误差函数
训练过程中,数据集一般分为三部分:训练集、验证集和测试集。验证集用于验证什么模型在什么超参数下表现更好,随着训练的进行,模型用于衡量预测的结果和真实数据的差异也会越来越小,损失函数的值也会越来越小
一般来说,随着模型的数据量的增加,模型越不容易过拟合;随着参数数目增加,也就是模型的复杂性的增加,模型越容易过拟合。机器学习中,训练集、验证集和测试集的比例可以考虑70%、20%、10%,深度学习中可以考虑90%、5%、5%的划分
神经网络中的损失函数与拟合问题_损失函数过拟合-CSDN博客
附:如何解决过拟合、欠拟合的问题
4、向量矩阵和张量
向量就是既有大小又有方向的量,矩阵是成长方形排列的数和集合,张量是多维数组
一文读懂标量、向量、矩阵、张量的关系_矩阵与张量方程-CSDN博客
由上可得,向量就是一维的张量,矩阵是二维的张量,三维的张量可以看作是按长方体排列的数,更高维度的张量较难想象——一般来说高维度的张量是低维度的张量的堆叠,例如照片的像素点是二维的张量,加上颜色的区分,RGB就是三维的张量,把多个三维的张量堆叠在一起就形成了四维的张量
维度的转换
一维的张量可以变为二维的张量:1×n 或者 n×1,二维的张量也可变为三维的张量 1×m×n 或者 m×1×n、m×n×1,而其中的元素可以保持不变
深度学习网络构造中,常常会碰到各种各样的线性变换:一类是对张量的线性变换,另一类是对张量的逐点变换;神经网络模型中,卷积层和线性层可以直接通过线性变换和矩阵乘法来计算
张量的逐点计算是对输入张量的每一个分量进行相同的运算,最后输出一个和之前输入的张量形状相同的新张量。在神经网络模型的构造中,都是一系列的线性变换和非线性的激活函数的运算交错进行叠加,最后构造出一个含有很多参数的非线性模型
张量的存储
https://www.cnblogs.com/vipsoft/p/17361876.html
5、神经元
神经元是神经网络的最基础的组成单元,它的结构由数个输入和输出组成,一个神经元的输入是上一个神经元输入的线性组合,得到的对上一个神经元的输入的增益是一个可训练的参数,称为神经网络的权重,该神经元会对经过上一个神经元增益之后的输出做一个非线性的函数变换,得到该神经元的输出结果
上述的非线性的函数变换就是激活函数,其选择有多样性,由于此函数的存在,神经网络模型的输出就是非线性的,这使得神经元的输出能够模拟不同的函数,构成了神经网络的基础
结合上述的向量、矩阵和张量的概念,可以将神经元的输入和输出排列为矩阵,使用神经网络的权重进行线性变换就可以对应成矩阵的乘法(m×n 阶矩阵和 n×m 阶矩阵相乘的话,最后得到的就是m×m 阶矩阵:相乘的要求:左列=右行),同时激活函数的计算就可以看作一个对于矩阵的每个元素的逐点计算
6、输入数据的表示方式
可以使用张量来表示神经网络中的数据,一般来说,在神经网络的神经元之间进行传递的数据是浮点数,为了将日常不是浮点数的数据进行深度学习,需要将这些数据转化为浮点数的形式才能输入神经网络进行计算,这个过程我们称之为预处理
图像数据的处理
为了保证神经网络能同时处理一批图片,需要将所有的图片调整为相同的大小,可以使用最近邻插值或者双线性插值,然后将数据转化为浮点数,如果是图像的话,就可以将它除以255,转化为0~1之间的浮点数
【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值-CSDN博客
在输入神经网络之前,一般还需要就行归一化操作,是数据分布更加的规整,这样更有利于神经网络的训练,应当使用一批数据的张量减去所有数据的均值,除以所有数据的方差,这个过程称为归一化,归一化能有效增加神经网络模型的数值稳定性,有利于优化损失函数,从而提高训练结果的准确性
文本数据的处理
除了图像之外,文本数据也是深度学习的一种重要的输入,相比图像可以数值化,文本是有离散的字符组成的,在将文本转化为数值张量的过程需要进行一系列的预处理
首先应当进行分词,就是将连续的文本转化为单词的序列,对英文来说,这个过程很简单,可以根据空格和标点符号确定,对于中文来说,则需要借助一些分词工具完成
下一步就是停词,就是找出文本中出现频率比较高,但对文本的实际意义没有太大关联的词语,如一些语气词就是停词
去停词之后要进行正则化,就是将不同的文本形式转化为一致的文本形式,方便下一步处理
经过预处理之后,就可以将结果直接转化为词向量,这个过程称为词嵌入。具体的构造过程就是将所有的单词对应的词向量建立一个词表,最后构成一个矩阵。对深度学习来说,这个矩阵的元素首先可以进行随机初始化,也可以使用预训练的词向量(如Word2vec或者GloVe算法余弦训练号的词向量)进行初始化
音频数据的处理
音频也是一个重要的输入数据,以16bit (这个音频将按照信号的振幅取离散的2^16个值,即-32768~32767,振幅越大,声音越响)的脉冲编码调制为例,每秒采样441000个点(主要针对的是语音信号),如果需要提取音频中的信息,就要对采样时间×采样数目的电进行预处理:
- 将振幅从整数转化为-1~+1 之间的数,即对所有的振幅先加32768,除以32768,然后减去1.0
- 预加重:本质上就是加一个高通滤波器,使音频信号的高频分量提高并滤除低频噪声(实际应用中,预加重是个可选项,该步骤对信号中的噪声具有一定的滤除作用)
- 分帧和加窗:把音频分为20ms~40ms的小段的过程称为分帧,两段之间的重合率一般为50%,一般采样点的数目应当接近2的整数次幂;分帧之后,需要对每一帧的信号进行加窗以防止频谱泄露,增加后续傅里叶变换后的频率空间的信噪比,常用的窗函数是汉宁窗
- FFT:快速傅里叶变换之后会得到一个负数的向量,长度和原始信号长度相同,然后画出傅里叶变换谱
- Mel-scale:根据傅里叶变换谱,得到梅尔尺度上的特征信息,即对数频率尺度的特征,此特征是通过梅尔滤波器实现的,根据奈奎斯特采样定理,能最大表示信号的频率是系统采样频率的一半,通过公式: M(f) = 2595* ln(1 + f / 700) 可以得到最大的梅尔尺度值,然后在0和这个最大值中间均匀采样一定的点数,然后逆变换得到对应频率的系数,把傅里叶变换的结果乘以梅尔过滤器对应的系数,即可提取出来对应的特征——由于梅尔系数之间有一定的相关性,为了减少线性相关,可以使用梅尔倒频谱图系数(MFCC),最后还要将信号减去信号对于时间的平均,这个过程称为平均归一化
7、线性变换和激活函数
全连接线性变换
全连接线性变换是最简单的线性变换,感知机是一种简单的二分类线性分类模型
如上所示,输入层有3个神经元,隐藏层有两层,分别有4个和5个神经元,输出层有2个神经元,层与层之间的实线是线性变换关系
具体表述为:这个大小为3的向量会和一个大小为 4×3 的矩阵做矩阵乘法,最终得到一个大小为4 的向量,对于此向量,需要对每个分量求一个激活函数,得到一个层隐藏层的值,同理,将第一层的值乘以 5×4 的矩阵,然后在得到的结构上面再加一个激活函数,就会得到一个大小为5 的向量,这就是第二层隐藏层的值,最后再经过一系列的线性变换和激活函数的作用下得到大小为2的向量,这个向量就是神经网络模型最后的输出值
可以看到,下层网络的每个值斗鱼前一层的神经网络的每个值相关联,这种就是全连接层,对应的变换就是全连接线性变换
对于多层感知机来说,神经网络的连接层中的每一层都是全连接层,对于全连接层来说,可以使用矩阵的方式描述这个过程,如对一个 n 大小的输入,乘以一个 m×n 的矩阵,就会得到 m 大小的输出,乘以一个 m×n 的矩阵就是一种线性描述,此矩阵就是连接的权重
对于神经网络来说,权重是经过一定随机初始化后经过训练就会逐渐想着让模型变得更好的方向发展,这个过程称为模型的优化
除权重外,一般还会给线性变换之后的输出统一加一个可训练的参数,这个参数是标量,即为一个实数,称之为偏置
多层感知机
一个多层感知机模型,把神经元分为三层:即输入层、隐藏层和输出层——其中输入层接收输入特征,输出层给出最终的预测结果,中间的隐藏层用于提取特征和进行非线性变换
多层感知机(Multilayer Perceptron,简称MLP)
一种基于前馈神经网络(Feedforward Neural Network)的深度学习模型,由多个神经元层组成,其中每个神经元层与前一层全连接。多层感知机可以用于解决分类、回归和聚类等各种机器学习问题
多层感知机优点:
多层感知机具有较强的表达能力,可以处理非线性问题和高维数据
MLP可以通过反向传播算法进行训练,可以自动学习特征和模式
MLP可以处理多分类问题和回归问题,具有较好的泛化能力
MLP可以通过添加正则化项、dropout等技术来防止过拟合
多层感知机缺点:
多层感知机的训练时间较长,需要大量的计算资源和时间
MLP对初始权重和偏置的选择比较敏感,可能会导致模型陷入局部最优解
MLP对数据的标准化和预处理要求较高,需要进行归一化、标准化等处理
MLP难以解释和理解,不如决策树等模型具有可解释性
卷积线性变换
全连接的线性变换由于前一层和厚一层的所有神经元之间都有一对一的连接关系,在实际训练中,这种关系可能有许多荣誉,对于神经网络模型的训练并不友好
卷积神经网络是一种稀疏表示连接关系的方法,它通过在输入数据上应用卷积操作来提取局部特征,并通过训练过程自动学习这些卷积操作的参数
包含了多个可学习的滤波器(也称为卷积核),这些滤波器在输入数据上滑动,进行卷积操作并生成特征图。每个滤波器专注于检测输入数据的不同特征,如边缘、纹理等。通过堆叠多个卷积层,网络能够学习到更加复杂和抽象的特征
卷积神经网络(Convolutional Neural Network,CNN)
激活函数
为了让神经网络引入非线性特征,需要再线性变换中插入非线性层,故引入了激活函数的概念
激活函数是一系列非线性函数的同城,通过对线性变换中输出结果的每个分量都应用激活函数,可以输出非线性的结果,理论上,所有的非线性函数都可用于激活函数
激活函数就是对系统的激励函数,常用的激活函数的区别如下:
常用激活函数(激励函数)理解与总结-CSDN博客
一般来说输出层是没有激活函数的,如果是二分类问题,可以直接使用Sigmoid函数作为输出,因为此函数的输出在0~1之间,能够表示二分类中的某一个分支的概率
如果是多分支问题,最后一层的线性输出要等于最终的分类的数目,具体输出的每一个类的概率需要Softmax激活函数得到
线性变换和激活函数构成了神经网络的基础,通过这两个元素,我们可以构造出多种多样的神经网络,这些神经网络也根据激活函数的不同,能够进行回归和分类任务
8、链式求导法则和反向传播
油壶深度学习模型的过程是优化模型的权重,从而让损失函数尽可能小的过程
可以将深度学习模型的损失函数看作是一个有两个参数的函数,一个参数是输入的数据,另一个是线性变换的权重,在给定输入数据(训练集)的情况下,如果想要求得最优的权重,需要求得损失函数相对权重的导数(梯度),然后沿着导数的方向对全中进行变化
基于链式求导的梯度计算
深度学习模型是由输入层、隐含层和输出层构成的,最后的损失函数是由输出层的值决定,最终的损失函数是所有中间层的权重的复合函数
在神经网络中,前向计算是为了得到损失函数,反向计算的时候,一开始获得的是损失函数相对于输出层神经元的函数和其对应的导数值,此时应当计算损失函数相对于前一层神经元值的导数式,进一步求出前一层的对应导数,这样就能求得损失函数相对于所有权重的导数值,这个过程称为反向传播
激活函数的导数
对具体的激活函数求导,可以知道:ReLU函数的导数在 x=0 的时候有一个阶梯跳跃,从0变化到了1,相应的导数的值为1/4,在 x 很大或很小的时候,激活函数的导数都趋近于0
一般把 x=0 出的导数定义为0,ReLU函数在 x>0 的体哦阿健下导数为1,说明在反向传播中,后一层的导数能够很容易的传导到前一层二没有任何的衰减,这个函数行为有助于梯度在神经网络中的反向传播,对深度学习的神经网络的训练非常有意义
梯度消失和梯度爆炸
在神经网络训练中,梯度的传播是一个反向传播的过程,而且与每一层的权重的数据相关,当神经网络很深的时候,我们可以看到,使用 Sighmoid 函数和Tanh函数作为激活函数(每次的梯度都小于1),在反向传播的时候,因为每次数据梯度的传播都要诚意关于数据的导数,数据梯度就会越来越小,对应的权重也会越来越小,这样就会造成梯度的反向传播,靠前的神经网络层的梯度非常小,这部分的而权重会难以进行优化,这个现象就是梯度消失——如果使用这两个函数作为激活函数,前面几层的梯度就会非常接近于0,这就是普通的神经网络都用比较浅的基层隐含层的原因,使用ReLU函数作为激活函数可以解决这个问题
ReLU函数既可以提供部分深度学习需要的非线性激活函数,也因为其特殊的梯度,能够解决梯度消失的问题,在深度学习的反向传播中,数据梯度起着非常大的作用,而数据梯度和权重也有很大的关系,假如一开始权重就取得很大,随着反向传播的过程,数据梯度就会逐渐变大,最后在前几层会变得非常大,这个过程称为梯度爆炸
由于数据梯度和权重梯度相互耦合,在这个情况下对权重进行优化可能会导致权重进一步增大,这样就会导致权重不稳定,导致深度学习的模型很难优化,甚至优化过程中数值很不稳定;同理,权重如果很小,机会造成梯度消失的情况
权重的初始化非常重要,其核心是让下一层的数据的绝对值尽可能分布在1附近,也可对神经网络反向传播中的梯度作截断,避免梯度在传播过程中过大的问题
数值梯度
权重和数据梯度的计算是神经网络的核心算法,现代的深度学习框架基本都自带微分功能,也就是说,对于框架提供的所有层,如果有数据的输入,输出和权重,能够根据反向传入的梯度来计算对应的输入数据的数据梯度和线性变换层的权重梯度,这样,通过建立神经网络所有结点的哈桑农户和最后的损失函数,反向计算数据梯度和权重梯度,递归到输入节点,就能得到路径上所有权重的梯度
9、损失函数和优化器
神经网络中的损失函数可以划分为用于费雷的损失函数和用于回归的损失函数
用于分类的损失函数又分为两类:一类是二分类的神经网络,输出的激活函数是Sigmoid函数,对应的损失函数是二分类的交叉熵。深度学习的优化器一般是使损失函数最小
对于多分类问题来说,使用的是概率分布,由Softmax函数产生,对应的损失函数是多分类交叉熵
基于梯度的优化器
之所以要计算神经网络中的梯度,是为了在后续的优化算法中使用梯度下降算法进行优化
根据微积分的知识,在函数的极小点附近,如果沿着函数的梯度方向行走,函数的值是下降的,一般函数中控制权重沿梯度下降的参数就是学习率——当学习率较小的时候,权重梯度优化速度比较慢,优化的过程也是连续的,能够逐渐收敛到函数的极小点的位置;当学习率比较大的时候,每次变化的步长较大,梯度优化的速度较快,但优化过程可能是不连续额的,这导致了函数在某些值附近震荡收敛,甚至会导致整个优化行为的数值不稳定
深度学习中,需要一次性给定所有的数据的权重梯度,采用的方法是使用迷你批次的数据来评估神经网络的权重梯度,并且使用估算得到的权重梯度来对模型进行梯度下降优化:一般就是对所有的数据进行随机排列,然后从这些数据里面随机抽取一些数据,抽取的数目称为批次大小,计算出每个数据的损失函数,并对损失函数求平均,接着用平均后的损失函数进行反向传播,计算对应的权重梯度
一般称包含了所有数据的迷你批次为迭代期,称训练完一次训练数据包含的所有迷你批次为一个迭代器,实际训练往往需要几十甚至几百个迭代期,一个迷你批次算出来的梯度并不能代表所有的数据的梯度,只能代表所有数据梯度的一个近似,故梯度下降的过程有一定的随机性,这种优化算法称为随机梯度下降算法,实际应用中,该算法具有一定的不稳定性,需要调节学习率使得损失函数最小出于下降比较快的状态
对随机梯度算法引入动量,可以使算法更接近真实的梯度,增加了算法的稳定性,还可引入权重梯度的平方进行优化:将历史的权重梯度的分量平方求和,并用这个平方和更新权重
10、学习率衰减和权重衰减
在深度学习中,优化的时候,如果损失函数逐渐下降,然后停滞了,可以尝试降低学习率,然后观察学习率是否继续下降,正常情况下,学习率降低之后,损失函数也会有一定的下降
优化器除了能优化神经网络之外,还能对神经网络进行一定的正则化,具体方法就是使用权重衰减,在优化过程中设法引入和权重相关的项,在存在正则化的情况下,优化器沿着梯度下降的方向进行优化,然后把权重替换为 1-α 倍的权重,就相当于对权重进行了衰减