首页
学习
活动
专区
圈层
工具
发布

【像训练CNN一样快速训练RNN】全新RNN实现,比优化后的LSTM快10倍

项目已经开源:https://github.com/taolei87/sru 先看论文摘要,有个大概的了解: 标题非常直接,也是很多人都想实现的——《像训练CNN一样快速训练RNN》: ?...我们所提出的循环单元,运行速度与卷积层一样快,比cuDNN优化的LSTM快5-10倍。我们展示了这种循环单元在广泛应用中的有效性,包括分类、问答、语言建模、翻译和语音识别。...我们开源了在PyTorch和CNTK中的实现。 简单循环单元SRU,简化状态计算,速度与CNN一样快 近来深度学习取得的许多进展都源于模型容量的增加和计算力的相应提升。...因此,SRU中的所有矩阵乘法(即gemm)和元素方面的操作可以在不同的维度和步骤中实现并行化。 SRU实现:增加highway连接和变分dropout 那么,SRU是怎么实现的呢?...然后,作者将 和步骤t的神经门之间的连接全部丢弃,以这种方法来加速循环计算。相比之下,现有的RNN在实现时是要使用先前的输出状态 的。

2.7K50

一个Sqrt函数引发的血案

我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢?...比如求sqrt(16)的结果,你先试(0+16)/2=8,8*8=64,64比16大,然后就向左移,试(0+8)/2=4,4*4=16刚好,你得到了正确的结果sqrt(16)=4。...这次真的是质变了,结果竟然比系统的还要好。。。哥真的是震惊了!!!哥吐血了!!!一个函数引发了血案!!!血案,血案。。。 到现在你是不是还不明白那个“鬼函数”,到底为什么速度那么快吗?...它的作用是将一个数开平方并取倒,经测试这段代码比(float)(1.0/sqrt(x))快4倍: float Q_rsqrt( float number ) { long i; float x2,...编译,实验,这个函数不仅工作的很好,而且比标准的sqrt()函数快4倍!要知道,编译器自带的函数,可是经过严格仔细的汇编优化的啊!

1.4K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一个 Sqrt 函数引发的血案

    我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢?...比如求sqrt(16)的结果,你先试(0+16)/2=8,88=64,64比16大,然后就向左移,试(0+8)/2=4,44=16 刚好,你得到了正确的结果 sqrt(16)=4。...到现在你是不是还不明白那个“鬼函数”,到底为什么速度那么快吗?不急,先看看下面的故事吧: Quake-III Arena (雷神之锤3)是 90 年代的经典游戏之一。...它的作用是将一个数开平方并取倒,经测试这段代码比(float)(1.0/sqrt(x))快4倍: float Q_rsqrt( float number ) 2{ long i; float...编译,实验,这个函数不仅工作的很好,而且比标准的sqrt()函数快4倍!要知道,编译器自带的函数,可是经过严格仔细的汇编优化的啊!

    1.2K40

    深度:震惊世间的惊人代码(附完整代码)

    long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number;...函数返回1/sqrt(x),这个函数在图像处理中比sqrt(x)更有用。 注意到这个正数只用了一次叠代!(其实就是根本没用叠代,直接运算)。...编译、实验,这个团数不仅工作的很好,而且比标准的sqrt()函数快4倍!...囊括世界万物的一段代码 这是一段使用Processing语言的代码,这短短的几行代码永无休止的就在做一件事——“穷举”。那么它又有什么特殊之处吗?...:,主要的核心代码是:|:&,可以看出这是一个函数本身的递归调用,通过&实现在后台开启新进程运行,通过管道实现进程呈几何形式增长,最后再通过:来调用函数引爆炸弹。

    99910

    大厂面试题:求根号2简单?高级算法你肯定不会

    这里再补充一点,实际上x的初始值可以取任意正数,但是会影响到性能,我尝试取1亿,最终需要30次迭代,不过还是比二分快。...实际我目前没有找到比牛顿迭代又好又快的算法了,但是我找到一个相关的故事,以及它引出的以牺牲精度换取速度求\frac{1}{\sqrt{x}}的神奇算法,当然它也可以用来求\sqrt2。...这里说不严格是因为我只做\sqrt2的测试,而且用的是java实现的,而且像是CarmackMethod的实现,可能因为java和c的运行机制的不同,性能会受很大影响,下面这个结果 仅供娱乐,看看就好。...上面说了3个解法,那你是不是也很好奇目前各种编程语言库函数里对sqrt是如何实现的?...我也很好奇,于是我们帮你们翻了jdk源码,发现它根本就不需要自己实现sqrt,毕竟sqrt在计算机领域是有个比较常用的计算,所以主流的CPU架构都提供了对sqrt的硬件支持,只需要一条汇编指令就可以了,

    2.2K10

    【C语言标准库函数】平方根与幂函数:sqrt()和pow()

    三、函数实现 C语言标准库中sqrt()和pow()的实际实现非常复杂,通常会结合硬件指令(如x86架构的FSQRT指令)、数值逼近算法(如牛顿迭代法、泰勒展开)以及精度优化策略,以在效率和精度之间取得平衡...3.1 sqrt()函数实现(牛顿迭代法) 牛顿迭代法是求解方程根的经典数值方法,也是多数标准库中sqrt()函数的核心实现思路。...处理负底数小数指数(无实数解) else: set errno = EDOM; return NaN; 实际实现中,标准库会对上述逻辑进行深度优化:例如快速幂算法的位运算优化...NAN; } // 功率比的0.5次幂即幅度调整系数,等价于sqrt(power_ratio) double adjust_factor = pow(power_ratio,...解析:考查函数实现开销,嵌入式开发对性能要求极高,核心是理解pow()的复杂逻辑带来的效率损耗。 答案: 1. 效率对比:x*x*x更高效,实际测试中效率是pow(x,3)的30倍以上。

    19110

    【安全函数】幂运算进阶:sqrt_s()与pow_s()解析

    根据C99标准定义,sqrt()接收非负输入时返回正确平方根,若输入为负,行为由具体编译器实现决定——GCC编译器返回NaN并设置errno为EDOM,而部分嵌入式编译器会直接触发硬件异常;pow()的行为更复杂...3.1 sqrt_s() 实现逻辑 sqrt_s()的校验逻辑相对简单,核心是拦截负数输”和空指针输出两大错误场景,具体伪代码如下: 函数 sqrt_s(输入参数 x: 双精度浮点数, 输出参数 result...3.2 pow_s() 实现逻辑 幂运算的定义域异常场景更多,pow_s()的校验逻辑需覆盖负数底数+非整数指数、0底数+非正指数、指数为NaN/无穷大等核心非法场景。...{ return fabs(x - round(x)) < 1e-9; } // 安全幂函数实现 int pow_s(double base, double exp, double* result...八、经典面试题 面试题1:不使用标准库函数,实现一个求平方根的函数(谷歌2023年校招后端开发题) 问题描述:给定一个非负整数x,计算并返回x的平方根,结果只保留整数部分(如输入8,返回2)。

    10910

    【安全函数】sqrt_s()与pow_s()解析

    sqrt_s()作为sqrt()的安全替代者,专注于非负实数的平方根计算,新增参数范围校验、输入类型合法性检查及异常状态返回机制;pow_s()则针对pow()的复杂参数组合场景,构建了多维度参数校验规则...x, double *result); 与标准sqrt(double x)相比,sqrt_s()的原型设计有三个关键改进:一是采用bool类型返回值直接标识计算成败,避免标准函数通过errno间接反馈异常的晦涩性...3.1 sqrt_s()实现逻辑(伪代码) bool sqrt_s(double x, double *result) { // 第一阶段:输入参数基础校验 if (result ==...()和pow_s()的实现,需自行补充或引入库 int main() { double result; // 测试sqrt_s():合法输入 printf("===...()和pow_s()并非对标准sqrt()、pow()的简单复刻,而是围绕安全性进行的重构设计。

    8310

    牛顿迭代法(Newtons Method)

    f(x)=0中精确解的意义是,当取得解的时候,函数值为零(即f(x)的精确解是函数的零点)。因此,x1比x0更加接近精确的解。只要不断以此方法更新x,就可以取得无限接近的精确的解。...牛顿迭代法是已知的实现求方根最快的方法之一,只需要迭代几次后就能得到相当精确的结果。 首先设x的m次方根为a。 下面程序使用牛顿法求解平方根。...也比c++标准库的sqrt()函数要快好几倍。此段代码有一个奇怪的句子: i = 0x5f3759df - ( i >> 1 ); // what the fuck? ...以雷神之锤III程序为蓝本可以写出比sqrt()更强大的求平方根函数: 1 int sqrt(float x) { 2 if(x == 0) return 0; 3 float...result = x; 4 float xhalf = 0.5f*result; 5 int i = *(int*)&result; 6 i = 0x5f375a86

    2.3K50

    CUDA优化冷知识24|函数和指令使用的选择和优化

    例如sqrt()函数,有double sqrt(double)的版本的,也有float sqrt(float)的版本的。...我们这里简单的举几个例子就好: 计算x的1/6次方,可以先计算一次x的平方根倒数,再计算一次立方根倒数,这样就得到1/6次方的值,而无需使用昂贵的pow之类的函数。...再例如:x的2/3次方,可以先求一个立方根,然后再求一次平方,这样就快速得到了2/3次方。...注意这个快速替换表格里的公式,很多都使用了特殊的GPU上专用的函数,例如rsqrt, rcbrt(二次方和三次方根的倒数),而不是标准的C库(libm),在CPU上我们能见到的sqrt、cbrt(二次方和三次方根...因为特殊的rsqrtf()这种,可能在实现上具有更好的精度和性能。例如我们之前的章节知道过,SFU这种喜欢提供平方根的倒数的这种快速的接近,可能有助于性能的提升。

    1.5K20

    贪心算法求快速平方根倒数算法中的“魔术数字”【含matlab源代码】

    一、快速平方根倒数算法简介及实现 1.1 算法简介 在计算平方根的倒数时,传统的计算方法是先计算a的平方根sqrt(a),再计算它的倒数1/sqrt(a)。...而快速平方根倒数算法则将输入的32位浮点数a作为一个整数i,用“魔术数字”0x5f3759df减去i右移一位的值产生近似的估值y,再使用牛顿迭代法迭代一次,就得到了相当精度的计算结果。...; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating...但通过指针将32位浮点数转化为32位整数的运算(以及其逆运算)很难在matlab中实现,但很容易通过c/c++实现。.../sqrt(as); 再调用FastInvSqrtFloat函数计算出R作为魔术数字时的近似结果es,用es与rs的平均均方误差作为的值。

    1.8K30

    使用程序计算近似Π值

    但是你有没有想过这个PI是怎么来的,是直接存储吗?还是计算来的。虽然不知道具体是怎么实现的,但是我们可以使用一些简单的数学知识,来计算出近似的Π值。...A的计算主要是矩形面积的累加,假如我们把圆拆成n个矩形,每个矩形的宽都为1/n,那么第i个矩形的面积应该为: dS = dx * y 因为是半圆,因此y的计算公式如下: y = \sqrt{R^2 -...(x-R)^2} 其中x应该为i/n*R(因为是把R分成n份,第i个矩形的x=i/n*R)。...最后,n个矩形相加的公式为: A = \sum_{i=1}^n\frac{\sqrt{R^2 - (\frac{i}{n}R-R)^2}}{n} 下面我们就可以根据公式用程序求出Π的近似值。...= pow(pow(r, 2) - pow(i*r/n-r, 2), 0.5) # 使用公式计算y,其中x=i/n dS = dx * y # 单个小矩形的面积 A += dS # 对矩形面积进行累加

    2.4K20
    领券