深度学习(一)

深度学习(一)

神经网络基础

人工神经网络的概念

是一种模仿动物神经网络行为的特征,进行分布式并行信息处理的算法数学模型

感知机

线性感知机算法,是神经网络支持向量机的基础,是二分类的线性分类模型,输入是实例的特征向量,输出为实例的类别

多层感知机

是一种基于前馈神经网络的深度学习模型,由多个神经元层组成,多层感知机可以用于解决分类回归聚类等各种机器学习问题

优点

可以通过反向传播算法进行训练,可以自动学习特征和模型

可以处理多分类问题和回归问题,具有较好的泛化能力

可以通过添加正则化项、dropout等技术来防止过拟合

缺点

对初始权重和偏置的选择比较敏感,可能会导致模型陷入局部最优解

对数据的标准化和预处理要求比较高,需要进行归一化、标准化等处理

可解释性不太好

神经网络常用模型架构

前向传播和反向传播

前向传播是通过各种层,然后输出一个结果

反向传播是根据前向传播的输出和正确的结果直接的误差,通过链式法则逆向计算梯度,并将梯度从输出层传播回网络的每一层,用于更新模型的参数

区别

通过前向传播,模型可以根据输入数据生成预测结果;通过反向传播,可以计算模型的梯度信息,从而进行参数优化。

超参数

超参数的概念

超参数是在开始训练模型之前设置的参数,而不是训练得到的参数数据,在通常情况下,需要对超参数进行优化,给模型选择一组最优超参数

常见的超参数

学习率:learning rate

指的是在网络训练过程中,权重每次调整的幅度大小,决定了权值更新的速度,训练过程中常用指数衰减的方式调节学习率,即训练次数的增大,学习率不断降低

学习率衰减:learning rate decay

指学习率衰减的幅度

权重衰减:weight decay

在网络的训练过程中,会通过求损失函数的最小值来不断优化网络权重,但直接优化损失函数可能会导致过拟合,为了避免过拟合,会给损失函数添加一个惩罚项(正则化项),常用的惩罚项是所有权重的平方和乘以一个衰减常量(这个衰减常量就是weight decay ),用来惩罚大的权值,所以我们平时优化的函数叫做目标函数,目标函数=损失函数+惩罚项

动量:momentum

作用是可以加快梯度的收敛过程

迭代次数

指的是训练集中的数据在网络中进行训练的次数。当测试错误率和训练错误率相差较小时,可以认为当前的迭代次数是合理的

权重初始化

在网络训练之间,要先给权重一个随机的初始值,常见的两种方法是采用均匀分布的方法初始化各层网络的权重和采用该模型之前已经训练好的权重作为训练的初始值

Dropout

是一种常用的正则化方式,在全连接层加入Dropout可以减弱深层神经网络的过拟合效应,该方法会按照所设定的参数,在每次的训练过程中随机地不激活一定数量的神经元

如何寻找超参数的最优值

超参数搜索的一般过程

1)将数据集划分成训练集验证集测试集

2)在训练集上根据模型的性能指标对模型参数进行优化

3)在验证集上根据模型的性能指标对模型的超参数进行搜索

4)步骤2和步骤3交替迭代,最终确定模型的参数和超参数,在测试集中验证评价模型的优劣

其中,搜索过程需要搜索算法,一般有:网格搜索、随机搜索、启发式智能搜索、贝叶斯搜索,之前还看到一个准随机搜索

激活函数

激活函数的作用

主要作用是未网络中每个神经元引入非线性变换,使得神经网络能够学习和执行非线性复杂的任务。或者我们这样想,如果没有激活函数,无论神经网络的层数有多深,最终的输出都只是输入的线性组合,会极大地限制网络的表达能力和复杂度

为什么要使用激活函数

激活函数将多层感知机输出转换为非线性,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型,目的是为了向网络中加入非线性因素;加强网络的表示能力,解决线性模型无法解决的问题

为什么激活函数是非线性的

因为矩阵乘法具有合并性,而每一层网络的作用就相当于在前一步的基础色乘上了一个权重矩阵

所以,在激活函数为线性的情况下,多层网络作用就等价于单层网络。此等价过程中,单层网络的权重矩阵就相当于多层网络中每一层权重的乘积

常见的激活函数

Sigmoid

表达式

图像

优点

将很大范围内的输入特征压缩到0~1之间,使得深层网络中可以保持数据幅度不会出现较大的变化

根据输出范围,该函数还适用于将预测概括作为输出的模型

缺点

