神经网络:优化器和全连接层

SGD(随机梯度下降)

随机梯度下降的优化算法在科研和工业界是很常用的。

很多理论和工程问题都能转化成对目标函数进行最小化的数学问题。

举个例子:梯度下降(Gradient Descent)就好比一个人想从高山上奔跑到山谷最低点,用最快的方式奔向最低的位置。

SGD的公式:

动量(Momentum)公式:

基本的mini-batch SGD优化算法在深度学习取得很多不错的成绩。然而也存在一些问题需解决:

  1. 选择恰当的初始学习率很困难。
  2. 学习率调整策略受限于预先指定的调整规则。
  3. 相同的学习率被应用于各个参数。
  4. 高度非凸的误差函数的优化过程,如何避免陷入大量的局部次优解或鞍点。

AdaGrad(自适应梯度)

AdaGrad优化算法(Adaptive Gradient,自适应梯度),它能够对每个不同的参数调整不同的学习率,对频繁变化的参数以更小的步长进行更新,而稀疏的参数以更大的步长进行更新。

AdaGrad公式:

g t , i g_{t,i} gt,i 表示t时刻的 θ i \theta_{i} θi 梯度。

G t , i i G_{t,ii} Gt,ii 表示t时刻参数 θ i \theta_{i} θi 的梯度平方和。

与SGD的核心区别在于计算更新步长时,增加了分母:梯度平方累积和的平方根。此项能够累积各个参数 θ i \theta_{i} θi 的历史梯度平方,频繁更新的梯度,则累积的分母逐渐偏大,那么更新的步长相对就会变小,而稀疏的梯度,则导致累积的分母项中对应值比较小,那么更新的步长则相对比较大。

AdaGrad能够自动为不同参数适应不同的学习率(平方根的分母项相当于对学习率α进进行了自动调整,然后再乘以本次梯度),大多数的框架实现采用默认学习率α=0.01即可完成比较好的收敛。

优势: 在数据分布稀疏的场景,能更好利用稀疏梯度的信息,比标准的SGD算法更有效地收敛。

缺点: 主要缺陷来自分母项的对梯度平方不断累积,随时间的增加,分母项越来越大,最终导致学习率收缩到太小无法进行有效更新。

RMSProp

RMSProp结合梯度平方的指数移动平均数来调节学习率的变化。能够在不稳定的目标函数情况下进行很好地收敛。

计算t时刻的梯度:

计算梯度平方的指数移动平均数(Exponential Moving Average), γ \gamma γ 是遗忘因子(或称为指数衰减率),依据经验,默认设置为0.9。

梯度更新的时候,与AdaGrad类似,只是更新的梯度平方的期望(指数移动均值),其中 ε = 1 0 − 8 \varepsilon = 10^{-8} ε=108 ,避免除数为0。默认学习率 α = 0.001 \alpha = 0.001 α=0.001

优势: 能够克服AdaGrad梯度急剧减小的问题,在很多应用中都展示出优秀的学习率自适应能力。尤其在不稳定(Non-Stationary)的目标函数下,比基本的SGD、Momentum、AdaGrad表现更良好。

Adam

Adam优化器结合了AdaGrad和RMSProp两种优化算法的优点。对梯度的一阶矩估计(First Moment Estimation,即梯度的均值)和二阶矩估计(Second Moment Estimation,即梯度的未中心化的方差)进行综合考虑,计算出更新步长。

Adam的优势:

  1. 实现简单,计算高效,对内存需求少。
  2. 参数的更新不受梯度的伸缩变换影响。
  3. 超参数具有很好的解释性,且通常无需调整或仅需很少的微调。
  4. 更新的步长能够被限制在大致的范围内(初始学习率)。
  5. 能自然地实现步长退火过程(自动调整学习率)。
  6. 很适合应用于大规模的数据及参数的场景。
  7. 适用于不稳定目标函数。
  8. 适用于梯度稀疏或梯度存在很大噪声的问题。

Adam的实现原理:

计算t时刻的梯度:

然后计算梯度的指数移动平均数, m 0 m_{0} m0 初始化为0。

类似于Momentum算法,综合考虑之前累积的梯度动量。

β 1 \beta_{1} β1 系数为指数衰减率,控制动量和当前梯度的权重分配,通常取接近于1的值。默认为0.9。

接着,计算梯度平方的指数移动平均数, v 0 v_{0} v0 初始化为0。

