zoukankan      html  css  js  c++  java
  • ML学习九——神经网络的学习

    9-1 代价函数

    那我们就从神经网络的代价函数讲起,假设我们我如下图的神经网络

    这里我们有m个样本,L表示我们神经网络的层次此时的L=4,sl表示输出层神经元个数,这其中不包括偏差单元(s1=3,s2=5)

    SL表示最后的输出单元,只有K大于等于3 的时候才会使用一对多的方法

     代价函数如下图所示(这是逻辑回归函数中的一般形式)后面多加的一项我们称之为正则项(将θ0正正则化)

    在神经网络中,我们的hθ(x)是一个k维的向量,hθ(x)i 表示我们第i个输出,i表示选择输出神经网络输出向量中的第i个元素,并且我们训练集中的因变量也是同样维度的一个向量,

     

     9-2 反向传播算法

    我们的目标

    向前传播算法如下图所示:a(2)表示第二层的激活值

     

    这里的表示第l层的第j个节点,

     

    偏导数项可以这样表示

     

     

     9-3 理解反向传播

    怎样使用反向传播算法计算代价函数的导数

    如下图是我们的前向传播算法

    如果我们只有一个输出单元,并且没有偏差单元,我们的反向传播算法如下图

     

     

     9-4  注意使用:展开参数

    我想快速地向你介绍一个细节的实现过程,怎样把你的参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要。

    接下来我们用octave演示一下具体的操作

    首先我们准备三个矩阵如下图所示

     

     接下来我们将矩阵转化为向量

     如果我们想恢复成原来的矩阵,如下图所示

     

     

     9-5 梯度检测

    当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的bug,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验方法;这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。

    ε是一个非常小的值,通常选取 0.001(这里其实是导数定义)

     

    检验时,我们要将该矩阵展开成为向量,同时我们也将  矩阵展开为向量,我们针对每一个 θ 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同 D(l)ij 进行比较。

     

     9-6 随机初始化

    到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。

    这里的θ和其他地方的并没有什么联系,这里要区分开来

     

    我们通常初始参数为正负ε之间的随机值,假设我们要随机初始一个尺寸为10×11的参数矩阵,代码如下:

    Theta1 = rand(10, 11) * (2*eps) – eps

    9-7 组合到一起

    这算是总体的回顾

    网络结构:第一件要做的事是选择网络结构(神经元的连接模式),即决定选择多少层以及决定每层分别有多少个单元。

    第一层的单元数即我们训练集的特征数量。

    最后一层的单元数是我们训练集的结果的类的数量。

    如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。

    我们真正要决定的是隐藏层的层数和每个中间层的单元数。

    训练神经网络:

    1. 权重的随机初始化(通常初始化很小,趋于0)
    2. 利用正向传播方法计算所有的 hθ(x)
    3. 编写计算代价函数 J(θ)  的代码
    4. 利用反向传播方法计算所有偏导数项
    5. 利用数值检验方法检验这些偏导数
    6. 使用优化算法来最小化代价函数

    9-8 无人驾驶

    我想向你介绍一个具有历史意义的神经网络学习的重要例子。那就是使用神经网络来实现自动驾驶,也就是说使汽车通过学习来自己驾驶。接下来我将演示的这段视频是我从 Dean Pomerleau那里拿到的,他是我的同事,任职于美国东海岸的卡耐基梅隆大学。在这部分视频中,你就会明白可视化技术到底是什么?

    这一条白亮的区段显示的就是神经网络在这里选择的行驶方向,是稍微的左转,并且实际上在神经网络开始学习之前,你会看到网络的输出是一条灰色的区段,就像这样的一条灰色区段覆盖着整个区域这些均称的灰色区域,显示出神经网络已经随机初始化了,并且初始化时,我们并不知道汽车如何行驶,或者说我们并不知道所选行驶方向。只有在学习算法运行了足够长的时间之后,才会有这条白色的区段出现在整条灰色区域之中。显示出一个具体的行驶方向这就表示神经网络算法,在这时候已经选出了一个明确的行驶方向,不像刚开始的时候,输出一段模糊的浅灰色区域,而是输出一条白亮的区段,表示已经选出了明确的行驶方向。

    我们还有很多更加先进的试验来实现自动驾驶技术。在美国,欧洲等一些国家和地区,他们提供了一些比这个方法更加稳定的驾驶控制技术。但我认为,使用这样一个简单的基于反向传播的神经网络,训练出如此强大的自动驾驶汽车,的确是一次令人惊讶的成就。

  • 相关阅读:
    Java JVM启动参数
    使用Navicat连接MySQL8.0版本报1251错误
    安装MySQL和出现的问题解决
    跨域问题:解决跨域的三种方案
    Java8 新特性lambda表达式(一)初始
    搭建docker私有仓库
    crontab定时任务
    CentOS610 php环境安装
    Docker常用命令
    PHP调用python脚本执行时报错
  • 原文地址:https://www.cnblogs.com/lmr7/p/12755786.html
Copyright © 2011-2022 走看看