栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

引言

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

sigmoid函数 原理

该函数的公式为:
1 1 + e − x frac{1}{1+e^{-x}} 1+e−x1​
在 x ≥ 0 xgeq 0 x≥0的时候, e − x ≤ 1 e^{-x} leq 1 e−x≤1,不会溢出,但是在 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{1cdot e^x}{(1+e^{-x})cdot e^x}=frac{e^x}{e^x+1} 1+e−x1​=(1+e−x)⋅ex1⋅ex​=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+e−xex−e−x​
那么在 x x x很大或者很小时,都有可能溢出,所以我们分开考虑。

1、 x ≥ 0 xgeq0 x≥0时

这时 e x e^x ex可能溢出, e − x < 1 e^{-x}<1 e−x<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+e−xex−e−x​=e−x⋅(ex+e−x)e−x⋅(ex−e−x)​=1+e−2x1−e−2x​

1、 x < 0 x<0 x<0时

这时 e − x e^{-x} e−x可能溢出, 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+e−xex−e−x​=ex⋅(ex+e−x)ex⋅(ex−e−x)​=e2x+1e2x−1​
这样就都不会溢出了。

实现
    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));
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850332.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号