机器学习深度学习——数值稳定性和模型化参数(详细数学推导)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er
🌌上期文章:机器学习&&深度学习——Dropout
📚订阅专栏:机器学习&&深度学习
希望文章对你们有所帮助

这一部分包括了很多概率论和数学的知识,而书上的推导很少,这边会做个比较细致的讨论,数学基础不行就去补,不能拖,深入浅出的感觉是最让人感到心情愉悦的。

数值稳定性和模型初始化

  • 梯度消失和梯度爆炸
    • 梯度消失
    • 梯度爆炸
  • 让训练更加稳定
  • 参数初始化
    • 讨论(各种概率论思维推导)
    • 默认初始化
    • Xavier初始化

梯度消失和梯度爆炸

一个具有L层、输入x和输出o的深层网络。每一层l由f定义,变换的参数权重为W(l),其隐藏变量为h(l)(令h(0)=x)。则我们的网络可以定义为:
h ( l ) = f l ( h ( l − 1 ) ) 因此 o = f L ○ . . . ○ f 1 ( x ) h^{(l)}=f_l(h^{(l-1)})因此o=f_L○...○f_1(x) h(l)=fl(h(l1))因此o=fL○...○f1(x)
若所有隐藏向量和输入都是向量,我们可以将o关于任何一组参数W{(l)}的梯度写为:
∂ h ( L − 1 ) h ( L ) ⋅ . . . ⋅ ∂ h ( l ) h ( l + 1 ) ∂ w ( l ) h ( l ) \partial_h(L-1)h^{(L)}·...·\partial_h(l)h^{(l+1)}\partial_w(l)h^{(l)} h(L1)h(L)...h(l)h(l+1)w(l)h(l)
换言之,该梯度是一个L-l个矩阵M(L)·…·M(l+1)与梯度向量v{l}的乘积。
这么多的乘积放在一起会出现严重的问题:可能会造成梯度的不稳定。要么是梯度爆炸:参数更新过大,破坏了模型的稳定收敛;要么是梯度消失:参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。

梯度消失

sigmoid就是一个造成梯度消失的常见原因,我们可以绘制sigmoid函数以及它的导数函数观察:

import torch
from d2l import torch as d2l

x = torch.arange(-8.0, 8.0, 0.1, requires_grad=True)
y = torch.sigmoid(x)
y.backward(gradient=torch.ones_like(x))  # 参与的参数是非标量的时候,就需要指定gradient为和x形状相同的全1向量(矩阵)

d2l.plot(x.detach().numpy(), [y.detach().numpy(), x.grad.numpy()],
         legend=['sigmoid', 'gradient'], figsize=(4.5, 2.5))
d2l.plt.show()

在这里插入图片描述
如上图,当sigmoid函数的输入很大或者很小时梯度会消失。此外,当反向传播通过许多层时,除非函数的输入接近于0,否则整个成绩的梯度都可能会消失。因此,更稳定的ReLU系列函数已经成为从业者的默认选择(虽然在神经科学的角度看起来不太合理)。

梯度爆炸

梯度爆炸可能同样令人烦恼。 为了更好地说明这一点,我们生成100个高斯随机矩阵,并将它们与某个初始矩阵相乘。 对于我们选择的尺度(方差σ2=1),矩阵乘积发生爆炸。当这种情况是由于深度网络的初始化所导致时,我们没有机会让梯度下降优化器收敛。

import torch

M = torch.normal(0, 1, size=(4, 4))
print('一个矩阵\n', M)
for i in range(100):
    M = torch.mm(M, torch.normal(0, 1, size=(4, 4)))

print('乘以100个矩阵后\n', M)

