防止sigmoid和tanh激活函数溢出的C++实现

2023-11-18

引言

上一期,我们介绍了softmax函数的C++实现,但是考虑到sigmoid和tanh函数也是带 e e e的次幂,所以现在我们来考虑该函数的防止溢出实现。

sigmoid函数

原理

该函数的公式为:
1 1 + e − x \frac{1}{1+e^{-x}} 1+ex1
x ≥ 0 x\geq 0 x0的时候, e − x ≤ 1 e^{-x} \leq 1 ex1,不会溢出,但是在 x < 0 x < 0 x<0的时候,就有可能溢出了。所以在 x < 0 x<0 x<0时,我们可以做如下变换:
1 1 + e − x = 1 ⋅ e x ( 1 + e − x ) ⋅ e x = e x e x + 1 \frac{1}{1+e^{-x}}=\frac{1\cdot e^x}{(1+e^{-x})\cdot e^x}=\frac{e^x}{e^x+1} 1+ex1=(1+ex)ex1ex=ex+1ex
这样 e x < 1 e^x<1 ex<1,也不会溢出了。

实现

    double sigmoid(double x)
    {
        if (x > 0)
            return 1.0 / (1.0 + exp(-x));
        else
            return exp(x) / (1.0 + exp(x));
    }

tanh函数

原理

该函数的公式为:
e x − e − x e x + e − x \frac{e^x-e^{-x}}{e^x+e^{-x}} ex+exexex
那么在 x x x很大或者很小时,都有可能溢出,所以我们分开考虑。

1、 x ≥ 0 x\geq0 x0

这时 e x e^x ex可能溢出, e − x < 1 e^{-x}<1 ex<1不会溢出。我们进行如下变换:
e x − e − x e x + e − x = e − x ⋅ ( e x − e − x ) e − x ⋅ ( e x + e − x ) = 1 − e − 2 x 1 + e − 2 x \frac{e^x-e^{-x}}{e^x+e^{-x}}=\frac{e^{-x}\cdot (e^x-e^{-x})}{e^{-x}\cdot (e^x+e^{-x})}=\frac{1-e^{-2x}}{1+e^{-2x}} ex+exexex=ex(ex+ex)ex(exex)=1+e2x1e2x

1、 x < 0 x<0 x<0

这时 e − x e^{-x} ex可能溢出, e x < 1 e^{x}<1 ex<1不会溢出。我们进行如下变换:
e x − e − x e x + e − x = e x ⋅ ( e x − e − x ) e x ⋅ ( e x + e − x ) = e 2 x − 1 e 2 x + 1 \frac{e^x-e^{-x}}{e^x+e^{-x}}=\frac{e^{x}\cdot (e^x-e^{-x})}{e^{x}\cdot (e^x+e^{-x})}=\frac{e^{2x}-1}{e^{2x}+1} ex+exexex=ex(ex+ex)ex(exex)=e2x+1e2x1
这样就都不会溢出了。

