【Tanh的标量实现】
cmath
文章目录
- 计算机是如何实现tanh计算的
- 一、tanh的一些基本内容
- 二、代码
- 1.我的实现例子
- 2.代码中分段函数的实现原理
- 补充
计算机是如何实现tanh计算的
一、tanh的一些基本内容
对于tanh函数有公式为 tanh(x)=(ex−e−x)/(ex+e−x)tanh(x) = (e^{x} -e^{-x}) / (e^{x}+e^{-x})tanh(x)=(ex−e−x)/(ex+e−x)。其定义域为R,原因是分母利用不等式可得>=2,所以无限制条件。
其次需要知道tanh的泰勒展开式,为tanh(x)=∑n=1∞22n(2n−1)B2nx2n−1(2n!)tanh(x) = \sum_{n=1}^{\infty} \frac {2^{2n} (2n-1)B_{2n}x^{2n-1}}{(2n!)} tanh(x)=n=1∑∞(2n!)22n(2n−1)B2nx2n−1
其中B2nB_{2n}B2n是伯努利数。
其函数图像如下:
一目了然,奇函数有$-tanh(x) = tanh(-x) $。因此我们只需要在正区间内讨论其值即可。
另外需要清楚这个导数公式,也可以证出其单调性,以及曲线趋于平直的点[tanh(x)]′=1−tanh2(x)[{tanh(x)}]' = 1-tanh^{2}(x)[tanh(x)]′=1−tanh2(x)
二、代码
1.我的实现例子
代码如下(示例):
#include <bits/stdc++.h>using namespace std;float myexp(float x){return 1+x+x*x/2+x*x*x/6+x*x*x*x/24+x*x*x*x*x*x/120;
}float mytanh(float x){int ix = (*(int*)&x) & 0x7fffffff; //去掉符号位 float t; //中间变量float z; //最终结果if(ix >= 0x7f800000){if(x >= 0) return 1; //+Inf else return 1/x - 1; //-Inf or NaN}if(ix < 0x41B00000){ //|x| < 22if(ix < 0x24000000){ //|x| < -55return x*(1+x);}if(ix >= 0x40000000){ //|x| >= 1t = myexp(2*ix)-1;z = 1 - 2/(t+2);}else{t = myexp(-2*ix)-1;z = -t/(t+2);}}else{return z = 1; // |x| > 22 return +-1}return (x >= 0)? z : -z;
}int main(){float i = 5.123456;float m = mytanh(i);float n = tanh(i);float q = m - n;cout << "mytanh = " << m << "cmath's tanh " << n << endl;cout << q;return 0;}
2.代码中分段函数的实现原理
1、在0<=x<=2−550 <= x <= 2^{-55}0<=x<=2−55时,有tanh(x)=x∗(1+x)tanh(x) = x*(1+x)tanh(x)=x∗(1+x)
2、在2−55<x<=12^{-55} < x <=12−55<x<=1时, 有tanh(x)=−tt+2tanh(x) = \frac{-t}{t+2}tanh(x)=t+2−t 其中t=e−2x−1t = e^{-2x}-1t=e−2x−1
3、在1<=x<221 <= x < 221<=x<22时,有tanh(x)=1−2t+2tanh(x) = 1 - \frac{2}{t+2}tanh(x)=1−t+22 其中t=e2x−1t = e^{2x}-1t=e2x−1
4、在22<x<inf22 < x < inf22<x<inf时,有tanh(x)=1tanh(x) = 1tanh(x)=1
下面对这四段函数进行具体解释:
对于第一段,是因为在x趋于一个很小的数值时近似有Tanh(x) = x,此时(1+x)约等于1,对于公式中逼近0的一段区间分子使用泰勒即为2x+2x22x+2x^{2}2x+2x2,分母就是2,所以可以直接得到x(1+x)这个式子。但是为什么是2−552^{-55}2−55这个值,还有待研究,但是确定的是这里使用一个较小的值即可
对于第二和第三段,对tanh(x)的公式进行通分化简即可得出结果,无误差。
对于第四段,便可以使用我们前边提到过的导数,令导数为0,也即求tanh(x)=1tanh(x) = 1tanh(x)=1的x的值,在计算器中我们可以得到tanh(17) 约等于 0.9999999999999964。tanh(18)约等于1,因此找到了一个点,但是在glibc中其使用了22作为这个点,大于这个点的x代入tanh(x)中均会得到结果1。
补充
代码中使用了位运算的技巧,需要清楚ieee754浮点数标准后进行阅读。这篇只是对tanh标量的初步认知,后面重点是进行向量化计算。
【Tanh的标量实现】相关推荐
- 【Python--torch(激活函数说明+代码讲解)】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)
[Python–torch]激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh) 文章目录 [Python--torch]激活函数(sigmoid/softmax ...
- 常用激活函数:Sigmoid/Softmax/ELU/ReLU/LeakyReLU/Tanh...(Pytorch)
激活函数 一.Sigmoid 1.介绍 2.实例 二.Softmax 1.介绍 2.实例 三.ELU:指数线性单元函数 1.介绍 2.实例 四.ReLU:整流线性单元函数 1.介绍 2.实例 五.Re ...
- scratch lenet(9): C语言实现tanh的计算
文章目录 1. 目的 2. tanh ( x ) \tanh(x) tanh(x) 的 naive 实现 2.1 数学公式 2.2 naive 实现 3. tanh ( x ) \tanh(x ...
- 机器学习入门(03)— 激活函数分类(阶跃函数和 sigmoid 函数的理论、实现、显示以及区别、非线性函数、ReLU 函数、tanh 函数)
各种激活函数介绍,请参考下面链接: https://en.wikipedia.org/wiki/Activation_function 1. 阶跃函数 1.1 理论 式(3.3)表示的激活函数以阈值为 ...
- Python的标量与矢量运算分析
文章目录 技术背景 NumPy Pytorch TensorFlow Numba Cython 标量运算 矢量运算 经验总结 技术背景 Python 的官方解释器是用 C 实现的 CPython .其 ...
- 常用的激活函数(Sigmoid、Tanh、ReLU等)
目录 一.激活函数定义 二.梯度消失与梯度爆炸 1.什么是梯度消失与梯度爆炸 2.梯度消失的根本原因 3.如何解决梯度消失与梯度爆炸问题 三.常用激活函数 1.Sigmoid 2.Tanh 3.ReL ...
- 深度学习常用的激活函数以及python实现(Sigmoid、Tanh、ReLU、Softmax、Leaky ReLU、ELU、PReLU、Swish、Squareplus)
2022.05.26更新 增加SMU激活函数 前言 激活函数是一种添加到人工神经网络中的函数,类似于人类大脑中基于神经元的模型,激活函数最终决定了要发射给下一个神经元的内容. 此图来自百度百科,其中s ...
- NumPy — 创建全零、全1、空、arange 数组,array 对象类型,astype 转换数据类型,数组和标量以及数组之间的运算,NumPy 数组共享内存
NumPy 简介 一个用 python 实现的科学计算包.包括: 1.一个强大的 N 维数组对象 Array : 2.比较成熟的(广播)函数库: 3.用于整合 C/C++ 和 Fortran 代码的工 ...
- 机器学习中的标量、向量、矩阵、和张量的概念
在线性代数中,我们必须掌握几个核心概念:标量.向量.矩阵和张量,它们是构成线性代数学科的基石. 标量 (Scalar) 标量其实就是一个独立存在的数,比如在线性代数中一个实数 5 就可以被看作一个标量 ...
最新文章
- 联想重启乐檬?5G时代手机双品牌战略带来变局
- (0065)iOS开发之工具条UIToolBar
- CocosEditor 1.0Final-IDEA13.0和1.5-IDEA13.1 发布–2014.03.25
- 10道C++输出易错笔试题收集
- 基类的构造函数也可以被继承_「C++ Primer plus 心得」13.类继承
- mongoose日期 时间 范围查询
- ARKit:增强现实技术在美团到餐业务的实践
- 2019日历全年一张_python 日历模块calendar
- bond解除 centos7_centos7上实现bonding
- Perl opendir()函数
- Python为视频设置遮罩实现异形窗口播放
- 静态检查------SourceMonitor的学习和使用
- android中横向滑动功能,Android开发基于ViewPager+GridView实现仿大众点评横向滑动功能...
- easyui 获取cloumns字段
- 记录一个小程序 input输入框格式手机号方法
- 跨省市跳槽,社保公积金处理办法
- 什么是EMC?什么是EMI?什么是EMS?电磁兼容详解(一)
- 银广夏事件--中国股票财务作假事件
- 微信小程序支付V3(Java版)
- java毕业设计搬家预约系统Mybatis+系统+数据库+调试部署