zoukankan      html  css  js  c++  java
  • 线性变换

    来源:神经网络的本质——无限拟合函数 - 知乎 (zhihu.com)

    如果输入是一条直线,那么输出也是一条直线。这才叫“线性变换”。

    本文将用一种直观的方式去理解神经网络

     

    为了可视化,我们把整个网络简化到最简单的形式,也就是从一次函数

     

    线性变换

    线性和非线性说起来有点抽象,但什么是线性变换呢?

    这个变换只能:

    在竖直方向上拉升,反向,收缩

    在竖直方向上上下移动。

     

    注意:这个连横向移动都做不到!你看到的水平移动是上下移动造成的“幻觉”

    你把一次函数变成二次函数就知道了,这个两个参数是无法控制函数左右移动的!

    这个二次函数要和其本身的一次函数做线性运算才能达到平移的效果!

    而这个是一层线性变换做不到的

     

    并非很多课程中讲述的“扭曲”,因为“扭曲”和“旋转”这种属于非线性的行为。

    也就是说你原来的输入有多少个拐点,那么输出的也依然是有几个拐点。

    如果输入是一个条直线,那么输出也是一条直线。这才叫“线性变换”

    如果是二次函数,那么经过线性变换也依然是二次函数。

    当然线性变换可以有特殊情况就是把缩放系数 a 如果是矩阵就是矩阵A,填上0,这样就可以把二次函数重新拉平。

     

    激活函数

    激活函数的作用只有一个,就是把输入加入一点非线性。

    你会问我们为什么不用平方,立方,开根号,log等方法加入非线性,而要用这么一个特定的函数做非线性?

    因为这个函数是几个能做到只加入“一点”非线性的函数,其他的函数加入的“非线性”太多,导致了函数的非线性不可控。这个函数除了某一个小区域内出现了一点曲线,其他地方依然是平的。

    我们希望加一点非线性,但有不能过多,所以经过神经网络炼丹师的反复摸索,只有几种函数可以带有这种“恰到好处的非线性”。

    其他的激活函数可以参考下表,虽然结果略有不同,但是本质都是加入一点非线性。

     

    好了,你已经学会神经网络了

    然而你真的懂了么?

    你会想,为什么这两种非常简单的东西居然可以做到识别图形,语音,这样如此复杂的工作?

    那么下面就在此基础上展开,看看两种函数叠加后的效果。

    其中系数a的部分控制着函数的横向缩放

    而偏移bias也就是b,控制着函数的横向移动

    这就解决了上面提到的一个问题,函数无法横向缩放,横向移动的问题,于此同时激活函数还给增加了一点非线性。

    一层线性变换,包裹一层激活函数,就可以实现原本线性函数所不具备的功能。

     

    那横向移动可以了,那纵向移动呢?

    再加一层线性

    d控制着上下的平移

    b控制着左右平移

    a控制着水平拉升收缩

    c控制着竖直方向的拉升收缩

     

    注意:激活函数F有一边是在0上的,所以不受c的影响。所以这一边只受到d的影响

    而C的作用是先于d的,所以合起来可以理解是d控制住一端的水平位置,而c进行数值方向的缩放。这也是激活函数带来的好处之一,现在你理解了,为什么激活函数一定要有一端是0了。因为只有这样,下一层的线性变换用d就可以单独控制这一条边,而不会受到c的干扰。

     

    这个函数看上去也很简单,感觉没什么用啊

    回答:继续套娃

     

    只不过我们现在要脱离函数的思维,用一个小小的矩阵来思考。

    我们把x分别套入两个不同的激活函数,然后再把输出作为一个矩阵,来喂给一个线性层,就可以实现比较复杂的效果了。

     

    神经网络甚至能做除法运算制作出 1/x !

    真是太神奇了!神经网络的运算种完全没有除号,居然可以算出和除法差不多的结果。

    我不知道这个神经网络是怎么做到的,但是它学会了!

    它真的太聪明了!

    只不过,如果数字太大或太小,它可能会出现bug,也就是如果数字比较正常,比如>0.1左右这个神经网络可以得出和除法几乎一模一样的结论。但是当数字<0.1 的时候,这个神经网络会 给你一个 10 并且拒绝运算。它似乎由看起来还不太聪明,因为计算1/0.01 对神经网络来说太难了!

     

    要精确的计算这种神经网络不擅长的算法,那么就需要继续堆叠更深的的层。

    理论上只要你堆叠的层数够多,神经网络总能学会“除法”。

    好吧,这么看来它似乎还是没有搞懂什么是“除法”,不过用来骗骗人类,尤其是没学过AI的人类,应该没有问题。

     

    Deep is Different

    所以你知道了,为什么神经网络越来越大了。因为只要层数够多,神经网络可以拟合出几乎任意的函数。

     

    Deep still not work?

    第一种可能是神经网络的学习资料太少,它还没学会,正确的骗人技巧。

    第二种可能确实是神经网络的局限所在了。

     

    神经网络的本质是函数,这个函数可以接受任意数量的变量,可以拥有任意数量的参数。但脱离不了函数的本质。函数能解决的问题,神经网络理论上就能解决,而函数不能解决的问题,神经网络理论上就是无解的。

     

    函数不能调整输出的个数

    如果不加入一些trick,神经网络通常是不支持有可变输出的任务。需要在神经网络的各种地方加入一些trick method,把问题转换到单输出的任务。然后用单输出的任务去组合出多输出的任务。

     

    函数不具备动态缓存

    学过计算机编程的应该知道heap的概念,而神经网络不具备heap,神经网络一旦运行就会定义固定的stack固定区域作为记忆单元。如果一种任务需要程序去记忆潜在的可能无限多的,动态的信息才能解决,那么很抱歉,神经网络是做不到的。

     

    神经网络有if语句,但没有跳转

    我之前的想法中提到了,神经网络的激活函数可以理解为一种if条件语句,但神经网络并没有跳转,也就是如果一种任务可能需要跳转到不同的状态,那神经网络也做不到。我们需要用额外的trick在神经网络的外面套上一些跳转语句,也就是把神经网络集成在专家系统中。

     

    这也是行业的一种趋势,也就是任何单一的神经网络作用有限,无论这个神经网络有多Deep,AI未来的趋势是专家系统配合神经网络,把能用函数解决的工作外包给神经网络,而一些本质上的核心的,确定的逻辑,依然要借助专家系统。

  • 相关阅读:
    pytorch-卷积基本网络结构-提取网络参数-初始化网络参数
    pytorch-mnist神经网络训练
    python 面对对象 类(继承, 多态)
    注意机制CBAM
    python sqlalchemy 进行 mysql 数据库操作
    python pymysql 连接 mysql数据库进行操作
    mysql数据库基础
    python正则表达式解析(re)
    python 装饰器 (test = submit(test))
    对opencv读取的图片进行像素调整(1080, 1920) 1.cv2.VideoCapture(构造图片读取) 2.cv2.nameWindow(构建视频显示的窗口) 3.cv2.setWindowProperty(设置图片窗口的像素) 4.video_capture(对图片像素进行设置)
  • 原文地址:https://www.cnblogs.com/yibeimingyue/p/15620620.html
Copyright © 2011-2022 走看看