预告:

明日更新最新技术AgentSkills,有兴趣的麻烦点点关注

一、神经网络概念

1、定义

神经网络就是模仿人脑神经网络对数据进行加工处理的模型

2、组成

输入层+隐藏层+输出层

  • 样本数据输入必须是二维形式,nidim=2

  • 样本几个特征,输入层就有几个神经元

  • 同层神经元相互隔离, 第N层每个神经元会和N-1层所有神经元连接,每个连接都有权重值

  • 隐藏层每层神经元数量一般前面多一些,后面少一些

  • 输入层输出层各一层,隐藏层数量可任意设置

  • 网络层数一般指的是输出层+隐藏层层数

二、激活函数

在隐藏层和输出层中,使用线性和非线性函数共同组成每层的处理逻辑,以此来拟合现实世界各种复杂关系,其中非线性函数也被称为激活函数:

隐藏层激活函数的选择:ReLu>tahn>sigmoid

输出层:二分类用sigmoid,多分类用softmax

1)sigmoid函数-二分类

函数  :  f(x) = 1/(1+e^-x)     --> 范围【0,1】

求导   :    f'(x) = f(x)(1-f(x))    --> 范围【0,0.25】

适用场景:

主要用于二分类的输出层,且适用浅层网络
加权求和结果数据在【-6,6】明显,【-3,3】之间效果最好

缺点  :网络层超过5层,会导致梯度消失问题,0.25^9太小了,权重计算没有变化

2)tanh函数---(sigmoid函数的改进版)

函数在(-1,1),导数在(0,1)间

缺点:仍然存在梯度消失问题

优点:梯度比sigmoid大,收敛速度比sigmoid快,迭代次数少

适用场景:
主要用于隐藏层,适用浅层网络
加权求和结果数据在【-3,3】明显,【-1,1】之间效果最好

3)ReLu 激活函数【最常用】

函数 : f(x) = max(0,x)

导数范围:0或者1

优点:样本大于0时,梯度恒为1,解决了梯度消失的问题

缺点:样本小于0时,梯度为0,不会再变化,会造成神经元死亡

适用场景:主要用于隐藏层,且适用深层神经网络

为什么会造成神经元死亡?

1-初始化权重太小导致z无限接近0,计算式出现波动落入负值区域

2-学习率太大,梯度跨步太大,导致权重落入负值

3-权重设置了负值,z<0直接死亡

解决神经元死亡的ReLU变体:LeakyReLU,PRelu

LeakyReLU (x<0,0.01x,x)在小于0的区域添加一个0.01的导数,缓解权重不更新的问题
进阶-PReLU  (x<0,ax,x)在小于0的区域自定义值

4)softmax  多分类

作用:将多分类的结映射为概率的形式展现,概率和为1,选取概率最大的值作为结果

适用场景:主要用于输出层的多分类

简单记忆就是隐藏层用Relu及其变体,输出层二分类用sigmoid,多分类用softmax


三、权重初始化

为了提高模型收敛速度,防止梯度消失或爆炸,对参数进行人为初始化设置,有很多初始化方法,但是都不实用用,我们只需要掌握均匀分布、正态分布、Kaiming/HE初始化、Xavier初始化方法即可。

基础初始化方法

1)均匀分布初始化torch.nn.init.uniform_()

权重从区间随机取值,默认(0,1)

适用场景:线性简单模型或者改进

2)正态分布初始化/标准化:torch. nn.init.normal_()

权重从均值为0,标准差为1的高斯分布采样,再缩放为最小的值

Kaiming/HE初始化 - 何凯明提出

1)正态分布的Kaiming- nn.init.kaiming_normal_()

在【0-std】抽取样本,std = sqrt(2/fan_in)

2)均匀分布的Kaiming- nn.init.kaiming_uniform_()

在 [-limit,limit] 抽取样本,limit是 sqrt(6 / fan_in)

Xavier初始化/Glorot初始化 

1)正态分布的Xavier:nn.init.xavier_normal_()

2)均匀分布的Xavier:nn.init.xavier_uniform_()

如何选择

深层的一定要用kaiming和xavier,浅层的话都可以


四、损失函数

定义:比较输出和真实值的差异

