• 史上最通俗易懂的手写人工神经网络——(一)(转载自https://blog.csdn.net/xipengbozai/article/details/118115444)


    1.神经元——思维的基本单元

    我们知道一方面计算机以速度飞快而称奇,但是对于事物识别以及复杂的任务却无能为力,另一方面人类没有计算机快,但是可以做很多极其复杂的事情。一只苍蝇有10万个左右的神经元就可以完成飞行,寻找食物,躲避天敌等等很复杂的任务。一只线虫仅仅有302,个神经元,却可以完成蠕动等相当有用的任务,但是这些任务对于飞快的计算机却很难完成。

    下面是一个神经元图:

    树突细胞体轴突髓鞘,以及轴突末端的突触组成。

            图片来自网路

    下图为秀丽隐杆线虫的神经元连接图,即线虫的神经网路,可见其结构还是相当复杂的。

     

    秀丽隐杆线虫,图片来自Nature, 2019, doi:10.1038/s41586-019-1352-7。

    生物学家研究发现,电信号化学信号在神经元间传递,比如你打针的时候,针会刺疼你,针扎的这种信号通过皮肤传到脑神经。针扎的疼痛因素只有激活痛感受器,将其转化为痛信号背根节神经元的中枢突传递至脊髓背角,由此处的投射神经元形成上行传导通路,经脑干、丘脑等多级中继到达皮质,才能产生痛感觉。也就是说只有针扎程度达到一定阈值才能激活痛觉。

    下图为生物神经元与人工神经元的比较图,是不是有很多相似之处。

    如:一个树突好比一个输入轴突好比一个输出总口,轴突的每一个末端突触类似于一个输出神经元细胞体类似于一个激活函数,因为输入细胞体的信号只有达到一定的阈值细胞体才会处理才会,除此外神经元细胞体可能还有其他处理。

     

                                                                    图片来自网络

    受神经元启发,人们发明了人工神经元。如下图其基本思想是:所有输入神经元的信号按一定的权重同一时刻叠加到一起,然后叠加的和信号超过一定的阈值时才会触发神经元的输出。

    用公式描述一个人工神经元:

    output = f(x1*w1+x2*w2+x3*w3+......+xn*wn+b)

    1.output为神经元的输出;

    2.x1——xn为神经元的n个输入;

    3.w1——wn为神经元对应n个输入的权重;

    4.b为受外界影响的偏移量;

    5.f是激活函数,也就是可以控制输出的函数;

    所以从本质上讲一个人工神经元就是一个n元的线性函数加一个非线性的处理。

     

                                                                    图片来源网络

    2.神经网络——智能产生的地方

    如下图所示为人脑的神经网络彩图和人脑示意图,数以亿计的神经元以各种各样的连接组成一个巨大的神经网络,从而让人处于生物界智慧的顶端。

                                                                                                                                            图片来源网络

    模拟生物或者人类的神经网络,产生了人工神经网络。如下为一个7层的人工神经网络和3层人工神经网络。

    人工神经元连接到一起形成了人工神经网络,信号从神经网络的最左侧流向最右侧,即信号从输入层输入,穿过中间层,最终流向输出层

    前面说过,每一个神经元相当便于一个n元的线性函数加一个非线性的处理,那么人工神经网络就是多层的多个n元的线性函数加一个非线性的处理的多次叠加与非线性处理,这样想的话人工神经网络确实是一个很复杂的东西,让人很难理解,不过我们不用想那么多,就这么个东西却有很大的用处。

     

    我们以最简单的二层人工神经网络来理解,如下图所示,第一层有3个人工神经元,第二层有2个人工神经元。

    信号流向从第一层流向第二层最后输出,可见第一层的输出对于第二层就是输入,所以

    第二层的第一个神经元的输出可以写为:

    z1 = g(a1*w1+a2*w2+a3*w3)

    类似第二层的第二个神经元输出可以写为:

    z2 = g(a1*w4+a2*w5+a3*w6)

    其中,w1为第一层第一个神经元与第二层第一个神经元之间的连接权重,其余权重以相同的方式理解。为了便于记忆:我们把第1层第i个神经元与第二层第j个神经元的连接权重用wij 表示,把第一层第i个神经元的输出用 ai 表示,第二层第j个神经元的输出用 zj 表示,那么下面的二层神经网络输出可以表示为:

    z1 = g(a1*w11+a2*w21+a3*w31)

    z2 = g(a1*w12+a2*w22+a3*w32)

    仔细观察这两个表达式,忽略掉g激活函数,感觉有些像线性代数里的线性方程组。

    我们知道线性方程组可以用矩阵来描述,所以二层神经网络的输出是否可以用矩阵来描述呢?答案是肯定的。

    使用矩阵描述二层神经网络如下:

    简写为:

    受二层神经网络的启发,那么更多层神经网络能否用矩阵描述呢?很明显也是可以的。因为3层是2层的拓展,更多层又是3层的拓展,所以矩阵的乘法可以表示多层神经网络

     

    由于篇幅问题,后续的神经网络算法和参数内容放到第二篇来阐述,第三篇讲述神经网络的python实现代码以及训练和测试情况。

    手写神经网络源代码下载地址: https://download.csdn.net/download/xipengbozai/19781210?spm=1001.2014.3001.5501

    ​转载自https://blog.csdn.net/xipengbozai/article/details/118115444

    需要程序源码的可以加我微信x241602私聊。
  • 相关阅读:
    九度-剑指Offer
    Fiddler如何模拟弱网环境进行测试
    登录功能测试点
    【转】移动应用崩溃日志收集工具对比
    【转】高扩展性网站的50条原则
    互联网常见架构接口压测性能分析及调优手段建议
    安装JDK时提示 IllegalArgumentException:Invalid characters in hostname的解决方法
    JAVA+Maven+TestNG搭建接口测试框架及实例
    Jmeter(二)Jmeter目录介绍
    性能测试-Gatling(一)
  • 原文地址:https://www.cnblogs.com/huipengbo/p/14928297.html
Copyright © 2020-2023  润新知