当前位置: 首页 > news >正文

鄂尔多斯网站建设鄂尔多斯wordpress国内开发

鄂尔多斯网站建设鄂尔多斯,wordpress国内开发,网站开发面板,wordpress网页打不开文章目录 权重初始化梯度消失与梯度爆炸 Hi#xff0c;你好。我是茶桁。 咱们这节课会讲到权重初始化、梯度消失和梯度爆炸。咱们先来看看权重初始化的内容。 权重初始化 机器学习在我们使用的过程中的初始值非常的重要。就比如最简单的wxb#xff0c;现在要拟合成一个yha… 文章目录 权重初始化梯度消失与梯度爆炸 Hi你好。我是茶桁。 咱们这节课会讲到权重初始化、梯度消失和梯度爆炸。咱们先来看看权重初始化的内容。 权重初始化 机器学习在我们使用的过程中的初始值非常的重要。就比如最简单的wxb现在要拟合成一个yhatw如果初始的过大或者初始的过小其实都会比较有影响。 假设举个极端情况就是w拟合的时候刚刚就拟合到了离x很近的地方我们想象一下这个时候是不是学习起来就会很快所以对于深度学习模型权重的初始化是一个非常重要的事情甚至有人就说把初始化做好了其实绝大部分事情就已经解决了。 那么我们怎么样获得一个比较好的初始化的值首先有这么几个原则 我们的权重值不能设置为0。尽量将权重变成一个随机化的正态分布。而且有更大的X输入那我们的权重就应该更小。 l o s s ∑ ( y ^ − y i ) 2 ∑ ( ∑ w i x i − y i ) 2 \begin{align*} loss \sum(\hat y - y_i)^2 \\ \sum(\sum w_ix_i - y_i)^2 \end{align*} loss​∑(y^​−yi​)2∑(∑wi​xi​−yi​)2​ 我们看上面的式子yhat就是w_i*x_i, 这个时候x_i可能是几百万也可能是几百。我们w_i取值在(-n, n)之间那当x_i维度特别大的时候那yhat值算出来的也就会特别大。所以x_i的维度特别大的时候我们期望w_i值稍微小一些否则加出来的yhat可能就会特别大那最后求出来的loss也会特别大。 如果loss值特别大可能就会得到一个非常的梯度。那我们知道学习的梯度特别大的话就会发生比较大的震荡。 所以有一个原则就是当x的dimension很大的时候, 我们期望的它的权重越小。 那后来就有人提出来了一个比较重要的初始化方法Xavier初始化。这个方法特别适用于sigmoid激活函数或反正切tanh激活函数它会根据前一层和当前层的神经元数量来选择初始化的范围以确保权重不会过大或过小。 均值为 0 和标准差的正态分布 : σ 2 n i n p u t s n o u t p u t s − r 和 r 之间的均匀分布 r 6 n i n p u t s n o u t p u t s \begin{align*} 均值为0和标准差的正态分布: \sigma \sqrt{\frac{2}{n_{inputs}n_{outputs}}} \\ -r和r之间的均匀分布r \sqrt{\frac{6}{n_{inputs}n_{outputs}}} \end{align*} 均值为0和标准差的正态分布:σ−r和r之间的均匀分布r​ninputs​noutputs​2​ ​ninputs​noutputs​6​ ​​ 然后W的均匀分布就会是这样 W ∼ U ∣ − 6 n j n j 1 , 6 n j n j 1 W \sim U \Bigg \vert -\frac{\sqrt 6}{\sqrt{n_j n_{j1}}}, \frac{\sqrt 6}{\sqrt{n_j n_{j1}}} W∼U ​−nj​nj1​ ​6 ​​,nj​nj1​ ​6 ​​ 这个是一个比较有名的初始化方法如果要做函数的初始化的话PyTorch在init里面有一个方法 torch.nn.init.xavier_uniform_(tensor, gain1.0)比如我们看这样例子 w torch.empty(3, 5) nn.init.xavier_uniform_(w, gainnn.calculate_gain(relu))注意: init方法里还有其他的一些方法大家可以查阅PyTorch的相关文档https://pytorch.org/docs/stable/nn.init.html 梯度消失与梯度爆炸 当我们的模型层数特别多的时候 就比如我们上节课用到的Sequential我们可以在里面写如非常多的一个函数 model nn.Sequential(nn.Linear(in_features10, out_features5).double(),nn.Sigmoid(),nn.Linear(in_features5, out_features8).double(),nn.Sigmoid(),nn.Linear(in_features8, out_features8).double(),nn.Sigmoid(),...nn.Linear(in_features8, out_features8).double(),nn.Softmax(), )这样在做偏导的时候我们其中几个值特别小那两个一乘就会乘出来一个特别特别小的数字。最后可能会导致一个结果 ∂ l o s s ∂ w i \frac{\partial loss}{\partial wi} ∂wi∂loss​的值就会极小它的更新就会特别的慢。我们把这种东西就叫做梯度消失也有人叫梯度弥散。 以Sigmoid函数为例其导数为 σ ′ ( x ) σ ( x ) ( 1 − σ ( x ) ) \begin{align*} \sigma (x) \sigma(x)(1-\sigma(x)) \end{align*} σ′(x)σ(x)(1−σ(x))​ 在x趋近正无穷或者负无穷时导数接近0。当这种小梯度在多层网络中相乘的时候梯度会迅速减小导致梯度消失。 除此之外还有一种情况叫梯度爆炸剃度爆炸类似当模型的层很多的时候如果其中某两个值很大例如两个102当这两个乘起来就会变成104。乘下来整个loss很大又会产生一个结果我们来看这样一个场景 假如说对于上图中这个函数来说横轴为x, 竖轴为loss对于这个xi来说这个地方 ∂ l o s s ∂ x i \frac{\partial loss}{\partial xi} ∂xi∂loss​已经是一个特别大的数字了。 假设咱们举个极端的情况忽略图中竖轴上的数字我们现在loss等于x^4 l o s s x 4 lossx^4 lossx4然后现在 ∂ l o s s ∂ x 4 \frac{\partial loss}{\partial x^4} ∂x4∂loss​就等于 4 x 3 4x^3 4x3我们假设x在A点当x10的时候那 4 × x 3 4000 4\times x^3 4000 4×x34000 那我们计算新的xi就是 x i x i − α ⋅ ∂ l o s s ∂ x i x_i x_i - \alpha \cdot \frac{\partial loss}{\partial x_i} xi​xi​−α⋅∂xi​∂loss​现在给alpha一个比较小的数我们假设是0.1那式子就变成 10 − 0.1 × 4000 10 - 0.1 \times 4000 10−0.1×4000结果就是-390。 我们把它变到-390之后本来我们本来做梯度下降更新完xi期望的是loss要下降但是我们结合图像来看xi-390的时候loss就变得极其的巨大了然后我们在继续(-390)^4 这个loss就已经爆炸了。 再继续的时候会发现会在极值上跳来跳去loss就无法进行收敛了。所以我们也要拒绝这种情况的发生。 那梯度消失和梯度爆炸这两个问题该如何解决呢我们来看第一种解决方法 Batch normalization批量归一化。 那这个方法的核心思想是对神经网络的每一层的输入进行归一化使其具有零均值和单位方差。 那么首先对于每个mini-batch中的输入数据计算均值和方差。 B { x 1 . . . m } B \{x_1...m\} B{x1​...m}; 要学习的参数: γ , β \gamma,\beta γ,β。 μ B 1 m ∑ i 1 m x i σ B 2 1 m ∑ i 1 m ( x i − μ B ) 2 μ 为均值 m e a n σ 为方差 \begin{align*} \mu_B \frac{1}{m}\sum^m_{i1}x_i \\ \sigma ^2_B \frac{1}{m}\sum_{i1}^m(x_i-\mu_B)^2 \\ \mu 为均值mean \sigma为方差 \end{align*} μB​σB2​​m1​i1∑m​xi​m1​i1∑m​(xi​−μB​)2μ为均值meanσ为方差​ 这里和咱们之前讲x做normalization的时候其实是特别相似基本上就是一件事。 然后我们使用均值和方差对输入进行归一化使得其零均值和单位方差即将输入标准化为xhat。 x ^ i x i − μ B σ B 2 ε \begin{align*} \hat x_i \frac{x_i - \mu_B}{\sqrt{\sigma ^2_B \varepsilon}} \end{align*} x^i​σB2​ε ​xi​−μB​​​ 接着我们对归一化后的输入应用缩放和平移操作以允许网络学习最佳的变换。 y i γ x ^ i β ≡ B N γ , β ( x i ) \begin{align*} y_i \gamma \hat x_i \beta \equiv BN_{\gamma,\beta}(x_i) \end{align*} yi​γx^i​β≡BNγ,β​(xi​)​ 输出为 { y i B N γ , β ( x i ) } \{y_i BN_{\gamma,\beta}(x_i)\} {yi​BNγ,β​(xi​)}。 最后将缩放和平移后的数据传递给激活函数进行非线性变换。 它会输入一个小批量的x值 经过反复的梯度下降会得到一个gamma和beta能够知道在这一步x要怎么样进行缩放在缩放之前会经历刚开始的时候那个normalization一样把把过小值会变大把过大值会变小。 我们在之前的课程中演示过没看过和忘掉的同学可以往前翻看一下。 然后在经过这两个可学习的参数进行一个变化这样它可以做到在每一层x变化不会极度的增大或者极度的缩小可以让我们的权值保持的比较稳定。 那除了Batch normalization之外还有一个方法叫Gradient clipping 它是可以直接将过大的梯度值变小。 它其实很简单也叫做梯度减脂。 如果我们求解出来 ∂ l o s s ∂ w i \frac{\partial loss}{\partial w_i} ∂wi​∂loss​很大假设原来等于400我们定义了一个100那超过100的部分就全部设置成100。 train_loss.backward() pt.nn.units.clip_grad_value_(model.parameters(), 100) optimizer.step()简单粗暴。那其实梯度爆炸还是比较容易解决的比较复杂的其实是梯度消失的问题。 梯度爆炸为什么比较容易解决梯度爆炸起码是有导数的只要把这个导数给它放的特别小就行了有导数起码保证wi可以更新。 假设alpha我们的learning_rate等于0.01乘上一个100可以保证每次可以有个变化。但是每次这个梯度特别小假如都快接近于0了那么1e-10, 就算乘上100倍最后还是一个特别小的数字。所以相较而言梯度爆炸就更好解决一些方法更粗暴一些。 补充一个知识点这个虽然现在已经用不到了但是对我们的理解还是有帮助的。方法比较古老。 就是当我们发现梯度有问题的时候 大概在10年前那个时候神经网络的模块也不太丰富很多新出的model做神经网络的人一些导数传播什么的都需要自己写就我们前几节课写那个神经网络框架的时候做的事。 有的时候导数写错了就有一种方法叫做gradient checking梯度检查。 这个使用场景非常的少当你自己发明了一个新的模块加到这个模型里面的时候会遇到。 其实很简单就是把最终的 ∂ l o s s ∂ w i \frac{\partial loss}{\partial w_i} ∂wi​∂loss​求解出来的偏导总是不收敛可能是这个偏导有问题那么有可能求导的函数写错了。 那在这个时候就可以做个简单的变化 ∂ l o s s ( θ ε ) − ∂ l o s s ( θ − ε ) 2 ε \begin{align*} \frac{\partial loss(\theta\varepsilon)-\partial loss(\theta - \varepsilon)}{2\varepsilon} \end{align*} 2ε∂loss(θε)−∂loss(θ−ε)​​ 这其中 ∂ l o s s ( θ ε ) \partial loss(\theta \varepsilon) ∂loss(θε)和 ∂ l o s s ( θ − ε ) \partial loss(\theta - \varepsilon) ∂loss(θ−ε)是在参数 θ \theta θ, 其实也就是我们的wi上添加和减去微小扰动theta后的损失函数值。 然后我们计算数值梯度和反向传播计算得到的梯度之间的差异。通常这是通过计算它们之间的差异来完成然后将其与一个小的阈值比如1e-7进行比较。如果差异非常小小于阈值则可以认为梯度计算是正确的否则可能就需要从新写一下偏导函数了。 这个比较难但不是一个重点当且仅当自己要发明一个模型的时候。 那接下来我们来看一下关于Learning_rate和Early Stopping的问题。 理论上如果深度学习效果不好那么我们可以将learning rate调小可以让所有模型效果变得更好它可以让所有的loss下降。 但是如果你的learning rate变得特别小假如说是1e-9那这样的结果就是w的变化会非常的慢训练时间就变得很长。为了解决这个问题就有一些比较简单的方法。 第一个我们可以把learning rate和loss设置成一个相关的函数例如说loss越小的时候Learning rate越小或者随着epoch的增大loss越小。这个就叫learning rate的decay。 将learning rate或者训练次数和loss设置成一个相关的函数那么越到后面效果越好的时候learning rate就会越小。 还有我们可能会发现loss连续k次不下降那我们就可以提前结束训练过程这个就是Early Stopping。 也就是当你发现loss连续k次不下降或者甚至于在上升那么这个时候就可以将最优的这个值给它记录下来。 咱们可能会经常出现的情况就是值在那里震荡本来呢已经快接近于最优点了可是震荡了几次之后还可能震荡出去了loss变大了。或者就一直在这个震荡里边出不去这个时候多学习也没有用所以就可以早点停止这个就是Early Stopping中文有人称呼它为早停方法。 好下节课咱们要讲一个重点也是一个难点。就是咱们做机器学习的时候不同的优化方法。
http://www.zqtcl.cn/news/348133/

