(1)深度学习 框架、流程解析,常用损失函数原理
一、深度学习
1、什么是深度学习
深度学习是一种人工智能的子领域,它基于人工神经网络的概念和结构,通过模拟人脑的工作方式来进行机器学习。

2、特点
深度学习的主要特点是使用多层次的神经网络来提取和学习数据中的特征,并通过反向传播算法来优化网络参数,从而实现对复杂数据的建模与分类。深度学习在图像识别、语音识别、自然语言处理等领域取得了显著的成果,并被广泛应用于各种领域。
3、神经网络构造

神经网络是一种由多个神经元(或称为节点)组成的计算模型,它模拟了生物神经系统中神经元之间的连接方式。神经网络有输入层、隐藏层和输出层组成,其中输入层用于接收外界的输入信号,输出层用于输出预测结果,隐藏层则用于处理输入信号并产生中间结果。
1)单层神经元
例如下图所示:

神经元1为输入层,而外部传入的x1、x2、x3、x4、x5、……全部都是外界即将传入神经元的电信号,这些电信号在传入途中可能会有所损耗,而损耗完剩下的才会传入神经元,这些传入的实际信号就用w1x1、w2x2、w3x3、w4x4、w5x5、……来表示,w叫做权重。
• 推导
有下列一堆数据,存在一条直线将他们分开成两类,而这条线叫线的表达式可以表示为y=kx+b

将这个线性回归模型的表达式改变一下就得到了我们的神经网络模型计算方式
y=kx+b -> 0=kx+b-y -> k1x+k2y+b=0 -> w1x1+w2x2+b=0 -> w1x1+w2x2+1*w0=0
这里的1为人为设定的偏执项
• 示例

如图传入信号为x1,x2,x3,他们分别通过权重w改变以后得到w1x1+w2x2+w3x3,然后再将这个结果映射到非线性函数上,这个非线性函数大多数用的都是sigmoid函数,从而得到最终结果,用sigmoid函数的原因是为了完成逻辑回归,因为 上图的模型为线性模型,他不能进行逻辑回归,所以只能将其映射到sigmoid函数中使其转变为逻辑回归
sigmoid函数图像:

2)多层神经网络

如图所示,第一列的五个圆圈叫输入层,最后一列的三个圆圈叫输出层,神经元则在中间三列,每一个神经元的运行方式和上述单层网络一样,如下图所示,上图的5个信号乘以权重的结果求和,
然后再对求和的值映射到sigmoid函数,然后第一个神经元接收到这样的信息,然后第一列的每一个神经元都需要得到所有信号的处理,最后再将这通过映射得到的五个值当做信号x再次计算权重求和映射传给下一个神经元,传送到最后到输出层得到结果。(这里的为初期的神经网络构架)

3)小结
神经网络:是由大量的节点(或称“神经元”)和之间相互的联接构成。
每个节点代表一种特定的输出函数,称为激励函数、激活函数(activation function)。就相当于下图的红框内的函数:

每两个节点间的联接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。相当于下列红框内的线条及其上所对应的w:

4、感知器
由两层神经元组成的神经网络 -- “感知器”(Perceptron), 感知器只能线性划分数据。

因为上述公式是线性代数方程组,因此可以用矩阵乘法来表达这两个公式:

输出公式表达:

输出的结果与训练集标签进行损失函数计算,与逻辑回归基本一致。
神经网络的本质
通过参数与激活函数来拟合特征与目标之间的真实函数关系。但在一个神经网络的程序中,不需要神经元和线,本质上是矩阵的运算,实现一个神经网络最需要的是线性代数库。
5、多层感知器
相对于上述感知器,多层感知器则增加了一个中间层,即隐含层,神经网络可以做非线性分类的关键--隐含层。

而矩阵的相乘也略微做了增加,如下所示:

6、动态图像示例
1)一个神经元
图中的线型为模型,动态表示正在训练

相当于下列状态:
一个输入层,一个输出层,一个神经元

2)两个神经元
同样是一条线的形态去分类

相当于下列所示:
一个输入层,一个输出层,两个神经元

3)三个神经元

相当于下图所示:
一个输入层,一个输出层,三个神经元

如需增加一个结果,则只需在输出层增加一个神经元即可。
7、多层感知器--偏置
在神经网络中需要默认增加偏置神经元(节点),这些节点是默认存在的。
它本质上是一个只含有存储功能,且存储值永远为1的单元。
在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。

偏置节点没有输入(前一层中没有箭头指向它)。 一般情况下,我们都不会明确画出偏置节点。
8、神经网络构造
1)重点
• 设计一个神经网络时,输入层与输出层的节点数往往是固定的,中间层则可以自由指定
• 神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别
• 结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。
2)如何构造中间层
• 输入层的节点数:与特征的维度匹配
• 输出层的节点数:与目标的维度匹配。
• 中间层的节点数:目前业界没有完善的理论来指导这个决策。一般是根据经验来设置。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。
二、损失函数
1、作用
它用于量化模型预测值与真实标签之间的差异,并指导模型的优化过程。
2、模型训练目的
使得参数尽可能的与真实的模型逼近。
3、常用损失函数

