深度学习--神经网络基础(2)

损失函数

在深度学习中, 损失函数是用来衡量模型参数的质量的函数 , 衡量的方式是比较网络输出和真实输
出的差异:

分类

1.多分类损失函数

在多分类任务通常使用 softmax logits 转换为概率的形式,所以多分类的交叉熵损失也叫做 softmax 损失 ,它的计算方法是:

其中:
1. y 是样本 x 属于某一个类别的真实概率
2. f(x) 是样本属于某一类别的预测分数
3. S softmax 激活函数 , 将属于某一类别的预测分数转换成概率
4. L 用来衡量真实值 y 和预测值 f(x) 之间差异性的损失结果

2.二分类任务损失交叉熵

在处理二分类任务时,我们不再使用softmax激活函数,而是使用sigmoid激活函数,那损失函数也相应的进行调整, 使用二分类的交叉熵损失函数:

其中:
1. y是样本x属于某一个类别的真实概率
2. 而y^是样本属于某一类别的预测概率
3. L用来衡量真实值y与预测值y^之间差异性的损失结果。

3.回归任务损失函数

MAE损失函数

Mean absolute loss(MAE)也被称为L1 Loss,是以绝对误差作为距离。损失函数公式:

曲线如下图所示:

特点是:
1. 由于L1 loss具有稀疏性,为了惩罚较大的值,因此常常将其作为 正则项添加到其他loss中作为约束。
2. L1 loss的最大问题是梯度在零点不平滑,导致会跳过极小值。
MSE损失函数
Mean Squared Loss/ Quadratic Loss(MSE loss) 也被称为L2 loss,或欧氏距离,它以误差的平方和的均值作为距离,损失函数公式:

曲线如下图所示:

特点是:
1. L2 loss也常常作为正则项。
2. 当预测值与目标值相差很大时, 梯度容易爆炸。
Smooth L1损失函数
smooth L1 说的是光滑之后的 L1 。损失函数公式 :

其中: ? =f(x)−y 为真实值和预测值的差值。

从上图中可以看出,该函数实际上就是一个分段函数
1. [-1,1] 之间实际上就是 L2 损失,这样解决了 L1 的不光滑问题
2. [-1,1] 区间外,实际上就是 L1 损失,这样就解决了离群点梯度爆炸的问题

代码示例

import torch

# 1. 多任务交叉熵损失
# 设置真实值: 可以是热编码后的结果也可以不进行热编码
# 注意的类型必须是64位整型数据
# y_true = torch.tensor([1,2],dtype=torch.int64)
y_true = torch.tensor([[0, 1, 0], [0, 0, 1]], dtype=torch.float32)
y_pred = torch.tensor([[1,10,1],[2,3,10]],dtype=torch.float32)

# 实例化多任务交叉熵损失
L= torch.nn.CrossEntropyLoss()
# 计算损失结果
print(L(y_pred,y_true))


# 2. 二分类的交叉熵
y_true = torch.tensor([0,0,1],dtype=torch.float32)
y_pred = torch.tensor([0.01,0.02,0.7],dtype=torch.float32)
# 二分类交叉熵损失
L= torch.nn.BCELoss()
print(L(y_pred,y_true))


# 3. 回归任务
y_true = torch.tensor([2.0,0.5,10],dtype=torch.float32)
# y_pred = torch.tensor([2,8,0.9],dtype=torch.float32)
y_pred = torch.tensor([2,0.8,9],dtype=torch.float32)

# L =torch.nn.L1Loss() 
# L =torch.nn.MSELoss()
L =torch.nn.SmoothL1Loss()

print(L(y_pred,y_true))
高级数字化帝都下降人才培训专家

梯度下降优化方法

梯度下降优化算法中,可能会碰到以下情况:
1. 碰到平缓区域,梯度值较小,参数优化变慢
2. 碰到 “鞍点” ,梯度为 0,参数无法优化
3. 碰到局部最小值,参数不是最优
对于这些问题, 出现了一些对梯度下降算法的优化方法,例如:Momentum、AdaGrad、RMSprop、Adam 等

 指数加权平均

