激活函数快速理解

本文深入探讨了常见的激活函数,包括sigmoid、tanh、Relu、Prelu和ELU,解析了它们的特点、优缺点以及如何解决梯度消失和deadrelu问题。

1、sigmoid函数

                                            f(x)=1/(1+e^{-x})    0 < f(x) < 1

                                             f(x)^{'}=f(x)*(1-f(x))   0 < f(x^{'}) < 0.25

所以啊很明显,会导致梯度消失(因为在反向传播BPTT过程中,在对w求导时,会包含f(x)的导数,多层时就相当于0.25的n次方,前面的单元更新态度太小了,所以是梯度消失啦)

2、tanh函数

                                              f(x)=(e^{x}-e^{-x})/(e^{x}+e^{-x})    -1 < f(x) < 1

0 < f(x)^{'} < 1,且有很大概率在0附近,且有很大概率在0附近,所以根据上面所述,就是会梯度消失呀

3、Relu函数

                                             f(x)=max(0,x)

  1. 优点:避免梯度消失问题,每一层的权重更新同等对待。计算速度快+收敛速度快。
  2. 缺点:1、Dead Relu Problem问题:learning rate较大时,如果初始w分布是一个均值是0.1,方差较小的分布,那么激活函数的输入就是一个正值,BPTT时,由于learning rate大,可能会出现w变成一个均值是0.1,方差较小的分布,那么这时激活函数的输入就是一个负值,这就会导致梯度更新时梯度一直是0,w更新不了。2、Relu的输出不是zero-centered的

4、Prelu函数

                                             f(x)=max(\alpha x, x)

α为0.01,这样就可以有效解决dead relu问题,因为梯度值不会为0了呀

5、ELU函数

                                             f(x)=x, x > 0 | \alpha (e^{x}-1), otherwise

这样就可以解决zero-centered问题了,尽量时均值为0嘛,同时避免dead relu问题

 

 

### 实现 Sigmoid 激活函数的 FPGA 设计 Sigmoid 函数是一种常见的非线性激活函数,在神经网络中被广泛用于引入非线性特性。其数学表达式为: ```math f(x) = \frac{1}{1 + e^{-x}} ``` 在 FPGA 上实现 sigmoid 激活函数时,通常采用近似算法来减少计算复杂度并提高效率。以下是几种常见方法及其具体实现方式。 #### 方法一:查表法 (Look-Up Table, LUT) 通过预先计算 sigmoid 的值并将这些值存储在一个 ROM 表中,可以快速查找输入对应的输出值。这种方法适用于输入范围有限的情况。 - 首先定义输入信号 `x` 和输出信号 `y` 的位宽。 - 使用 MATLAB 或 Python 计算 sigmoid 函数的一系列离散点,并将其转换为定点数表示形式[^1]。 - 将这些预计算的结果存入一个 ROM 查找表中。 代码示例(Verilog)如下所示: ```verilog module sigmoid_lut ( input wire [7:0] x_in, output reg [9:0] y_out ); always @(*) begin case (x_in) 8'b00000000 : y_out = 10'd25; 8'b00000001 : y_out = 10'd26; // ... 更多条目 ... default : y_out = 10'd255; endcase end endmodule ``` 此方法的优点在于速度快且资源消耗低,缺点是对内存需求较高以及精度受限于表格分辨率[^2]。 #### 方法二:分段多项式逼近 另一种常用的技术是利用泰勒级数展开或其他数值分析技术得到局部范围内较好的拟合曲线。例如,可以用二次或者三次多项式分别描述不同区间的响应行为。 对于整个实数域上的连续变化量来说,则需划分成若干子区间;每一段单独构建适合该片段特性的简单模型代替原始复杂的指数运算过程。这样既保留了一定程度上接近真实情况的表现力又极大地简化了实际操作流程。 下面给出一种简单的双直线分割方案作为例子说明这一思路的具体实施步骤: 假设我们把自变量分为两部分[-a,a],当|x|<=b(b<a),取一次方程ax+b近似替代原曲线上相应位置处的真实高度值h=f(c);而超出这个界限之外的部分则统一赋固定常数值k. 最终综合起来形成完整的映射关系g(x)=p(|x|-d)+q ,其中参数p,q,d均依据实验数据调整获得最佳匹配效果即可完成全部准备工作. 注意这里只是提供了一个概念框架下的粗略估计版本供参考学习之用而已并非精确解法! #### 方法三:CORDIC 算法 坐标旋转数字计算机(Coordinate Rotation Digital Computer,CORDIC) 是一种高效迭代算法,能够用来解决三角函数、对数和幂次等问题。它也可以扩展到处理超博尔斯特德变换(Exponential Function),从而间接支持 sigmoids 的求值工作。 由于篇幅原因不再详述其实现细节,有兴趣者可查阅相关资料深入理解。 --- ### 总结 以上介绍了三种主流途径帮助开发者们在 Vivado 平台上针对特定应用场景选取合适的策略去部署自己的解决方案。无论是追求极致速度还是兼顾成本效益都可以找到满足条件的选择项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值