β 2 \beta_{2} β2 系数为指数衰减率,控制之前的梯度平方的影响情况。默认为0.999。

类似于RMSProp算法,对梯度平方进行加权均值。

由于 m 0 m_{0} m0 初始化为0,会导致 m t m_{t} mt偏向于0,尤其在训练初期阶段。

所以,此处需要对梯度均值 m t m_{t} mt进行偏差纠正,降低偏差对训练初期的影响。

同时 v 0 v_{0} v0 也要进行偏差纠正:

最后总的公式如下所示:

其中默认学习率 α = 0.001 \alpha = 0.001 α=0.001 ε = 1 0 − 8 \varepsilon = 10^{-8} ε=108 避免除数变为0。

从表达式中可以看出,对更新的步长计算,能够从梯度均值和梯度平方两个角度进行自适应地调节,而不是直接由当前梯度决定。

Adam的不足:

虽然Adam算法目前成为主流的优化算法,不过在很多领域里(如计算机视觉的图像识别、NLP中的机器翻译)的最佳成果仍然是使用带动量(Momentum)的SGD来获取到的。

全连接层的作用

全连接层将卷积学习到的高维特征映射到label空间,可以作为整个网络的分类器模块。

虽然全连接层参数存在冗余的情况,但是在模型进行迁移学习时,其能保持较大的模型capacity。

目前很多模型使用全局平均池化(GAP)取代全连接层以减小模型参数,并且依然能达到SOTA的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

23年12月AI烟火识别系统应用案例-北京梅兰芳故居防火系统

AI烟火识别智能视频分析系统在文化遗产保护领域的应用,尤其是在梅兰芳故居防火系统的部署,是现代科技与传统文化保护结合的典范。这篇文章将详细介绍富维烟火识别系统的设计、实施及其在23年12月在北京梅兰芳故居中的应用。 背景介绍 ● 梅兰芳故居的重要…

Ubuntu20.04.2-mate上Lazarus安装与测试

简言 Lazarus采用RAD方式界面开发,一套代码可交差编译出windows、ios、android、solaris、BSD等 各平台运行的程序,在unbuntu的repo中有2.2.0版本可用,在sourceforge上有2.2.6版本和3.0.0的Rolling版可下载安装,但感觉上2.2.0和2…

【实时绘画】comfyUI 实时绘画工作流 - 投屏

原理:(可用方案) 1:利用DesignDoll(人体控制模型)comfyUI实现 实时绘制人物对话场景 2:利用krita投影 实时绘制 场景人物 3:利用posemy.art进行实时绘画 设置有关模型。如果要开启lora&#xff…

C/C++与MySQL:多线程、大并发和异步操作的实践

C/C与MySQL:多线程、大并发和异步操作的实践 在前面的文章中,我们介绍了如何使用C/C调用MYSQL API进行基本的数据库操作。然而,在实际应用中,特别是面对大量用户请求和高并发场景时,单线程的数据库操作往往显得力不从…

内网离线部署Ant Design离线文档离线api antd离线组件api

我们经常会遇到需要在内网开发不方便查看api的尴尬情况,文本用最简单的nginx,让你十分钟部署好本地的离线antd文档,想在哪用在哪用,妈妈在也不用担心我啦 1.x及以下的只要到官网下载gh-pages分支,放到nginx里&#xf…

在centos7.9上安装Jenkins的安装过程

1.jenkins的安装和配置: 安装JDK: yum install -y fontconfig java-11-openjdk # 安装目录:/usr/lib/jvm # fontconfig 是 Linux 系统中用于配置和管理字体的一种工具 下载jenkins安装包: sudo wget -O /etc/yum.repos.d/jenkins…

2017年第六届数学建模国际赛小美赛B题电子邮件中的笔迹分析解题全过程文档及程序

2017年第六届数学建模国际赛小美赛 B题 电子邮件中的笔迹分析 原题再现: 笔迹分析是一种非常特殊的调查形式,用于将人们与书面证据联系起来。在法庭或刑事调查中,通常要求笔迹鉴定人确认笔迹样本是否来自特定的人。由于许多语言证据出现在电…

Ubuntu 常用命令之 tar 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 tar 命令在 Ubuntu 系统中是用来打包和解包文件的工具。tar 命令可以将多个文件或目录打包成一个 tar 文件,也可以将 tar 文件解包成原来的文件或目录。 tar 命令的常用参数如下 c:创建一个新的 tar 文件…

