神经网络通俗理解学习笔记(1)
神经网络通俗理解学习笔记(1)
- 神经网络原理
- 激活函数
- 前向传播和反向传播
- 多层感知机代码实现
- 加载数据
- 网络结构
- 损失函数
- 优化器
- 训练
- 测试
- 保存
- 回归问题
- 一元线性回归
- 多元线性回归
- 多项式回归
- 线性回归代码实现
- 数据生成
- 设置超参数
- 初始化参数
- 可视化
- Pytorch模型实现
- 分类问题
- 数学表示
- 损失函数
- 多分类问题代码实现
- 加载MINIST数据集
- 数据加载器
- 构建网络
- 损失函数和优化器
- 模型评估
- 模型训练
- 常见问题及对策
- 训练常见问题
- 模型架构设计
- 万能近似定理
- 宽度 or 深度
- 过拟合问题
- 欠拟合问题
- 过拟合欠拟合应对策略
- 数据集大小选择
- 数据增强
- 使用验证集
- 模型选择
- K折交叉验证
- 提前终止
- 过拟合欠拟合代码示例
- 深度学习中的 正则化
- Dropout方法
- Dropout代码实现
神经网络原理
汇聚n个线性变换,最后做一个非线性变换。
神经网络本质上是很多个线性模型的模块化组合
输入层是样本本身,维度就是样本维度
输出层是样本类别标签
隐藏层是最重要的神经元,并不是层数越多维度越大泛化能力越好,会出现过拟合问题。
隐藏层层数和维度多了容易过拟合,少了模型比较弱,隐藏层层数和维度2个指标需要综合考量,都是重要的超参数。
激活函数
用于非线性变换,必须是可导的
为什么引入非线性?
线性组合无法表示复杂的非线性数据。
神经网络模型的本质其实是如何用线性模型去解决非线性问题。
怎么引入非线性?
通过激活函数。(就可以对空间进行扭曲变换)
线性空间的非线性,在高维非线性空间却线性可分。
sigmoid函数
输出值压缩到(0,1),常用于二分类问题,其他一般不用,容易导致梯度消失问题
Tanh函数
是sigmoid函数的改进版,输出值压缩到(-1,1),输出以0为中心,更快的收敛速度,适用于多分类,输入值较大的时候也容易导致梯度消失
Relu函数
多数情况下的第一选择,解决梯度消失问题,计算速度快,但当输入为负数时某些权重无法更新。
softmax函数
输入值映射到概率分布上
主要用在多分类问题
使得输出具有可解释性
激活函数用于给线性的矩阵运算非线性化
softmax作用是将输出转化为概率值,相当于归一化
损失衡量当前模型的好坏
反向传播是优化调整参数(权重w、截距b)
不同网路模型区别体现在:
网络模型结构、损失函数、动态求解损失函数过程、对问题(过拟合等)的解决方式
前向传播和反向传播
损失函数
均方误差
前向传播(本质传递数据和信息):
不断往前传计算损失
深度前馈网络
前馈神经网络
反向传播(本质传递误差、梯度/偏导数):
通过训练参数(w和b)使损失函数的值越来越小
损失倒查分解(偏导数的链式法则)
计算每层参数梯度
目的是找到这些参数的偏导数,然后以此为依据更新模型参数。
多层感知机代码实现
举初级阶段便于理解的神经网络代码实现的例子。
加载数据
先加载数据
由于直接全部拿去训练内存吃不消,所以批量进行训练,训练集需要设置shuffle为true,消除顺序影响,提升泛化能力。
网络结构
损失函数
根据分类问题或是回归问题确定
这里是分类问题,所以用交叉熵损失函数
优化器
优化器Adam
训练
在图片任务中,一般采用小批量策略读取数据和训练
外层循环表示训练10次,里面的循环表示从dataloader中循环读取数据,每次读取batchsize大小的批数据
测试
保存
回归问题
一元线性回归
用于对数据进行预测
找最优的拟合直线 转化为 最优化问题,反复迭代参数使得目标函数值最小
多元线性回归
X 变成矩阵的形式
多项式回归
把非线性问题转化为线性问题去求解
这个X可能是高维的
线性回归代码实现
本质上是一个神经元的神经网络
数据生成
tensor是张量的意思,一种多维数组,在机器学习领域,tensor通常用来表示训练数据、模型参数、输入数据等。
维度可以是一维、二维、n维
pytorch中的基本数据结构,具备良好的计算性能,可以使得GPU加速,大大提高计算效率。
设置超参数
学习率和最大迭代次数
初始化参数
用pytorch的randn函数初始化参数w
用zeros函数初始化参数b
randn函数会生成均值为0标准差为1的随机张量
zeros函数会生成全部元素都为0的张量
grad参数设为true 表示在反向传播时计算梯度
初始化方法:
1、常数 zeors
2、随机数 randn
3、预训练好的参数
具体使用哪种视问题而定
可视化
Pytorch模型实现
设置超参数以及前面的生成数据一样
为什么要清空梯度?
- 避免梯度累加:在神经网络训练过程中,每次迭代都会计算梯度。如果不清空梯度,那么在下一次迭代时,新的梯度会与之前的梯度累加。这会导致梯度值非常大,从而使得模型参数更新过大,影响模型的收敛。
- 确保每次迭代独立:清空梯度可以确保每次迭代都是独立的,每次更新模型参数都是基于当前批次的损失函数计算出的梯度,而不是之前批次的累积梯度。
- 防止梯度爆炸:在某些情况下,如果梯度没有被清空,梯度可能会随着迭代次数的增加而指数级增长,导致所谓的梯度爆炸问题,这会使得模型参数更新变得不稳定。
分类问题
输出是离散的类别标签,而不是连续的值
把一个问题用数学模型表示,然后找到目标函数,用优化求解办法获得模型参数
数学表示
softmax可以使所有类别的概率和等于1
可以将输入的特征值转化为概率值,方便决策
神经网络中一般用概率这种表示
损失函数
均方误差适合衡量回归预测结果与真实值的差距,但不能很好衡量分类结果与真实值之前的差距
在二分类中,当y为1时 后面项为0;当y为0时,前面项为0
对数运算的好处:
- 单调性质
- 结合性质 将多个乘转化为和的形式
- 缩放性 可以把一个大数范围进行压缩
m样本数,n类别数, Yij 表示样本i的类别标号是j,p(Xij)表示预测的样本i属于类别j的概率
二分类问题上本质上和对数损失函数等价
多分类表示上略有区别,更适合神经网络模型
通常二分类用对数损失函数,多分类用交叉熵损失函数
多分类问题代码实现
在二分类中 可以用sigmoid函数
在多分类中 通常用softmax函数
神经网络的最后一层称为softmax层,这一层的输出是概率分布,表示输入数据属于每个类别的概率,为了计算这个概率,我们使用softmax函数
在训练神经网络时,通常使用交叉熵损失函数度量预测值和真实值的差距,对于多分类问题,交叉熵损失函数可以计算为
y是预测值,p是预测值
通过最小化交叉熵损失函数,可以训练模型参数。训练完之后,可以使用他进行多分类,为了做出预测,需要将输入数据输入到神经网络中,并根据输出的概率分布决定它属于哪个类别
使用softmax函数和交叉熵损失函数是一种多分类的常见方法。
加载MINIST数据集
可以使用torchvision中的数据加载器轻松访问这个数据集
数据加载器
pytorch中加载和预处理数据的工具
可以将数据分成若干批,每次送入一个批次的数据到神经网络中,可以减少内存的使用,使得训练更快
cmap显示灰度图
构建网络
定义模型
定义一个线性层
实例化模型
损失函数和优化器
模型评估
model.eval 设置模型为评估模式不会更新权重
torch.no_gard 上下文管理器 适用于不需要求梯度的情况
x.view(-1,input_size) -1 是pytorch中特殊符号表示这个数据维度由数据其他维度决定
实际上是将数据拉伸成一个二维矩阵,每一行对应一个样本,每一列对应特征
使输入数据的形状满足模型的要求
模型训练
常见问题及对策
训练常见问题
模型架构设计
网络结构、节点数量、网络层数、不同类型的层、层间链接关系等
万能近似定理
一个具有足够多的隐藏节点的多层前馈神经网络,可以逼近任意连续的函数。
必须包含一种 有挤压性质的激活函数(例如sigmoid函数),让他能够进行非线性空间变换
宽度 or 深度
增加深度更有助提高泛化能力
实践证明,在宽度不变的情况下,增加深度,每一层更有助于捕获新的特征,更有助于提高泛化能力
过拟合问题
Overfitting;模型在训练数据上表现良好,在测试数据上不佳
泛化能力:训练后的模型应用到新的、未知的数据上的能力
产生原因:通常是由模型复杂度过高导致的
欠拟合问题
Underfitting:学习能力不足,无法学习到数据集中的“一般规律
产生原因:模型学习能力较弱,而数据复杂度较高的情况
解决办法:增加模型层数或者神经元数量或者更复杂的网络模型结构
模型复杂度越高,其表征能力越强
实际中,我们想要泛化误差尽可能小,着重解决过拟合问题
过拟合欠拟合应对策略
本质原因:数据和模型匹配问题
- 数据复杂度
- 模型复杂度
- 训练策略
数据集大小选择
数据角度
数据集较小,很容易出现过拟合
数据集过大可能导致训练效率降低
数据增强
数据角度
对训练数据进行变换,圳增加数据数量和多样性
有效解决过拟合问题,提高模型在新数据上的泛化能力
使用验证集
数据角度
验证集(validation set) : 训练中评估模型性能,调整超参数
在训练中就可以对模型进行评估
模型选择
奥卡姆剃刀法则:选择简单合适的模型解决复杂的问题
deeper is better
K折交叉验证
训练策略角度
1.将训练数据划分为K份
2.对于每份数据作为验证集,剩余的 K-1 份数据作为训练集,进行训练和验证。
3.计算 K 次验证的平均值。
提前终止
训练策略角度
Early stopping:模型对训练数据集迭代收敛之前停止迭代来防止过拟合
如果在验证集上发现测试误差上升,则停止训练
过拟合欠拟合代码示例
数据生成
数据划分
DataLoader 封装数据加载器
shuffle打乱顺序,提高泛化能力
模型定义
nn.Linear(a,b) 分别是输入输出维度
辅助函数
注意测试模型的时候 不用计算梯度
可视化
深度学习中的 正则化
对学习算法的修改目的是减少泛化误差,而不是训练误差
没有一种算法或者模型能够在所有的场景中都表现良好
正则化是一种权衡过拟合和欠拟合的手段
L2正则化
通过给模型的损失函数添加一个模型参数的平方和的惩罚项来实现正则化
空间解释
L1正则化
通过在损失函数中加入对模型参数权值矩阵中各元素绝对值之和的惩罚项,来限制模型参数的值
·L1正则化更倾向于产生稀疏解)适于特征选择
·L2正则化更倾向于小的非零权值,更适用于优化问题
范数惩罚
将L1和L2正则化扩展到一般情况
权重衰减
Dropout方法
数据增广是从数据角度
提前终止、权重衰减都是从训练过程角度优化
Dropout是从调整模型结构角度
工作原理
- 在训练过程中随机删除即将其权重设为零)一些神经元
- 只用在训练期间,不用在测试期间!
使模型不能完全依赖某些特定特征,防止神经对网络对某些训练集过于依赖,而使模型泛化能力更强
主要步骤
- 指定一个保留比例p
- 每层每个神经元,以p的概率保留,以1-p的概率将权重设为零
- 训练中使用保留的神经元进行前向、反向传播
- 测试过程,将所有权重乘以p
直观理解
- 相当于把一个网络拆分
- 由多个网络构成集成学习
神经网络中的使用
在训练网络的每个单元都要添加概率计算
为什么能减少过拟合
- 本质是Bagging集成学习,平均化作用(不同网络产生不同过拟合无法避免,但是取平均,可以抵消一部分)
- 减少神经元之间复杂的关系(2个神经元不一定每次都碰面, 权值更新不依赖本身连接关系,迫使其学习更鲁棒、显著的数据特征)
- 类似性别在生物进化中的角色
优点:
- 可以有效地减少过拟合
- 简单方便
- 实用有效
缺点:
- 降低训练效率
- 损失函数不够明确
本质上把一个大的网络拆成很多个小的网络,然后通过共享参数减轻过拟合
训练过程中随机把一些权重参数置为0
当前dropout已经被大量运用于全连接网络,一般设为0.5/0.3,效果非常好
Dropout代码实现
数据生成
模型定义
模型训练
可视化
相关文章:

