sigmoid

sigmoid函数和tanh函数是研究早期被广泛使用的2种激活函数。两者都为S型饱和函数。

  1. 当sigmoid 函数输入的值趋于正无穷或负无穷时,梯度会趋近零,从而发生梯度弥散现象
  2. sigmoid函数的输出恒为正值,不是以零为中心的,这会导致权值更新时只能朝一个方向更新,从而影响收敛速度。

tanh激活函数是sigmoid 函数的改进版,是以零为中心的对称函数,收敛速度快,不容易出现 loss 值晃动,但是无法解决梯度弥散的问题

2个函数的计算量都是指数级的,计算相对复杂。softsign 函数是 tanh 函数的改进版,为 S 型饱和函数,以零为中心,值域为(−1,1)。

公式

更多可以直接看

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
# -*- coding: utf8 -*-#import math

import torchfrom torch.functional import F

print('sigmoid'.center(60, '-'))

def sigmoid(x):    return 1 / (1 + math.exp(-x))

print(torch.sigmoid(torch.tensor([1., 2.])))print([sigmoid(1.), sigmoid(2.)])

print('softmax'.center(60, '-'))

def softmax(xs):    z_exp = [math.exp(x) for x in xs]    sum_z_exp = sum(z_exp)    return [_z_exp / sum_z_exp for _z_exp in z_exp]

print(torch.softmax(torch.tensor([1., 2., 7.]), dim=-1))print(softmax([1., 2., 7.]))

print('tanh'.center(60, '-'))

def tanh(x):    return (math.exp(x) - math.exp(-x)) / (math.exp(x) + math.exp(-x))

print(torch.tanh(torch.tensor([1., 2.])))print([tanh(1.), tanh(2.)])

print('cross_entropy'.center(60, '-'))import torch

def my_cross_entropy(input, target, reduction="mean"):    # input.shape: torch.size([-1, class])    # target.shape: torch.size([-1])    # reduction = "mean" or "sum"    # input是模型输出的结果,与target求loss    # target的长度和input第一维的长度一致    # target的元素值为目标class    # reduction默认为mean,即对loss求均值    # 还有另一种为sum,对loss求和

    # 这里对input所有元素求exp    exp = torch.exp(input)    # 根据target的索引,在exp第一维取出元素值,这是softmax的分子    tmp1 = exp.gather(1, target.unsqueeze(-1)).squeeze()    # 在exp第一维求和,这是softmax的分母    tmp2 = exp.sum(1)    # softmax公式:ei / sum(ej)    softmax = tmp1 / tmp2    # cross-entropy公式: -yi * log(pi)    # 因为target的yi为1,其余为0,所以在tmp1直接把目标拿出来,    # 公式中的pi就是softmax的结果    log = -torch.log(softmax)    # 官方实现中,reduction有mean/sum及none    # 只是对交叉熵后处理的差别    if reduction == "mean":        return log.mean()    else:        return log.sum()

# example1# input = torch.randn(3, 5,)# target = torch.randint(5, (3,), dtype=torch.int64)# example2input = torch.tensor([[0.1, 0.9], [0.9, 0.1]])target = torch.tensor([1, 0])# example3# input = torch.tensor([[0., 1.], [1., 0.]])# target = torch.tensor([1, 0])loss1_mean = F.cross_entropy(input, target)loss2_mean = my_cross_entropy(input, target)print(loss1_mean)print(loss2_mean)

loss1_sum = F.cross_entropy(input, target, reduction="sum")loss2_sum = my_cross_entropy(input, target, reduction="sum")print(loss1_sum)print(loss2_sum)

def bce_loss_with_logit(y_pred, y_true, reduction='mean'):    y_pred = sigmoid(y_pred)

    loss = -y_true * torch.log(y_pred) - (1 - y_true) * torch.log(1 - y_pred)    if reduction == 'mean':        return torch.mean(loss)    raise NotImplementedError

交叉熵

有木有发现,伯努利分布加上log就是交叉熵。

另外其实可以理解交叉熵就是极大似然估计加上log。

如何解释梯度消失呢?

描述

梯度消失是指模型在反向传播的过程中,更上层模型获取到的梯度值越来越小,导致更上层的权重基本保持不变,导致整个模型无法正常收敛以及训练。

原因?
其出现原因在Xavier Glorot和Yoshua Bengio在2010年的一篇论文中阐述了一些观点,包含像当时流行的sigmoid激活函数以及均值为0标准差为1的权重初始化方案,每层输出的方差远大于输入的方差,随着网络的延伸,方差在每一层之后都会增加,直到激活函数在顶层达到饱和为止。而实际像simoid这种激活函数随x的增大其导数值趋向于0,导致在反向传播的过程中,基本没有什么可以传播回去。

解决方式?

他提出应该在每一层网络的输出的方差等于其输入的方差。但是除非该层具有相等数量的输入和神经元,否则这条条件无法满足,故提出一些这种方案,像Xavier初始化或者Glorot初始化。

