你好,这篇文章咱们讨论一下关于「L2正则化在深度神经网络中是否会降低训练速度」的事情...
L2正则化是一种常见的正则化技术,它可以帮助解决深度神经网络模型过拟合的问题。但是,有人认为在深度神经网络中使用L2正则化会降低训练速度。在本篇技术文中,我们将探讨这个问题。
什么是L2正则化
在对L2正则化在深度神经网络中是否会降低训练速度的影响进行讨论之前,让我们先了解一下什么是L2正则化。
L2正则化是一种常见的正则化技术,也被称为权重衰减。它通过在损失函数中添加一项对权重的平方惩罚项来惩罚权重参数的大小,从而防止过拟合。L2正则化的损失函数可以表示为:
$loss = cost + \frac{\lambda}{2N} \sum_j{||w_j||^2}$
其中,$cost$是损失函数,$\lambda$是正则化系数,$N$为训练样本的数量,$w_j$ 是神经网络中的一个权重参数。
因此,L2正则化可以帮助限制权重的“绝对”大小,从而减少神经网络的过拟合问题。
L2正则化对训练速度的影响
对于神经网络模型的训练,通常采用反向传播算法来优化模型参数。反向传播算法的核心是计算损失函数对每个参数的导数,从而根据导数的方向更新参数。
正则化技术对于神经网络模型的训练速度有一定的影响。L2正则化在训练过程中会对权重参数进行惩罚,这会使得权重参数的更新方向发生变化,从而影响训练速度。当使用L2正则化时,神经网络模型的训练速度通常会比不使用正则化技术的情况下更慢。
但是,L2正则化对训练速度的影响并不是绝对的。实际上,在某些情况下,L2正则化甚至可以帮助加快神经网络模型的训练速度。
下面我们将从三个方面考察L2正则化对于训练速度的影响。
1. L2正则化带来的额外计算量
在神经网络模型使用L2正则化时,每次迭代都需要计算权重参数的平方和,这会增加一定的计算量。但是,这种额外的计算量通常可以忽略不计。特别是在GPU等高性能计算设备上,这种额外计算的负担通常可以被忽略。
因此,从计算量的角度来看,L2正则化对于训练速度的影响并不是很大。
2. L2正则化对反向传播算法的影响
L2正则化通过在损失函数中添加一项对权重的平方惩罚项,从而影响反向传播算法中的梯度计算。
具体来说,对于某个权重参数 $w_i$ ,它的梯度可以表示为:
$\frac{\partial{loss}}{\partial{w_i}} = \frac{\partial{cost}}{\partial{w_i}} + \frac{\lambda}{N} w_i$
其中,第一项是损失函数的常规梯度,第二项是L2正则化的惩罚项。由于惩罚项具有与权重参数 $w_i$ 有关的常量 $\frac{\lambda}{N}$ ,因此它会影响梯度计算的方向和大小。
在反向传播算法中,每个参数的梯度都需要计算并更新。由于L2正则化的惩罚项会影响所有的参数梯度,L2正则化计算可能更复杂,需要更长的反向传播时间。
因此,从反向传播算法的角度来看,L2正则化会对训练速度产生一定的影响。
3. L2正则化对模型收敛速度的影响
通过对损失函数中的L2正则化惩罚项进行调整,可以精调模型的模型复杂度。L2正则化可以有效控制权重参数的大小,从而避免了模型因权重参数过大而导致的过拟合问题。
同时,L2正则化也会在损失函数中引入一个额外项,这会使得损失函数不易于优化。实际上,在一些情况下,L2正则化可能会使得损失函数更加倾向于局部最小值,从而减慢模型的收敛速度。
因此,从模型收敛速度的角度来看,L2正则化也有可能对训练速度产生一定的影响。
如何在实践中应用L2正则化
综上所述,L2正则化对于深度神经网络的训练速度有一定的影响。因此,在实践中应用L2正则化时,需要权衡正则化的效果和训练速度的影响。
以下是一些在实践中应用L2正则化时建议的注意事项:
-
调整正则化系数:正则化系数的大小会影响权重参数的惩罚程度。在应用L2正则化时,需要仔细调整正则化系数的大小,以达到平衡正则化效果和训练速度的目的。
-
结合其他正则化技术:除了L2正则化之外,还有其他一些正则化技术可以用于深度神经网络的训练,例如L1正则化、Dropout等等。结合多种正则化技术可以强化模型的正则化效果,并减少L2正则化对于训练速度的影响。
-
结合优化算法:不同的优化算法有不同的更新策略,这也会影响L2正则化的效果和训练速度。
-
并行计算:在GPU等高性能计算设备上进行并行计算,能够有效减少L2正则化对于训练速度的影响。
综上所述,L2正则化对于深度神经网络的训练速度有一定的影响。在实践中应用L2正则化时,需要仔细权衡正则化效果和训练速度的影响,并结合其他正则化技术、优化算法和并行计算等手段来减小L2正则化对训练速度的影响。
大家都在看:
PX4原生固件源码分析(挖坑)--1、代码结构
写在开头
最近开始学习PX4源码,并进行二次开发,苦于网上缺少有关PX4源码的分析,于是在这开个坑,记录自己学习PX4的过程,以此自勉,笔者第一次写博客,若有不足之处,还请多包涵。
硬件、固件版本
硬件:雷迅V5+飞控
源码版本:v1.11(PX4固件源码在20年有一次很大的改动)
编译固件命令:make px4_fmu-v5(默认编译的是default固件)
参考链接:PX4 飞控源码系统框架介绍 - 徐景祥 - 博客园 (cnblogs.com)
代码结构
PX4源码文件如下图:(笔者会根据个人理解说明,出错之处敬请指出)
1、boards文件夹
boards文件夹中是各版本固件的编译脚本,比如笔者用的v5固件,路径为Firmware\boards\px4\fmu-v5
其中default.cmake文件就是总的编译脚本,之后若是添加新的模块,也要在这个文件中写入模块名称。
2、build文件夹
执行make px4_fmu-v5命令编译后生成的文件,见保存在build文件夹下,如下图所示:
px4_fmu-v5_default是编译v5固件生成的。
px4_sitl_default是只是make px4_sitl_default进行gazebo仿真编译生成的。
3、mavlink文件夹
包含了mavlink协议所用的文件,包括基本的msg内容,以及通过mavlink代码生成工具生成的h文件。mavlink分为1.0和2.0两个版本,现PX4用的就是2.0版本的mavlink协议,主要是负责和QGC地面站进行通信。
4、msg文件夹
包含了uORB所用的所用msg的内容,在PX4各进程之间传递的就是这些msg。同时我们也可以参照其格式定义自己的msg,这会在后面给出具体方法。
5、ROMFS文件夹
ROM file_system 的简写,内部的 px4fmu_common 文件夹中的 init.d 是关于 px4 系统初始上电启动的启动脚本,即一系列的启动过程和系统配置。其中较为重要的部分在如下目录下:Firmware\ROMFS\px4fmu_common\init.d
如文件rcS、rc.logging、rc.mc_apps、rc.sensors等
rcS:最先启动的脚本,负责挂载SD卡、启动uORB、配置系统参数等。
rc.logging:日志配置和启动代码。
rc.sensors:sensors驱动启动代码。
rc.mc_apps:启动上层应用(src/modules中的模块均在此启动),如 attitude_estimate 、 attitude_control 、position_estimate 和 position_control 等。
6、src文件夹
这是较为重要的一个文件夹:
drivers:pixhawk 硬件系统中使用的所有的 sensor 的驱动代码。也包含了 STM32 主控MCU 的 io 输出控制(PX4IO)和 pwm 的驱动。
examples:官方给出的简单例程,引导开发者进行二次开发。
lib:标准库,有矩阵运算、PID等
modules:各上层应用,有 attitude_estimate 、 attitude_control 、position_estimate 和 position_control等,之后自定义的应用也应也在这个文件夹中。具体介绍如下:
attitude_estimator_q:基于mahony 的互补滤波算法的姿态解算
ekf2:基于扩展卡尔曼滤波的姿态和位置解算
local_position_estimator:LPE算法实现位置解算
logger:读写log日志文件
mc_att_control:姿态控制
mc_pos_control:位置控制
uORB:进程间的通信机制
sensors:各sensors的初始化代码
总结
关于px4整体代码结构就写到这里,若是以后有新的理解会及时补充。
Original: https://blog.csdn.net/lmh081910/article/details/123531900
Author: 梦里见莯
Title: PX4原生固件源码分析(挖坑)--1、代码结构