记一次渗透测试信息收集(证书+c段+历史漏洞搜索)

目录 一、当资产列表挖掘不出漏洞的时候 二、信息收集之证书信息收集(部分方式) 三、信息收集之C段信息收集 四、信息收集之某网关RCE 一、当资产列表挖掘不出漏洞的时候 二、信息收集之证书信息收集(部分方式) Fofa语句&#…

JS常用方法

1、reduce()统计 (1)数组和 计算并返回给定数组 arr 中所有元素的总和 let arr [1,4,3,6,2,6] function sum(){const newArr arr.reduce((pre,item)>{return preitem})console.log(newArr);//22 } sum() 2、filter()过滤器 (1&#…

el-table 实现行拖拽排序

element ui 表格实现拖拽排序的功能&#xff0c;可以借助第三方插件Sortablejs来实现。 引入sortablejs npm install sortablejs --save组件中使用 import Sortable from sortablejs;<el-table ref"el-table":data"listData" row-key"id" …

智能优化算法应用:基于龙格-库塔算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于龙格-库塔算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于龙格-库塔算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.龙格-库塔算法4.实验参数设定5.算法结果…

红队打靶练习:WINTERMUTE: 1

前言 网络扫描&#xff08;Nmap、netdiscover&#xff09; HTTP 服务枚举 使用电子邮件日志文件在浏览器中进行目录遍历 利用 SMTP RCPT 选项中的操作系统命令注入 生成 PHP 后门 (Msfvenom) 执行RCPT选项中嵌入的后门 反向连接&#xff08;Metasploit&#xff09; 导入 pytho…

一键在线获取APP公钥、包名、签名及备案信息方法介绍

​ 目录 一键在线获取APP公钥、包名、签名及备案信息方法介绍 摘要 引言 一键获取APP包信息 操作步骤 ​编辑 解析报告 总结 致谢 关键词 参考资料 声明 摘要 本文介绍了一款在线APP解析工具&#xff0c;可以一键获取APP的公钥、包名、签名等基础信息&#xff0c;…

spring依赖注入对象类型属性----外部bean的引入(bean和bean之间的引入)

文章目录 注入普通属性的方式1、set方法注入2、构造器&#xff08;构造方法&#xff09;注入 总结&#xff1a;注入对象类型属性 注入普通属性的方式 1、set方法注入 2、构造器&#xff08;构造方法&#xff09;注入 总结&#xff1a; set方法注入和构造器方法的注入&#…

C语言——高精度乘法

一、引子 高精度乘法相较于高精度加法和减法有更多的不同&#xff0c;加法和减法是一位对应一位进行操作的&#xff0c;而乘法是一个数的每一位对另一个数的每一位进行操作&#xff0c;需要的计算步骤更多。 二、核心算法 void Calculate(int num1[], int num2[], int numres…

Linux docker安装nacos

1&#xff1a;首先下载安装docker&#xff0c;这里不做描述&#xff0c;可以自行百度安装。 2&#xff1a;通过docker下载nacos&#xff0c; docker pull nacos/nacos-server:latest3&#xff1a;搭建临时nacos容器&#xff0c;此步骤的目的是为了获取nacos的配置文件和日志 …

总结两套JVM模版配置

大白话&#xff1a; 1.秒杀场景&#xff0c;Eden会设置的比较大&#xff1b; 2.FullGC是代价最高的GC&#xff0c;频率越低越好。 大白话&#xff1a; 一般情况下&#xff0c;设置JVM堆内存为物理机内存的一半&#xff0c;最大不超过3/4; -Xmn3072M - 设置新生代的内存大小&a…

『 C++ 』二叉树进阶OJ题

文章目录 根据二叉树创建字符串 &#x1f996;&#x1f969; 题目描述&#x1f969; 解题思路&#x1f969; 代码 二叉树的层序遍历(分层遍历) &#x1f996;&#x1f969; 题目描述&#x1f969; 解题思路&#x1f969; 代码 二叉树的层序遍历(分层遍历)Ⅱ &#x1f996;&…

uniapp websocket的使用和封装

在uniapp中socket分为两种形式&#xff0c;第一种适用于只有一个socket链接&#xff0c;第二种适用于多个socket链接。传送门 这里以socketTask为列子封装 在utils新建一个文件 在你要使用的页面引入&#xff0c;我这是聊天那种&#xff0c;所以我在拿到用户信息之后连接sock…