sigmoid激活函数推理和实现

sigmoid激活函数定义为:

                                                                         f(x) = \frac{1}{1+e^{-x}}

该值域为:(0,1)

求该函数的导数推理过程:

主要是依据复合函数:f(g(x))'= f(u)^{'}g(x)^{'}         

求解过程:

                                                             f(x)^{'} = (\frac{1}{1+e^{-x}})^{'} \\\\= f(g(x))' \\\\=f(u)'g(x)' \\\\=((1+e^{-x})^{-1})^{'}(1+e^{-x})^{'} \\\\= (-1) (1+ e^{-x})^{-1-1} (1+e^{-x})^{'}

先对右边 (1+e^{-x})^{'} 求导:

                                                             (1+e^{-x})^{'} \\\\= (e^{x(-1)})^{'} \\\\= (-1) e^{x(-1-1)} (e^{x})' \\\\= -e^{-2x} e^{x} \\\\= -e^{-x}

再返回来求解:

                                                              (-1) (1+ e^{-x})^{-1-1} (1+e^{-x})^{'}\\ \\=(-1) (1+ e^{-x})^{-2}* (-e^{-x})\\ \\ = \frac{​{}e^{-x}}{(1+e^{-x})^2}\\\\= \frac{1}{1+e^{-x}}(\frac{e^{-x}}{1+e^{-x}})\\\\=\frac{1}{1+e^{-x}}(1-\frac{1}{1+e^{-x}})

又因为

                                                                 f(x) = \frac{1}{1+e^{-x}}

所以最后导数形式为:

                                                                 f(x)^{'} = f(x) (1-f(x))

一般作用:

  1. 取值范围在0~1之间。 
  2. 对于一个事件发生情况,50%是其结果的分水岭,选择函数应该在0.5中心对称。

可以对这两个函数画出图像:                                     

代码实现:

import math
import matplotlib.pyplot as plt
import numpy as np

# 以类实现
class Sigmoid:
    def __init__(self, w):
        self.weight_input = w
        self.output = 0.0
    # 原函数
    def obj(self):
        self.output = 1.0 / (1.0 + np.exp(- self.weight_input))
        return self.output
    # 导数
    def der(self):
        if self.output == 0.0:
            self.output = 1.0 / (1.0 + np.exp(- self.weight_input))
        return self.output * (1 - self.output)

# 返回间隔均匀的100个样本,计算间隔为[start, stop]。
x = np.linspace(-10, 10, 100)
y_obj = Sigmoid(x).obj()
y_der = Sigmoid(x).der()

# 画图,原函数
plt.figure(figsize=(12, 12))
plt.subplot(2,2,1)
plt.plot(x, y_obj, color='red', label='primitive function')
plt.ylim((-0.2, 1.2))
plt.legend()
plt.xlabel(r'$f(x) = \frac{1}{1+e^{-x}}$', fontsize=18, color='red')
# 导数
plt.subplot(2,2,2)
plt.plot(x, y_der, color='blue', label='derived function')
plt.ylim((-0.1, 0.5))
plt.legend()
plt.xlabel('f(x)\' = f(x)*(1-f(x))', fontsize=18, color='blue')
plt.show()

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
激活函数在神经网络中起着至关重要的作用,它负责引入非线性变换,为模型添加非线性能力。以下是激活函数的几个重要性和作用: 1. 引入非线性:激活函数允许神经网络学习非线性关系,使得模型能够更好地适应复杂的数据模式。线性函数的组合只能产生线性变换,而非线性激活函数可以引入非线性变换,从而提高模型的表达能力。 2. 解决线性可分问题:激活函数能够帮助神经网络解决线性不可分的问题,如图像分类、语音识别等。通过引入非线性变换,激活函数使得神经网络能够更好地捕捉数据中的复杂模式和特征。 3. 梯度传播:激活函数在反向传播过程中起到关键作用,帮助梯度从输出层向输入层传播。合适的激活函数能够缓解梯度消失问题,促进网络的训练和收敛。 4. 输出范围控制:不同类型的激活函数具有不同的输出范围。例如,Sigmoid和tanh函数将输出限制在(0, 1)和(-1, 1)之间,适合用于二分类和多分类问题。ReLU函数则将负数截断为0,适合处理非负输入的情况。输出范围的控制可以对模型的性能和稳定性产生影响。 5. 计算效率:激活函数的计算通常是神经网络中计算密集型的部分之一。因此,高效的激活函数实现能够提升整个网络的计算效率,加快训练和推理速度。 总之,激活函数在神经网络中扮演着重要的角色,通过引入非线性变换,帮助网络学习复杂模式和特征。选择合适的激活函数对于模型的性能和训练效果至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值