相关文章:

  • 手机营销网站制作网站建设备案和免备案的区别
  • 浙江省住房和城乡建设厅网站打不开中国建设银行官网站纪念币预约
  • 推广软件的网站安徽省城乡建设网站
  • 用网站做淘宝客怎么样珍爱网
  • 龙岩建设局招聘网站网站dns解析失败
  • 音乐网站的音乐怎么做深圳美容网站建设
  • 贵阳市观山湖区网站建设wordpress博客vieu模板
  • 怎么区分网站的好坏网站建设营销型号的区别
  • wordpress固定链接 中文建设网站优化
  • 东莞地产网站建设简述建设iis网站的基本过程
  • 外贸网站建设 公司价格怎样在手机上制作网站
  • 网站建设电话销售录音企业做网站有什么用
  • 网站布局设计软件软件工程大学排名
  • 自己的网站做防伪码深圳软件开发公司招聘
  • 网上购物网站大全wordpress文本悬停变色
  • 科技类公司网站设计如何做各大网站广告链接
  • 深圳做h5网站制作奢侈品网站设计
  • 用什么程序做网站佛山网站建设慕枫
  • 萍乡网站建设哪家公司好惠州开发做商城网站建设哪家好
  • 2021半夜好用的网站在菲做平台网站
  • 国家排污许可网站台账怎么做wordpress表单位插件
  • 如何构建成交型网站wordpress搭建英文网站
  • 阿里云网站建设方案书怎么写四川做网站公司哪家好
  • 提供衡水网站建设wordpress游客看小图登陆查看大图
  • 网站开发优势wordpress 密码破解
  • 做网站空间需要多大深圳服装网站建设
  • 建网站wordpress制作app多少钱一个
  • 怎么做装修网站torrentkitty磁力猫
  • 网站建立站点wordpress手机网站模板制作
  • 宁夏建设工程招标投标信息网站教师做网站赚钱