深度学习之感知机

感知机是由美国学者 Frank Rosenblatt 于 1957 年发明的, 它是神经网络和深度学习的起源算法。

什么是感知机?

我们考虑输入信号 x = (x_1, \cdots, x_n)^T, 输出信号 y, 权重 w = (w_1, \cdots, w_n)^T, 其中 x, w \in \mathbb{R}^{n\times 1}, y \in \{0, 1\}, 则感知机的定义为

y = \begin{cases} 0 & (w^Tx \leq \theta)\\ 1 & (w^Tx > \theta) \end{cases}

其中 \theta 被称为阈值,用来控制“神经元是否被激活”(1 表示激活)。感知机接收多个信号,输出一个信号。这里的“信号”可以当作电流等具有“流动性”的东西。x_iy 被称为节点, 箭头的指向表示信号流动的方向。权重 w_i 可以看作“电流”对应的“”电阻。下面画出了二节点输入的感知机结构图:

二元输入的感知机

下面我们看看逻辑运算的定义:

输入 x_1 输入 x_2 OR AND NAND
0 0 0 0 1
0 1 1 0 1
1 0 1 0 1
1 1 1 1 0

下面我们将使用 Python 来实现感知机型的逻辑运算。为了和后面的深度学习模型一致,我们可以将上面的感知机模型改写为

y = \begin{cases} 0 & (w^Tx + b \leq 0)\\ 1 & (w^Tx + b> 0) \end{cases}

下面我们使用 Numpy 来手动设计逻辑运算:

import numpy as np

class Gate:
    '''
    逻辑运算的输入 x1, x2 只能是 0 或 1
    '''
    @staticmethod
    def AND(x1, x2):
        '''
        与门
        '''
        x = np.array([x1, x2])
        w = np.array([.5, .5])
        b = -.7
        tmp = np.dot(x.T, w) + b
        if tmp <= 0:
            return 0
        else:
            return 1

    @staticmethod
    def NAND(x1, x2):
        '''
        与非门
        '''
        x = np.array([x1, x2])
        w = np.array([-.5, -.5])
        b = .7
        tmp = np.dot(x.T, w) + b
        if tmp <= 0:
            return 0
        else:
            return 1

    @staticmethod
    def OR(x1, x2):
        '''
        或门
        '''
        x = np.array([x1, x2])
        w = np.array([.5, .5])
        b = -.2
        tmp = np.dot(x.T, w) + b
        if tmp <= 0:
            return 0
        else:
            return 1
gate = Gate()

将逻辑运算的不同状态看作四个不同的样本:

X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
X
array([[0, 0],
       [0, 1],
       [1, 0],
       [1, 1]])
for x1, x2 in X:
    y = gate.AND(x1, x2)
    print(x1, 'and', x2, '-->', y)
    y1 = gate.OR(x1, x2)
    print(x1, 'or', x2, '-->', y1)
    y2 = gate.NAND(x1, x2)
    print(x1, 'not and', x2, '-->', y2)
    print('^'*18)
0 and 0 --> 0
0 or 0 --> 0
0 not and 0 --> 1
^^^^^^^^^^^^^^^^^^
0 and 1 --> 0
0 or 1 --> 1
0 not and 1 --> 1
^^^^^^^^^^^^^^^^^^
1 and 0 --> 0
1 or 0 --> 1
1 not and 0 --> 1
^^^^^^^^^^^^^^^^^^
1 and 1 --> 1
1 or 1 --> 1
1 not and 1 --> 0
^^^^^^^^^^^^^^^^^^

从上面的结果我们可以看出:感知机可以实现与门、与非门、或门运算。

感知机的局限性

单层感知机无法实现异或运算,下面我们利用 Matplotlib 来说明单层感知机的局限性:

import numpy as np
import matplotlib.pyplot as plt

x, y = X.T
fig = plt.figure()
ax1 = fig.add_axes([0.6, 0, .5, .5])
ax1.scatter(x, y, s=75, c=[1, 1, 0, 1], alpha=0.5)
ax1.plot(x, x-.2)
plt.title('NAND')
plt.xticks([])
plt.yticks([])

ax2 = fig.add_axes([0, 0, .5, .5])
ax2.scatter(x, y, s=75, c=[0, 0, 1, 0], alpha=0.5)
ax2.plot(x, x-.5)
plt.title('AND')
plt.xticks([])
plt.yticks([])

ax3 = fig.add_axes([0, 0.6, .5, .5])
ax3.scatter(x, y, s=75, c=[0, 1, 1, 1], alpha=0.5)
ax3.plot(x, - x + .7)
plt.title('OR')
plt.xticks([])
plt.yticks([])

ax4 = fig.add_axes([.6, 0.6, .5, .5])
ax4.scatter(x, y, s=75, c=[1, 0, 0, 1], alpha=0.5)
ax4.plot(x, x-.5)
plt.title('XOR')
plt.xticks([])
plt.yticks([])
plt.show()
逻辑运算.png

图中黄色的点代表“正例”,紫色的点代表“负例”。从上图可以看出 XOR 无法使用一条直线将“正例”与“负例”分隔开。在机器学习中,一般称可以使用一条“直线”将“正例”与“负例”分隔开的数据集为线性可分的,否则称为线性不可分的。

从上面的分析,我们发现单层感知机的局限性:无法解决异或问题(线性不可分的问题)。

多层感知机

虽然单层感知机无法解决异或问题,但是多层感知机便可以解决异或问题。

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

for x1, x2 in X:
    y = XOR(x1, x2)
    print(x1, 'xor', x2, '-->', y)
0 xor 0 --> 0
0 xor 1 --> 1
1 xor 0 --> 1
1 xor 1 --> 0

上面的 XOR 求解过程可以使用如下的图像来表示。

捕获.PNG

小结

我们已经完成了感知机的学习,感知机是十分简单的算法,已经有理论证明,2 层(使用了非线性激活函数的)感知机可以表示任意函数。但是,使用 2 层感知机的构造,需要我们手工设定权重,这是令人十分绝望的,而神经网络的自动设定参数机制为此带来了福音。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352