10.梯度、激活函数和loss
文章目录
- 梯度
- 1.初始状态
- 2.学习率
- 3.动量(怎么逃离局部最小值)
- 4.stochastic gradient descent
- 5.梯度消失和梯度爆炸、退化问题
- 常见的函数梯度
- 梯度API
- 1.torch.autograd.gard(loss[w1,w2,..])
- 2.loss.backward()
- 3.梯度更新
- 激活函数及其梯度
- 1.torch.sigmoid()
- 2.torch.tanh()
- 3.torch.relu()
- 4.softmax
- 5.Leaky ReLU
- 6.SELU
- 7.softplus
- Loss
- 1.MSE(优先使用)
- 2.Cross Entropy Loss交叉熵
- 1.Cross Entropy Loss
- p=q
- for one-hot encoding
- 实例
- 2.binary classification
- 求entropy
- 3.muti-class classification
- 3.Hinge Loss
- 4.分类问题为什么不选择MSE
梯度
神经网络中最为核心的概念,梯度。
梯度是一个向量,
第一,梯度的长度大小表达了某种趋势,第二,梯度的方向代表着增长(大值)的方向,朝着函数越来越大的方向走。
找到极小值
αt一般设置的比较小,可以更好地找到极小值。
除了马鞍的鞍点影响优化器,也就是搜索的过程外,还有:
1.初始状态
如果你的初始值在A点,很有可能当你到达x1时,得到局部最小值后就停止了。
2.学习率
当我们的学习率比较大时,步长就会比较大,可能下一个点直接就跨过了最小值到另一边了,对于一些较好的函数,可能会通过左右震荡,最终会收敛到最小值点。但大部分情况都是,最后无法收敛。最开始最好把学习率设置的小一点,例如0.01,0.001,若是收敛了,则慢慢增加学习率,训练的速度会变快,如果不收敛,则继续减少学习率。学习率还会影响训练的精度,有的时候,会不断在最小值左右震动,就是无法到达最小值点,此时需要慢慢减小学习率。
3.动量(怎么逃离局部最小值)
我们会添加一个动量,这个动量可以理解为一个惯性,帮助走出这个局部最小值。
4.stochastic gradient descent
把原来的在所有数据集的所有梯度均值变成在一个batch上的所有梯度均值
stochastic
有一定的随机性,但不是真正的random,给一个x,它对应的f(x)符合某个分布
deterministic
x与f(x)是一一对应。
5.梯度消失和梯度爆炸、退化问题
解决梯度消失、爆炸:对数据进行准化处理、权重初始化、以及BN标准化处理。
退化问题:残差结构
常见的函数梯度
梯度API
求梯度
1.torch.autograd.gard(loss[w1,w2,…])
loss对w求导
2.loss.backward()
直接进行w1.grad
3.梯度更新
反向传播后,要梯度更新:权重新=权重旧-lr*(loss对权重偏导)
激活函数及其梯度
激活就是指在x必须大于某个数后,才会激活,输出一个电平值。
激活函数存在一个重要概念,就是不可导。不能使用梯度下降的方法进行优化。使用启发式搜索来求解最优解。
1.torch.sigmoid()
比较适合模拟生物学上神经元的机制。Sigmod是可导的,
Sigmod导数=Sigmod(1-Sigmod)
Sigmod函数是连续的光滑的,且函数值压缩在0到1之间,概率、RGB都可以使用Sigmod函数。
缺点:梯度离散现象,求最优解时,因为x趋近于无穷小时等于0,loss保持不变,使得我们的最优解一直无法更新。
import torch
a=torch.linspace(-100,50,10)
print(a)
print(torch.sigmoid(a))
2.torch.tanh()
在RNN中常用。
tanh的导数=1-tanh**2
缺点:梯度离散现象
a=torch.linspace(-10,10,10)
print(a)
print(torch.tanh(a))
3.torch.relu()
ReLU(Rectified Linear Unit)是深度学习奠基石的激活函数,使用最多的。
做research时优先选择relu。
优点:一定程度上解决了sigmod函数的梯度离散现象。
当x小于0时不激活,且梯度是0,当x大于0时,线性激活,且梯度是1。导数计算起来非常简单,且不会放大缩小。x等于0时,一般梯度理解为0或1。
a=torch.linspace(-10,10,10)
print(a)
print(torch.relu(a))
4.softmax
与Cross Entropy Loss结合的激活函数。
首先,每个区间的概率值在0到1之间,且概率之和等于1,适合多分类问题。
pi对aj求导,当i=j时,得pi(1-pj),当i≠j时,得-pipj。
刚开始2是1的2倍,俩个值的概率大于2倍,即会把大的放的更大,把小的放的更密集,使差距变得更大。
a=torch.rand(3)
p=torch.softmax(a,dim=0)
print(p)
必须写dim。
5.Leaky ReLU
解决:ReLU在x小于0时梯度为0的情况
∝很小,且可在pytorch上设置。
6.SELU
SELU(x)=scale*(max(0,x)+min(0,∝*(exp(x)-1)))
relu=max(0,x)
7.softplus
是relu函数平滑的版本,在0附近是连续光滑的。
Loss
1.MSE(优先使用)
Mean Square Erro
采用torch.norm求解MSE,则torch.norm(y-pred,2)*pow(2),第一个2代表L2。
2.Cross Entropy Loss交叉熵
1.Cross Entropy Loss
熵entropy在信息学上的定义:
a=torch.full([4],1/4.)
print(a)
print(a*torch.log2(a))
print(-(a*torch.log2(a)).sum())
b=torch.tensor([0.1,0.1,0.1,0.7])
print(-(b*torch.log2(b)).sum())
c=torch.tensor([0.001,0.001,0.001,0.999])
print(-(c*torch.log2(c)).sum())
对于a,这四个数的增长度一样,熵较大,比较稳定。
对于b,前三个数的增长度较小,最后一个数增长都比较高,熵大概是1.3568,不稳定的。
对于c,前三个数代表发生概率极低,最后一个是极高,最后熵是0.0313,如果是这四分数中的幸运儿,则更加惊喜,因为这种情况发生概率很低。
从上到下越来越好,使我们朝着目标前进。
Dkl求散度,判断两者的重叠情况。
p=q
当p和q相等时,交叉熵就会等于某一个分布的熵
for one-hot encoding
若分布是[0,1,0,0],只有这一项的概率是1,则1log1=0,则H(p)=0。
实例
import torch
import torch.nn.functional as Fx=torch.randn(1,784)
w=torch.randn(10,784)logits=x@w.t()
print('logits shape',logits.shape)pred=F.softmax(logits,dim=1)
print('pred shape',pred.shape)pred_log=torch.log(pred)print('cross entropy:',F.cross_entropy(logits,torch.tensor([3])))
print('nll_loss后:',F.nll_loss(pred_log,torch.tensor([3])))
logits=xw+b
logits经过softmax函数后,得到pred
pred经过log函数,得到pred_log
使用cross entropy,此时必须使用logits,cross entropy把softmax和log在一起了。
cross entropy=softman+log+nll_loss,cross entropy相当于这三个操作一起。
2.binary classification
f:x->p(y=1|x)
如果p(y=1|x)>0.5(已经确定的阈值),预测为1,其他情况预测为0
求entropy
目标函数是-[ylog(p+(1-y)log(1-p))]
3.muti-class classification
f:x->p(y=y|x)
多类:p(y=0|x),p(y=1|x),…,p(y=9|x),每个的概率都是0到1,且总概率值为1。可通过softmax实现。
3.Hinge Loss
4.分类问题为什么不选择MSE
在一些前沿问题上,假如cross entropy不行时,可以选择使用MSE进行尝试
- sigmoid+MSE会很容易出现梯度离散现象
- cross entropy更大,梯度信息更大,收敛的更快。
10.梯度、激活函数和loss相关推荐
- (四)激活函数与loss梯度
(四)激活函数与loss梯度 激活函数 科学家对于青蛙的神经元的研究,发现青蛙的神经元有多个输入,中间是一个对输入加权的响应,但是这个响应不是线性的输出,而是基于一个阈值来作为标准,当响应值大于阈值时 ...
- 聊一聊CNN中的感受野、优化函数、激活函数、Loss函数等
目录: 1.感受野 2.优化函数 3.激活函数 4.loss 函数. 前言 文章有点长,内容有点丰富,基本涵盖整个深度卷积神经网络,涉及 网络中的感受野.激活函数.loss函数以及各种相关知识. Pa ...
- 激活函数和最常用的10个激活函数
1. 什么是激活函数 activation function 激活函数 是一种添加到ANN中的函数,它决定了最终要发射给下一个神经元的内容. 在人工神经网络中,一个节点的激活函数 定义了该节点在给定的 ...
- PyTorch教程(八):常见激活函数与Loss的梯度
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机. 如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近 ...
- 【2】激活函数与Loss函数求导
文章目录 1.常见的激活函数与梯度 Sign函数 Sigmoid函数 Tanh函数 ReLU函数 Softmax函数 Leaky ReLU函数 SELU函数 Softplus函数 2.常见的Loss与 ...
- 深度学习最常用的10个激活函数
那就让我们来整理一下深度学习中离不开的激活函数! 激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式.类似于人类大脑中基于神经元的模型 ...
- 深度学习最常用的10个激活函数!(数学原理+优缺点)
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Sukanya Bag,来源:机器之心 激活函数是神经网络模型重要 ...
- 深度学习领域最常用的10个激活函数,一文详解数学原理及优缺点
来源:机器之心.信息网络工程研究中心本文约2400字,建议阅读5分钟本文从激活函数的数学原理出发,详解了十种激活函数的优缺点. 激活函数是神经网络模型重要的组成部分,本文作者Sukanya Bag从激 ...
- 【CV】10分钟理解Focal loss数学原理与Pytorch代码
原文链接:https://amaarora.github.io/2020/06/29/FocalLoss.html 原文作者:Aman Arora Focal loss 是一个在目标检测领域常用的损失 ...
最新文章
- JAVA服务治理实践之无侵入的应用服务监控--转
- JDK 1.4 主要新特性
- [数论]Gcd/ExGcd欧几里得学习笔记
- 一个ABAP程序,能够下载指定的note到本地
- python调用键盘_使用 Python 控制自己的电脑和键盘是一种什么样的体验?
- 没有代码天赋的我,先退出了
- Robot Framework操作
- 导出函数__declspec(dllexport)
- mybatis从0到1--学mybatis看这一篇就足够
- javascript小方法之数组去重、数字转成逗号分隔、html元素去标签
- 计算机应用软件安装不了,应用程序无法正常启动,详细教您电脑应用程序无法正常启动0xc000007b怎么解决...
- 在我的网站 Φ十三月网Φ 开站前的宣传,当我是炒作,造势都可以,但是我们要的是有内涵。
- 【Android 教程系列第 31 篇】通过 adb install 命令安装 apk 时提示 signatures do not match previously installed version
- 服务器怎么买,腾讯云服务器购买三种流程介绍
- 国内洗地机品牌排行榜前十名有哪些?洗地机十大品牌排行榜介绍
- 简悦+Logseq 搭建本地化个人知识库
- 使用ADB命令连接手机、发送广播
- 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps
- XZ_iOS之内存泄露exc_bad_access
- php 怎么打印条形码,php – 直接从(zebra)打印机上的浏览器打印贴纸/条形码标签...