李沐动手学深度学习-优化和深度学习

优化和深度学习

对于深度学习问题,我们通常会先定义损失函数。一旦有了损失函数,就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统惯例,大多数优化算法都关注的是最小化

优化的目标

尽管优化提供了一种最大限度地减少深度学习损失函数的方法,但本质上,优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。例如,训练误差和泛化误差通常不同:由于优化算法的目标函数通常是基于训练数据集的损失函数,因此优化的目标是减少训练误差。但是,深度学习(或更广义地说,统计推断)的目标是减少泛化误差。为了实现后者,除了使用优化算法来减少训练误差之外,我们还需要注意过拟合。

%matplotlib inline
import numpy as np
import torch
from mpl_toolkits import mplot3d
from d2l import torch as d2l

为了说明上述不同的目标,引入两个概念风险经验风险。经验风险是训练数据集的平均损失,而风险则是整个数据群的预期损失。下面我们定义了两个函数:风险函数f和经验风险函数g。假设我们只有有限的训练数据。因此,这里的g不如f平滑。

def f(x):
    return x * torch.cos(np.pi * x)

def g(x):
    return f(x) + 0.2 * torch.cos(5 * np.pi * x)

下图说明,训练数据集的最低经验风险可能与最低风险(泛化误差)不同。

def annotate(text, xy, xytext):  #@save
    d2l.plt.gca().annotate(text, xy=xy, xytext=xytext,
                           arrowprops=dict(arrowstyle='->'))

x = torch.arange(0.5, 1.5, 0.01)
d2l.set_figsize((4.5, 2.5))
d2l.plot(x, [f(x), g(x)], 'x', 'risk')
annotate('min of\nempirical risk', (1.0, -1.2), (0.5, -1.1))
annotate('min of risk', (1.1, -1.05), (0.95, -0.5))

在这里插入图片描述

深度学习中的优化挑战

本章将关注优化算法在最小化目标函数方面的性能,而不是模型的泛化误差。在 :numref:sec_linear_regression中,我们区分了优化问题中的解析解和数值解。在深度学习中,大多数目标函数都很复杂,没有解析解。相反,我们必须使用数值优化算法。本章中的优化算法都属于此类别。

深度学习优化存在许多挑战。其中最令人烦恼的是局部最小值、鞍点和梯度消失。

局部最小值

对于任何目标函数 f ( x ) f(x) f(x),如果在 x x x处对应的 f ( x ) f(x) f(x)值小于在 x x x附近任意其他点的 f ( x ) f(x) f(x)值,那么 f ( x ) f(x) f(x)可能是局部最小值。如果 f ( x ) f(x) f(x) x x x处的值是整个域中目标函数的最小值,那么 f ( x ) f(x) f(x)是全局最小值。

例如,给定函数

f ( x ) = x ⋅ cos ( π x )  for  − 1.0 ≤ x ≤ 2.0 , f(x) = x \cdot \text{cos}(\pi x) \text{ for } -1.0 \leq x \leq 2.0, f(x)=xcos(πx) for 1.0x2.0,

我们可以近似该函数的局部最小值和全局最小值。

x = torch.arange(-1.0, 2.0, 0.01)
d2l.plot(x, [f(x), ], 'x', 'f(x)')
annotate('local minimum', (-0.3, -0.25), (-0.77, -1.0))
annotate('global minimum', (1.1, -0.95), (0.6, 0.8))

在这里插入图片描述

深度学习模型的目标函数通常有许多局部最优解。当优化问题的数值解接近局部最优值时,随着目标函数解的梯度接近或变为零,通过最终迭代获得的数值解可能仅使目标函数局部最优,而不是全局最优。只有一定程度的噪声可能会使参数跳出局部最小值。事实上,这是小批量随机梯度下降的有利特性之一。在这种情况下,小批量上梯度的自然变化能够将参数从局部极小值中跳出。

鞍点

除了局部最小值之外,鞍点是梯度消失的另一个原因。鞍点(saddle point)是指函数的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。考虑这个函数 f ( x ) = x 3 f(x) = x^3 f(x)=x3。它的一阶和二阶导数在 x = 0 x=0 x=0时消失。这时优化可能会停止,尽管它不是最小值。

x = torch.arange(-2.0, 2.0, 0.01)
d2l.plot(x, [x**3], 'x', 'f(x)')
annotate('saddle point', (0, -0.2), (-0.52, -5.0))

在这里插入图片描述

