A、参数初始化

        参数初始化对模型的训练速度、收敛性以及最终的性能产生重要影响。它可以尽量避免梯度消失和梯度爆炸的情况。

一、固定值初始化

        在神经网络训练开始时,将权重或偏置初始化为常数。但这种方法在实际操作中并不常见。

1.1全零初始化

        将所有的权重参数初始化为0,但此时模型在每一层神经元上就无法学习,把所有的特征信息都忽略了,但模型仍然会接收输入数据,由于所有神经元的权重相同,它们会对所有输入做相同的响应。

        全零初始化可以用来初始化偏置。

API:import torch.nn as nn

          nn.init.zeros_(linear.weight)

代码示例:

import torch
import torch.nn as nn
def test01():linear = nn.Linear(in_features = 6 , out_features = 4)nn.init.zeros_(linear.weight)print(linear.weight)
if __name__ == '__main__':test01()

结果:

Parameter containing:
tensor([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]], requires_grad=True) 

1.2全一初始化

        只是把值从群全部为0,转换为全为1。

代码:

import torch
import torch.nn as nn
def test02():linear = nn.Linear(in_features = 3,out_features = 2)nn.init.ones_(linear.weight)print(linear.weight)
if __name__ == '__main__':test02()

结果:

Parameter containing:
tensor([[1., 1., 1.],
[1., 1., 1.]], requires_grad=True)

1.3任意常数初始化

        将参数设为非零的常数。要自行设置这个非零数字。

代码:

def test03():linear = nn.Linear(in_features = 2,out_features = 4)nn.init.constant_(linear.weight,7.7)print(linear.weight)
if __name__ == '__main__':test03()

结果:

Parameter containing:
tensor([[7.7000, 7.7000],
[7.7000, 7.7000],
[7.7000, 7.7000],
[7.7000, 7.7000]], requires_grad=True)

1.4固定值初始化

        将权重的参数数值自定义下来,在整个程序中它都一直保持这个数值不变。

代码:

def test04():net = nn.Linear(2,2,bias=True)x = torch.tensor([[0.1,0.95]])net.weight.data = torch.tensor([[0.1,0.2],[0.3,0.4]])output = net(x)print(output)print(net.weight)print(net.bias)if __name__ == '__main__':test04()

结果:

tensor([[-0.2744,  0.0352]], grad_fn=<AddmmBackward0>)

Parameter containing:
tensor([[0.1000, 0.2000],
[0.3000, 0.4000]], requires_grad=True)
Parameter containing:
tensor([-0.4744, -0.3748], requires_grad=True)

二、随机初始化

        将权重初始化为随机的小值,通常呈现正态分布或者均匀分布。

        它可以避免对称性破坏,但是可能会出现梯度消失(权重太小)或者梯度爆炸(权重太大)。

注:“对称性破坏”(Symmetry Breaking)是指:如果神经网络中所有参数(例如同一层的权重)被初始化为相同的值(比如全0或者全相同的非零值),那么在训练过程中,这些参数会以相同的方式更新,导致同一层中的所有神经元在训练过程中学习到相同的特征。这样,这些神经元在功能上就是冗余的,整个网络的表达能力就会受到限制,相当于只有一个神经元的效果。

API:

均匀分布随机初始化:nn.init.uniform_(linear.weight)

正态分布随机初始化:nn.init.normal_(linear.weight)

代码:

import torch.nn as nn
def test():linear = nn.Linear(2,3)fun1 = nn.init.uniform_(linear.weight)print(fun1)fun2 = nn.init.normal_(linear.weight,mean=0,std=1)print('-'*40)print(fun2)if __name__ == '__main__':test()

结果:

Parameter containing:
tensor([[0.7598, 0.4357],
[0.3120, 0.3512],
[0.6281, 0.1598]], requires_grad=True)
----------------------------------------
Parameter containing:
tensor([[ 1.0969,  0.5326],
[-0.0624,  1.1465],
[ 0.0963,  0.1332]], requires_grad=True)

三、Xavier初始化

        泽维尔初始化也叫做Glorot初始化,核心原理是跟如输入输出的维度来初始化权重,使得每一层的输出方差保持一致:主要是前向传播的方差一致性和反向传播的梯度方差一致性。综合考虑之下,为了同时平衡前向传播和反向传播,Xavier采用的权重为Var(W) = 2/(Nin+Nout)

 API:

均匀分布:nn.init.xavier_uniform_(linear.weight)

正态分布:nn.init.xavier_normal_(linear.weight)

代码:

