一、原理

重点:明白偏导数含义,是该函数在该点的切线,就是变化率,一定要理解变化率。

1)什么是梯度

梯度本意是一个向量(矢量),当某一函数在某点处沿着该方向的方向导数取得该点处的最大值,即函数在该点处沿方向变化最快,变化率最大(为该梯度的)。

2)代价函数有哪些

0-1损失函数(0-1 loss function):

L(Y,f(X))={1,0,Y≠f(X)Y=f(X)

平方损失函数(quadratic loss function)

L(Y,f(X))=(Y−f(X))2

绝对损失函数(absolute loss function)

L(Y,f(X))=|Y−f(X)|

对数损失函数(logarithmic loss function) 或对数似然损失函数(log-likelihood loss function)

L(Y,P(Y|X))=−logP(Y|X)

3)为什么需要代价函数(损失函数)

a: 学自动化的时候,我们要求系统是收敛的,稳定的。对于模型,输入x,产生的输出y,希望能最接近期望的Y,如果y不能等于Y时,我们希望知道模型离期望的Y有多远,所以我们需要定义一个cost function以衡量模型的好坏。既然是付出代价,我们希望付出的代价最小,因为输入的x是逐步添加的,我们不可能一步到位,那么选择下降最快的方向,尽快达到最低,使得系统稳定。这就是我们需要梯度的原因。(更新权值即为更新这个函数的斜率(切线的斜率,该函数的变化快慢),在这个代价函数中,这个是以权值为参数的函数,我们要做的就是找到最小误差时,权值为多少)

梯度下降原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快;

b: 假如你现在有一个凸目标函数J(x)如下图,你想要求它的最小值。

假如你是在左边那个点上面(画出了切线和函数相交的那个点),你要往最小值的那个地方跑,你肯定不能够往上面跑对吧。要是你高中学过物理的话,你就会知道,你必须完全把速度用到切线的方向上面你才能够最快的到最小值。为什么呢?因为要是你的速度在其他的方向,最后算是你往下的速度只是你一开始速度的一个分量。那么肯定就没有那么大的速度往最小值走了对吧。

我们又知道,在一个点的切线方向就是导数的方向。你从上面的图来看的话,在最小值点处的导数是0,然后最小值左边的导数都小于0,最小值右边的导数都大于0.(这里别问我为什么)。

对于左边那个点的横坐标,是应该加上该点导数的值还是应该减去该点导数的值才能够往最小值的横坐标移动呢?如果x值要往右边移动,需要加上一个正的数,又因为这里的导数是小于0的,那么就需要减去导数值。最终对于左边这个点来说是要减去导数的值才能够向最小值移动。

对于右边那个点,想去最小值那么x需要往左边移动,因为该点的导数是大于0的,那么往左边移动需要减去导数的值。那么还是需要减去导数的值

个人总结:

在我们确定了输入了以后,这个代价函数就是以权值为参数的一个函数,我们要做的就是去寻找最小的误差点,求最小就是要去找权值点,因为这是一个以权值为参数的函数,求导,导数的含义就是变化率,当我们求出导数的值为正数时,则说明这是这是一个上升的点,上升说明了这个函数的误差率在变大,我们要往其反方向走(我们以增大的方向为正方向),怎么走,这个时候就要去找方向了,找哪个方向更快的下降,答案是切线的方向(如有不懂的地方,可以百度).当导数为负数时,则相反!

所以存在这样的式子:

这个方向是个矢量,表示朝哪个方向走,而n(导数前面那个符号)表示步长,表示我朝这个方向走多长(步长由我们用户自定义)。

求解过程

发现是不是都是关于E对w的求导。符号第一点的要求。

定义变量&4和&8

观察上图,我们发现权重wji仅能通过影响节点j的输入值影响网络的其它部分(前面只能影响后面),设netj是节点j的加权输入。

 
链式求导
 
1)输出层权值训练
有:

 
 分别求解:
 
 则:
有:
得到输出层的方程
 
 

2)隐藏层权值训练

 
隐含层: 
3)结论:
当输出层时:
 当隐含层时:

深度学习(二)BP求解过程和梯度下降的更多相关文章

  1. 深度学习面试题03:改进版梯度下降法Adagrad、RMSprop、Momentum、Adam

    目录 Adagrad法 RMSprop法 Momentum法 Adam法 参考资料 发展历史 标准梯度下降法的缺陷 如果学习率选的不恰当会出现以上情况 因此有一些自动调学习率的方法.一般来说,随着迭代 ...

  2. 【深度学习】BP反向传播算法Python简单实现

    转载:火烫火烫的 个人觉得BP反向传播是深度学习的一个基础,所以很有必要把反向传播算法好好学一下 得益于一步一步弄懂反向传播的例子这篇文章,给出一个例子来说明反向传播 不过是英文的,如果你感觉不好阅读 ...

  3. 深度学习之BP算法

    1.介绍 人工神经网络(Artificial Neural Network,ANN)简称神经网络(NN),是在现代生物学研究人脑组织所取得成果的基础上提出来的.人工神经网络是大脑生物结构的数学建模,有 ...

  4. go微服务框架go-micro深度学习 rpc方法调用过程详解

    摘要: 上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取serv ...

  5. 深度学习二、CNN(卷积神经网络)概念及理论

    一.卷积神经网络(CNN) 1.常见的CNN结构有:LeNet-5.AlexNet.ZFNet.VGGNet.ResNet等.目前效率最高的是ResNet. 2.主要的层次: 数据输入层:Input ...

  6. go微服务框架go-micro深度学习(五) stream 调用过程详解

        上一篇写了一下rpc调用过程的实现方式,简单来说就是服务端把实现了接口的结构体对象进行反射,抽取方法,签名,保存,客户端调用的时候go-micro封请求数据,服务端接收到请求时,找到需要调用调 ...

  7. go微服务框架go-micro深度学习(二) 入门例子

    上一篇帖子简单介绍了go-micro的整体框架结构,这一篇主要写go-micro使用方式的例子,中间会穿插一些go-micro的源码,和调用流程图,帮大家更好的理解go-micro的底层.更详细更具体 ...

  8. 吴恩达深度学习:2.9逻辑回归梯度下降法(Logistic Regression Gradient descent)

    1.回顾logistic回归,下式中a是逻辑回归的输出,y是样本的真值标签值 . (1)现在写出该样本的偏导数流程图.假设这个样本只有两个特征x1和x2, 为了计算z,我们需要输入参数w1.w2和b还 ...

  9. 深度学习基础(CNN详解以及训练过程1)

    深度学习是一个框架,包含多个重要算法: Convolutional Neural Networks(CNN)卷积神经网络 AutoEncoder自动编码器 Sparse Coding稀疏编码 Rest ...

随机推荐

  1. 自我介绍+github注册

    我是网络工程141的蒋易,学号是1413042018 个人兴趣:打篮球,打羽毛球,打游戏 github注册流程 id:Scorpio1 注册困难:1.刚开始网页没打开. 2.全英文的界面无法看懂,要查 ...

  2. Python学习-11.Python中的类定义

    Python是一门面向对象语言,那么作为面向对象的特征——类也是有的.值得注意的是Python中一切皆对象,并不像C#中为了性能考虑,int这些在Python中也是对象.(C#中int是结构体) 如何 ...

  3. 如何搭建eclipse+maven环境

    Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目中的jar包.本文仅对Eclipse中如何安装.配置和使用Maven进行了介绍.完全step by step. 如果觉得本文 ...

  4. 手动编译安装lamp之php

    转自马哥教育讲课文档 三.编译安装php-5.4.8 1.解决依赖关系: 请配置好yum源(可以是本地系统光盘)后执行如下命令: # yum -y groupinstall "X Softw ...

  5. leecode刷题(22)-- 反转数组

    leecode刷题(22)-- 反转数组 反转数组 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...

  6. item pipeline 实例:爬取360摄像图片

    生成项目 scrapy startproject image360 cd Image360 && scrapy genspider images  images.so.com 一. 构 ...

  7. react onclick传递参数

    最近在做react项目的时候,被一个小问题绊了一脚,记录一下 onClick 传入参数 onClick={e=>{this.Mallclose(e,index)} onClick={this.M ...

  8. 基于Django+celery二次开发动态配置定时任务 ( 二)

    一.需求 结合上一篇,使用djcelery模块开发定时任务时,定时任务的参数都保存在djcelery_periodictask表的args.kwargs字段里,并且是json格式.那么,当定时任务多了 ...

  9. Linux中的任务调度

    1.crond,linux中的任务调度器 crond的概念和crontab是不可分割的.crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入 ...

  10. JavaIO系统

    为了方便记忆,特将IO中涉及的类进行整理如下: 1.File类 提供了目录操作,查看文件属性等. 2.java IO类层次 面向字节流的类为InputStream.OutputStream:面向字符流 ...