别名:损失函数、代价函数、目标函数、误差函数

1、分类损失

1)多分类交叉熵损失函数 nn.CrossEntropyLoss() ,适用于softmax损失

2)二分类交叉熵损失 nn.BCELoss() , 适用于 sigmoid损失

2、回归损失

1)MAE损失-nn.L1Loss()平均绝对值误差损失函数

Mean absolute loss(MAE)也被称为L1 Loss,以绝对误差作为距离

2)MSE损失 -nn.MSELoss() 均方误差函数

Mean Squared Loss/ Quadratic Loss也被称为L2 loss,或欧氏距离,它以误差的平方和的均值作为距离

3)平滑L1损失函数Smooth L1

顾名思义,这是平滑后的L1Loss也就是MAE

解决了L1Loss梯度不连续问题、L2Loss梯度爆炸问题

应用场景:既想在误差小时有稳定的梯度(像MSE),又想在误差大时对异常值不敏感(像MAE)

五、网络优化方法

1、梯度下降算法

寻找使损失函数最小化的方法。从数学上的角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向

BGD批量梯度下降:每次用全部数据更新,计算慢但是稳定

SGD随机梯度下降:每次用一个样本更新,速度快,噪声大

Mini-Batch SGD小批量梯度下降,最常用,前两者折中,训练样本数/批次更新

实际上torch.optim.SGD指的是Mini-Batch SGD

在torch.optim.SGD,可以通过调整 batch_size 来控制使用多少样本,实现哪种算法

2、梯度下降优化器

梯度下降过程中存在如下问题:

  • 平坦区域梯度下降很慢,接近0,神经元接近死亡,模型收敛速度慢
  • 鞍点区域,梯度为0,模型可能误认为极值点
  • 局部最小值:模型很难察觉是不是全局最优值

基于以上问题设置了梯度优化器,缓解三个错误区域的频率

1)指数加权平均算法

距离越远的数字对平均数计算的贡献就越小(权重较小),距离越近则对平均数的计算贡献就越大(权重越大)

2)动量算法

  • Dt = β * St-1 + (1- β) * Wt

  • Dt-1上次加权梯度 Dt本次加权梯度  Wt本次样本的梯度  β自定义权重

作用:Momentum 使用移动加权平均,平滑了梯度的变化,使得前进方向更加平缓,有利于加快训练过程

optimzer = torch.optim.SGD(model.parameters(),lr=0.1,momentum=0.9)
momentum默认是0

3)Adagrad

学习率会“自动适应”不同参数的梯度规模
以前梯度总和大,学习率就调小,以前梯度总和小,学习率就调大

4)RMSPorp:“移动平均”替代累积,防止Adagrad的学习率过快衰减
optimzer = torch.optim.RMSprop(model.parameters(),lr=0.1,alpha=0.9)

5)Adam自适应矩估计:

将 Momentum 和 RMSProp 算法结合在一起。 
    1.修正梯度: 使⽤梯度的指数加权平均 
    2.修正学习率: 使⽤梯度平⽅的指数加权平均。

 optimizer = optim.Adam(params=[w], lr=0.1, betas=(0.9, 0.999))

3、学习率调度器

1)等间隔学习率衰减

scheduler_lr = optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.5)

2)指定间隔衰减学习率

指定具体轮次、下降比例milestones = [50, 125, 160]

scheduler_lr = optim.lr_scheduler.MultiStepLR(optimizer, milestones=milestones, gamma=0.5)

指数衰减学习率

scheduler_lr = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)

六、正则化方法

1、概念

防止模型过拟合(训练集好、测试集差)提高模型泛化能力的方法

2、Dropout正则化

随机失活机制:训练时,让每个神经元以概率 p随机“死亡”

丢弃概率 p的经验值:一般在0.2-0.5,简单模型第低、复杂模型容易过拟合,丢弃概率要高;

数值缩放与模式切换:训练时存活的神经元放大信号,测试时没有随机失活要再缩小信号

dropout = nn.Dropout(p=0.4)
d1 = dropout(output)

3、批量归一化

γ 和 β 是可学习的参数,它相当于对标准化后的值做了一个线性变换,γ 为系数,β 为偏置;

eps 通常指为 1e-5,避免分母为 0。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