激活函数以及损失函数相关推荐

  1. Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解

    Keras深度学习实战(4)--深度学习中常用激活函数和损失函数详解 常用激活函数 Sigmoid 激活函数 Tanh 激活函数 ReLU 激活函数 线性激活函数 Softmax 激活函数 损失函数 ...

  2. 深度学习关于激活函数和损失函数的调研

    关于激活函数和损失函数的调研 1) 激活函数(Activation Function) 背景 Sigmoid函数 tanh函数 Relu函数 Leaky Relu函数(PReLu) ELU(Expon ...

  3. 神经网络中的激活函数与损失函数深入理解推导softmax交叉熵

    神经网络中的激活函数与损失函数&深入理解softmax交叉熵 前面在深度学习入门笔记1和深度学习入门笔记2中已经介绍了激活函数和损失函数,这里做一些补充,主要是介绍softmax交叉熵损失函数 ...

  4. randn函数加噪声_NLP入门指南01:感知机、激活函数、损失函数

    单层感知机 最简单的神经网络单元,感知机模拟生物神经元而来,有输入.输出,信号从输入流向输出. 每一个感知机都有一个输入 ,一个输出 ,和三个参数构成,它们分别是: 权重(weight) 偏置(bia ...

  5. 激活函数、损失函数和优化函数的比较

    激活函数:将神经网络上一层的输入,经过神经网络层的非线性变换转换后,通过激活函数,得到输出.常见的激活函数包括:sigmoid, tanh, relu等. 损失函数:度量神经网络的输出的预测值,与实际 ...

  6. Tensorflow2.1基础知识---复杂度、学习率、激活函数、损失函数

    文章目录 复杂度 学习率 激活函数 损失函数 复杂度 空间复杂度(用层数和待优化的参数个数表示) 层数 = 隐藏层的层数+1个输出层(输入层不算) 总参数 = 总w + 总b 时间复杂度: 乘加运算次 ...

  7. 激活函数与损失函数及其常见问题

    一.激活函数 Sigmoid.tanh.ReLU.LeakyReLU.PReLU.RReLU 0.激活函数的作用 神经网络为什么需要激活函数:首先数据的分布绝大多数是非线性的,而一般神经网络的计算是线 ...

  8. 激活函数,损失函数以及学习率

    学习记录 (一)激活函数 1. 什么是激活函数 2. 常用的激活函数 2.1 sigmoid函数 2.2 tanh函数 2.3 ReLU函数 2.4 Leaky ReLU函数 3. 为什么要用非线性激 ...

  9. (tensorflow笔记)神经网络中的一些关键概念(学习率、激活函数、损失函数、欠拟合和过拟合、正则化和优化器)

    目录 1.神经网络复杂度 空间复杂度 时间复杂度 2.学习率策略 指数衰减学习率 分段常数衰减 3.激活函数 sigmoid tanh ReLU Leaky ReLU 建议 4.损失函数 均方误差损失 ...

  10. 【深度学习】激活函数和损失函数

    4.3 激活函数 作用: 当神经网络中上一层的输出直接作为下一层的输入时,每层之间的关系是线性关系,即相当于f(x)=x,此时神经网络的拟合能力较弱.为了使得神经网络有更好的拟合能力,在每一层网络之间 ...

最新文章

  1. 写了个Linux包过滤防火墙
  2. 用C语言扩展Python的功能
  3. ubuntu QT 编译报错 -1: error: cannot find -lGL问题的解决方法
  4. 第一节:从面向对象思想(oo)开发、接口、抽象类以及二者比较
  5. (ECC)椭圆曲线加密算法原理和C++实现源码
  6. Bitmap文件格式+生成一个BMP文件
  7. 一步一步分析vue之_data属性
  8. python发送邮件并返回提示_python-邮件提醒功能
  9. Redis如何支持高并发的访问
  10. 以命令行的方式运行activity
  11. vim编辑器常见使用
  12. MySQL的常用SQL脚本
  13. 车座自动排水阀行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  14. Q96:PT(1):方格纹理(Checker)(2)——2D Checker
  15. FileRecv VNCViewer 使用方法
  16. 兄弟连php课程大纲,LAMP兄弟连PHP课程学习笔记 第四天 流程控制分支语句
  17. 中央处理器cpu中的什么是计算机的指挥中,计算机中央处理器CPU的组成有哪些
  18. 优秀IT项目经理的基本要求
  19. Congrats !
  20. opencv 图片上画一条线

热门文章

  1. Google的PageRank算法
  2. 如何在CentOS 7中安装内核头文件
  3. 多核时代:并行程序设计探讨(7)——并行编程模式概览
  4. MybatisPlus为什么可以不用@MapperScan
  5. JAVA接入支付宝授权第三方登录
  6. Linux修改挂载点
  7. 提示文件过大无法复制到U盘怎么解决
  8. 路由器的System Verilog验证平台
  9. 聊天没有表情包被嘲讽,用python爬取了十万张表情包
  10. python减法报错_python – numpy FloatingPointError:减法中遇到的值无效 – 不可重现?...