适用分类: 0-1损失函数、交叉熵损失(使用于多分类任务,最常用)、合页损失
适用回归:均方差损失、平均绝对差损失
一、常用损失函数
1、CrossEntropyLoss(交叉熵损失)
1)原理
交叉熵损失是一种常用于分类问题的损失函数,它衡量的是模型输出的概率分布与真实标签分布之间的差异
在多分类问题中,模型会输出每个类别的预测概率。交叉熵损失通过计算真实标签对应类别的负对数概率来评估模型的性能。在实际应用中,nn.CrossEntropyLoss内部会对logits(即未经softmax的原始输出)应用softmax函数,将其转换为概率分布,然后计算交叉熵。
例如:
假设有一个多类别分类任务,共有C个类别。对于每个样本,模型会输出一个包含C个元素的向量,其中每个元素表示该样本属于对应类别的概率。而真实标签是一个C维的向量,其中只有一个元素为1,其余元素均为0,表示样本的真实类别。
2)流程
首先,将模型输出的向量通过softmax函数进行归一化,将原始的概率值转换为概率分布。即对模型输出的每个元素进行指数运算,然后对所有元素求和,最后将每个元素除以总和,得到归一化后的概率分布。
然后,将归一化后的概率分布与真实标签进行比较,计算两者之间的差异。交叉熵损失函数的计算公式为: -sum(y * log(p)) ,其中y是真实标签的概率分布,p是模型输出的归一化后的概率分布。该公式表示真实标签的概率分布与模型输出的归一化后的概率分布之间的交叉熵。
最后,将每个样本的交叉熵损失值进行求和或平均,得到整个批次的损失值。
3)用法示例
import torch
import torch.nn as nn
# 假设有一个模型输出的logits和一个真实的标签
logits = torch.randn(10, 5, requires_grad=True) # 10个样本,5个类别
labels = torch.randint(0, 5, (10,)) # 真实标签,每个样本对应一个类别索引
# 创建CrossEntropyLoss实例
loss_fn = nn.CrossEntropyLoss()
# 计算损失
loss = loss_fn(logits, labels)
# 反向传播
loss.backward()
2、L1Loss(L1损失/平均绝对误差)
1)原理
L1损失,也称为平均绝对误差(MAE),计算的是预测值与真实值之差的绝对值的平均值。
L1损失对异常值(即远离平均值的点)的敏感度较低,因为它通过绝对值来度量误差,而绝对值函数在零点附近是线性的。
2)用法示例
loss_fn = nn.L1Loss()
predictions = torch.randn(3, 5, requires_grad=True) # 预测值
targets = torch.randn(3, 5) # 真实值
# 计算损失
loss = loss_fn(predictions, targets)
# 反向传播
loss.backward()
3、NLLLoss(负对数似然损失)
1)原理
负对数似然损失(NLLLoss)通常与log_softmax一起使用,用于多分类问题。它计算的是目标类别的负对数概率。
NLLLoss期望的输入是对数概率(即已经通过log_softmax处理过的输出),然后计算目标类别的负对数概率。
2)用法示例
# 假设已经计算了logits
logits = torch.randn(3, 5, requires_grad=True)
# 应用log_softmax获取对数概率(在PyTorch中,通常直接使用CrossEntropyLoss)
log_probs = torch.log_softmax(logits, dim=1)
# 创建NLLLoss实例
loss_fn = nn.NLLLoss()
# 真实标签
labels = torch.tensor([1, 0, 4], dtype=torch.long)
# 计算损失
loss = loss_fn(log_probs, labels)
# 反向传播
loss.backward()
4、 MSELoss(均方误差损失)
1)定义
均方误差损失(MSE)计算的是预测值与真实值之差的平方的平均值。
MSE通过平方误差来放大较大的误差,从而给予模型更大的惩罚。它是回归问题中最常用的损失函数之一。
2)用法示例
loss_fn = nn.MSELoss()
predictions = torch.randn(3, 5, requires_grad=True) # 预测值
targets = torch.randn(3, 5) # 真实值
# 计算损失
loss = loss_fn(predictions, targets)
# 反向传播
loss.backward()
5.BCELoss(二元交叉熵损失)
1)定义
二元交叉熵损失(BCE)用于二分类问题,计算的是预测概率与真实标签(0或1)之间的交叉熵。
BCE通过计算真实标签对应类别的负对数概率来评估模型的性能。它适用于输出概率的模型,但并不要求输入必须经过sigmoid函数(尽管在实践中很常见)。
2)用法示例
loss_fn = nn.BCELoss()
# 假设预测值已经通过sigmoid函数(虽然不是必需的)
predictions = torch.sigmoid(torch.randn(3, requires_grad=True))
# 真实标签
targets = torch.empty(3).random_(2).float() # 生成0或1的随机值
# 计算损失
loss = loss_fn(predictions, targets)
# 反向传播
loss.backward()
二、总结常用损失函数
1、nn.CrossEntropyLoss:交叉熵损失函数
主要用于多分类问题。它将模型的输出(logits)与真实标签进行比较,并计算损失。
2、nn.MSELoss:均方误差损失函数
用于回归问题。它计算模型输出与真实标签之间的差异的平方,并返回平均值。
3、nn.L1Loss:平均绝对误差损失函数
也称为L1损失。类似于MSELoss,但是它计算模型输出与真实标签之间的差异的绝对值,并返回平均值。
4、nn.BCELoss:二元交叉熵损失函数
用于二分类问题。它计算二分类问题中的模型输出与真实标签之间的差异,并返回损失。
5、nn.NLLLoss:负对数似然损失函数
主要用于多分类问题。它首先应用log_softmax函数(log_softmax(x) = log(softmax(x)))将模型输出转化为对数概率,然后计算模型输出与真实标签之间的差异。
4、具体做法
1)首先给所有参数w赋上随机值。我们使用这些随机生成的参数值,
来预测训练数据中的样本,当预测结果与真实值差距大,则需要去调整w的值来使其接近真实值
2)计算预测值为yi,真实值为y。那么,定义一个损失值loss,损失值用于判断预测的结果和真实值的误差,误差越小越好。
例如,有下列一堆数据,其中包含训练集和测试集,训练集和测试集又被分为训练特征集和训练标签,以及测试特征集和测试标签,而这里的标签集则表示真实值,将特征集作为输入信号,放入输入层对其进行训练,最后得到训练结果 ,训练结果叫预测值,然后再将预测值与真实值作比较。