def test06():linear1 = nn.Linear(3,4)nn.init.xavier_uniform_(linear1.weight)print(linear1.weight)linear2 = nn.Linear(3,2)nn.init.xavier_normal_(linear1.weight)print(linear2.weight)if __name__ == '__main__':test06()

结果:

Parameter containing:
tensor([[-0.2246, -0.2905,  0.4308],
[ 0.2819,  0.6478, -0.5633],
[ 0.3807, -0.7230, -0.2279],
[-0.6118, -0.0948,  0.4442]], requires_grad=True)
Parameter containing:
tensor([[ 0.4279, -0.1615, -0.0495],
[ 0.1024,  0.4124,  0.2298]], requires_grad=True)

四、He初始化

        He初始化也叫kaiming初始化,核心思想是调整权重的初始化范围,使得每一层的输出方差保持一致(前向传播的方差一致性、反向传播的梯度一致性)。它是专门针对ReLU激活函数进行优化的。分为两种模式:

(1)fan_in:优先保证前向传播稳定,方差2/Nin;

(2)fan_out:优先保证反向传播稳定,方差2/Nout;

api :         nn.init_kaiming_uniform(linear.weight)

                nn.init_kaiming_normal(linear.weight)

代码:

def test08():linear = nn.Linear(1,4)nn.init.kaiming_uniform_(linear.weight)print(linear.weight)linear = nn.Linear(2,1)nn.init.kaiming_normal_(linear.weight)print(linear.weight)if __name__ == '__main__':test08()

结果:

Parameter containing:
tensor([[ 1.2009],
[-0.5195],
[-0.3154],
[ 1.0753]], requires_grad=True)
Parameter containing:
tensor([[ 1.1605, -0.8621]], requires_grad=True)

五、小结

        自此,在前边学习了四种对权重初始化的方法,每个网络层的参数都有默认的初始化方法,同时对上面的方法我们也要针对具体情况进行使用。

B、损失函数

一、线性回归损失函数

1.1MAE损失

        MAE平均绝对误差,L1-Loss,通过对预测值和真实值之间的绝对差来衡量他们之间的差异。

特点:

(1)鲁棒性强,比MSE鲁棒性好,他不会像MSE那样对较大误差平方敏感;

(2) 物理意义直观。

API:nn.L1Loss()

代码:

import torch
import torch.nn as nndef test1():mae_loss = nn.L1Loss()y_pred = torch.tensor([0.4,2.3])y_true = torch.tensor([0.5,2.2])loss = mae_loss(y_pred,y_true)print(loss.item())if __name__ == '__main__':test1()

结果:

0.09999994933605194

1.2MSE损失

        均方差损失,L2Loss,通过对预测值和真实值之间的误差平方取平均值,来衡量预测值与真实值之间的差异。

特点:

(1)平方惩罚,对误差施加更大的惩罚,对异常值更为敏感;

(2) 凸性:MSE是一个凸函数,它具有一个唯一的全局最小值,有助于优化问题的求解。

API:nn.MSELoss()

代码:

mse_loss = nn.MSELoss()
y_true = torch.tensor([0.9,2.1])
y_pred = torch.tensor([0.7,2.2])
loss = mse_loss(y_true,y_pred)
print(loss.item())

结果:

0.025000011548399925

二、交叉熵

        用于分类。

2.1信息量

        信息量用于衡量一个事件所包含的信息的多少。信息量的定义基于事件发生的概率:事件发生的概率越低,其信息量越大

        公式:

其中x为某一事件,p(x)是该事件发生的概率,I(x)是该事件的信息量。

2.2信息熵

        信息熵是信息量的期望值,熵越大,表示事件的不确定性越大。

2.3KL散度

        KL散度用于衡量两个概率分布之间的差异(损失的信息量),KL越小,两个分布越接近。

2.4交叉熵

        在KL散度的基础上,将KL公式展开,就能得到交叉熵。

 注意:

 交叉熵函数内置了softmax,所以不要重复显示调用softmax。CrossEntropyLoss是多分类问题的首选损失函数

所以,CrossEntropyLoss 实质上是两步的组合:Cross Entropy = Log-Softmax + NLLLoss

Log-softmax:是对softmax函数取对数;

NLLLoss:对Log-softmax取负值。

利用交叉熵进行分类:

(1)输入数据信息;

(2)输入真实标签的数据;

(3)定义损失函数;

(4)定义loss,将输入信息代入损失函数;

(5)查看结果。

代码:

import torch
import torch.nn as nn
input_data = torch.tensor([[1.5,2.0,0.5],[0.5,1.0,1.5]])  #分别对应类别 0、1 和 2 的得分
labels = torch.tensor([1,2])
criterion = nn.CrossEntropyLoss()
loss = criterion(input_data,labels)
print('交叉熵损失为:',loss.item())  

