2020李宏毅学习笔记——4.Gradient Descent

最优化(optimization)。最优化就是发现能够最小化损失函数值的这组参数W的过程。损失函数量化了一组特定权重的质量。最优化的目标是去发现能够最小化损失函数值的那一组权重。
梯度告诉我们损失函数在每个维度上的斜率,所以我们可以使用梯度进行权重更新:梯度会告诉权重W和方向,当然还有超参数步长

一:公式:

1.重要元素:
元素:parameters(参数),η(学习率)
在这里插入图片描述

  1. 梯度下降直观图:
    在这里插入图片描述
    注意:1.方向(因为是减,所以要不断改变方向)

3.Gradient Descent(Batch Gradient)也就是梯度下降法是一种常用的的寻找局域最小值的方法。其主要思想就是计算当前位置的梯度,取梯度反方向并结合合适步长使其向最小值移动。通过柯西施瓦兹公式可以证明梯度反方向是下降最快的方向。

经典的梯度下降法利用下式更新参量,其中J(θ)是关于参量θ的损失函数,梯度下降法通过不断更新θ来最小化损失函数。当损失函数只有一个global minimal时梯度下降法一定会收敛于最小值(在学习率不是很大的情况下)

二.learning rate η:

1.先看图,找规律总结:
在这里插入图片描述
1.1
learning rate刚刚好,就可以像下图中红色线段一样顺利地到达到loss的最小值
1.2
learning rate太小,像下图中的蓝色线段,虽然最后能够走到local minimal的地方,但是它可能会走得非常慢,以至于你无法接受
1.3
learning rate太大.像下图中的绿色线段,它的步伐太大了,它永远没有办法走到特别低的地方,可能永远在这个“山谷”的口上振荡而无法走下去
1.4
learning rate非常大,就会像下图中的黄色线段,一瞬间就飞出去了,结果会造成update参数以后,loss反而会越来越大(这一点在上次的demo中有体会到,当lr过大的时候,每次更新loss反而会变大)

2.最基本、简单的原则
learning rate通常是随着参数的update越来越小

三.Adagrad

Adagrad算法update到后面速度会越来越慢 它是将不同参数的learning rate分开考虑的一种算法

4.但是Adagrad的表达式中,分子gt表示梯度越大需要步伐越大,分母却表示梯度越大 分母倒数步伐却变小了,两者似乎相互矛盾。
在一些paper里是这样解释的:
Adagrad要考虑的是,这个gradient有多surprise,即反差有多大。
在这里插入图片描述
5.gradient越大,离最低点越远这件事情在有多个参数的情况下是不一定成立的。
它不仅跟一阶导数(gradient)有关,还跟二阶导师有关,因此我们可以通过这种方法重新比较上面的a和c点,就可以得到比较正确的答案。
所以Adagrad想要做的事情就是,在不增加任何额外运算的前提下,想办法去估测二次微分的值
在这里插入图片描述

四:Stochastic Gradicent Descent(随机梯度下降)

1.概念:
GD 上式的梯度是基于所有数据的,如果数据量比较大时,看完所有的样本点之后再构建loss function,然后去update参数;这就会导致每次更新参量时都需要计算整个数据集而使计算量很大。
因此梯度下降法又衍生出一下其他形式,随机梯度下降法就是其中之一。顾名思义,所谓随机就是随便选取一个或一组数据去代替整个数据集来更新参数,这样计算量就会大大减少。很多文章中的随机梯度下降都只随机选取一个数据作为参考,因此有时也称为online-GD,当随机选取一组数据时又称mini-batch GD,其实本质上应该都是SGD(我是这么理解的。。)
stochastic gradient descent的做法是,看到一个样本点就update一次,因此它的loss function不是所有样本点的error平方和,而是这个随机样本点的error平方
在任意方向上都尝试迈出一步,只有这个方向能够往下才继续下一步。第二个策略具体如下:我们将以一个随机开始,生成一个随机的改变值,如果权重计算得到的损失值更小,那么我们将进行一次权重更新。

在这里插入图片描述
2.随机选取的方式有几种包括:
1,随机随机排列数据后,迭代更新参量直至收敛

2,每次迭代时都进行数据随机排列

3,每次迭代时从数据中随机选取一个数据

总结

gradient descent的限制是:它在gradient即微分值接近于0的地方就会停下来,而这个地方不一定是global minima,它可能是local minima,可能是saddle point鞍点,甚至可能是一个loss很高的plateau平缓高原

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值