4-4 数值稳定性 + 模型初始化和激活函数

数值稳定性

请添加图片描述
这里的 t t t表示层,假设 h t − 1 h^{t-1} ht1是第 t − 1 t-1 t1层隐藏层的输出,经过一个 f t f_{t} ft得到第 t t t层隐藏层的输出 h t h^{t} ht

y y y表示 x x x进来,第一层一直到第 d d d层,最后到一个损失函数,就是我们预测的,要优化的目标函数。( y y y这里不是预测, y y y还包括了损失函数。)
请添加图片描述
如果我们计算损失 l l l关于我们某一个层权重 W t W^{t} Wt的梯度的话,损失 l l l自顶向下求导,一直求到第 t t t层的输出 h t h^{t} ht,再乘以第 t t t层的输出 h t h^{t} ht关于第 t t t层的权重 W t W^{t} Wt的导数。

注意到说,这里的所有的 h h h都是一些向量,向量关于向量的导数是一个矩阵,所以黄色括号这里是一个 d − t d-t dt次的矩阵乘法。

我们的主要问题就在这里,因为我们做了太多的矩阵乘法!!!
请添加图片描述
梯度爆炸:假设我的梯度都是一些比 1 1 1大一点的数字,然后我就是对 1.5 1.5 1.5 100 100 100次,假设我有 100 100 100层的话,作 100 100 100次就会得到一个 4 × 1 0 17 4 \times 10^{17} 4×1017的数,当然这个数浮点数是能表示的,但是这个数很容易带来浮点数上限的问题。
梯度消失:假设我的梯度是一个小于 1 1 1的数,就算不是太小,但是作 100 100 100层的话,那么 0.8 0.8 0.8 100 100 100次方,也是 2 × 1 0 − 10 2 \times 10^{-10} 2×1010次方,也是个非常非常小的数。慢慢地,梯度就很快不见了。

请添加图片描述
t t t层的输入 h t − 1 h^{t-1} ht1,也就是第 t − 1 t-1 t1层的输出,第 t t t层的权重 W t W_{t} Wt乘以我的第 t t t层的输入 h t − 1 h^{t-1} ht1,然后我们假设省略掉偏移,我们直接在输出上作激活函数。

请添加图片描述
Relu的导数,如果 x > 0 x > 0 x>0,导数为 1 1 1,否则为 0 0 0

请添加图片描述
我们是用GPU的时候,通常会使用 16 16 16位浮点数。 16 16 16浮点数的缺点是,它的数值范围很小。如果你的值超出了我这个区间,那我就变成无穷大了。

学习率不好调,大一点点就炸掉了,小一点点就不动,学习率只能在一个很小的范围内比较合适,对模型训练的调参很麻烦。

请添加图片描述
蓝色是值的函数,黄色是梯度的函数,当值很大的时候,梯度很小,对于激活函数,当输入稍微大一点点的时候,它的导数就会变成 0 0 0
请添加图片描述
请添加图片描述
请添加图片描述


让训练更加稳定

我们的核心问题是说,如何让我们的训练更加稳定,也就是让梯度不要太大也不要太小。请添加图片描述
归一化

  • 把梯度变成均值为 0 0 0,方差为 1 1 1的数,不管有多大,都拉回来
  • 梯度剪裁:比如,如果梯度 > 5 >5 5,就把它变成 5 5 5 < − 5 <-5 5,就把它变成 − 5 -5 5,就是强行把梯度剪裁到一个范围里面

请添加图片描述
t t t是我第 t t t层的输出, i i i是我的第 i i i个元素,所以 h i t h_{i}^{t} hit是个标量,我把它当作随机变量。

正向:我的输出的期望为 0 0 0,方差假设为 a a a
反向:损失函数关于第 t t t层输出的第 i i i个元素,我一样希望它的期望为 0 0 0,方差为常数 b b b

不管哪个层,不管哪一层的哪个输出,不管我作多深,都可以保证数值在一个合理的范围内。这是我们希望的假设,我们要设计神经网络,使得它满足这个性质。

权重初始化

