昨天刚开始学神经网络,做完与或非门之后,手贱想做一做异或,真是初生牛犊不怕虎,后来查了下资料,直接查到了深度学习,害,无意入坑。不过既来之,则安之。我准备把这个功能实现,无所谓翻山越岭,但求有所收获。

先看了花书:
第六章 深度前馈网络
第一节XOR 的实现
但是没有看懂,然后再B站看了shuhuai008的白板推导系列的(二十三)-前馈神经网络的第三p ,有种豁然开朗的感觉。但是并没有写出具体的代码实现。我下面的内容有一大部分基于那个视频。大家也可以去看看 白板推导系列的(二十三)-前馈神经网络

下面开始写我思考过程:其实我完全没有思路~
先做做头脑风暴吧:



  • 如何用其他逻辑表示呢
    首先,异或表示两个状态不同时输出1,相同时输出0
    可是计算机看不懂语言,我们还是将他转化为公式,才更好理解。

感知机异或门权重 感知机实现异或门_感知机异或门权重
但是这个公式怎么来呢? 凭什么是这个公式呢? 杠精已上线
当然是有根据的:
我们看下异或取正样本的条件;
当 输入
(1,0)-》1
(0,1)-》1
这两个都能输出1对吧,那要是想让异或输出1 ,这两个式子应该是什么关系呢? 答 或关系,很好,就是或的关系
下面就有了两个式子的联系
感知机异或门权重 感知机实现异或门_python_02
下面继续考虑,什么情况下可以保证 输入(1,0) 输出是1呢?
有两种情况:
情况一:原来的函数是一个或函数 这样输入(1,0 )-》1
情况二:原来是一个与函数,同时x2的输入后进行了非操作,这样有(1,!0)-》1
那究竟是哪一种呢? 我们在做一个假设:
如果情况一满足异或操作的话,那么输入(1,1) 此时,输出的也为1 ,加之外层的或关系,可见我们最终的输出为1 ,这明显与异或函数(1,1)-》0 不符合。因此,情况二才是真正我们想要的函数。
这样我们就合理的推出了这个式子:
感知机异或门权重 感知机实现异或门_感知机异或门权重
[至此,再次感谢抒怀兄,给予的指点]

【思考时间】推出来这个式子有什么用? 难道说我们知道了之间的逻辑关系就可以做一个多层感知机(MLP)? 好像也不是不可以,大胆想象一下:

感知机异或门权重 感知机实现异或门_感知机异或门权重_04

这不就是三个感知机嘛! -灵魂画师已上线

对比下周志华老师的图

感知机异或门权重 感知机实现异或门_感知机异或门权重_05

还不错嘛,哈哈。

有一个无赖的想法,就是用上一篇文章的内容得到与门和或门的阈值和权重,然后直接搬到这里来。根据上面的分析构建出来一个异或函数。可这根本不是直接训练的结果,不过有胜于无。我准备先用这种方式试一下。

w1

w2

b

与门

1

1

-1

或门

3

3

-1

写写函数,由于我们之前那些函数输出的都是1,-1 ,但是输入的是1,0 所以,我们要进行一次统一,就是将输出的-1 转化为零。函数中有标注

import numpy as np
def sign(p):
    return 1 if p>0 else -1
def and_(x1,x2):
    x=np.array([x1,x2])
    return 0 if sign(np.dot(x,[1,1])-1)==-1 else 1
def or_(x1,x2):
    x=np.array([x1,x2])
    return 0 if sign(np.dot(x,[3,3])-1)==-1 else 1
def not_(x1):
    return 0 if x1==1 else 1
def xor_(x1,x2):
    h1=and_(not_(x1),x2)
    h2=and_(x1,not_(x2))
    return or_(h1,h2)
print("1 xor 1=",xor_(1,1))
print("1 xor 0=",xor_(1,0))
print("0 xor 1=",xor_(0,1))
print("0 xor 0=",xor_(0,0))

输出结果为:

1 xor 1= 0
1 xor 0= 1
0 xor 1= 1
0 xor 0= 0

完美实现,不过这肯定不是我想要的,我想要用数据集自己训练出来一个模型,而不是手动分析,这样等数据集复杂化后,手动根本无法计算。

下面重新开始,使用花书上面的方式:


我准备先存档,【存档时间,】2020/10/10 早晨8:54分
【读档时间】2020/10/14 早晨9:44分
异或感知机的训练,看我写的另一篇文章:误差逆传播算法-实现异或感知机