结果:

交叉熵损失为: 0.6422001123428345

三、二分类交叉熵

        在输出层使用sigmoid激活函数进行二分类时运用该损失函数。

        二分类问题的标签只有两个,要么0,要么1,因此原本的损失函数可以写为:

代码:

def test001():y = torch.tensor([[0.7],[0.2],[0.9],[0.7]])#信息为相应分类的概率labels = torch.tensor([[1],[0],[1],[0]],dtype = torch.float)#对应信息的标签bceloss = nn.BCELoss()loss = bceloss(y,labels)print('二分类交叉熵的损失值为:',loss.item())if __name__ == '__main__':test001()

结果:

 二分类交叉熵的损失值为: 0.47228795289993286

四、小结

       (1) 当输出层使用softmax多分类时,损失函数为交叉熵函数CrossEntropyLoss;

       (2) 当输出层使用sigmoid二分类时,损失函数为二分类交叉熵函数BCELoss;

        (3)当网络层为线性层时,做线性回归功能,损失函数为M均方误差损失SELoss。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914765.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914765.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914765.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

格密码--Ring-SIS和Ring-LWE

1. 多项式环&#xff08;Polynomial Rings&#xff09; 设 f∈Z[x]f \in \mathbb{Z}[x]f∈Z[x] 是首一多项式&#xff08;最高次项系数为1&#xff09; 则环 RZ[x]/(f)R \mathbb{Z}[x]/(f)RZ[x]/(f) 元素为&#xff1a;所有次数 <deg⁡(f)< \deg(f)<deg(f) 的多项式…

前端工作需要和哪些人打交道?

前端工作中需要协作的角色及协作要点 前端工作中需要协作的角色及协作要点 前端开发处于产品实现的 “中间环节”,既要将设计方案转化为可交互的界面,又要与后端对接数据,还需配合团队推进项目进度。日常工作中,需要频繁对接的角色包括以下几类,每类协作都有其核心目标和…

万字长文解析 OneCode3.0 AI创新设计

一、研究概述与背景 1.1 研究背景与意义 在 AI 技术重塑软件开发的浪潮中&#xff0c;低代码平台正经历从 “可视化编程” 到 “意图驱动开发” 的根本性转变。这种变革不仅提升了开发效率&#xff0c;更重新定义了人与系统的交互方式。作为国内领先的低代码平台&#xff0c;On…

重学前端006 --- 响应式网页设计 CSS 弹性盒子

文章目录盒模型一、盒模型的基本概念二、两种盒模型的对比 举例三、总结Flexbox 弹性盒子布局一、Flexbox 的核心概念​​二、Flexbox 的基本语法​​​​1. 定义 Flex 容器​​​2. Flex 容器的主要属性​​​​3. Flex 项目的主要属性​​​​三、Flexbox 的常见布局示例​​…

rLLM:用于LLM Agent RL后训练的创新框架

rLLM&#xff1a;用于LLM Agent RL后训练的创新框架 本文介绍了rLLM&#xff0c;一个用于语言智能体后训练的可扩展框架。它能让用户轻松构建自定义智能体与环境&#xff0c;通过强化学习进行训练并部署。文中还展示了用其训练的DeepSWE等智能体的出色表现&#xff0c;以及rLL…

rocky8 --Elasticsearch+Logstash+Filebeat+Kibana部署【7.1.1版本】

软件说明&#xff1a; 所有软件包下载地址&#xff1a;Past Releases of Elastic Stack Software | Elastic 打开页面后选择对应的组件及版本即可&#xff01; 所有软件包名称如下&#xff1a; 架构拓扑&#xff1a; 集群模式&#xff1a; 单机模式 架构规划&#xff1a…

【JVM】内存分配与回收原则

在 Java 开发中&#xff0c;自动内存管理是 JVM 的核心能力之一&#xff0c;而内存分配与回收的策略直接影响程序的性能和稳定性。本文将详细解析 JVM 的内存分配机制、对象回收规则以及背后的设计思想&#xff0c;帮助开发者更好地理解 JVM 的 "自动化" 内存管理逻辑…

Qt获取hid设备信息

Qt 中通过 HID&#xff08;Human Interface Device&#xff09;接口获取指定的 USB 设备&#xff0c;并读取其数据。资源文件中包含了 hidapi.h、hidapi.dll 和 hidapi.lib。通过这些文件&#xff0c;您可以在 Qt 项目中实现对 USB 设备的 HID 接口调用。#include <QObject&…

Anaconda Jupyter 使用注意事项