如下例所示,较高维度的鞍点甚至更加隐蔽。考虑这个函数 f ( x , y ) = x 2 − y 2 f(x, y) = x^2 - y^2 f(x,y)=x2y2。它的鞍点为 ( 0 , 0 ) (0, 0) (0,0)。这是关于 y y y的最大值,也是关于 x x x的最小值。此外,它看起来像个马鞍,这就是鞍点的名字由来。

x, y = torch.meshgrid(
    torch.linspace(-1.0, 1.0, 101), torch.linspace(-1.0, 1.0, 101))
z = x**2 - y**2

ax = d2l.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10})
ax.plot([0], [0], [0], 'rx')
ticks = [-1, 0, 1]
d2l.plt.xticks(ticks)
d2l.plt.yticks(ticks)
ax.set_zticks(ticks)
d2l.plt.xlabel('x')
d2l.plt.ylabel('y');

在这里插入图片描述

我们假设函数的输入是 k k k维向量,其输出是标量,因此其Hessian矩阵(也称黑塞矩阵)将有 k k k个特征值(参考特征分解的在线附录)。函数的解可能是局部最小值、局部最大值或函数梯度为零位置处的鞍点:

  • 当函数在零梯度位置处的Hessian矩阵的特征值全部为正值时,我们有该函数的局部最小值;
  • 当函数在零梯度位置处的Hessian矩阵的特征值全部为负值时,我们有该函数的局部最大值;
  • 当函数在零梯度位置处的Hessian矩阵的特征值为负值和正值时,我们有该函数的一个鞍点。

对于高维度问题,至少部分特征值为负的可能性相当高。这使得鞍点比局部最小值更有可能出现。我们将在下一节介绍凸性时讨论这种情况的一些例外。简而言之,凸函数是Hessian函数的特征值永远不为负值的函数。不幸的是,大多数深度学习问题并不属于这一类。尽管如此,它还是研究优化算法的一个很好的工具。

梯度消失

可能遇到的最隐蔽问题是梯度消失。回想一下我们在 :numref:subsec_activation_functions中常用的激活函数及其衍生函数。例如,假设我们想最小化函数 f ( x ) = tanh ⁡ ( x ) f(x) = \tanh(x) f(x)=tanh(x),然后我们恰好从 x = 4 x = 4 x=4开始。正如我们所看到的那样, f f f的梯度接近零。更具体地说, f ′ ( x ) = 1 − tanh ⁡ 2 ( x ) f'(x) = 1 - \tanh^2(x) f(x)=1tanh2(x),因此是 f ′ ( 4 ) = 0.0013 f'(4) = 0.0013 f(4)=0.0013。因此,在我们取得进展之前,优化将会停滞很长一段时间。事实证明,这是在引入ReLU激活函数之前训练深度学习模型相当棘手的原因之一。

x = torch.arange(-2.0, 5.0, 0.01)
d2l.plot(x, [torch.tanh(x)], 'x', 'f(x)')
annotate('vanishing gradient', (4, 1), (2, 0.0))

在这里插入图片描述

小结

  • 最小化训练误差并不能保证我们找到最佳的参数集来最小化泛化误差。
  • 优化问题可能有许多局部最小值。
  • 一个问题可能有很多的鞍点,因为问题通常不是凸的。
  • 梯度消失可能会导致优化停滞,重参数化通常会有所帮助。对参数进行良好的初始化也可能是有益的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563943.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PC电脑微信等软件多开详细解决方案

一、新建“微信多开.bat” 文件 备注:如果很多人看不到文件后缀名,请参考如下解决方案 二、双击修改微信的安装路径 start C:\"Program Files (x86)"\Tencent\WeChat\WeChat.exe start C:\"Program Files (x86)"\Tencent\WeChat\We…

记录一个因mysql-connetcor的jar包版本导致Maxwell无论如何起不起来的问题

【背景说明】 我需要用Maxwell把我MySQL的数据同步到kafka上,我的zk,kafka都是正常的,但是启动Maxwell的时候,无论如何起不来,maxwell中的conf.properties的配置文件也没问题(检查了好几遍) 【…

《Spring》系列文章目录

Spring Framework是一个为基于Java的现代企业应用程序提供全面编程和配置模型的开源框架。它集成了控制反转(IOC)、依赖注入(DI)和面向切面编程(AOP)等容器技术。Spring框架的设计理念是面向Bean编程&#…

new[]与delete[]

(要理解之前关于new,delete的一些概念,看​​​​​​ CSDN) 引子: 相比new,new[]不仅仅是个数的增加,还有int大小记录空间的创建, 下图中错误的用模拟多个new来替代new[],释放步…

vue3 watch监听

Watch在vue3中是一个组合API,可以多次调用,它有三个参数: Params1:被监听的变量,可以是一个数组,存放多个变量。 Params2:回调函数,监听的数据有变化时调用,回调函数中有…