指数移动加权平均 则是参考各数值,并且各数值的权重都不同,距离越远的数字对平均数计算的贡献就越小(权重较小),距离越近则对平均数的计算贡献就越大(权重越大)。
比如:明天气温怎么样,和昨天气温有很大关系,而和一个月前的气温关系就小一些。
计算公式可以用下面的式子来表示:

St 表示指数加权平均值 ;
Yt 表示 t 时刻的值 ;
β 调节权重系数,该值越大平均数越平缓。
下面通过代码来看结果,随机产生 30 天的气温数据:

import torch
import matplotlib.pyplot as plt

# 产生30天的随机温度
temperature = torch.randn([30,]) * 10
# 绘制平均温度
x = torch.arange(0,30,1)
plt.scatter(x,temperature)


# 指数加权平均
exp = []   # 指数加权后的值
beta = 0.9
for idx,tmp in enumerate(temperature):
    # 第一个元素的的 EWA 值等于自身
    if idx ==0:
        exp.append(tmp)
        continue
    # 第二个元素的 EWA 值等于上一个 EWA 乘以 β + 当前气温乘以 (1-β)
    t = beta * exp[idx-1] + (1-beta) * tmp
    exp.append(t)

plt.scatter(x,temperature)
plt.plot(x,exp)
plt.show()

上图是 β 0.5 0.9 时的结果,从中可以看出:
指数加权平均绘制出的气氛变化曲线更加平缓,
β 的值越大,则绘制出的折线越加平缓,波动越小。

动量算法Momentum

梯度计算公式:Dt = β * St-1 + (1- β) * Wt
1. St-1 表示历史梯度移动加权平均值
2. Wt 表示当前时刻的梯度值
3. Dt 为当前时刻的指数加权平均梯度值
4. β 为权重系数
假设:权重 β 为 0.9,例如:
        第一次梯度值:s1 = d1 = w1
        第二次梯度值:d2=s2 = 0.9 * s1 + w2 * 0.1
        第三次梯度值:d3=s3 = 0.9 * s2 + w3 * 0.1
        第四次梯度值:d4=s4 = 0.9 * s3 + w4 * 0.1
梯度下降公式中梯度的计算,就不再是当前时刻 t 的梯度值,而是历史梯度值的指数移动加权平
均值。公式修改为:
W_t+1 = W_t - a * Dt

adagrad

AdaGrad 通过对不同的参数分量使用不同的学习率, AdaGrad 的学习率总体会逐渐减小
其计算步骤如下:
1. 初始化学习率 α 、初始化参数 θ 、小常数 σ = 1e-6
2. 初始化梯度累积变量 s = 0
3. 从训练集中采样 m 个样本的小批量,计算梯度 g
4. 累积平方梯度 s = s + g g 表示各个分量相乘
学习率 α 的计算公式如下:
参数更新公式如下:

重复 2-4 步骤 , 即可完成网络训练。
AdaGrad 缺点是可能会使得学习率过早、过量的降低,导致模型训练后期学习率太小,较难找到最优解。

RMSProp

RMSProp 优化算法是对 AdaGrad 的优化 . 最主要的不同是,其使用 指数移动加权平均梯度 替换历史梯度 的平方和。其计算过程如下:
1. 初始化学习率 α 、初始化参数 θ 、小常数 σ = 1e-6
2. 初始化参数 θ
3. 初始化梯度累计变量 s
4. 从训练集中采样 m 个样本的小批量,计算梯度 g
5. 使用指数移动平均累积历史梯度,公式如下:
学习率 α 的计算公式如下:
参数更新公式如下:
高级数字化人才培训
专家

Adam

