一文窥见神经网络

一文窥见神经网络

  • 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.mzph.cn/diannao/60634.shtml

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

相关文章

【视觉SLAM】2-三维空间刚体运动的数学表示

读书笔记:学习空间变换的三种数学表达形式。 文章目录 1. 旋转矩阵1.1 向量运算1.2 坐标系空间变换1.3 变换矩阵与齐次坐标 2. 旋转向量和欧拉角2.1 旋转向量2.2 欧拉角 3. 四元数 1. 旋转矩阵 1.1 向量运算 对于三维空间中的两个向量 a , b ∈ R 3 a,b \in \R^3 …

shell 100例

1、每天写一个文件 (题目要求) 请按照这样的日期格式(xxxx-xx-xx每日生成一个文件 例如生成的文件为2017-12-20.log,并且把磁盘的使用情况写到到这个文件中不用考虑cron,仅仅写脚本即可 [核心要点] date命令用法 df命令 知识补充&#xff1…

[Python学习日记-66] 多态与多态性

[Python学习日记-66] 多态与多态性 简介 多态 多态性 鸭子类型 简介 多态与多态性都是面向对象的特征之一,它们都是面向对象编程的一个重要概念,在 Python 当中也有一些独特的见解和用法,下面我们一起来了解一下是怎么回事吧。 多态 多态…

Linux基础1

Linux基础1 Linux基础1学习笔记 ‍ 声明! ​​​学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他…

GESP4级考试语法知识(贪心算法(二))

排队接水2代码&#xff1a; #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct people {int num;int time; }; people s[1001]; int n,r,a[1001]; double sum,ave; bool cmp(people x,people y) {return x.time<y.t…

MySQL45讲 第二十讲 幻读是什么,幻读有什么问题?

文章目录 MySQL45讲 第二十讲 幻读是什么&#xff0c;幻读有什么问题&#xff1f;一、幻读的定义二、幻读带来的问题&#xff08;一&#xff09;语义问题&#xff08;二&#xff09;数据一致性问题 三、InnoDB 解决幻读的方法四、总结 MySQL45讲 第二十讲 幻读是什么&#xff0…

【再谈设计模式】建造者模式~对象构建的指挥家

一、引言 在软件开发的世界里&#xff0c;创建对象是一项基本且频繁的操作。然而&#xff0c;当对象的构造变得复杂&#xff0c;涉及众多属性和初始化步骤时&#xff0c;传统的构造函数方式往往会让代码陷入混乱的泥沼。就如同搭建一座复杂的建筑&#xff0c;若没有合理的规划和…

三、模板与配置(下)

三、模板与配置 8、WXSS模板样式-全局样式和局部样式 类型说明适用情景注意点全局样式定义在 app.wxss 中的样式&#xff0c;作用于每一个页面。当有一些通用的样式规则需要应用于整个小程序时&#xff0c;比如全局的字体大小、颜色、布局等。全局样式可能会被局部样式覆盖&a…

SQL面试题——抖音SQL面试题 主播播出时长

主播播出时长 现有如下数据,主播id、房间号、播出的批次号,每个批次号进出房间的时间戳、分区时间: 每一次直播都有一个上播和下播,每个房间里,同一个批次号会有两条数据,分别记录了上播和下播时间,求每个主播的播出时长? 通过上面的数据,可以清晰的看出,同一个批次…

大语言模型LLM综述

一、LM主要发展阶段 1.1、统计语言模型SLM 基于统计学习方法&#xff0c;基本思想是基于马尔可夫假设HMM建立词概率预测模型。如n-gram语言模型 1.2、神经语言模型NLM 基于神经网络来做词的分布式表示。如word2vec模型 1.3、 预训练语言模型PLM 预训练一个网络模型来做词表…

用 Python 从零开始创建神经网络(七):梯度下降(Gradient Descent)/导数(Derivatives)

梯度下降&#xff08;Gradient Descent&#xff09;/导数&#xff08;Derivatives&#xff09; 引言1. 参数对输出的影响2. 斜率&#xff08;The Slope&#xff09;3. 数值导数&#xff08;The Numerical Derivative&#xff09;4. 解析导数&#xff08;The Analytical Derivat…

防爆手机市场“百花齐放”,该怎么选?

在危险作业场景&#xff0c;如石化煤矿&#xff0c;通讯设备采购关系到提高生产效率‌&#xff0c;保障安全生产‌&#xff0c;‌符合法规要求‌。在应急救援通信场景&#xff0c;通讯设备采购&#xff0c;与保障救援行动的效率和准确性息息相关。而通信设备的性能参数是评估其…

似然函数解析

从贝叶斯定理引出似然函数 最大似然估计用来估计均值方差的 文心对似然函数的解释&#xff0c;注意 抛出正反的概率&#xff0c;就是固定均值方差的条件概率密度了

记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题(详细说明防止忘记)

今天的工作需要自己录制的数据集来验证昨天的标定结果 用ORBSLAM3单目imu模式运行&#xff0c;mentor给的是一个rosbag格式的数据包&#xff0c;配置过程出了几个问题记录一下&#xff0c;沿配置流程写。 一.orbslam3编译安装 1.首先是安装各种依赖 这里不再赘述&#xff0…

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

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

前端(2)——快速入门CSS

参考&#xff1a; 罗大富 CSS 参考手册 | 菜鸟教程 CSS 参考手册 1. CSS CSS全名是层叠样式表&#xff0c;中文名层叠样式表。用于定义网页样式和布局的样式表语言。 通过 CSS&#xff0c;你可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景等样式&#xff0c;…

yolo标签自动标注(使用python和yolo方法)

yolo代码自动标注 1.引言1.初阶“自动标注”&#xff0c;给每个图像都生成一个固定的标注文件&#xff0c;进而在labglimg中对矩形框进行微调&#xff0c;减少标注的工作量2.高阶自动标注&#xff0c;利用我们训练好的&#xff08;但是没有特别精准的&#xff09;yolo文件先对每…

jmeter常用配置元件介绍总结之线程组

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之线程组 1.线程组(用户)1.1线程组1.1.setUp线程组和tearDown线程组1.2.Open Model Thread Group(开放模型线程组)1.3.bzm - Arrivals Thread Group(到达线程组)1.4.jpgc - Ultimate Thread Group(终极线程组)1.5.jpgc - St…

spring gateway 动态路由

##yml配置 spring:application:name: public-gateway # cloud: # gateway: # routes: # - id: mybatis-plus-test # 路由的唯一标识 # uri: http://192.168.3.188:9898 # 目标服务的地址 # predicates: # - Path/test/** # 匹配…

NVT新能德科技入职测评SHL题库更新:数字推理+演绎推理高分答案、真题解析

新能德的入职Verify测评主要考察应聘者的逻辑推理能力、数学能力、数据分析能力以及处理信息的能力。根据搜索结果&#xff0c;测评通常包含以下几个部分&#xff1a; 1. **语言理解**&#xff1a;这部分包括阅读理解、逻辑填空和语句排序。要求应聘者在17分钟内完成30题&#…