一个矩阵
tensor([[ 2.2266, 0.1844, -0.1071, -0.7712],
[-0.1580, -0.3028, -0.9375, -0.2922],
[ 0.0616, -1.1593, 1.8516, 1.6285],
[ 0.2703, -0.5483, -0.6187, -1.2804]])
乘以100个矩阵后
tensor([[ 1.3260e+25, -6.2655e+25, 1.2841e+25, 1.5429e+25],
[ 1.5770e+24, -7.4518e+24, 1.5273e+24, 1.8351e+24],
[ 8.5330e+23, -4.0321e+24, 8.2638e+23, 9.9294e+23],
[ 5.7656e+24, -2.7244e+25, 5.5837e+24, 6.7091e+24]])

让训练更加稳定

而如何让我们的训练更加稳定呢?也就是要避免掉梯度消失和梯度爆炸问题。
目标:让梯度值在合理范围内,如[1e-6,1e3]
将乘法变加法:ResNet,LSTM
归一化:梯度归一化,梯度裁剪
合理的权重和激活函数(这是我们的重点)

参数初始化

减轻上面问题的一种方法就是进行参数初始化,优化期间的注意以及适当的正则化也可以使得训练更加的稳定。

讨论(各种概率论思维推导)

我们现在做一个假设:
(1)假设w都是独立同分布的,那么:
E [ w i , j t ] = 0 , D [ w i , j t ] = γ t 2 E[w_{i,j}^t]=0,D[w_{i,j}^t]=γ_t^2 E[wi,jt]=0D[wi,jt]=γt2
(2)ht-1独立于wt(也就是层的权重与输入是无关的)
我们大胆假设此时没有激活函数,那么
h t = W t h t − 1 ,这里 W t ∈ R n t × n t − 1 h^t=W^th^{t-1},这里W^t∈R^{n_t×n_{t-1}} ht=Wtht1,这里WtRnt×nt1
则容易推出:
E [ h i t ] = E [ ∑ j w i , j t h j t − 1 ] = ∑ j E [ w i , j ] E [ h j t − 1 ] = 0 (独立同分布的推广) E[h_i^t]=E[\sum_jw_{i,j}^th_j^{t-1}]=\sum_jE[w_{i,j}]E[h_j^{t-1}]=0(独立同分布的推广) E[hit]=E[jwi,jthjt1]=jE[wi,j]E[hjt1]=0(独立同分布的推广)
此时我们分别计算正向方差与反向方差,并且让他们都相同。