请添加图片描述
越陡的地方梯度越大,因为梯度指向最陡的方向。

使用 N ( 0 , 0.01 ) N(0,0.01) N(0,0.01)有可能太小,有可能太大,不能保证深度神经网络。

请添加图片描述
假设权重是独立同分布,那可以说均值等于0,方差等于 γ t \gamma_{t} γt t t t就是层数。

我的这一层的输入 h i t − 1 h_{i}^{t-1} hit1也是独立于我当前层的权重,这两个事件是独立的事件。

假设没有激活函数,这样可以求出均值为 0 0 0。(因为独立同分布)

请添加图片描述

请添加图片描述
请添加图片描述
我们需要满足两个条件
第一个条件是要满足每次我的前项的输出方差是一致的,
第二个条件是要使得梯度是一样的。
这两个条件很难同时满足。

除非输入刚好等于输出,那不然的话,无法同时满足这两个条件

Xavier初始化,取个折中,作个权衡。
给定我的神经网络的当前层的输入和输出的大小,那我就能确定我的权重需要满足的方差的大小

Xavier初始化,是我们常用的模型初始化的方法,意思是我的初始化权重的方差是根据我的输入和输出维度来定的
当你的输入和输出长得不那么一样的时候,或者每个网络变化比较大的时候,可以根据输入和输出来适配我的权重形状,使得我希望我的梯度和输出的方差都在一个恒定的范围里。

激活函数

请添加图片描述
请添加图片描述
正向反向都意味着,你这个激活函数,必须是 f ( x ) = x f(x)=x f(x)=x

请添加图片描述
对于tanh和relu来讲,在零点附近,确实是近似到 f ( x ) = x f(x)=x f(x)=x
sigmod不过原点,但是可以把sigmod调整一下。

请添加图片描述

  • 合理的权重初始值:Xavier初始化
  • 激活函数,尽量用relu和tanh,实在不行用sigmod的变体

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

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

相关文章

研究生选择学习Android开发的利与弊?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「Android的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!产品经理可以学学Axure快…

vscode远程免密登入

1、windows (1) 点击左下角 ->将当前窗口连接到主机…->(配置ssh文件,点击或者指定)->按这个格式添加 (2) 在cmd命令窗口:ssh-keygen -t rsa (-C “name”) #这个name是远程linux的用户名,这里也可以不加-C…

H264编码器实现-帧内预测之像素值预测

前言 本文所介绍的像素值预测,是指在帧内预测总体流程中的预测块每个像素值的推导过程。当我们已知向量像素的重建值的时候,我们就可以对当前预测块进行像素值预测。该过程得到的结果将与源像素值相减得到残差,为后续变换量化提供数据来源。…

Godot入门 04平台设计

新建创景,添加AnimatableBody2D节点。 添加Sprite2D节点 拖动图片 剪裁图片,吸附模式:像素吸附 添加CollisionShape2D,设置实际形状为矩形 重命名AnimatableBody2D节点为Platform,保存场景,拖动platform场景…

C#初级——条件判断语句、循环语句和运算符

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

深入理解 Java 虚拟机第三版(周志明)

这次社招选的这本作为 JVM 资料查阅&#xff0c;记录一些重点 1. 虚拟机历史 Sun Classic VM &#xff1a;已退休 HotSpot VM&#xff1a;主流虚拟机&#xff0c;热点代码探测技术 Mobile / Embedded VM &#xff1a;移动端、嵌入式使用的虚拟机 2.2 运行时数据区域 程序计…

软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能…

“消费增值风暴:百万业绩背后的创新电商模式“

今日&#xff0c;我怀着无比激动的心情&#xff0c;向您揭示一个激励人心的成长篇章。我们的战略伙伴在短短一个月内&#xff0c;业绩如火箭般攀升&#xff0c;成功跨越百万销售额大关&#xff0c;同时&#xff0c;其用户活跃度居高不下&#xff0c;日均在线用户数稳稳占据8至1…

[Unity] ShaderGraph实现镜头加速线/残血效果 URP