当输入非常大或非常小时,输出基本为常数,即变化非常小,进而导致梯度接近于0

随着网络的加深,会改变原始数据的分布趋势

梯度可能会过早消失,导致收敛速度较慢

Tanh

表达式

图像

优点

解决了上述的Sigmoid函数输出不是0均值的问题

导数取值范围在0--1之间,一定程度上缓解了梯度消失的问题

当输入的激活值较低时,可以直接进行矩阵运算,训练相对容易

缺点

梯度消失问题仍然存在

ReLu

表达式

图像

优点

输入为正时,ReLu函数不存在饱和问题,即解决了梯度消失问题

计算速度很快,只需要判断输入是否大于0

收敛速度也快

输出会使一部分神经元为0,在带来网络稀疏性的同时,也减少参数之间的关联性,一定程度上缓解了过拟合问题

缺点

可能某些神经元永远不会被激活,进而导致相应的参数一直得不到更新,产生该问题主要原因包括参数初始化问题以及学习率设置过大问题

Softmax

定义
σ ( z ) i = e z i ∑ j = 1 K e z j \sigma(\mathbf{z})i = \frac{e^{z_i}}{\sum{j=1}^{K} e^{z_j}} σ(z)i=∑j=1Kezjezi
图像

特性

归一化并且对应的所有概率累加起来为1

对应的真实类别概率值特别大,有方法

算出的概率值非负

优化方法总结

基本的梯度下降的方法

随机梯度下降:SGD

是每次使用一个训练样本 x i x_i xi和标签 y i y_i yi进行一次参数更新,SGD通过一次执行一次更新解决了BGD中,每一次参数更新都要计算很多相似样本的梯度的问题,因此通常SGD的速度会非常快而且可以被用于在线学习。SGD以高方差的特点进行连续参数更新,导致目标函数严重震荡,然而SGD的震荡特点导致其可以跳到新的潜在的可能更好的局部最优点

批量梯度下降:BGD

由于为了一次参数更新,我们需要整个训练集上计算梯度,导致BGD可能会非常慢,而且在训练集太大而不能全部载入内存的时候会很麻烦,并且BGD也不允许我们在线更新模型参数,即实时增加新的训练样本

Mini-batch梯度下降:MBGD

该方法是上述两种方法中采取了一个折中的办法,每从训练集中取出batchsize个样本作为一个mini-batch,以此来进行一次参数更新。

batch size越大,批次越少,训练时间会更快一些,但可能造成数据的很大浪费 ;而batch size越小,对数据的利用越充分,浪费的数据量越少,但批次会很大,训练更耗时

动量梯度下降

