zoukankan      html  css  js  c++  java
  • 【Neural Network】林轩田机器学习技法

    首先从单层神经网络开始介绍

    最简单的单层神经网络可以看成是多个Perception的线性组合,这种简单的组合可以达到一些复杂的boundary。

    比如,最简单的逻辑运算AND  OR NOT都可以由多个perception构成的单层神经网络模拟。

    但是,单层感知器神经网络能力再强也是有限的,有些逻辑也无法完成。比如,XOR异或运算。

    这个时候,就很自然地引出了多层神经网络。

    通过这个例子,可以看到多层的神经网络的表达能力要比单层的要强。

    上面给出了看待神经网络的一种方式:

    1)从原始输入开始一直到OUTPUT之前的那一层,可以看做是对输入x做各种transform

    2)与OUTPUT紧挨着的那一层,可以看做是隐层输出做线性组合

    并且,在这里规定了神经网络'regression'类型用sqaure error来衡量。

    这里有个环节值得说道一下,我们来比较集中transform的方式:

    1)如果是sign的:是表达力很强,但是由于是离散的,不好优化

    2)如果是linear的:好优化,但整个网络也都相当于是个线性的了,失去了较强的学习能力

    3)popular choice 是一种tanh(S)的转换器:

      a. 这种转换器介于sign和linear之间,相当于是模拟化的sign

      b. 同时这个转换函数的导数的性质又很好(与逻辑回归类似)

    这样,神经网络的各个环节是啥已经搞清楚了。林接下来给出了神经网络各个部分的符号表示:

    这里有个地方需要注意:每个隐层都有一个bias神经元,它与下一层的每个神经元都有权重连线(为了简便,bias设为常数1,对下一层每个神经元的偏置影响体现在权重连线上)

    到此,可以给出神经网络的一个物理解释:前一层的输出作为厚一层的输入,每两个隐层之间的权重相当于两个隐层之间的匹配模式

    模型构造完成了,接下来就是如何学习模型的参数。

    gradient boosting方法对于多层神经网络来说,有些太困难。

    在这里,还是采用前人的梯度下降的思路来求解。问题的关键就是如何高效地计算出错误对于每个权重的导数。

    这里先从最后一层的权重开始求解:这个求解利用了求导链式法则,讲每个神经元的输入分数s作为中间连接,就可以直观求解了。

    林在这里将error与每个神经元的输入分数s的导数抽象出来,记为一个特殊符号delta。这样,就可以表示出来任意的error对于权重w的导数了。

    每个神经元的输出x是很好求的(只要给定w,带入就可以求得了);因此,下面只需要关注,如何把error对于权重w的导数求解出来。

    这里求解delta采用了递归的思路:

    1)sl经过tanh的计算→xl

    2)xl经过下一层的权重→sl+1

    沿着这两个思路,就把sl与sl+1给联系起来了,因此也获得了delta的递推关系。

    又因为最后一层的delta是可以直接算出来的,因此,delta的计算思路也出来了,可以backwards的思路算出来。

    上面就是伟大的BP神经网络求解算法,的原型。。。

    1)S:选点

    2)forward:(initial w)求x

    3)backward:利用反向递推关系,求解delta

    4)GD:对每个隐层权重更新

    若干轮之后,返回整个神经网络的‘权重+偏置’参数

    1)3)可以同步去做,获得若干个x*delta,然后average的动作后作用于4)(一周前面试的时候还被面试官问到了这个问题,现在看来就是取个平均,就可以获得mini-batch的效果了

    下面再补充一些NN的其他问题:

    1)神经网络由于太太复杂了,因此GD的方法难免落入local minimum

    2)有关初始化选取W的问题,无外乎两种选择:

      a. 如果W选的很大,wx就会很大,优化作用不明显(联想tanh的函数图像,如果wx的绝对值很大,wx下一轮即使有比较大的变化,神经元的输出也变化不大了)

      b. 因此,通常的做法是w取相对小一些,随机一些的值,这样貌似能好一些

    有关VC Dimension的问题:神经网络越复杂,VC就越大。

    只要神经网络的层数一旦多起来,神经元一旦多起来,VC Dimension自然就起来了。因此,regularization自然不可避免。

    最常规的做法是损失函数中加一个L2 regularizer惩罚项。

    但:

    1)L2惩罚项的作用效果是不让每个权重分量太大,但确实成比例变化的(Large的shrink large, small的shrink small),总的来说没啥改变

    2)L1惩罚项倒是可以让某些项目为0了,但是not differentiable,所以不好求解

    因此,林介绍了一种新的regularizer:weight-elimination regularizer:

    1)无论是原来是大的还是小的w分量,都会有同等效果的shrink(大的减小了,小的可能减没了)

    2)differentiable,求解比L1容易一些

    在这一节课的问题中,给出了weight-elimination的求导结果:

    通过这个结果分析,其实我TM啥也分析不出来。。。有功夫再看原始的论文吧:http://papers.nips.cc/paper/323-generalization-by-weight-elimination-with-application-to-forecasting.pdf

    另外,还有一种stop early的方法防止过拟合:

    这个方法的背后思想史:

    1)有理论保证:迭代的次数愈多,dvc就越大

    2)联合VC Dimension理论,early stopping有助于防治过拟合

  • 相关阅读:
    对于.net config文件中加密使用
    删除windows不想要的服务
    ora12514: tns: 监听程序当前无法识别连接描述符中请求的服务
    读《.NET设计规范》笔记
    创建服务总结
    加载XML文档
    XMLHttpRequest对象的使用
    ReportView控件的使用
    C#代码的编译过程
    Qt vs设置可执行程序图标
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4712785.html
Copyright © 2011-2022 走看看