Spring核心总结

要学什么? (1)核心层 * Core Container:核心容器,这个模块是Spring最核心的模块,其他的都需要依赖该模块 (2)AOP层 * AOP:面向切面编程,它依赖核心层容器,目的是在不改变原有代码的前提下对其进行功能增强 * Aspects:…

Qt分享一个壁纸页面布局的方式

分享一个壁纸软件的设计思路 在QScrollArea中添加一个总体的垂直布局,创建若干个水平布局,使用垂直布局组合,具体如图。在添加QAbstractButton时设置button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)属性,它会…

关于agi中的Function Calling深入解析

接口(Interface) 两种常见接口: 1、人机交互接口,User Interface,简称UI 2、应用程序编程接口,Application Programming Interface,简称API 接口能【通】的关键,是两边都要遵守约定。 人要按照UI的设计来操作。UI的设计要符合…

第一届 “帕鲁杯“ writeup

文章目录 MiscMisc-签到江FM 145.8ez_misc为什么我的新猫猫吃不饱 Crypto玛卡巴卡有什么坏心思呢 webWeb-签到 应急响应1.找到JumpServer堡垒机中flag标签的值。2.提交攻击者第一次登录时间。3.提交攻击者源IP。4.提交攻者使用的cve编号。5.提交攻击者留在Web服务器上的恶意程序…

更换本地yum源的步骤

更换本地yum源的流程与命令:

一山不容二虎?雷池WAF和宝塔面板共存部署

互联网上的攻击和扫描流量非常多,为了保证网站安全,在网站之前新增WAF防护是必要的。之前有了解过宝塔云WAF,但需要独立的一台服务器来部署,架构不够灵活,对于个人用户来说成本太高了。后来在微信公众号上看到简单好用…

虚良SEO怎么有效的对百度蜘蛛权重优化?

人们交换链接通常首先要问的是你BR值是多少?国内搜索引擎来说以百度马首是瞻,无论seo还是竞价都看重的是百度,那么针对百度权重的优化就特别重要了。其实,百度权重是民间的一种说法,百度官方并没有认同这个数值&#x…

三. TensorRT基础入门-TensorRT简介

目录 前言0. 简述1. 什么是TensorRT2. TensorRT的工作流介绍3. TensorRT的一些限制总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习课程第三章—TensorRT 基础入门&#xf…

Centos7.9云计算CloudStack4.15 高级网络配置(3)

上两章的文章都是用的CloudStack的基本网络,这一篇我们来介绍CloudStack的高级网络,这里虚拟机用的是自己配置的内部网络,通过nat方式到物理网络。按照第一篇的文章,安装管理服务器和计算服务器。 并且在管理服务器配置好如下的全…

Ubuntu22.04.4 - apt - 笔记

一、修改源配置 这里使用的时候又出现了联不通的情况,换成国内镜像 在update cp /etc/apt/source.list /etc/apt/source.list.bak vim source.list 换源地址 修改完(网上有,注意:根据Ubuntu版本不一样,部分内同也会不…

免费一年期ssl证书怎么申请?看这里!(教育版、政务版)

自从去年年底开始,各大公有云陆续下架一年期的免费ssl证书,且申请数量都做了限制调整,那么现在去哪里申请免费一年期的ssl证书呢? 一、短期ssl证书 首先了解一下短期免费证书的平台,一般免费证书都为90天有效期&…

kubectl常用命令行介绍

1、kubectl用法概述 kubectl命令⾏的语法如下: $ kubectl [command] [type] [name] [flags] command:命令,用于操作Kubernetes集群资源对象的命令,例如create、delete、describe、get、apply等TYPE:资源对象的类型&am…

外包干了6天,技术明显退步。。。

我是一名大专生,自19年通过校招进入湖南某软件公司以来,便扎根于功能测试岗位,一晃便是近四年的光阴。今年3月,我如梦初醒,意识到长时间待在舒适的环境中,已让我变得不思进取,技术停滞不前。更令…

【xhs爬虫软件】把小红书评论comment接口封装成GUI采集工具!

用Python开发爬虫采集软件,可自动抓取小红书评论数据,并且含二级评论。 小红书的评论接口URL是: https://edith.xiaohongshu.com/api/sns/web/v2/comment/page 开发者模式分析过程: 进而封装成GUI界面软件,如下&…

线程池中常见的几大问题

说说你对线程池的了解? 线程池,是对一系列线程进行管理的资源池,当有任务来时,我们可以使用线程池中的线程,完成任务时不需要被销毁,会重新回到池子中,等待下一次的复用。 为什么要使用线程池…