一文窥见神经网络

一文窥见神经网络

  • 1.初识神经元
    • 1.1 生物神经元
    • 1.2 人工神经元
    • 1.3 权重的作用
    • 1.4 偏置的作用
    • 1.5 激活函数的作用
      • 1.5.1 线性激活函数
      • 1.5.2 非线性激活函数
  • 2. 神经元模型
    • 2.1 多输入单神经元模型
    • 2.2 一层神经元模型
    • 2.3 神经网络(多层神经元)模型
  • 3. 神经网络优化
    • 3.1 损失函数(性能函数/目标函数)
    • 3.2 神经网络优化的核心思想
    • 3.2 损失函数的泰勒展开
    • 3.3 损失函数的极值情况
    • 3.4 借助链式求导进行反向传播
      • 3.4.1 前向传播
      • 3.4.2 链式求导
      • 3.4.3 反向传播
      • 3.4.4 参数更新
      • 3.4.5 完整推导过程
  • 4.实践:简单神经网络拟合函数
  • 5.个人感悟
  • 6.附录
    • 6.1 L1和L2正则化项
    • 6.2 梯度和方向导数
    • 6.3 学习率
      • (1)最大常数学习率
      • (2)动态学习率
    • 6.4 常见的神经网络优化算法

1.初识神经元

1.1 生物神经元

生物神经元的组成

生物神经元的基本工作原理

1.2 人工神经元

人工神经元(对生物神经元的数学建模)

1.3 权重的作用

神经网络中权重的作用

1.4 偏置的作用

神经网络中偏置的作用

1.5 激活函数的作用

下图来自:Most used activation functions in Neural Networks

神经网络中激活函数的作用


1.5.1 线性激活函数

1.5.2 非线性激活函数


2. 神经元模型

2.1 多输入单神经元模型

2.2 一层神经元模型

2.3 神经网络(多层神经元)模型


