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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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代码,这样或许印象会更加深刻一点。

相关推荐
程序员cxuan14 分钟前
为每个任务配一套 harness:Claude Code 里的动态工作流
人工智能
程序员cxuan19 分钟前
Claude Fable 5 来了
人工智能·后端·程序员
云边云科技_云网融合23 分钟前
云边云科技亮相 2026 WOD 制造业数智化博览会 云网融合赋能制造焕新
人工智能·科技·安全·制造
Σίσυφος190030 分钟前
激光三角 光平面标定-多高度误差分析
人工智能·计算机视觉·平面
JS菌31 分钟前
手写一个 AI Agent 全栈项目:从沙箱执行到子智能体的完整实现
前端·人工智能·后端
lqqjuly38 分钟前
前沿算法深度解析(二)
人工智能·算法·机器学习
Bode_200240 分钟前
基于大数据分析的全生命周期质量追溯质量评估体系落地方案
大数据·人工智能
分布式存储与RustFS1 小时前
RustFS S3 Table 开源后,我重新梳理了一下 Iceberg 数据湖的选型思路
人工智能·开源·minio·dpu·rustfs·ai存储·s3 table
DevOpenClub2 小时前
用 Agent 搭建网页内容采集与结构化处理流水线
人工智能
56AI2 小时前
2026 企业级AI智能体开发平台推荐:聚焦底层安全与准确率的智能体平台
人工智能·安全·智能体