-Momentum 使用指数加权平均计算当前的梯度值
-AdaGrad、RMSProp 使用自适应的学习率
-Adam优化算法(Adaptive Moment Estimation,自适应矩估计)将 Momentum 和
 RMSProp 算法结合在一起。
        1.修正梯度: 使⽤ 梯度的指数加权平均
        2.修正学习率: 使⽤ 梯度平 的指数加权平均

代码示例

import torch
from torch import optim

# 1. SGD
# 初始化权重参数
w = torch.tensor([1.0],requires_grad=True)
y = (w**2/2.0).sum()  # 损失函数

# 优化方法:SGD指定参数beta(momentum)
# optimizer = optim.SGD([w],lr=0.01,momentum=0.9)

# 优化方法: Adagrad
# optimizer = optim.Adagrad([w],lr=0.01)

# 优化方法: RMSProp
optimizer = optim.RMSprop([w],lr=0.01,alpha=0.9)

# 优化方法:Adam
optimizer = optim.Adam([w],lr=0.01,betas=[0.9,0.99])



# 第一次更新计算梯度,并对参数进行更新
optimizer.zero_grad() # 梯度清零
y.backward()  # 自动微分
optimizer.step()  # 更新权重
# 打印结果
print(w.detach().numpy())  # w本身
print(w.grad.numpy())   # 梯度结果

# 第二次更新计算梯度,并对参数进行更新
y = (w**2/2.0).sum()
optimizer.zero_grad() # 梯度清零
y.backward()  # 自动微分
optimizer.step()  # 更新权重
# 打印结果
print(w.detach().numpy())
print(w.grad.numpy())

学习率衰减方法

等间隔学习率衰减

指定间隔学习率衰减

 按指数学习率衰减

代码示例

import torch
import matplotlib.pyplot as plt

# 初始化参数
y_true = torch.tensor([0.1])
w = torch.tensor([1.0],requires_grad=True)
x = torch.tensor([1.0])
# 设置优化器
optimizer = torch.optim.SGD([w],lr=0.1,momentum=0.9)

# 设置间隔学习率下降策略  step_size:调整间隔数=50 , gamma:调整系数
lr_s = torch.optim.lr_scheduler.StepLR(optimizer,step_size=20,gamma=0.1)

# 设置指定间隔学习率下降策略   milestones:设定调整轮次 , gamma:调整系数
# lr_s = torch.optim.lr_scheduler.MultiStepLR(optimizer,milestones=[50, 125, 160],gamma=0.1)

# 设置指数学习率下降策略    gamma:指数的底
# lr_s = torch.optim.lr_scheduler.ExponentialLR(optimizer,gamma=0.98)

# 获取学习率和当前的epoch
lr_list = []  # 学习率
for epoch in range(200): # 轮次
    lr_list.append(lr_s.get_last_lr())  # get_last_lr 提取学习率
    for i in range(10):  # 批次
        loss = (w*x-y_true)**2/2.0  # 损失函数
        optimizer.zero_grad()    # 梯度清零
        loss.backward()   # 自动微分
        optimizer.step()   # 更新权重
    # 更新下一个epoch的学习率
    lr_s.step()

plt.plot(torch.arange(0,200),lr_list)
plt.grid()
plt.show()

正则化

在设计机器学习算法时希望在新样本上的泛化能力强。许多机器学习算法都采用相关的策略来减小测试误差,这些策 略被统称为正则化。
神经网络的强大的表示能力经常遇到过拟合,所以需要使用不同形式的正则化策略。
目前在深度学习中使用较多的策略有 范数惩罚, DropOut ,特殊的网络层等

DropOut

在练神经网络中模型参数较多,在数据量不足的情况下,很容易过拟合。 Dropout (随机失活)是一个简单有效的正则 化方法。
在训练过程中, Dropout 的实现是 让神经元以超参数 p 的概率停止工作或者激活被置为 0, 未被置为 0 的进行缩放,缩放 比例为 1/(1-p) 。训练过程可以认为是对完整的神经网络的一些子集进行训练,每次基于输入数据只更新子网络的参数
  • 在测试过程中,随机失活不起作用。 

