深度学习基础——感知机

感知机

感知机是一种非常简单的算法(特别是对有一定基础的同学来说),感知机也是学习神经网络的基础,因此,感知机的构造是神经网络,深度学习的一种重要思想。感知机是由美国科学学者Frank Rosenblatt在1957年提出的。

感知机的理解

什么是感知机呢?感知机可以接收多个输入信号,输出一个信号。举个列子:判断一个张三是不是男生,输入信号有张三的身高,体重,头发的长度;输出信号就是0或1(是和不是)(注意,感知机只有0或1两种取值)下图是一个接收两个输入信号的感知机例子,x1,x2是输入信号,y是输出信号,w1,w2是权重。图中的圈称为“神经元”或者“节点”。输入信号会被送往神经元时,接着分别乘以固定的权重,神经元会计算传进来的信号的总和,当这个总和超过了某个界限值(阈值)时,才会输出1。这也称为“神经元被激活”。
在这里插入图片描述

用数学式来表示就是下式:
y = { 0 ( w 1 x 1 + w 2 x 2 ≤ θ ) 1 ( w 1 x 1 + w 2 x 2 > θ ) y = \begin{cases} 0 & (w_1x_1+w_2x_2\leq \theta) \\ 1 & (w_1x_1+w_2x_2> \theta) \\ \end{cases} y={01(w1x1+w2x2θ)(w1x1+w2x2>θ)
或者引入偏置,把 θ \theta θ换成-b:
y = { 0 ( b + w 1 x 1 + w 2 x 2 ≤ 0 ) 1 ( b + w 1 x 1 + w 2 x 2 > 0 ) y = \begin{cases} 0 & (b+w_1x_1+w_2x_2\leq0) \\ 1 & (b+w_1x_1+w_2x_2> 0) \\ \end{cases} y={01(b+w1x1+w2x20)(b+w1x1+w2x2>0)
感知机的多个输入信号都有各自的固定权重,这些权重发挥着控制各个信号的重要性的作用。换句话说就是:权重越大,对应该权重的信号的重要性就越高。(小疑问:这些权重怎么计算?怎么得到呢?)设定权重的工作,既确定合适的,能符合预期输入与输出的权重,一般还是人工设定的。但面对一些看不出哪些数据重要,数据量大,人工设定就显得有点鸡肋了,当神经网络的出现就很好的解决了这权重的设定。因为神经网络的一个重要性质是它可以自动地从数据中学习到适合的权重参数。

感知机的简单编程实现(python)

感知机的编程实现我们用python来实现一个简单的逻辑电路——与门。与门是有两个输入和一个输出的门电路,当两个输入同时为1时,输出才会是1,下图是与门的真值表。

x 1 x_1 x1 x 2 x_2 x2y
000
010
100
111

该如何编程实现这个与门电路呢?要实现这个与门电路,我们需要做的就是确定能满足真值表的权重( w 1 w_1 w1, w 2 w_2 w2)和阈值 θ \theta θ实现上,要满足真值表的条件参数选择有无数多个,例如,( w 1 w_1 w1, w 2 w_2 w2, θ \theta θ)=(0.5,0.5,0.7),(1,1,1)等等。设定这样的参数后,仅当 x 1 x_1 x1 x 2 x_2 x2同时为1时,信号的加权总和才会超过给定的阈值 θ \theta θ,下面我们使用( w 1 w_1 w1, w 2 w_2 w2, θ \theta θ)=(0.5,0.5,0.7)来编程实现与门电路。

def AND(x1, x2):
    w1 = 0.5
    w2 = 0.5
    theta = 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1


if __name__ == '__main__':
    print(AND(0, 0))
    print(AND(0, 1))
    print(AND(1, 0))
    print(AND(1, 1))

在这里插入图片描述

感知机的局限性

感知机的局限性就是在于它只能表示有一条直线分割的空间。我们用逻辑电路——异或门来举个例子
根据异或门的真值表(下图)来看,只有同时输入一个0和1,才会输出1。如果我们还是用( w 1 w_1 w1, w 2 w_2 w2, θ \theta θ)=(0.5,0.5,0.4)来实现这个异或门的话,显然(1,1)输出的也是1,与真值表不符,其实这就是感知机的局限限,它只能像图1那样,用一条直线b来分割,并不能像图2那样用一条曲线来区分,所以它无法实现异或门。那感知机就只限于此吗,并不然,下面的多层感知机就可以解决。(这里的轨迹有点像机器学习的线性模型一样,最小二乘法解决不了的,下一个算法岭回归就可以解决,岭回归解决不了的Lasso回归解决了,这也告诉了我们,每个算法都是不断在优化的,进步的)

x 1 x_1 x1 x 2 x_2 x2y
000
011
101
110

在这里插入图片描述

多层感知机

感知机不能表示异或门,但,实际上感知机的绝妙之处在于它可以“叠加层”——多层感知机。下图就是一个2层感知机,在2层感知机中,第0层的两个神经元接收到输入信号,并将信号发至第一层神经元;然后第一层神经元将信号发送到第二层的神经元,第二层神经元输出Y。叠加一层,,感知机得以实现了异或门,也可以这样理解单层感知机无法表示的东西,通过增加一层就可以解决,也可以这样说,通过叠加层,感知机能进行更加灵活的表示。下面我们编程来实现异或门。
在这里插入图片描述

异或门实现的真值表

把与非门的输入当第一层的输入s1,或门的输出当输入s2。y为异或门的输出

x 1 x_1 x1 x 2 x_2 x2 s 1 s_1 s1 s 2 s_2 s2y
00100
01111
10111
11010

代码实践

import numpy as np


# 与非门
def NAND(x1, x2):
    w1 = -0.5
    w2 = -0.5
    b = 0.7
    tmp = x1 * w1 + x2 * w2 + b
    if tmp <= 0:
        return 0
    else:
        return 1


# 或门
def OR(x1, x2):
    w1 = 0.5
    w2 = 0.5
    b = -0.2
    tmp = x1 * w1 + x2 * w2 + b
    if tmp <= 0:
        return 0
    else:
        return 1


# 与门
def AND(x1, x2):
    w1 = 0.5
    w2 = 0.5
    theta = 0.7
    tmp = x1*w1 + x2*w2
    if tmp <= theta:
        return 0
    elif tmp > theta:
        return 1


def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y


if __name__ == '__main__':
    print(XOR(0, 0))
    print(XOR(0, 1))
    print(XOR(1, 0))
    print(XOR(1, 1))

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值