当前位置: 首页 > news >正文

Chapter 5 Deep Learning

Backpropagation

引入话题

从前面的学习的梯度下降法我们可以知道:
参数的决定因素是上一个参数、学习率以及梯度,例如:\theta ^{1}=\theta ^{0}-\eta \bigtriangledown L(\theta ^{0})

其中,梯度\bigtriangledown L(\theta )是个向量

 那么如何有效得将百万维的向量计算出来,这时候我们就需要使用Backpropagation

所需的数学知识——链式法则

情况一:y=g(x)z=h(y)

              \Delta x\rightarrow \Delta y\rightarrow \Delta z

              那么:\frac{dz}{dx}=\frac{dz}{dy}\frac{dy}{dx}

情况二:x=g(s)y=h(s)z=k(x,y)

            

            那么: \frac{dz}{ds}=\frac{\partial z}{\partial x}\frac{dx}{ds}+\frac{\partial z}{\partial y}\frac{dy}{ds}

设置一个损失函数:L(\theta )=\sum_{n=1}^{N}l^{n}(\theta ),其中l(\theta )表示y^{n}\widehat{y}^{n}之间的距离,距离越大说明这个神经网络的参数值\theta不好。损失函数对某个参数w求微分是\frac{\partial L(\theta )}{\partial w}=\sum_{n=1}^{N}\frac{\partial l^{n}(\theta )}{\partial w}

取神经网络中的一部分来说明:
 

 w_{1}=\frac{\partial z}{\partial x_{1}}w_{2}=\frac{\partial z}{\partial x_{2}}

Forward pass和Backward pass

计算所有的参数的偏导数\frac{\partial z}{\partial w},叫做Forward pass,图如下:

 计算所有激活功能输入值的偏导数\frac{\partial l}{\partial z},叫做Backward pass,图如下:

由于z在正向传递( forward pass)中已经确定,所以\sigma ^{'}(z)是一个常数,所以上式就只有\frac{\partial l}{\partial z^{'}}\frac{\partial l}{\partial z^{''}}是未知的。因此分情况讨论:

 情况一:红色圈圈位置就是输出层

 那么:\frac{\partial l}{\partial z^{'}}=\frac{\partial y_{1}}{\partial z^{'}}\frac{\partial l}{\partial y_{1}}\frac{\partial l}{\partial z^{''}}=\frac{\partial y_{2}}{\partial z^{''}}\frac{\partial l}{\partial y_{2}},所以\frac{\partial l}{\partial z^{'}}\frac{\partial l}{\partial z^{''}}求出来了。

情况二:红色圈圈位置不是输出层

 利用递归的方法,直到找到输出层,从后向前偏导,拿下图举例:

已知了\frac{\partial l}{\partial z_{5}}=\frac{\partial y_{1}}{\partial z_{5}}\frac{\partial l}{\partial y_{1}}\frac{\partial l}{\partial z_{6}}=\frac{\partial y_{2}}{\partial z_{6}}\frac{\partial l}{\partial y_{2}}

所以可以求得\frac{\partial l}{\partial z_{3}}=\sigma ^{'}(z_{3})(w_{3}\frac{\partial l}{\partial z_{5}}+w_{4}\frac{\partial l}{\partial z_{6}}),以此向前类推,直到求得 \frac{\partial l}{\partial z^{'}}\frac{\partial l}{\partial z^{''}} 。

总结步骤:先求出Forward pass,后求出Backward pass,两者相乘得出最终的某个参数的偏导数,进而求得损失函数。

 Tips for Training DNN

深度学习的秘诀

过拟合并非是我们面临的第一个问题,我们需要确定神经网络在训练数据中是否可以得到一个好的结果,如果没有,重新进行三步走,看看哪步需要做出一些修改;如果有好的结果且在测试数据中没有得到好的结果,那么就可以判断为过拟合。

 当看到下面这个图,56层的比20层的测试误差更大,就会判定应该是参数过多,出现过拟合。那么事实上真的是这样吗?这个时候我们需要查看训练数据上两者的情况做出正确的判断。

我们从训练数据可以看到56层的神经网络是没有训练好。

new activation function

 事实上,层数越多并非意味着最好。

 特征:

 为了使得输出层的损失值l变小,在输入层处添加一个\Delta w。但是对梯度的影响是越来越小,输出层损失值就不会变很小,例如sigmod函数。

 sigmod函数:很大变化的输入会产生很小变化的输出,如下:

 

 那么,如何解决这个问题呢?

我们采用的方法是:Rectified Linear Unit(ReLU)

假设a——输出,z——输入,两者之间的关系如下所示:

 选择这样的关系有以下几个理由:

(1)计算快

(2)生物上的理由

(3)无穷多的sigmod函数叠加的结果

(4)最重要的是:可以解决梯度问题

ReLU进阶版:Leaky ReLU、Parametric ReLU、Maxout

 PS:Maxout可以得到ReLU,如下图:

 

Learnable activation function的特征: 

(1)maxout中的激活函数可以是任意分段线性凸函数;

(2)多少块取决于一组中有多少个元素。

 那么,给定训练数据的输入值x,如何得到最大的输出值呢?

 Maxout中,我们在每一步选择最大值(即,红色框框部分),这样我们就可以得到一个细而线性的网络,如下图所示。然后对其训练。

 Adaptive Learning Rate

Adagrad:

RMSProp:其中\alpha可以自行调整

local minima问题

 解决办法——Momentum,简单来说,在真实世界中,小球会因为惯性而一直向前,从而度过了局部最低点,从而解决了Momentum。具体见https://blog.csdn.net/qwertyuiop0208/article/details/126348658

Early Stopping

 Regularization

要最小化的新损失函数,就要找一组不仅使原始损失(例如:最小化平方误差、交叉熵)最小而且接近于零的权重。

权重是在慢慢下降的。

Dropout

  每次在更新参数之前,每个神经元都有p%的丢失率,当某个神经元丢失,那么就会失去作用。

 从而导致网络的结构发生了变化(变得细长),所以要使用新网络进行训练。对于每一个小批,我们对丢失的神经元进行重新取样。

 而在测试的时候,注意两件事情:

(1)不做dropout操作。

(2)如果训练时的丢失率是p%,那么所有的权重需要乘以1-p%。例如丢失率为50%,如果通过训练使权重w=1,则设置w=0.5进行测试。

测试时不做dropout操作的直觉原因:

(1)训练时脚上绑了重物,而测试时重物被拿掉,自然就会变得很强。

(2) 当团队合作时,如果每个人都期望合作伙伴会做工作,最终什么也做不成。然而,如果你知道你的伙伴会dropout,你会做得更好。所以在测试时不做dropout操作,所以最终获得了好的结果。

测试时权重要乘以(1-p)%(丢失率)的直觉原因:

Dropout is a kind of ensemble:

ensemble是训练一堆不同结构的网络

 在dropout时就会产生很多种网络。不同网络的参数有可能是共用的。

 举例:输入值为x_{1},x_{2},输出值为z

 ensemble:输入值有可能被dropout,有可能不被dropout,所以就会产生四种情况。

将这四种情况平均一下得到:z=\frac{1}{2}(w_{1}x_{1}+w_{2}x_{2})

如果我们改变权重,不做dropout,那么也能得到平均后的结果,如下: 

Why deep Learning?

我们可以看到,参数越多,错误率就越低,网络就越好。

 那么,同等参数下,是又胖又短的网络(shallow model)还是又瘦又长的网络(deep model)好呢?

 我们可以看到,层数少,参数多的反而没有那么好,这是为什么呢?

 modularization(模块化)

 事实上,当我们写写程序时,我们并不会将所有的部分作为主要程序,而是将其模块化,如下:

举个例子:对一个人的判断分为长发女、短发女、长发男、短发男四种。显然,长发男的数据相对其他三种肯定是比较少的,所以将有很少的数据可以拿去训练,那么这个时候该怎么做的?

modularization是先进行一个基础的分类:男生or女生、长发or短发。

通过基础分类,就可以训练较少的数据,得到较好的结果。 

 模块化和深度学习关系如下图,模块化是从数据中自动学习的

 Universality theorem

只要有够多的参数,那么就可以代表任何的函数,但是当我们只用一个到一个隐藏层是没有效率的,只有深层结构才更有效。

deep learning 优点

深度学习可以解决复杂的问题,例如很相似的输入可能有不同的输出;很不同的输入可能有相同的输出。

 举例:图像上,可以很清晰得将相同的类归在一起,不同的类分开。

 

相关文章:

  • Windows与网络基础-8-windows基本命令-文本操作
  • 元宇宙办公室APP功能系统软件源码开发
  • Kafka监控与指标解析-UnderReplicatedPartitions
  • css:移动端实现1px、0.5px的细线
  • 解决方案|电力行业应如何应对数字化转型危机
  • 使用iptables动态映射Docker容器端口
  • 低代码怎么用?三位一体发挥最大价值!
  • Libra论文阅读笔记-A unified congestion control framework for diverse application
  • Python代码优化工具——memory_profiler
  • LeetCode220831_92、滑动窗口最大值
  • 哈希碰撞概率计算
  • 2021年超全中高级Java工程师面试题+答案
  • 阿里新产MySQL性能优化实践笔记,GitHub已获千万推荐
  • yolov5篇---官方ultralytics / yolov5代码复现,训练自己的数据集
  • avalanche 配置dns解析域名
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  •  D - 粉碎叛乱F - 其他起义
  • HashMap ConcurrentHashMap
  • Javascript 原型链
  • mongodb--安装和初步使用教程
  • PHP的Ev教程三(Periodic watcher)
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring Cloud Feign的两种使用姿势
  • supervisor 永不挂掉的进程 安装以及使用
  • 初识 beanstalkd
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 机器学习 vs. 深度学习
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 收藏好这篇,别再只说“数据劫持”了
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 提醒我喝水chrome插件开发指南
  • 通过git安装npm私有模块
  • 微服务框架lagom
  • 我有几个粽子,和一个故事
  • 延迟脚本的方式
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • RDS-Mysql 物理备份恢复到本地数据库上
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三)Honghu Cloud云架构一定时调度平台
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net MVC + EF搭建学生管理系统
  • .NET MVC 验证码
  • .net和php怎么连接,php和apache之间如何连接
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .py文件应该怎样打开?
  • /dev/sda2 is mounted; will not make a filesystem here!
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @拔赤:Web前端开发十日谈
  • [ Linux Audio 篇 ] 音频开发入门基础知识