效果如下所示&#xff1a;残血状态时&#xff0c;画面会压暗角&#xff0c;并出现速度线营造紧迫感。 使用到的素材如下&#xff0c;换别的当然也可以。[这是张白色的png放射图&#xff0c;并非皇帝的新图hhh] 这个效果的实现逻辑&#xff0c;其实就是利用time向圆心做透明度的…

HAL库源码移植与使用之低功耗模式

低功耗特性对用电池供电的产品&#xff1a; 更小电池体积&#xff08;降低了大小和成本&#xff09; 延长电池寿命 电磁干扰更小&#xff0c;提高无线通信质量 电源设计更简单&#xff0c;无需过多考虑散热问题 电源供电区分为&#xff1a; 分为VDD供电区…

友思特应用 | 硅片上的光影贴合:UV-LED曝光系统在晶圆边缘曝光中的高效应用

导读 晶圆边缘曝光是帮助减少晶圆涂布过程中多余的光刻胶对电子器件影响的重要步骤。友思特 ALE/1 和 ALE/3 UV-LED 高性能点光源&#xff0c;作为唯一可用于宽带晶圆边缘曝光的 i、h 和 g 线的 LED 解决方案&#xff0c;可高效实现WEE系统设计和曝光需求。 晶圆边缘曝光及处…

分布式相关理论详解

目录 1.绪论 2.什么是分布式系统&#xff0c;和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…

通过ATS软件抓取ios手机日志方法记录

1.ios手机下载描述符文件&#xff0c;用于过检测 下载网址&#xff1a;https://developer.apple.com/bug-reporting/profiles-and-logs/?nameB 点击这个下载&#xff0c;之后在手机通用-VPN与设备管理里面找到刚才下载的描述文件然后安装&#xff1b; 2024.6月后注意会提示描…

springcloud RocketMQ 客户端是怎么走到消费业务逻辑的 - debug step by step

springcloud RocketMQ &#xff0c;一个mq消息发送后&#xff0c;客户端是怎么一步步拿到消息去消费的&#xff1f;我们要从代码层面探究这个问题。 找的流程图&#xff0c;有待考究。 以下我们开始debug&#xff1a; 拉取数据的线程&#xff1a; PullMessageService.java 本…

Linux构建远程YUM仓库与NFS共享存储服务

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

YOLOX+PyQt5交通路口智能监测平台设计与实现

1.概述 交通要道的路口上人车穿行&#xff0c;特别是上下班早高峰&#xff0c;且时常发生交通事故。因此对交通路口的车流量和人流量的监测必不可少。 2.检测模型 使用的检测模型为YOLOX模型&#xff0c;模型权重为训练VOC数据集得来&#xff0c;其中包括了二十个类别&#…

Vue3二次封装axios

官网: https://www.axios-http.cn/docs/interceptors steps1: 安装 npm install axios -ssteps2: /src/api/request.js 文件 >>> 拦截器 import axios from axios // 如果没用element-plus就不引入 import { ElMessage } from element-plusconst service axios.cre…

【区块链+绿色低碳】基于区块链的双碳能源纳管平台 | FISCO BCOS应用案例

在双碳战略的指导下&#xff0c;南京区块链产业应用协会牵头研发的双碳能源纳管平台&#xff0c;依托区块链、人工智能、云计算、 物联网、大数据、工业互联网与边缘计算等技术&#xff0c;对绿电追溯、需求侧响应、能源微网、源网荷储、隔墙用电、 碳排放权认证、额度计量、预…

循环队列的实现【C语言】

用数组实现循环队列 题目&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 分析 循环队列&#xff0c;队列满则不能再插入数据&#xff0c;队列为空则不能再出数据。 多开一个空间方便区分队列为空和队列为满的情况。 如果要存K个数据只开K个空间&a…

【在排序数组中查找元素的第一个和最后一个位置】python刷题记录

R2-分治 有点easy的感觉&#xff0c;感觉能用哈希表 class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:nlen(nums)dictdefaultdict(list)#初始赋值哈希表&#xff0c;记录出现次数for num in nums:if not dict[num]:dict[num]1else:dict[…