正向方差
D [ h i t ] = E [ ( h i t ) 2 ] − E [ h i t ] 2 = E [ ( ∑ j w i , j t h j t − 1 ) 2 ] (前面假设过独立同分布那么 E [ h i t ] = 0 ) = E [ ∑ j ( w i , j t ) 2 ( h j t − 1 ) 2 + ∑ j ≠ k w i , j t w i , k t h j t − 1 h k t − 1 ] (这里就是 ( a + b + c + . . . ) 2 的计算方式) 由于独立同分布,所以 ∑ j ≠ k w i , j t w i , k t h j t − 1 h k t − 1 = 0 ,则 上式 = ∑ j E [ ( w i , j t ) 2 ] E [ ( h j t − 1 ) 2 ] = ∑ j ( E [ ( w i , j t ) 2 ] − E [ w i , j t ] 2 ) ( E [ ( h j t − 1 ) 2 ] − E [ h j t − 1 ] 2 ) (构造出 D ) = ∑ j D [ w i , j t ] D [ h j t − 1 ] = n t − 1 γ t 2 D [ h j t − 1 ] D[h_i^t]=E[(h_i^t)^2]-E[h_i^t]^2=E[(\sum_jw_{i,j}^th_j^{t-1})^2](前面假设过独立同分布那么E[h_i^t]=0)\\ =E[\sum_j(w_{i,j}^t)^2(h_j^{t-1})^2+\sum_{j≠k}w_{i,j}^tw_{i,k}^th_j^{t-1}h_k^{t-1}](这里就是(a+b+c+...)^2的计算方式)\\ 由于独立同分布,所以\sum_{j≠k}w_{i,j}^tw_{i,k}^th_j^{t-1}h_k^{t-1}=0,则\\ 上式=\sum_jE[(w_{i,j}^t)^2]E[(h_j^{t-1})^2]\\ =\sum_j(E[(w_{i,j}^t)^2]-E[w_{i,j}^t]^2)(E[(h_j^{t-1})^2]-E[h_j^{t-1}]^2)(构造出D)\\ =\sum_jD[w_{i,j}^t]D[h_j^{t-1}]=n_{t-1}γ_t^2D[h_j^{t-1}] D[hit]=E[(hit)2]E[hit]2=E[(jwi,jthjt1)2](前面假设过独立同分布那么E[hit]=0=E[j(wi,jt)2(hjt1)2+j=kwi,jtwi,kthjt1hkt1](这里就是(a+b+c+...)2的计算方式)由于独立同分布,所以j=kwi,jtwi,kthjt1hkt1=0,则上式=jE[(wi,jt)2]E[(hjt1)2]=j(E[(wi,jt)2]E[wi,jt]2)(E[(hjt1)2]E[hjt1]2)(构造出D=jD[wi,jt]D[hjt1]=nt1γt2D[hjt1]
我们让t层输入的反差与输出的方差都是相同的,那么可以推出:
n t − 1 γ t 2 = 1 (其中 n t − 1 代表第 t 层输入的规模) n_{t-1}γ_t^2=1(其中n_{t-1}代表第t层输入的规模) nt1γt2=1(其中nt1代表第t层输入的规模)
其他层也是同理的。

反向方差
而反向和正向的情况就类似了,可以这么推导:
∂ l ∂ h t − 1 = ∂ l ∂ h t W t \frac{\partial l}{\partial h^{t-1}}=\frac{\partial l}{\partial h^t}W^t ht1l=htlWt
分别取转置,得:
( ∂ l ∂ h t − 1 ) T = ( W t ) T ( ∂ l ∂ h t ) T (\frac{\partial l}{\partial h^{t-1}})^T=(W^t)^T(\frac{\partial l}{\partial h^t})^T (ht1l)T=(Wt)T(htl)T
依旧假设:
E [ ∂ l ∂ h i t − 1 ] = 0 E[\frac{\partial l}{\partial h_i^{t-1}}]=0 E[hit1l]=0

D [ ∂ l ∂ h i t − 1 ] = n t γ t 2 D [ ∂ l ∂ h j t ] D[\frac{\partial l}{\partial h_i^{t-1}}]=n_tγ_t^2D[\frac{\partial l}{\partial h_j^t}] D[hit1l]=ntγt2D[hjtl]
这时我们可以推出:
n t γ t 2 = 1 (其中 n t 代表第 t 层输出的规模) n_tγ_t^2=1(其中n_t代表第t层输出的规模) ntγt2=1(其中nt代表第t层输出的规模)
其他层也是同理的。

照着上面的方式推下去,我们最终整合起来的结论是
n t − 1 γ t 2 = 1 和 n t γ t 2 = 1 n_{t-1}γ_t^2=1和n_tγ_t^2=1 nt1γt2=1ntγt2=1
显然我们要满足上面的式子,当且仅当:
n t − 1 = n t n_{t-1}=n_t nt1=nt
这并不容易满足,因为我们很难说对于一层中,我们的输入和输出的规模(神经元的数量)是相同的。
接下来就会谈到Xavier初始化,将会用另外一种方式来解决这一问题。

默认初始化

在前面的学习中,我们初始化权重值的方式都是使用正态分布来。而如果我们不指定初始化方法的话,框架会使用默认的随机初始化方法(比如Linear就会提供,具体原理可以自行去了解),简单问题用默认初始化还是很有效的。

Xavier初始化

回到之前的讨论,我们已知很难同时满足
n t − 1 γ t 2 = n t γ t 2 = 1 n_{t-1}γ_t^2=n_tγ_t^2=1 nt1γt2=ntγt2=1
我们推广到每一层,即为:
n i n σ 2 = n o u t σ 2 = 1 n_{in}\sigma^2=n_{out}\sigma^2=1 ninσ2=noutσ2=1
虽然难以满足输入和输出规模相同,但是我们可以先将两个式子相加并调整:
σ 2 ( n i n + n o u t ) / 2 = 1 → σ = 2 ( n i n + n o u t ) \sigma^2(n_{in}+n_{out})/2=1→\sigma=\sqrt\frac{2}{(n_{in}+n_{out})} σ2(nin+nout)/2=1σ=(nin+nout)2
对于上面的式子,我们就可以有两种采样方式:
(1)Xavier初始化从均值为0,方差为
σ 2 = 2 n i n + n o u t \sigma^2=\frac{2}{n_{in}+n_{out}} σ2=nin+nout2
的高斯分布中采样权重,即为
正态分布 N ( 0 , 2 n i n + n o u t ) 正态分布N(0,\sqrt\frac{2}{n_{in}+n_{out}}) 正态分布N(0,nin+nout2 )
(2)从均匀分布从抽取权重时的方差,我们先注意一个定理:
均匀分布 U ( − a , a ) 的方差为 a 2 3 均匀分布U(-a,a)的方差为\frac{a^2}{3} 均匀分布U(a,a)的方差为3a2
此时我们将其带入到σ2的条件中,将得到初始化值域:
均匀分布 U ( − 6 n i n + n o u t , 6 n i n + n o u t ) 均匀分布U(-\sqrt\frac{6}{n_{in}+n_{out}},\sqrt\frac{6}{n_{in}+n_{out}}) 均匀分布U(nin+nout6 ,nin+nout6 )

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

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

相关文章

MySQL 极速安装使用与卸载版

mysql-5.6.51 极速安装使用与卸载版 mysql-8.1.0下载安装在后 mysql中国官网 MySQLhttps://www.mysql.com/cn/ 点击MySQL社区服务器 点击历史档案 下载完 解压 用管理员运行cmd,进入bin目录,输入mysqld --install,进行安装 这样&#xff…

【LeetCode】88. 合并两个有序数组

这道题我总共想了三种解法。 1.将nums2中的元素依次放入nums1有效元素的后面&#xff0c;再总体进行排序。 import java.util.*; class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int j 0;for(int i m;i<mn;i){nums1[i] nums2[j];j;}Arrays…

时间复杂度为O(n2)的三种简单排序算法

1.冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较&#xff0c;看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少少一个元素移动到它应该在的位置&#xff0c;重复n次&#xff0c;就完成了n个数据的排序工作。 /*** …

华为OD机试真题 JavaScript 实现【云短信平台优惠活动】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

【css】nth-child选择器实现表格的斑马纹效果

nth-child() 选择器可以实现为所有偶数&#xff08;或奇数&#xff09;的表格行添加css样式&#xff0c;even&#xff1a;偶数&#xff0c;odd&#xff1a;奇数。 代码&#xff1a; <style> table {border-collapse: collapse;width: 100%; }th, td {text-align: cente…

算法与数据结构(五)--树【1】树与二叉树是什么

一.树的定义 树是一个具有层次结构的集合&#xff0c;是由一个有限集和集合上定义的一种层次结构关系构成的。不同于线性表&#xff0c;树并不是线性的&#xff0c;而是有分支的。 树&#xff08;Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集。 若n0&…

数据采集的方法有哪些?

近年来&#xff0c;国家和各大企业都在部署大数据战略。“大数据”这个词也越来越频繁地出现在我们的生活中。当我们在进行网上冲浪时&#xff0c;页面总会跳出我们想要搜索的相关产品或关联事物。大数据&#xff0c;似乎总是能够“算”出我们“心中所想”。那么&#xff0c;大…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(23)-Fiddler如何优雅地在正式和测试环境来回切换-上篇

1.简介 在开发或者测试的过程中&#xff0c;由于项目环境比较多&#xff0c;往往需要来来回回地反复切换&#xff0c;那么如何优雅地切换呢&#xff1f;今天介绍几种方法供小伙伴或者童鞋们进行参考。 2.实际工作场景 2.1问题场景 &#xff08;1&#xff09;已发布线上APP出…

centos系统离线安装k8s v1.23.9最后一个版本并部署服务,docker支持的最后一个版本

注意&#xff1a;我这里的离线安装包是V1.23.9. K8S v1.23.9离线安装包下载&#xff1a; 链接&#xff1a;https://download.csdn.net/download/qq_14910065/88143546 这里包括离线安装所有的镜像&#xff0c;kubeadm&#xff0c;kubelet 和kubectl&#xff0c;calico.yaml&am…

Java版本spring cloud + spring boot企业电子招投标系统源代码 tbms

&#xfeff;功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&…

Charles抓包工具使用(一)(macOS)

Fiddler抓包 | 竟然有这些骚操作&#xff0c;太神奇了&#xff1f; Fiddler响应拦截数据篡改&#xff0c;实现特殊场景深度测试&#xff08;一&#xff09; 利用Fiddler抓包调试工具&#xff0c;实现mock数据特殊场景深度测试&#xff08;二&#xff09; 利用Fiddler抓包调试工…

java版直播商城平台规划及常见的营销模式+电商源码+小程序+三级分销+二次开发 bbc

&#xfeff; 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、R…

手机设置全局代理ip步骤

在互联网时代&#xff0c;隐私和安全问题备受关注。使用全局代理能够帮助我们保护个人信息&#xff0c;突破地理限制&#xff0c;并提高网络速度。但是&#xff0c;你是否对全局代理的安全性存有疑虑&#xff1f;而且&#xff0c;如何在手机上设置全局代理呢&#xff1f;今天就…

如何将文档、视频某页或某帧转换成图片?

目录 一、需求背景 二、引入依赖 三、根据自身的业务编写合适的代码 一、需求背景 博主的大概需求是&#xff0c;获取第一章第一节的课件&#xff08;有pdf、各种文档、视频等形式&#xff09;&#xff0c;生成课程的封面图片。 二、引入依赖 <dependency><groupI…

AI绘画:当艺术遇见智能

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 前言 随着人工智能技术…

接口自动化测试-Postman+Newman+Git+Jenkins实战集成(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Postman 创建…

[语义分割] LR-ASPP(MobileNet v3、轻量化、16倍下采样、膨胀卷积、ASPP、SE)

Searching for MobileNetV3 论文地址&#xff1a;Searching for MobileNetV3Pytorch 实现代码&#xff1a; https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_segmentation/lrasppMobileNet v3 LR-ASPP 这篇论文就是 MobileNet v3 的论…

golang interface类型的nil

golang中interface变量&#xff0c;底层两个对象来存&#xff0c;一个是type、一个是value&#xff0c;只有type、value都为nil时&#xff0c;interface变量才是nil package mainimport ("fmt""reflect" )type People interface {Show() }type Student str…

【数据结构】带头+双向+循环链表(DList)(增、删、查、改)详解

一、带头双向循环链表的定义和结构 1、定义 带头双向循环链表&#xff0c;有一个数据域和两个指针域。一个是前驱指针&#xff0c;指向其前一个节点&#xff1b;一个是后继指针&#xff0c;指向其后一个节点。 // 定义双向链表的节点 typedef struct ListNode {LTDataType dat…

LeetCode[面试题04.08]首个共同祖先

难度&#xff1a;Medium 题目&#xff1a; 设计并实现一个算法&#xff0c;找出二叉树中某两个节点的第一个共同祖先。不得将其他的节点存储在另外的数据结构中。注意&#xff1a;这不一定是二叉搜索树。 例如&#xff0c;给定如下二叉树: root [3,5,1,6,2,0,8,null,null,7,…