第一层输出作为第二层输入、第二层输出作为第三层输入、 ⋯ \cdots 层层嵌套(前向传播),所以后续需要链式法则,由内层逐层往外求导,即从输出层逐步到输入层(将梯度反向传播到输出层)
前向传播: a n = f ( W n ( f ( W n − 1 ( ⋯ f ( W 1 p + b ) ⋯ ) + b n − 1 ) + b n ) 前向传播:\bold{a}^n=f(\bold{W}^n(f(\bold{W}^{n-1}(\cdots f(\bold{W}^1\bold{p}+\bold{b})\cdots)+\bold{b}^{n-1})+\bold{b}^n) 前向传播:an=f(Wn(f(Wn1(f(W1p+b))+bn1)+bn)

3. 神经网络优化

3.1 损失函数(性能函数/目标函数)



关于L1和L2正则化项的作用详见附录


3.2 神经网络优化的核心思想

关于梯度和方向梯度的知识铺垫详见附录

有了损失函数,我们需要通过损失函数来优化参数(网络中所有权重Weight和偏置Bias),优化的核心思想:
将损失函数在某点处(初始权重和偏置的向量)展开,这就有了对损失函数的局部近似(梯度,线性近似)、Hessian矩阵(局部曲率近似),我们根据这个局部近似找到下一次迭代的点(权重和偏置),这一点处的损失值相比之前损失函数值下降了,由此方式不断迭代最终到达收敛点,收敛点处对应的参数就是神经网络的最优参数



纵轴为损失、横轴为权重,横轴每个点为一个向量 x k \bold{x}_k xk(k次迭代中对应网络中的所有权重)

(1)Starting Point(初始权重 x k \bold{x}_k xk
(2)Slope(梯度, ∇ L ( x k ) \nabla L(\bold{x}_k) L(xk)
(3)Step Size Δ x k \Delta\bold{x}_k Δxk= Learning Rate( α \alpha α)× Slope( ∇ L ( x k ) \nabla L(\bold{x}_k) L(xk)
(4)New Parameter = Old parameter - Step Size
x k + 1 = x k + Δ x k = x k − α ∇ L ( x k ) \bold{x}_{k+1}=\bold{x}_{k}+\Delta\bold{x}_k=\bold{x}_{k}-\alpha\nabla L(\bold{x}_k) xk+1=xk+Δxk=xkαL(xk)
(5)Convergence(收敛点)

学习率(learning rate)太高或太低都不可取

常数学习率(学习率大小在整个优化期间不变)

关于学习率的补充知识详见附录

动态学习率(学习率大小在整个优化期间动态变化)
学习率衰减、自适应学习率(AdaGrad、RMSprop、Adam优化算法)

3.2 损失函数的泰勒展开

我们要在损失函数上进行迭代寻找极小值,迭代就需要我们了解损失函数的局部情况,有了局部了解我们就能“逐步的下山了”,所以我们将损失函数进行泰勒展开了解其局部情况

将目标函数一元函数 F ( x ) F(x) F(x) x = x ∗ x=x^* x=x点处泰勒展开

相关博客:3Blue1Brown系列:泰勒级数(Taylor Series)

单个输入值

多个输入值( x \bold{x} x为权重和偏置向量)

多元函数 F ( x ) F(\bold{x}) F(x) x = x ∗ x=x^* x=x点泰勒展开




方向导数和梯度的关系

方向导数 = 梯度 ⋅ \cdot 某个方向的单位向量


方向导数在神经网络优化中的作用


3.3 损失函数的极值情况

我们要从起始点出发到达损失函数收敛点,该收敛点(极小值点)对应最优的参数,接下来我们分析一下损失函数的极值情况

局部极小值,在 [ 0 , δ ] [0,\delta] [0,δ]范围内满足某点处函数值恒小于局部其他点的函数值

局部弱极小值,在 [ 0 , δ ] [0,\delta] [0,δ]范围内满足某点处函数值恒小于等于局部其他点的函数值

全局最小值,在整个范围内满足某点处函数值恒小于整个范围内其他点的函数值

例:1:

例2:

一阶必要条件静态点(梯度为0的点)是局部极值的候选点

二阶必要条件 静态点(梯度为0的点)是极小值的候选点

二阶充分条件静态点(梯度为0的点)是否为强极小值点

Hessian矩阵的正定性和半正定性
结合损失函数,下图几何代表损失函数在某点处的局部曲率情况

在优化问题中,判断 Hessian 矩阵的正定性和半正定性可以帮助确认我们是否找到了局部极小值。梯度下降算法可以通过 Hessian 矩阵的信息来调整步长或方向,使得算法更有效地避开鞍点,并且更快地收敛到最小值。

3.4 借助链式求导进行反向传播

3.4.1 前向传播

3.4.2 链式求导




3.4.3 反向传播





3.4.4 参数更新


3.4.5 完整推导过程




4.实践:简单神经网络拟合函数


import numpy as np
import matplotlib.pyplot as plt# 目标函数
def target_function(p):return 1 + np.sin((np.pi / 4) * p)# 激活函数及其导数
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return sigmoid(x) * (1 - sigmoid(x))# 定义神经网络
class SimpleNN:def __init__(self, learning_rate=0.01):# 初始化网络参数(权重和偏置),取随机小值self.learning_rate = learning_rateself.weights_input_hidden = np.random.randn(1, 2)  # 输入到隐藏层的权重self.bias_hidden = np.random.randn(2)  # 隐藏层偏置self.weights_hidden_output = np.random.randn(2, 1)  # 隐藏层到输出层的权重self.bias_output = np.random.randn(1)  # 输出层偏置self.loss_history = []  # 用于存储损失值def forward(self, p):# 前向传播self.input = p.reshape(-1, 1)  # 将输入转换为列向量self.hidden_input = np.dot(self.input.T, self.weights_input_hidden) + self.bias_hidden  # 隐藏层输入self.hidden_output = sigmoid(self.hidden_input)  # 隐藏层输出self.final_input = np.dot(self.hidden_output, self.weights_hidden_output) + self.bias_output  # 输出层输入self.final_output = self.final_input  # 输出层(线性激活)return self.final_outputdef backward(self, p, target):# 计算损失的梯度(反向传播)output_error = self.final_output - target  # 输出层误差d_output = output_error  # 输出层激活函数为线性,所以导数为1hidden_error = d_output * self.weights_hidden_output.T  # 传播到隐藏层的误差d_hidden = hidden_error * sigmoid_derivative(self.hidden_input)  # 隐藏层激活函数为 sigmoid# 更新权重和偏置self.weights_hidden_output -= self.learning_rate * np.dot(self.hidden_output.T, d_output)self.bias_output -= self.learning_rate * d_output.sum(axis=0)self.weights_input_hidden -= self.learning_rate * np.dot(self.input, d_hidden)self.bias_hidden -= self.learning_rate * d_hidden.flatten()def train(self, p_data, target_data, epochs=1000):for epoch in range(epochs):total_loss = 0  # 记录当前epoch的总损失for p, target in zip(p_data, target_data):self.forward(p)  # 前向传播total_loss += np.square(self.final_output - target).item()  # 计算当前样本的损失,并转为标量self.backward(p, target)  # 反向传播avg_loss = total_loss / len(p_data)  # 计算当前epoch的平均损失self.loss_history.append(avg_loss)  # 保存损失值(已转化为标量)# 训练模型
# 生成训练数据
p_data = np.linspace(-2, 2, 100)
target_data = target_function(p_data)# 初始化网络
nn = SimpleNN(learning_rate=0.01)# 训练神经网络
nn.train(p_data, target_data, epochs=5000)# 测试网络
predicted = np.array([nn.forward(p)[0][0] for p in p_data])# 可视化结果
plt.figure(figsize=(10, 5))# 绘制目标函数和网络预测结果
plt.subplot(1, 2, 1)
plt.plot(p_data, target_data, label='Target Function')
plt.plot(p_data, predicted, label='Neural Network Approximation')
plt.legend()
plt.xlabel("p")
plt.ylabel("F(p)")
plt.title("Function Approximation using Neural Network")# 绘制损失曲线
plt.subplot(1, 2, 2)
plt.plot(np.array(nn.loss_history).flatten(), label='Loss')
plt.xlabel("Epoch")
plt.ylabel("Mean Squared Error")
plt.title("Loss Curve during Training")
plt.legend()plt.tight_layout()
plt.show()

5.个人感悟

个人感悟:神经网络本质上就是一个函数,即将一个输入映射到一个输出上,通过不同权重和偏置的组合来模拟这种映射,如果这种组合恰到好处(参数最优)那么就能很好的模拟某个函数。输入输出可以是文字、图片、脑电信号等等任何你想要产生映射的两种东西,实现不同的映射就需要不同的神经网络

6.附录

6.1 L1和L2正则化项

L1 和 L2 正则化通过对模型的权重参数添加惩罚项来抑制过拟合。过拟合是指模型在训练数据上表现良好,但在新数据(测试数据)上表现不佳。通常是因为模型的参数在训练过程中过度拟合了训练数据中的噪声或偶然模式。L1 和 L2 正则化通过控制权重的大小和稀疏性,减小模型的复杂度,从而提升泛化能力。以下是详细原因:


6.2 梯度和方向导数

知识铺垫:
梯度(沿坐标轴方向的导数)
笔者之前在学习高等数学时也写过相关笔记–方向导数和梯度向量

梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。–摘自:梯度

类比现实中的例子,高山流水,水所流的方向就是梯度方向,在梯度方向上能够最快速度到达山底(最优解的地方)

下图来自:直观上理解“梯度”与“法向量”的关系

二元函数的梯度是二维等高线的法向量
三元函数的梯度是三维等值面的法向量

方向导数(沿指定方向的导数)




6.3 学习率

(1)最大常数学习率

如何求解损失函数的最大常数学习率?




例子:




补充:矩阵的谱半径(最大特征值 λ max \lambda_{\text{max}} λmax的绝对值)


(2)动态学习率

学习率衰减(适合在模型逐渐接近最优解时提高收敛精度;)
衰减方法:指数衰减、分段衰减、根据验证机误差调整

自适应学习率(适合复杂的损失面和非平稳目标,通过动态调整每个参数的学习率,能够更快且稳定地收敛。)
AdaGrad

RMSprop

Adam

6.4 常见的神经网络优化算法

SGD、Momentum、NAG、AdaGrad、RMSprop、Adam、AdamW、AdaDelta、AMSGrad、Nadam

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

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

相关文章

DBeaver 连接 OceanBase Oracle 租户

DBeaver 是一款通用的数据库工具软件,支持任何具有JDBC驱动程序的数据库。DBeaver 需要 Java 运行环境的支持。截稿时 DBeaver 24.0.0 版本默认提供的 OceanBase 驱动是连接 MySQL 的,想连接 Oracle 租户需要新建一个驱动器使用。 下载数据库驱动包 1、…

web实操5——http数据详解,request对象功能

http请求数据 现在我们浏览器f12的那些是浏览器给http格式数据整理之后便于我们阅读的。 原始的http格式信息: 就是按照一定格式和符号的字符串: 请求行:格式如下图 请求头:一个个key,value数据,用,分割…

u盘加密软件有哪些?2025年必备的u盘加密神器分享(共6款!提前布局!)

2024年《数据泄露成本报告》最新出炉!再破纪录! 报告显示,全球数据泄露事件的平均成本达488万美元,同比增加10%。 其中,u盘最为数据存储和传输的常用媒介,对其进行加密早已箭在弦上! 在2025年…

实验5:网络设备发现、管理和维护

实验5:网络设备发现、管理和维护 实验目的及要求: 通过实验,掌握Cisco 路由器和交换机的IOS配置管理。自动从NTP服务器获取时间信息。能够利用TFTP服务器实现路由器和交换机配置文件的备份和恢复。同时验证CDP协议和LLDP协议的网络参数。完…

基于java的航空机票预定管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

排序算法 -快速排序

文章目录 1. 快速排序(Quick Sort)1.1、 简介1.2、 快速排序的步骤 2. Hoare 版本2.1、 基本思路1. 分区(Partition)2. 基准选择(Pivot Selection)3. 递归排序(Recursive Sorting) 2…

UAC2.0 speaker——同时支持 16bit,24bit 和 32bit

文章目录 同时支持 16bit,24bit 和 32bit配置描述符集合描述符结构位数切换16bit 选择24bit 选择32bit 选择枚举效果同时支持 16bit,24bit 和 32bit 在一个 USB speaker 设备中同时支持 16bit, 24bit 和 32bit。 配置描述符集合 09 02 E9 00 02 01 00 80 32 08 0B 00 02

conda创建 、查看、 激活、删除 python 虚拟环境

1、创建 python 虚拟环境 ,假设该环境命名为 “name”。 conda create -n name python3.11 2、查看 python 虚拟环境。 conda info -e 3、激活使用 python 虚拟环境。 conda activate name 4、删除 python 虚拟环境 conda remove -n name --all ​​ 助力快速掌握数据集…

三周精通FastAPI:37 包含 WSGI - Flask,Django,Pyramid 以及其它

官方文档:https://fastapi.tiangolo.com/zh/advanced/wsgi/ 包含 WSGI - Flask,Django,其它 您可以挂载多个 WSGI 应用,正如您在 Sub Applications - Mounts, Behind a Proxy 中所看到的那样。 为此, 您可以使用 WSGIMiddlewar…

微服务即时通讯系统的实现(客户端)----(1)

目录 1. 项目整体介绍1.1 项目概况1.2 界面预览和功能介绍1.3 技术重点和服务器架构 2. 项目环境搭建2.1 安装Qt62.3 安装vcpkg2.3 安装protobuf2.4 构建项目2.5 配置CMake属性 3. 项目核心数据结构的实现3.1 创建data.h存放核心的类3.2 工具函数的实现3.3 创建编译开关 4. 界面…

MyBatis——增删查改(XML 方式)

1. 查询 1.1. 简单查询 使用注解的方式主要是完成一些简单的增删查改功能,如果要实现复杂的 SQL 功能,还是建议使用 XML 来配置映射语句,将 SQL 语句写在 XML 配置文件中 如果要操作数据库,需要做以下的配置,与注解…

A029-基于Spring Boot的物流管理系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

华为路由策略配置

一、AS_Path过滤 要求: AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接,引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…

如何向函数模块 FM 中传递 Range 参数

有时候需要在选择屏幕之后调用一个函数模块,那么如果利用 SE37 在函数模块定义 Range 参数呢。 解决方法很简单,系统有很多预定义的 Range_* 类型: 如上图,这里有很常用的 Range 结构,如订单号、发票号、公司代码等等…

工作和学习遇到的技术问题

写在前面 记录工作和学习遇到的技术问题,以求再次遇到可以快速解决。 1:Ubuntu TSL换源报错:Err:1 http://mirrors.aliyun.com/ubuntu focal InRelease 执行如下操作(已经操作的则忽略),首先在文件/etc/apt/sources…

研究生如何远控实验室电脑?远程办公功能使用教程

如果你是研究生,是不是会遇到需要远程控制实验室电脑进行查看文献、调代码和拉数据的时候?有时候就是这么棘手,不过你可以借助一些工具来帮助你随时随地远控实验室电脑。这样就不用担心导师催促,无法及时完成科研了。常见的工具比…

重卡穿越商都,ROG DAY 2024郑州站高燃来袭

野塘菡萏正新秋,红藕香中过郑州!2024年11月9日~10日,ROG DAY 2024信仰集结的号角正式吹响,首战据点落地郑州局外太格茂。炫酷涂装的战车如同未来战士般震撼登陆,ROG硬核科技闪耀亮相,现场氛围瞬间点燃!活动现场人流不息,年轻学子、数码爱好者、极客玩家、科技博主以及周末悠闲惬…

web安全测试渗透案例知识点总结(上)——小白入狱

目录 一、Web安全渗透测试概念详解1. Web安全与渗透测试2. Web安全的主要攻击面与漏洞类型3. 渗透测试的基本流程 二、知识点详细总结1. 常见Web漏洞分析2. 渗透测试常用工具及其功能 三、具体案例教程案例1:SQL注入漏洞利用教程案例2:跨站脚本&#xff…

浪潮信息“源”Embedding模型登顶MTEB榜单第一名

在自然语言处理(NLP)和机器学习领域,Embedding模型是将文本数据转换为高维向量表示的核心技术,直接影响NLP任务(如文本分类、情感分析等)的效果,对于提升模型性能和深入理解文本语义具有至关重要…

catchadmin-webman 宝塔 部署

1:宝塔的php 中删除禁用函数 putenv 问题: 按照文档部署的时候linux(php) vue (本地) 无法访问后端api/login 的接口 。 解决办法: webman 没有配置nginx 反向代理 配置就能正常访问了