神经网络通俗理解学习笔记(1)
神经网络通俗理解学习笔记(1) 神经网络原理激活函数前向传播和反向传播多层感知机代码实现加载数据网络结构损失函数优化器训练测试保存 回归问题一元线性回归多元线性回归多项式回归 线性回归代码实现数据生成设置超参数初始化参数可视化Pytorch模型实现…...

有n个人,他们需要分配m元钱(m>n),每个人至少分到1元钱,且每个人分到的钱数必须是整数。请问有多少种分配方案?
分配方案 描述 有n个人,他们需要分配m元钱(m>n),每个人至少分到1元钱,且每个人分到的钱数必须是整数。请问有多少种分配方案? 输入 一行,两个整数,分别是人数n与钱数m,用一个空格隔开。 输出 一行&am…...

光耦——创新引擎 助推中国经济高质量发展
近年来,中国经济正处于转型升级的关键时期,高质量发展成为经济发展的重要目标。在这一伟大征程中,光耦作为一种关键性的电子元器件,正在发挥着重要的作用,助力中国经济迈向更加光明的未来。 光耦概念及工作原理 ▲光耦…...
Go 中 RPC 的使用教程
前言 RPC(Remote Procedure Call)是一种允许程序调用远程服务器上函数的方法,调用过程对于开发者来说像是调用本地函数一样方便。Go 语言自带了强大的 net/rpc 库,能够让开发者轻松实现基于 Go 的 RPC 服务。本文将介绍 Go 中 RP…...