关于动量梯度下降,其作用普通的梯度下降是差不多的。但是在普通的梯度下降中,如果遇到了比较复杂的情况,就会出现:如果学习率过大,摆动过大,误差较大;如果学习率过小,又会使得迭代次数增加,学习时间会很长。在神经网络模型中就常常会遇到上面这些情况的,总是会出现解一种在小范围震荡而很难达到最优解的情况,主要目的是加速收敛,减少梯度震荡 。(加速损失函数的最小化收敛,也可以加速模型参数的收敛

动量梯度下降是计算梯度的指数加权平均值,并利用该值来更新参数值,使用动量梯度下降时,通过累加过去的梯度值来减少抵达最小值上的波动,加速了收敛,因此在横轴方向下降得更快,从而得到图中红色或紫色的曲线。当前后梯度方向一致时,动量梯度下降能够加速学习;而前后梯度方向不一致时,动量梯度下降能够抑制震荡

Adam优化器

使用动量和自适应学习率来加速收敛速度

优点

通过一阶动量和二阶动量,有效控制学习率步长和梯度方向,防止梯度的振荡和在鞍点的静止

超参数具有很好的解释性,且通常无需调整或仅需很少的微调

缺点

后期Adam的学习率太低,影响了有效的收敛

损失函数

损失函数的定义

简单的;理解就是每一个样本经过模型后都会得到一个预测值,然后得到的预测值和真实值的差值就是损失。有很多种类的损失函数,这些函数本质上就是计算预测值和真实值的差距的一类函数

回归损失函数

绝对值误差损失:MAE

L1损失是预测值和真实值之差的绝对值的和

特点

不会对大误差赋予过大的惩罚,对异常值(离群点)包容度高

产生的损失函数不是处处可导的

均方误差损失:MSE

L2损失是预测值和真实值之差的平方的总和

特点

对较大的误差赋予了更高的惩罚,使得模型倾向于减少较大的误差,但这也会导致模型对异常值过于敏感

产生的损失函数是平滑且处处可导的,这使得优化算法(如梯度下降)更容易找到最小值

分类损失函数

0-1损失

Logistics loss

对数损失函数或二元交叉熵损失函数

用于二分类问题,还可以用于优化模型预测的概率,使得模型输出的概率能够更好地表述输入属于某一类别的可能性,有较好的可解释性,损失越大,表示模型的预测与真实标签的差异越大,模型表现越差

神经网络中常用的损失函数

在实际工程项目上,结合激活函数来选择算函数是常见的做法,常用组合有以下3种

ReLu+MSE

均方误差损失函数无法处理梯度消失问题,而使用 Leak ReLU 激活函数能够减少计算时梯度消失的问题,因此在神经网络中如果需要使用均方误差损失函数,一般采用 Leak ReLU 等可以减少梯度消失的激活函数。另外,由于均方误差具有普遍性,一般作为衡量损失值的标准,因此使用均方误差作为损失函数表现既不会太好也不至于太差。

Sigmoid+Logistics

Sigmoid函数会引起梯度消失问题:根据链式求导法,Sigmoid函数求导后由多个[0, 1]范围的数进行连乘,如其导数形式为,当其中一个数很小时,连成后会无限趋近于零直至最后消失。而类 Logistic 损失函数求导时,加上对数后连乘操作转化为求和操作,在一定程度上避免了梯度消失,所以我们经常可以看到Sigmoid 激活函数+交叉摘损失函数的组合。

Softmax+Logistics

在数学上,Softmax 激活函数会返回输出类的互斥概率分布,也就是能把离散的输出转换为一个同分布互斥的概率,如(0.2, 0.8)。另外,Logisitc 损失函数是基于概率的最大似然估计函数而来的,因此输出概率化能够更加方便优化算法进行求导和计算,所以我们经常可以看到输出层使用 Softmax 激活函数+交叉熵损失函数 的组合。

调参指南

关于BatchSize

BatchZise是决定训练时间和计算资源消耗的关键

增加Batch Size通常会减少训练时间

不应该被当做验证集性能的可调超参数

此外我们应该选择合适的Batch Size以最小化训练时间

与Batch Size交互最强烈的超参数是优化器超参数(学习率、动量等)和正则化超参数

学习率搜索算法

常见的有网格搜索,是一种穷举的方法,随机搜索,不保证能找到全局最优解

该训练多久

通常进行两轮调整:

第一轮是进行短时间的训练来找到较好的模型和优化器参数

第二轮在较好的超参数上进行少量长时间的训练来获得最终模型

调参指南

关于BatchSize

BatchZise是决定训练时间和计算资源消耗的关键

增加Batch Size通常会减少训练时间

不应该被当做验证集性能的可调超参数

此外我们应该选择合适的Batch Size以最小化训练时间

与Batch Size交互最强烈的超参数是优化器超参数(学习率、动量等)和正则化超参数

学习率搜索算法

常见的有网格搜索,是一种穷举的方法,随机搜索,不保证能找到全局最优解

该训练多久

通常进行两轮调整:

第一轮是进行短时间的训练来找到较好的模型和优化器参数

第二轮在较好的超参数上进行少量长时间的训练来获得最终模型

相关推荐
张人玉34 分钟前
人工智能——猴子摘香蕉问题
人工智能
草莓屁屁我不吃38 分钟前
Siri因ChatGPT-4o升级:我们的个人信息还安全吗?
人工智能·安全·chatgpt·chatgpt-4o
小言从不摸鱼42 分钟前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
AI科研视界1 小时前
ChatGPT+2:修订初始AI安全性和超级智能假设
人工智能·chatgpt
霍格沃兹测试开发学社测试人社区1 小时前
人工智能 | 基于ChatGPT开发人工智能服务平台
软件测试·人工智能·测试开发·chatgpt
小R资源2 小时前
3款免费的GPT类工具
人工智能·gpt·chatgpt·ai作画·ai模型·国内免费
artificiali4 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python
酱香编程,风雨兼程5 小时前
深度学习——基础知识
人工智能·深度学习
Lossya5 小时前
【机器学习】参数学习的基本概念以及贝叶斯网络的参数学习和马尔可夫随机场的参数学习
人工智能·学习·机器学习·贝叶斯网络·马尔科夫随机场·参数学习
#include<菜鸡>6 小时前
动手学深度学习(pytorch土堆)-04torchvision中数据集的使用
人工智能·pytorch·深度学习