使用均方差损失函数计算损失值:
有上述得到预测值后,对真实值与预测值作差然后做平方,计算每一条数据的差值平方加起来,然后再除以数据的条数即可得到损失值。

对于均方差损失函数,当标签是连续型的值,或者回归类型的值时很适用,但是当数据是离散型的那么使用它将效果差。
5、多分类情况下计算损失值
分类的情况下一般使用softmax交叉熵损失函数。
公式:

完整流程:


例如输出端输入的是猫、狗、羊,分别代号为0,1,2,输入端为一张图片,利用模型来判断这张图片中的动物是这三种动物的哪一种,输入一张图后得到三条数据,分别表示猫、狗、羊的值,然后将这三个值使用e的次方进行放大,以此来拉开差距,然后对放大后的数据进行归一化得到各个结果的概率,然后此时如果图片真实为猫的照片,那么第一行所表示的则为猫的概率,然后对这三个概率求负对数的值,这个负对数的值就是交叉熵损失值。
log与-log图像如下图所示

如果传入猫照片,猫的神经元输出数值相比其他越大, 计算的损失值会越小,也表明越靠近真实结果。 如果训练时,类别分错了,则会出现大的损失值。

6、正则化惩罚
正则化惩罚用于避免模型过拟合到训练数据,从而提高模型的泛化能力。正则化惩罚通过在目标函数中引入一个正则化项,以限制模型参数的大小或复杂度。
1)正则化惩罚的功能
主要用于惩罚权重参数w,一般有L1和L2正则化。
2)L1正则化
L1正则化通过在目标函数中加入参数的L1范数(绝对值之和),使得模型更倾向于产生稀疏的权重矩阵,即将一部分参数置为0,从而减少模型的复杂度。这可以帮助筛选出对模型影响较大的特征,提高模型的鲁棒性和可解释性。
公式为:
L1 = ∑ |w| w为权重参数
3)L2正则化
L2正则化通过在目标函数中加入参数的L2范数(平方和的开方),使得模型更倾向于产生较小的权重值。这可以有效地控制模型参数的大小,避免出现过大的参数值,从而减少模型对训练数据的过拟合。
公式为:
L2 = 1/2 *w**2 w为权重参数
4)示例
有如下模型:

当输入为 x = [ 1,1,1,1 ] ,现有两种不同权重值,如下所示
w1 = [ 1,0,0,0 ]
w2 = [ 0.25,0.25,0.25,0.25 ]
w1和w2与输入的乘积都为1,但w2 与每一个输入数据进行计算后都有数据,使得w2会学习到每一个特征信息。而w1只和第1个输入信息有关系,容易出现过拟合现象,因此w2的效果会比w1 好。
此时就使用均方差损失函数来计算损失值更合适,因为它适用于连续型的值
此时的公式与上述略有不同,即增加了一个正则化惩罚项

当使用L1正则化时即增加一个λ*L1
当使用L2正则化时即增加一个λ*L2
更多推荐
所有评论(0)