挖耳勺可以伸进耳朵多深?安全可视挖耳勺推荐!
一般来说,挖耳勺不应该伸进耳朵太深,外耳道的长度大约在2.5厘米到3.5厘米之间,但不建议将挖耳勺伸进超过外耳道外1/3的深度,也就是大概1厘米左右较为安全。因为如果伸得太深,很容易损伤外耳道皮肤,引起疼痛…...

SuperMap GIS基础产品FAQ集锦(20240911)
一、SuperMap iObjects Java 问题1:【iObject Python】Objects Python产品有哪些能力特性和优势? 11.2.0 【解决办法】iObjects Python产品包含传统GIS功能(基于iObjects Java扩展的功能接口)和AI GIS功能模块。 其中传统GIS功能…...
从状态管理到性能优化:全面解析 Android Compose
文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compo…...
ChatGPT提示词优化大师使用指南
我希望你成为我的ChatGPT提示词优化大师。 您的目标是帮助我根据自己的需要制定尽可能最好的提示。 你提供的提示应该是站在我向ChatGPT发起请求的角度来写的。我的初始提示词如下:此处填入你的初始提示词 ChatGPT提示词生成器 我希望你充当提示词生成器。 比如&…...

计算机毕业设计 智能推荐旅游平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
【拥抱AI】基于多种数据分段工具的优缺点分析
最近在深入了解RAG方面的知识,其中数据清洗和数据分段是创建知识库的重要步骤。数据清洗目前暂时选用了MinerU,然后就需要针对数据分段进行选型。 以下是我了解到的几种数据分段工具,简单总结了一下它们的优缺点,权当笔记分享&am…...