批量归一化(BN)

先对数据标准化,再对数据重构(缩放 + 平移),如下所示:

1. λ β 是可学习的参数,它相当于对标准化后的值做了一个 线性变换 λ 为系数, β 为偏置;
2. eps 通常指为 1e-5 ,避免分母为 0
3. E(x) 表示变量的均值;
4. Var(x) 表示变量的方差;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/421223.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式中有关软件开发的错误观念

从学生转变为职业人的过程是很艰难的,因为我们要与自己积累了多年的“老毛病”作斗争,这些“老毛病”包括:做事拖拉、不守时、不遵守规则、怕吃苦等。 就像发射火箭卫星一样,摆脱重力的束缚所花费的燃料是最多的,一旦…

springcloud:3.1介绍雪崩和Resilience4j

灾难性雪崩效应 简介 服务与服务之间的依赖性,故障会传播,造成连锁反应,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。 原因 1.服务提供者不可用(硬件故障、程序bug、缓存击穿、用户大量请求) 2.重试加大流量(用户重试,代码逻辑重试) 3.服…

STM32标准库开发——BKP备份RTC时钟

备份寄存器BKP(Backup Registers) 由于RTC与BKP关联性较高,所以RTC的时钟校准寄存器以及一些功能都放在了BKP中。TAMPER引脚主要用于防止芯片数据泄露,可以设计一个机关当TAMPER引脚发生电平跳变时自动清除寄存器内数据不同芯片BKP区别,主要体…

【python开发】网络编程(上)

这里写目录标题 一、必备基础(一)网络架构1、交换机2、路由器3、三层交换机4、小型企业基础网络架构5、家庭网络架构6、互联网 (二)网络核心词汇1、子网掩码和IP2、DHCP3、内网和公网IP4、云服务器5、端口6、域名 一、必备基础 &…

小程序配置服务器域名的操作步骤(入门级)

将详细列出小程序配置服务器域名的操作步骤: 服务器选购推荐:腾讯云轻量服务器 点击以下任一云产品链接,跳转后登录,自动享有所有云产品优惠权益: 经过笔者亲测,强烈推荐腾讯云轻量应用服务器作为游戏服…

益生菌不一定全是“益”,也存在一定的安全风险

谷禾健康 益生菌被世界卫生组织定义为“当摄入足够量时,可为宿主带来健康益处的活微生物”。近年来,随着人们发现其可用于预防、减轻或治疗特定疾病以及改善健康,益生菌在食品和临床治疗中的应用越来越广泛。 大量研究表明,益生菌有助于维持肠道菌群的平衡,促进消化和吸收…

【图说】电脑发展史

免责声明:文中有一些图片来源自网络,如有版权请通知我删除,谢谢! “结绳记事”是计算的开端 如果说“结绳记事”仅是计数,那么“算筹”就是真正的计算工具 算盘也是我们老祖宗的杰出发明,最擅长“加减乘除”,包括但不限于乘方、开方、对数等。还能进行开发智力的“珠心算…

MongoDB聚合运算符:$count

文章目录 语法使用举例在$group阶段中使用在$setWindowFields阶段使用 $count聚合运算符返回分组中文档的数量。从5.0开始支持。 语法 { $count: { } }$count不需要参数 使用 $count可以用于下列聚合阶段: $bucket$bucket$group$setWindowFields 在$group阶段中…