实现

    double tanh(double x)
    {
        if(x > 0)
            return (1-exp(-2*x))/(1+exp(-2*x));
        else
            return (exp(2*x)-1)/(1+exp(2*x));
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止sigmoid和tanh激活函数溢出的C++实现 的相关文章

随机推荐

  • k8s功能介绍和常用命令

    一 Node篇 kubectl get nodes 查看所有node信息 kubectl get nodes owide 查看所有node的详细信息 kubectl get node o yaml 查看所有node的yaml文件 kubec
  • python: 获取 后缀名(扩展名) / 文件名

    method 使用 os path splitext file 0 可获得 文件名 使用 os path splitext file 1 可获得以 开头的 文件后缀名 code import os file Hello py 获取前缀 文件
  • [YOLO专题-26]:YOLO V5 - ultralytics代码解析-detect.py程序的流程图与对应的plantUML源码

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122443972 目录 第1章 det
  • 海南大学软件工程原理835考研

    海南大学835考研 2023考研已经落幕 我从2022 05 2023 03 用了大概一年的时间 目前已被海南大学计算机科学与技术学院录取 下面来谈谈我的学习感想 希望能给大家带来帮助 对于专业课 我用的是张海藩的软件工程导论第六版 和史济
  • MySQL数据库中随机获取一条或多条记录

    在开发过程中遇到了一个问题 使用MySQL数据库 用SQL语句在表中随机获取一条或多条数据 看似简单 但是往深层研究的话还是很有深度的 查了好多资料 接下来给大家分享一下 1 随机获取单条数据 SELECT FROM table name
  • springboot学习(一)——helloworld

    以下内容 如有问题 烦请指出 谢谢 springboot出来也很久了 以前零散地学习了不少 不过很长时间了都没有在实际中使用过了 忘了不少 因此要最近准备抽时间系统的学习积累下springboot 给自己留个根 因为以前学过一些 这里就主要
  • IDEA学习(一)——IDEA的安装

    最近IDE从Eclipse转到了IDEA 抽时间熟悉了一下IDEA相关的东西 在此记录一下说不定可以帮到有需要的同学 我们就先从IDEA的安装说起吧 需要说明一点的是IDEA是比较吃内存的 所以在安装IDEA之前最好确认的内存不要太小 最好
  • JavaScript运算符

    1 JavaScript运算符 算数运算符 运算符也叫做操作符 通过运算符可以对一个或则多个值进行运算 并获取运算结果 算数运算符 加 可以对两个值进行加法运算 如果是两个字符串则进行字符串拼接 任何值和字符串做加法运算 都会先转为字符串
  • 数据结构如何计算复杂度

    在学习具体的数据结构和算法之前 每一位初学者都要掌握一个技能 即善于运用时间复杂度和空间复杂度来衡量一个算法的运行效率 通过算法所编写出的程序的运行效率 程序的运行效率具体可以从 2 个方面衡量 分别为 程序的运行时间 程序运行所需内存空间
  • 熵值法计算权重有异常值_熵权法评价估计详细原理讲解

    写在前面 熵权法也属于一种综合评价方法 没有主观性 可与前面几篇文章提到的方法联合使用 目录 一 熵权法概述 1 1 信息论基础 1 2 熵权法介绍 二 熵权法赋权步骤 2 1数据标准化 2 2 求各指标在各方案下的比值 2 3 求各指标的
  • 一篇关于LLM指令微调的综述

    深度学习自然语言处理 原创作者 cola 指令微调 IT 是提高大型语言模型 LLM 能力和可控性的关键技术 其本质是指在由 INSTRUCTION OUTPUT 对组成的数据集上以监督的方式进一步训练LLM的过程 它弥合了LLM的下一个词
  • 线程连接池

    第一种 Executors newCacheThreadPool 可缓存线程池 先查看池中有没有以前建立的线程 如果有 就直接使用 如果没有 就建一个新的线程加入池中 缓存型池子通常用于执行一些生存期很短的异步型任务 package tes
  • FFPlay视频播放流程

    背景说明 FFmpeg是一个开源 免费 跨平台的视频和音频流方案 它提供了一套完整的录制 转换以及流化音视频的解决方案 而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器 学习ffplay对于播放器流程 ffmpeg的
  • 机器学习 day31(baseline、学习曲线)

    语音识别的Jtrain Jcv和人工误差 对于逻辑回归问题 Jtrain和Jcv可以用分类错误的比例 这一方式来代替 单单只看Jtrain 不好区分是否高偏差 可以再计算人类识别误差 即人工误差 作为基准线来进行比较 Jtrain与base
  • npm 常用指令介绍

    npm usage what is npm 实现js代码的复用 分享和管理 npm consists of three distinct components 1 the website 通过 www npmjs com 网址查找需要的 包
  • html 浇水动画,纯CSS3实现动画插件spinkit

    spinkit使用CSS3的特性实现多种动画效果 元素移动 放大缩小 翻转 进度条加载效果等等 使用了很多CSS3新的特性 是一个学习CSS3不错的网站 spinner width 30px height 30px background c
  • echarts自定义Y轴刻度及其颜色

    yAxis min 0 max 5 axisLabel color 999 textStyle fontSize 14 fontWeight 400 设置分段颜色 color function value console log 试试 va
  • 4399 C++笔试题

    1 写出一个函数 取到链表中倒数第二个节点 双链表 node getSec List mylist return mylist m tail gt m prev m prev为链表前指针 单链表 node getSec List mylis
  • 如何利用Jmeter从0到1做一次完整的压测?这2个步骤很关键!

    压测 在很多项目中都有应用 是测试小伙伴必备的一项基本技能 刚好最近接手了一个小游戏的压测任务 一轮压测下来 颇有收获 赶紧记录下来 与大家分享一下 希望大家能少踩坑 一 压测的时机 压测的时机很重要 如果时间选择不对 可能会做无用功 简单
  • 防止sigmoid和tanh激活函数溢出的C++实现

    引言 上一期 我们介绍了softmax函数的C 实现 但是考虑到sigmoid和tanh函数也是带 e e e的次幂 所以现在我们来考虑该函数的防止溢出实现 sigmoid函数 原理 该函数的公式为 1 1