Anaconda Jupyter 使用注意事项 1.将cell转换为markdown。 First, select the cell you want to convertPress Esc to enter command mode (the cell border should turn blue)Press M to convert the cell to Markdown在编辑模式下按下ESC键&#xff0c;使单元块&#xff08;c…

[硬件电路-20]:模拟信号处理运算与数字信号处理运算的相同点与不同点

模拟信号处理运算与数字信号处理运算是信号处理领域的两大核心方法&#xff0c;二者在信号形式、处理机制、性能特点和应用场景上存在显著差异&#xff0c;但也共享一些基础目标与理论支撑。以下从多个维度进行系统对比分析&#xff1a;一、相同点1. 核心目标一致信号变换与分析…

Redis 高频面试题

1. 缓存穿透 1.1 描述 用户想要查询某个数据,在 Redis 中查询不到,即没有缓存命中,这时就会直接访问数据库进行查询。当请求量超出数据库最大承载量时,就会导致数据库崩溃。这种情况一般发生在非正常 URL 访问,目的不是为了获取数据,而是进行恶意攻击。 1.2 现象 1、应…

OWASP Top 10 攻击场景实战

OWASP (开放式Web应用程序安全项目) Top 10 榜单是全球公认的、针对Web应用最关键安全风险的权威指南。它不是一份详尽无遗的清单&#xff0c;而是一份凝聚了安全专家共识的“高危预警”。本文将不止于罗列这些风险&#xff0c;而是深入每个风险的核心&#xff0c;通过生动的比…

Three.js 实战:使用 PBR 贴图打造真实地面材质

在 Three.js 中&#xff0c;我们可以通过 MeshStandardMaterial 材质配合多张贴图来实现真实的地面效果。这种方式模拟了物理世界中光照与表面材质的复杂交互&#xff0c;常用于构建高质量场景&#xff0c;如数字孪生、建筑可视化、游戏等。 本文将以一个完整示例为基础&#x…

Java基础的总结问题(第一篇)

JDK和JRE的区别&#xff1f;JRE是Java运行环境&#xff08;Java Runtime Environment&#xff09;&#xff0c;包含了JVM和Java核心类库JDK是Java开发工具包&#xff08;Java Developers Kit&#xff09;,包含了JRE和Java常见的开发工具与equals的区别&#xff1f;可以用来比较…

[智能算法]MOEA/D算法的Python实现

一、初始化不同于NSGA-II&#xff0c;MOEA/D在进行迭代之前需要先进行初始化&#xff0c;初始化的主要内容是计算个体向量权重之间的欧氏距离&#xff0c;并得出其邻域集合。# 计算T个邻居 def cpt_W_Bi_T(moead):# 设置的邻居个数错误(自己不能是自己的邻居)if moead.T_size &…

Java设计模式之-组合模式

什么是组合模式&#xff1f; 组合模式允许你将对象组合成树形结构来表示"部分-整体"的层次结构。它让客户端能够以统一的方式处理单个对象和对象组合。 简单来说&#xff0c;就像公司的组织结构&#xff1a; 公司有部门部门有小组小组有员工但无论是对公司、部门还是…

2021-10-29 C++与反转数的和

缘由输入一个三位数 与它倒过来的数相加&#xff0c;输出和-编程语言-CSDN问答 直接写 int n0,nn0,nnn0; cin>>n;nnn; while(nn)nnn*10,nnnnn%10,nn/10; cout<<nnnn<<endl; 缘由https://ask.csdn.net/questions/7552128 int 反转数(int n) { int nn 0…

论安全架构设计(威胁与措施)

安全架构威胁与措施摘要2021年4月&#xff0c;我有幸参与了某保险公司的“优车险”项目的建设开发工作&#xff0c;该系统以车险报价、车险投保和报案理赔为核心功能&#xff0c;同时实现了年检代办、道路救援、一键挪车等增值服务功能。在本项目中&#xff0c;我被安排担任架构…

022_提示缓存与性能优化

提示缓存与性能优化 目录 缓存技术概述缓存工作原理实现方法详解成本优化策略性能优化实践高级应用场景最佳实践指南 缓存技术概述 什么是提示缓存 提示缓存是Claude API的一项优化功能&#xff0c;允许缓存提示的特定部分以便重复使用&#xff0c;从而显著减少处理时间和…

【AI交叉】地理:人工智能如何推动地理科学的智能转型?

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;越来越多的传统学科开始与之融合&#xff0c;催生出一系列跨学科的新研究方向和应用场景。地理科学作为研究地球表层自然与人文现象的综合性学科&#xff0c;也在这一浪潮中迎来转型契机。 AI与地理学的交叉正…