ML(机器学习)神经网络,阶跃函数,sigmoid激活函数

我们在上一篇文章说了单层感知机实现简单逻辑电路,多层感知机实现异或门电路。引入了阈值θ,偏置b。现在,我们根据上一篇的表达式,现实激活函数。

我们之前感知机的表达式如下:

y = {
x1w1+x2w2+b >0 return 1
x1w1+x2w2+b <=0 return 0
}

现在,我们将x1w1+x2w2+b这个整体令它等于α,现在有一种特殊的映射关系h,当α>0时,使得h(α)=1。当α<=0时,使得h(α)=0。这里的h(α)函数就称为激活函数。激活函数就是将输入总和转换成输出数值的函数。所以,表达式可以又写成y = h(α)。

感知机的优势,在于能够表达复杂的函数,或者是逻辑运算。不过,它存在一定缺陷,例如:权重w需要人为设定,还有偏置b同样也是,不能通过一定/一套具体的规则,来进行权重和偏置的自动优化。因此,神经网络的出现可以处理这个问题,因为神经网络的权重是可以进行自动调整的。神经网络与感知机类似,因为它也是存在输入层,中间层(隐藏层),输出层。神经网络使用的激活函数不属于阶跃函数(阶跃函数:设定一个阈值,当输入超出阈值就输出),常用的激活函数:sigmoid函数:h(α)= 1 / (1+e^(-x))。

阶跃函数的实现:

import numpy as np
import matplotlib.pyplot as plt


"""

#encoding="utf-8"
@Author:Mr.Pan_学狂
@finish_time:2022/2/10
感知机的阶跃函数与神经网络的激活函数对比
"""

def JY(inx):
    if inx > 0:
        return 1
    else:
        return 0

def JY2(inx):
    shape_tup = inx.shape
    print(shape_tup[0])
    if len(shape_tup) > 1:#矩阵
        for vector in inx:
            for num in range(shape_tup[1]):
                if vector[num] > 0:
                    vector[num] = 1
                else:
                    vector[num] = 0
    else:#向量
        for n in range(shape_tup[0]):
            if inx[n] > 0:
                inx[n] = 1
            else:
                inx[n] = 0
    return inx

def JY3(inx):
    return np.array(
        inx > 0,dtype=np.int
    )



def sigmoid():
    pass

if __name__ == '__main__':
    print(JY(0.5))
    print(JY2(np.array([-0.2,0.3,-1])))
    print(JY2(np.array([[-0.5,0.5,1],[1,2,0],[0.2,-3,0.01],[-6,2,-0.9],[1,-2,6],[-0.3,0,1]])))
    x = np.arange(-5.0, 5.0, 0.1)
    y = JY3(inx=x)
    plt.plot(x,y)
    plt.ylim(-0.1,1.1)
    plt.show()

运行结果:
在这里插入图片描述
在这里插入图片描述
sigmoid函数的实现:

def sigmoid(inx):
    return 1 / (1 + np.exp(-inx))

不过,我们注意到一点,激活函数可以允许输入的数值是向量或矩阵类型的数据。而不像阶跃函数,只能指定一种数据类型的输入。
测试sigmoid函数:

X = np.array([-1,0,1,2])
X2 = np.array([[-0.5,-1,0],[1,2,-2]])
X3 = 1
print(sigmoid(X))
print(sigmoid(X2))
print(sigmoid(X3))

运行结果:
在这里插入图片描述
绘图代码:

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(inx=x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()

sigmoid函数图像:
在这里插入图片描述
对比阶跃函数和激活函数图像,我们可以看出sigmoid函数图像变化更加平缓,阶跃函数的变化更加剧烈。且sigmoid是随着输入的变化,输出不断发生连续性变化的。在观察数值微小变化方面,sigmoid函数显然更加合适。

sigmoid函数与阶跃函数的相同之处,在于输入小的时候,输出接近于0。输入大的时候,输出接近于1。无论输入数据多大或者多小,输出结果总在(0,1)内。阶跃函数和sigmoid都是非线性函数。

神经网络的激活函数必须使用非线性函数。原因在于使用线性函数,会导致叠加层没有意义。例如:g(x)=Cx(C为常数),g(x)就是一个线性函数。那么经过3次叠加 g(g(g(x)))=CCCx。其实等同于h(x)=C^3*x(线性函数),并没有什么区别。因此,我们需要使用非线性函数作为神经网络的激活函数。

最后,感谢大家前来观看鄙人的文章,文中或有诸多不妥之处,还望指出和海涵。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不羁_神话

感谢支持,欢迎交流。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值