自己动手写深度学习框架(感知机)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

所谓的感知机,其实本质上就是一个分类问题。假设一个事物有两个feature,那么可以根据这两个feature,来判断当前物体属于哪一个类别。判断的时候,有两种情况,一种是线性可分,一种是线性不可分。

1、or的情况

所谓的or,就是假设希望在1、0,0、1,1、1的时候,输出都是1。只有等到0、0的时候,才输出为0。这样讲起来,可能不是很直观,可以用一个图来表示,

如果是转换成python代码的形式,一般是这样的,

复制代码
def OR(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    b = -0.2
    tmp = np.sum(w*x)+b
    if tmp <= 0:
        return 0
    else:
        return 1

这里的参数0.5、0.5、-0.2只是为了说明问题而存在的。实际开发过程中,比如深度学习,这些参数最终都是通过算法和大量的数据,迭代训练出来的。这里只是为了演示挑选出来的。

2、and的情况

有了or的情况,那么and也比较好理解了。那就是在0、0,1、0,0、1的时候都输出为0,只有等到1、1的时候,才输出为1。如果用上面的图形表示,就是左下方三个点属于一个类别,右上方的一个点属于一个类别。目测一下来,它也是可以找到这样一根判别线的。

3、nand的情况

nand和and是一样的,只是0、0,1、0,0、1的时候输出为1,只有等到1、1的时候,输出为0。看上出输出结果有点奇怪,但还是可以通过一根判别线进行线性可分的。

4、xor的情况

一切看上去都没有问题,也很完美。但是如果遇到异或这样的计算,问题就来了。因为,出现0、0,1、1的时候,输出为0。而只有等到0、1,1、0的时候,结果才是1。画成二维曲线的时候,就是这样的一种形式,

如果是这种情况,不管用什么直线,都是没有办法进行区分的。如果要区分的话,只能想办法构建非线性函数才能去区分。

5、怎么构建非线性函数

前面我们构建曲线的时候,都是直接在输入和输出之间,通过映射的方法去解决。其实还有一种办法,就是通过中间层的办法来解决,比如像这样,

复制代码
def XOR(x1,x2): # very important, similar to neuron network
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

对于输入的x1、x2,我们先计算s1、s2中间数据,然后再通过s1、s2去输出最终的结果。这样就可以达到我们的目的,即非线性分解,

这也就是多层网络的由来。感知机是神经网络的基础。里面的一些基本概念,比如激励函数,比如多层网络,这些和神经网络都是通用的。大家可以先理解一下感知机的概念,自己去写一些对应的python代码,这样或许印象会更加深刻一点。

相关推荐
藦卡机器人3 分钟前
国产机械臂做的比较好的品牌有哪些?
大数据·数据库·人工智能
迎仔15 分钟前
06-AI开发进阶
人工智能
陈天伟教授16 分钟前
人工智能应用- 语言处理:01.机器翻译:人类语言的特点
人工智能·自然语言处理·机器翻译
Codebee18 分钟前
OoderAgent 相比主流Agent框架的五大核心独特优势
人工智能
home_49819 分钟前
与gemini关于神的对话
人工智能·科幻·神学
代码改善世界19 分钟前
CANN深度解构:中国AI系统软件的原创性突破与架构创新
大数据·人工智能·架构
Fairy要carry20 分钟前
面试-Torch函数
人工智能
aiguangyuan35 分钟前
基于BERT的中文命名实体识别实战解析
人工智能·python·nlp
量子-Alex37 分钟前
【大模型RLHF】Training language models to follow instructions with human feedback
人工智能·语言模型·自然语言处理
晚霞的不甘42 分钟前
Flutter for OpenHarmony 实现计算几何:Graham Scan 凸包算法的可视化演示
人工智能·算法·flutter·架构·开源·音视频