Apache Flink连载(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​编辑

List 集合遍历过程中删除元素避坑指南。

文章目录 1. 遍历2. 遍历过程中删除元素2.1 for 简单循环正向遍历方式2.2 for 简单循环反向遍历方式2.3 foreach 方式遍历删除2.4 Iterator的remove()方法2.5 <font color green> removeIf() &#xff08;推荐&#xff09;<green>2.6 Strem 方式 作为一名后端开发…

S1---FPGA硬件板级原理图实战导学

视频链接 FPGA板级实战导学01_哔哩哔哩_bilibili FPGA硬件板级原理图实战导学 【硬件电路设计的方法和技巧-哔哩哔哩】硬件电路设计的方法和技巧01_哔哩哔哩_bilibili&#xff08;40min&#xff09; 【高速板级硬件电路设计-哔哩哔哩】 高速板级硬件电路设计1_哔哩哔哩_bil…

网安播报|开源Xeno RAT特洛伊木马在GitHub上成为潜在威胁

1、开源Xeno RAT特洛伊木马在GitHub上成为潜在威胁 一种“设计复杂”的远程访问特洛伊木马&#xff08;RAT&#xff09;&#xff0c;称为Xeno RAT已在GitHub上提供&#xff0c;使其他参与者可以轻松访问&#xff0c;无需额外费用。开源RAT是用C#编写的&#xff0c;与Windows 10…

【Flutter 面试题】解释 Flutter的热重载(Hot Reload)功能

【Flutter 面试题】解释 Flutter的热重载&#xff08;Hot Reload&#xff09;功能 文章目录 写在前面解答补充说明 写在前面 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏作者&#xff0c;阿里云社区专家博主&#xff0c;51CTO专家博主。2…

JVM运行时数据区——虚拟机栈

文章目录 1、虚拟机栈概述1.1、StackOverflowError1.2、OOM异常 2、栈的存储单位3、局部变量表3.1、局部变量表简介3.2、Slot 4、操作数栈5、栈顶缓存技术6、动态链接7、方法的调用7.1、方法调用的分类7.2、虚方法与非虚方法7.3、关于invokedynamic指令7.4、方法重写的本质7.5、…

StarRocks——中信建投基于StarRocks构建统一查询服务平台

目录 一、需求背景 1.1 数据加工链路复杂 1.2 大数据量下性能不足&#xff0c;查询响应慢 1.3 大量实时数据分散在各个业务系统&#xff0c;无法进行联合分析 1.4 缺少与预计算能力加速一些固定查询 二、构建统一查询服务平台 三、落地后的效果与价值 四、项目经验总结…

laravel ApiResponse接口统一响应封装

一&#xff0c;新增接口返回码配置文件 在config中新增配置文件apicode.php <?phpreturn [ apicodes>[/*** Message("OK")* 对成功的 GET、PUT、PATCH 或 DELETE 操作进行响应。也可以被用在不创建新资源的 POST 操作上*/HTTP_OK > 200,/*** Message(&qu…

C#,K中心问题(K-centers Problem)的算法与源代码

1 K中心问题&#xff08;K-centers Problem&#xff09; k-centers problem: 寻找k个半径越小越好的center以覆盖所有的点。 比如&#xff1a;给定n个城市和每对城市之间的距离&#xff0c;选择k个城市放置仓库&#xff08;或ATM或云服务器&#xff09;&#xff0c;以使城市…

python实现ElGamal算法

ElGamal公钥密码算法是在密码协议中有着重要应用的一类公钥密码算法&#xff0c;基于公钥密码体制和椭圆曲线加密体系&#xff0c;其安全性是基于有限域上离散对数学问题的难解性。至今仍是一个安全性良好的公钥密码算法。既可用于加密又可用于数字签名的公钥密码体制。 数字签…

2.2_2 进程调度的时机、切换与过程、调度方式

文章目录 2.2_2 进程调度的时机、切换与过程、调度方式&#xff08;一&#xff09;进程调度的时机&#xff08;二&#xff09;进程调度的方式&#xff08;三&#xff09;进程的切换与过程 总结 2.2_2 进程调度的时机、切换与过程、调度方式 &#xff08;一&#xff09;进程调度…

Qt 自定义长条进度条(类似播放器进度条)

1.运行界面 2.步骤 其实很简单。 2.1绘制底图圆角矩形 2.2绘制播放进度圆角矩形 参考&#xff1a;painter绘图 3.源码 #pragma once#include <QWidget> #include <QLabel> #include <QHBoxLayout> #include <QMouseEvent> #include <QDebug&g…