在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作
在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作。以下是几种方法: ### 方法 1: 使用 VS Code 图形界面 1. **连接到远程 VM**: - 在 VS Cod…...
kafka的主要功能
Apache Kafka 是一个分布式流处理平台,它最初由 LinkedIn 开发,后来捐赠给了 Apache Software Foundation,并成为了 Apache 的顶级项目。Kafka 设计用于处理实时数据流,并且提供了高性能、可扩展性和持久性。下面是 Kafka 的主要功…...
vue3中provide和inject详解
provide和inject是什么 provide 和 inject 是 Vue.js 框架中提供的一种依赖注入机制。这种机制允许一个祖先组件(提供者)向其所有子孙组件(使用者)提供数据或方法,而不需要通过逐层组件传递属性(props&…...

相约华中科技大学,移动云技术论坛来了!NineData创始人CEO叶正盛将分享《数据库全球实时传输技术实践》的主题演讲
2024年9月12日,中国移动云能力中心将在华中科技大学举办“智算浪潮下数据库发展论坛”,共同探讨数据库技术与应用的创新,分享算力网络时代数据库未来发展的洞见。本次论坛,NineData 创始人&CEO 叶正盛受邀参会,并来…...

华为 昇腾 310P 系列 AI 处理器支持 140Tops 的 AI 算力。
1、产品简介 模组是基于昇腾 310P 系列 AI 处理器设计而成,可实现图像、视频等多种数据分析 与推理计算。超强的视频编解码能力以及支持 140Tops 的 AI 算力。在边缘侧及端侧的嵌入式计算 领域,有着极高的性价比,具有超强算力、 超高能效、…...

基于单片机的小型生态鱼缸控制器设计
本设计以STC89C52单片机为核心,利用DS18B20温度传感器和LCD1602液晶显示器实时采集和显示当前环境温度,并根据与预设温度阈值的比较结果控制加热棒或风扇进行加热或制冷操作。此外,该控制器还利用DS1302完成计时功能,在预设时间点…...
git-repo使用
即使用 XML 格式文件(manifest 清单文件)定义一个项目的多仓库关联,然后用 repo 客户端工具操作多仓库 git repo命令行格式: git repo <子命令> <参数>创建一个空目录,作为工作区。 $ mkdir workspace$ …...
如何设计实现完成一个FPGA项目
设计并完成一个FPGA项目是一个复杂但非常有价值的工程任务。以下是一个详细的步骤指南,帮助你从零开始完成一个FPGA项目。 1. 项目定义与需求分析 确定项目目标:明确项目要实现的功能和性能指标。需求分析:列出所有功能需求、性能需求、接口需求等。可行性分析:评估技术可…...
Oracle(106)如何实现透明数据加密?
透明数据加密(TDE)是一种用于保护数据库中静态数据的加密技术。TDE通过自动加密数据库文件和日志文件,确保数据在磁盘上是加密的,从而防止未经授权的访问。TDE的一个主要优点是它对应用程序是透明的,不需要对应用程序代…...

用Python实现时间序列模型实战——Day 18: 时间序列中的季节性与周期性预测
一、学习内容 1. 季节性调整与周期性预测 季节性调整 是在时间序列分析中常用的技术,旨在去除数据中因季节性波动导致的周期性变化,使数据更易于解释和预测。通常,我们可以使用季节性分解方法来分离时间序列中的趋势、季节性和随机成分。 …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...