Pytorch:神经网络基础
目录
一、什么是神经网络
二、神经网络的构成
三、激活函数
四、模型参数计算
五、神经网络的优缺点
六、损失函数
七、网络优化方法
八、学习率优化方法
九、正则化方法
📚 重点及目标
1、知道什么是神经网络
2、知道常见的激活函数
3、了解常见的参数初始化方法
4、能够完成神经网络模型的搭建
5、知道神经网络模型的参数的计算方法
一、什么是神经网络
人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的计算模型。
如下图所示:
二、神经网络的构成
1、神经网络构成
输入层,隐藏层和输出层。
2、隐藏层的特点
✅同一层的神经元之间没有连接
✅第 N 层的每个神经元和第 N-1层 的所有神经元相连(这就是full connected的含义),这就是全连接神经网络
✅全连接神经网络接收的样本数据是二维的,数据在每一层之间需要以二维的形式传递 第N-1层神经元的输出就是第N层神经元的输入
✅每个连接都有一个权重值(w系数和b系数)
3、构建神经网络示意图如下:
三、激活函数
1、激活函数的作用
激活函数用于对每层的输出数据进行变换, 进而为整个网络注入了非线性因素。此时, 神经网络就可以拟合各种曲线。
2、常见的激活函数
(1)Sigmod
(2)Tanh
(3)ReLU
(4)SoftMax
3、各种激活函数的选择方法
对于隐藏层:
1、优先选择ReLU激活函数
2、如果ReLu效果不好,那么尝试其他激活,如Leaky ReLu等。
3、如果你使用了ReLU, 需要注意一下Dead ReLU问题, 避免出现0梯度从而导致过多的神经元死亡。
4、少用使用sigmoid激活函数,可以尝试使用tanh激活函数
对于输出层:
1、二分类问题选择sigmoid激活函数
2、多分类问题选择softmax激活函数
3、回归问题选择identity激活函数
4、参数初始化
激活函数的选择:
根据激活函数的类型选择对应的初始化方法
Sigmoid/Tanh:Xavier 初始化 ReLU/Leaky ReLU:kaiming 初始化
网络的深度
浅层网络:随机初始化即可
深层网络:需要考虑方差平衡,如 Xavier 或 kaiming 初始化
四、模型参数计算
🧩 神经网络的输入数据是为[batch_size, in_features]的张量经过网络处理后获取了[batch_size, out_features]的输出张量。
🧩模型参数的计算: 以第一个隐层为例:
该隐层有3个神经元,每个神经元的参数为:4个(w1,w2,w3,b1),所以一共用3x4=12个参数。 输入数据和网络权重是两个不同的事儿!理解这一点十分重要,要分得清。
五、神经网络的优缺点
1.优点
🔥 精度⾼,性能优于其他的机器学习⽅法,甚⾄在某些领域超过了⼈类 可以近似任意的⾮线
性函数 近年来在学界和业界受到了热捧,有⼤量的框架和库可供调。
2.缺点
🚫 ⿊箱,很难解释模型是怎么⼯作的 训练时间⻓,需要⼤量的计算⼒ ⽹络结构复杂,需要调
整超参数 ⼩数据集上表现不佳,容易发⽣过拟合。
六、损失函数
1、什么是损失函数?
在深度学习中, 损失函数是用来衡量模型参数的质量的函数, 衡量的方式是比较网络输出和真实输出的差异。
2、在多分类任务损失函数
在多分类任务通常使用softmax将logits转换为概率的形式,所以多分类的交叉熵损失也叫做softmax损失,它的计算方法是:
其中: y是样本x属于某一个类别的真实概率
而f(x)是样本属于某一类别的预测分数
S是softmax激活函数,将属于某一类别的预测分数转换成概率
L用来衡量真实值y和预测值f(x)之间差异性的损失结果
3、二分类损失函数
在处理二分类任务时,我们不再使用softmax激活函数,而是使用sigmoid激活函数,那损失函数也相应的进行调整,使用二分类的交叉熵损失函数:
其中: y是样本x属于某一个类别的真实概率 而y^是样本属于某一类别的预测概率 L用来衡量真实值y与预测值y^之间差异性的损失结果。 在pytorch中实现时使用nn.BCELoss() ,如下所示:
4、回归任务的损失函数
Mean Squared Loss/ Quadratic Loss(MSE loss)也被称为L2 loss,或欧氏距离,它以误差的平方和的均值作为距离 损失函数公式:
曲线如下图所示:
特点是: L2 loss也常常作为正则项。 当预测值与目标值相差很大时, 梯度容易爆炸。
Smooth L1说的是光滑之后的L1。损失函数公式:
如下图所示:
其中:𝑥=f(x)−y 为真实值和预测值的差值。 从上图中可以看出,
该函数实际上就是一个分段函数 在[-1,1]之间实际上就是L2损失,这样解决了L1的不光滑问题
在[-1,1]区间外,实际上就是L1损失,这样就解决了离群点梯度爆炸的问题。
七、网络优化方法
1、梯度下降
梯度下降法是一种寻找使损失函数最小化的方法。从数学角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向,所以有:
其中,η是学习率,如果学习率太小,那么每次训练之后得到的效果都太小,增大训练的时间成本。如果,学习率太大,那就有可能直接跳过最优解,进入无限的训练中。解决的方法就是,学习率也需要随着训练的进行而变化。
在进行模型训练时,有三个基础的概念:
Epoch: 使用全部数据对模型进行一次完整训练,训练轮次
Batch_size: 使用训练集中的小部分样本对模型权重进行以此反向传播的参数更新,每次训练每批次样本数量
Iteration: 使用一个 Batch 数据对模型进行一次参数更新的过程
假设数据集有 50000 个训练样本,现在选择 Batch Size = 256 对模型进行训练。
每个 Epoch 要训练的图片数量:50000
训练集具有的 Batch 个数:50000/256+1=196
每个 Epoch 具有的 Iteration 个数:196
10个 Epoch 具有的 Iteration 个数:1960
2、梯度下降优化的方法
梯度下降优化算法中,可能会碰到以下情况: 碰到平缓区域,梯度值较小,
参数优化变慢 碰到 “鞍点” ,梯度为 0,参数无法优化
碰到局部最小值,参数不是最优
对于这些问题, 出现了一些对梯度下降算法的优化方法,例如:Momentum、AdaGrad、RMSprop、Adam 等
总结:
- **简单任务和较小的模型**:SGD 或 Momentum
- **复杂任务或有大量数据**:Adam 是最常用的选择,因其在大部分任务上都表现优秀
- **需要处理稀疏数据或文本数据**:Adagrad 或 RMSProp
八、学习率优化方法
1、等间隔学习率衰减
2、指定间隔学习率衰减
3、按指数学习率衰减
九、正则化方法
在设计机器学习算法时希望在新样本上的泛化能力强。许多机器学习算法都采用相关的策略来减小测试误差,这些策略被统称为正则化。 神经网络强大的表示能力经常遇到过拟合,所以需要使用不同形式的正则化策略。 目前在深度学习中使用较多的策略有范数惩罚,DropOut,特殊的网络层等。
1、Dropout
在神经网络中模型参数较多,在数据量不足的情况下,很容易过拟合。Dropout(随机失活)是一个简单有效的正则化方法。
2、BN:批量归一化在视觉领域使用较多。
对数据标准化,再对数据重构(缩放+平移)
