动手学深度学习5 矩阵计算

矩阵计算--矩阵怎么求导数

  • 1. 导数和微分
  • 2. 偏导数
  • 3. 梯度
    • 1. 向量-标量求导
    • 2. 向量-向量求导
    • 3. 拓展到矩阵
  • 4. 链式法则
  • 5. 小结
  • QA
  • 练习

课程安排:
在这里插入图片描述
视频:https://www.bilibili.com/video/BV1eZ4y1w7PY/?spm_id_from=autoNext&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8
课件:https://zh-v2.d2l.ai/chapter_preliminaries/calculus.html
课上PPT:https://courses.d2l.ai/zh-v2/assets/pdfs/part-0_6.pdf

机器学习或深度学习中,所有优化模型的求解都是通过求导数来进行的。
导数 偏导数 微分 梯度 这些数学概念先了解一些方便理解。先理解一下课件。

1. 导数和微分

斜率:导数的意义。
在这里插入图片描述
图片下方的是一些链式法则。

h足够小 逼近

%matplotlib inline
import numpy as np
from matplotlib_inline import backend_inline
from d2l import torch as d2l

def f(x):
  return 3*x**2 - 4*x

def numerical_lim(f, x, h):
  return (f(x+h) - f(x))/h

h = 0.1
for i in range(5):
  print(f'h={h:.5f}, numerical limit={numerical_lim(f, 1, h):.5f}')
  h*=0.1
h=0.10000, numerical limit=2.30000
h=0.01000, numerical limit=2.03000
h=0.00100, numerical limit=2.00300
h=0.00010, numerical limit=2.00030
h=0.00001, numerical limit=2.00003

2. 偏导数

不一定存在导数怎么办
在这里插入图片描述

3. 梯度

要把形状搞对
在这里插入图片描述
在这里插入图片描述

1. 向量-标量求导

具体是怎么变化的:
x是一个列向量,y是一个标量,关于标量y关于列向量x的导数是一个行向量。第i个元素,是标量y关于标量 x i x_{i} xi的导数。
对于 ( x 1 , x 2 ) = ( 1 , 1 ) (x_{1}, x_{2})=(1,1) (x1,x2)=(1,1)这个点,对等高线做切线,切线做正交的方向,方向的值是(2,4),和等高线正交,和梯度的值【梯度带入(1,1)是(2,4)】一致,也是梯度的方向。
即梯度是和等高线正交的方向,指向的是值变化最大的方向,通常是往大的值走,是后续所有机器学习求解的核心思想。
在这里插入图片描述
向量关于向量的导数,是一个矩阵。
在这里插入图片描述
在这里插入图片描述

2. 向量-向量求导

在这里插入图片描述
在这里插入图片描述

3. 拓展到矩阵

用二维数组区分行向量跟列向量
在这里插入图片描述

4. 链式法则

在这里插入图片描述

5. 小结

在这里插入图片描述

QA

  1. 导数主要用于梯度下降,容易陷入局部最优解,有办法达到全局最优解吗?
    如果是凸函数,能拿到全局最优解,但是机器学习几乎不会处理凸函数,基本上拿不到全局最优解【理论上数学上可以,但计算上基本拿不到】。机器学习不关注P问题,关注NP问题。
在计算机科学中,P和NP是两个常见的复杂性类别。它们用于描述问题的计算复杂性。
P问题(P class)指的是那些可以在多项式时间内解决的问题。多项式时间是指问题的解决时间与问题规模的多项式成正比。P问题通常可以在合理的时间内通过确定性算法求解。
NP问题(NP class)指的是那些可以在多项式时间内验证解答的问题。换句话说,如果给定一个解决方案,我们可以在多项式时间内验证它的正确性。然而,我们不能保证在多项式时间内找到一个解决方案。因此,NP问题可能需要指数时间或更长时间来解决。
机器学习通常关注的是解决NP问题,即那些不能在多项式时间内确定性解答的问题。机器学习使用各种技术和方法,例如优化算法、近似算法和启发式算法,来尝试在合理的时间内找到可能的解决方案。
  1. pytorch不用做手动微分,有自动微分的工具包。重要的是关注:导数的形状和input的形状是怎么变化的,有什么关系。

练习

在这里插入图片描述

这章节还是得回去学习导数相关的数学知识才能更好的理解~~QAQ
1.

def use_svg_display():
  """使用svg格式在jupyter中显示绘图"""
  backend_inline.set_matplotlib_formats('svg')

def set_figsize(figsize=(3.5, 2.5)):
  """设置matplotlib的图表大小"""
  use_svg_display()
  d2l.plt.rcParams['figure.figsize'] = figsize

def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):
  """设置matplotlib的轴"""
  axes.set_xlabel(xlabel)
  axes.set_ylabel(ylabel)
  axes.set_xlim(xlim)
  axes.set_ylim(ylim)
  axes.set_xscale(xscale)
  axes.set_yscale(yscale)
  if legend:
    axes.legend(legend)
  axes.grid()

def plot(X, Y=None, xlabel=None, ylabel=None, legend=None, xlim=None, ylim=None, xscale='linear', yscale='linear', fmts=('-', 'm--', 'g-.', 'r:'), figsize=(3.5, 2.5), axes=None):
  """绘制数据点"""
  if legend is None:
    legend = []
  set_figsize(figsize)
  # 用于获取当前图形的坐标轴对象(gca代表get current axis)。它的功能是返回当前图形的坐标轴对象,以便我们可以对坐标轴进行各种设置和操作,例如设置坐标轴范围、标签、标题,添加图例等。使用d2l.plt.gca()函数可以方便地对当前图形的坐标轴进行自定义操作。
  axes = axes if axes else d2l.plt.gca()

  # 如果X有一个轴 输出True
  def has_one_axis(X):
    return (hasattr(X, 'ndim') and X.ndim == 1 or isinstance(X, list) and not hasattr(X[0], "__len__"))

  if has_one_axis(X):
    X = [X]
  if Y is None:
    X, Y = [[]] * len(X), X
  elif has_one_axis(Y):
    Y = [Y]
  if len(X) != len(Y):
    X = X * len(Y)
  axes.cla()  # Matplotlib 中的一个函数,用于清除(clear)当前坐标轴(axes)中的所有内容 以便重新制作
  for x, y, fmt in zip(X, Y, fmts):
    if len(x):
      axes.plot(x, y, fmt)
    else:
      axes.plot(y, fmt)
  set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend)


def f(x):
  return x**3 - x**(-1)

x = np.arange(0, 3, 0.1)
plot(x, [f(x), 4*x-4], 'x', 'f(x)', legend=['f(x)', 'Tangent line (x=1)'])

感觉有点对了,不知道为什么np.arange(-10, 10, 0.1)设置的话,图片就很奇怪,看着都不对。
Y 输入的是两个 [f(x), 切线方程]
切线方程:导数代入值得斜率,原函数带入值得点,一点一斜率写出切线【直线】方程
代码执行报错,无法解决。太难了~~

找了个别的写法

import numpy as np
import matplotlib.pyplot as plt

# 定义函数 f(x) 和其导数 f'(x)
def f(x):
  return x**3 - x**(-1)

def f_derivative(x):
  return 3*x**2 + x**(-2)

# 创建等间距数据点
x = np.linspace(0, 3, 10, dtype=float)
y = f(x)

# 计算切线的值
tangent_x = np.array([1], dtype=float)
tangent_y = f(tangent_x) + f_derivative(tangent_x) * (x - tangent_x)

# 绘制函数和切线图像
plt.plot(x, y, label='f(x)=x^3 - x^(-1)')
plt.plot(x, tangent_y, label='Tangent Line at x=1')
plt.scatter(tangent_x, f(tangent_x), color='red', label='Tangent Point (1, f(1))')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

在这里插入图片描述

  1. 求函数 f ( x ) = 3 ∗ x 1 2 + 5 ∗ e x 2 f(x)=3*x_{1}^2+5*e^{x_{2}} f(x)=3x12+5ex2的梯度
    要求函数 f ( x ) = 3 ∗ x 1 2 + 5 ∗ e x 2 f(x)=3*x_{1}^2+5*e^{x_{2}} f(x)=3x12+5ex2的梯度,我们需要对每个变量求偏导数。
    函数f(x)对x1的偏导数可以通过求导公式得到: ∂f/∂x1 = 6x1
    函数f(x)对x2的偏导数可以通过求导公式得到: ∂f/∂x2 = 5
    e^x2
    因此,函数f(x)的梯度为 (∂f/∂x1, ∂f/∂x2) = (6x1, 5e^x2)

  2. 没搞明白 有大佬会的能不能评论区写一写

  3. 写出函数u=f(x,y,z), 其中 x=x(a,b), y=y(a,b), z=z(a,b)的链式法则
    根据链式法则,函数u关于自变量a和b的偏导数可以表示为:
    ∂u/∂a = (∂f/∂x)(∂x/∂a) + (∂f/∂y)(∂y/∂a) + (∂f/∂z)(∂z/∂a)
    ∂u/∂b = (∂f/∂x)(∂x/∂b) + (∂f/∂y)(∂y/∂b) + (∂f/∂z)
    (∂z/∂b)
    这里,∂u/∂a 表示函数u对变量a的偏导数,∂u/∂b 表示函数u对变量b的偏导数。∂f/∂x 表示函数f对变量x的偏导数,依此类推。
    所以,链式法则可以用来计算复合函数的偏导数

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

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

相关文章

如何选择第三方电子合同平台?

说起第三方电子合同平台大家可能有点不了解,陕西CA来给大家解释解释:第三方电子合同平台是一种提供电子合同服务的第三方机构,可以提供电子合同的签署、管理、存储、公证等服务,保障电子合同的有效性和合法性。 第三方电子合同平台…

vue 里 props 类型为 Object 时设置 default: () => {} 返回的是 undefined 而不是 {}?

问题 今天遇到个小坑&#xff0c;就是 vue 里使用 props 传参类型为 Object 的时候设置 default: () > {} 报错&#xff0c;具体代码如下 <template><div class"pre-archive-info"><template v-if"infoData.kaimo ! null">{{ infoD…

如何使用Docker本地部署Wiki.js容器并结合内网穿透实现知识库共享

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

用冒泡排序谈默认参数应用

前面在调用函数提到为了将信息打印到ofil中&#xff0c;前面提到的办法是 ofstream ofil("text_out1"); void bubble_sort(vector<int> vec){ } 在file scope中定义ofil&#xff0c;这是一个不受欢迎的举动。这样比较难在其他环境重用 一般的程序编写法则是&…

组态王软件安装教程6.51/6.53/5.55/6.60/7.5SP2版本组态软件

组态王软件是一款功能强大的工业自动化软件&#xff0c;以下是各个版本的主要特点&#xff1a; 组态王6.51&#xff1a;该版本是亚控科技在组态王6.0x系列版本成功应用后&#xff0c;广泛征询数千家用户的需求和使用经验&#xff0c;采取先进软件开发模式和流程&#xff0c;由…

私有仓库工具Nexus Maven如何部署并实现远程访问管理界面

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

服务器运维小技巧(一)——如何进行远程协助

服务器运维中经常会遇到一些疑难问题&#xff0c;需要安全工程师&#xff0c;或者其他大神远程协助。很多人会选择使用todesk或者向日葵等一些远控软件。但使用这些软件会存在诸多问题&#xff1a; 双方都需要安装软件&#xff0c;太麻烦需要把服务器的公钥/密码交给对方不知道…

.NetCore Flurl.Http 4.0.0 以上管理客户端

参考原文地址&#xff1a;Managing Clients - Flurl 管理客户端 Flurl.Http 构建在堆栈之上System.Net.Http。如果您熟悉HttpClient&#xff0c;那么您可能听说过这个建议&#xff1a;不要为每个请求创建一个新客户端&#xff1b;重复使用它们&#xff0c;否则将面临后…

C++ //练习 1.15 编写程序,包含第14页”再探编译“中讨论的常见错误。熟悉编译器生成的错误信息。

C Primer&#xff08;第5版&#xff09; 练习 1.15 练习 1.15 编写程序&#xff0c;包含第14页”再探编译“中讨论的常见错误。熟悉编译器生成的错误信息。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /******************…

Django关联已有数据库中已有的数据表

Django关联已有数据库中已有的数据表 兜兜转转&#xff0c;发现自己还得用Python写后端&#xff0c;无语。。。 在写Django项目时&#xff0c;一般是通过模型来创建表&#xff0c;以及通过ORM框架来实现数据的crud&#xff0c;现在的情况是&#xff0c;如果我们的数据表已经存…

在js文件中引入外部变量

需求背景: 有个ip地址需要在项目部署后修改为客户自己的,所以就把这个ip放到了外部进行管理,方便直接修改 实现方法: 第一步:在public文件夹下创建一个json文件,里面放的就是需要在外部进行管理,随时都可以修改的变量 第二步:在需要引变量的js文件中写入如下代码 结合第一步…

Javascript,到底要不要写分号?

小白随机在互联网上乱丢一些赛博垃圾&#xff0c;还望拨冗批评斧正。 要不要加分号&#xff1f; 先说结论&#xff1a;“不引起程序出错的前提下&#xff0c;加不加都可以&#xff0c;按自身习惯来。” 为什么JS可以不加分号&#xff1f; 实际上&#xff0c;行尾使用分号的风…

命令行参数环境变量和进程空间地址

文章目录 命令行参数环境变量进程地址空间 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 命令行参数 什么是命令行参数&#xff1f; 我…

【JavaEE进阶】 关于应用分层

文章目录 &#x1f38b;序言&#x1f343;什么是应⽤分层&#x1f38d;为什么需要应⽤分层&#x1f340;如何分层(三层架构)&#x1f384;MVC和三层架构的区别和联系&#x1f333;什么是高内聚低耦合⭕总结 &#x1f38b;序言 在我们进行项目开发时我们如果一股脑将所有代码都…

限流算法之固定窗口算法

文章目录 原理示例图 优缺点优点缺点 示例代码java 适用场景不推荐原因如下&#xff1a; 原理 固定窗口算法是一种常见的限流算法&#xff0c;它通过在固定长度的时间窗口内限制请求数量来实现限流。这种算法的原理是在每个时间窗口内&#xff0c;对到达的请求进行计数&#x…

操作系统课程设计-内存管理

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 步骤 3.2 关键代码 3.2.1 显示虚拟内存的基本信息 3.2.2 遍历当前进程的虚拟内存 4 实验结果与分析 5 代码 前言 本实验为课设内容&#xff0c;博客内容为部分报告内容&#xff0c;仅为大家提供参考&#xff0c;请勿直…

【白皮书下载】GPU计算在汽车中的应用

驾驶舱域控制器 (CDC) 是汽车 GPU 的传统应用领域。在这里&#xff0c;它可以驱动仪表板上的图形&#xff0c;与车辆保持高度响应和直观的用户界面&#xff0c;甚至为乘客提供游戏体验。随着车辆屏幕数量的增加和分辨率的提高&#xff0c;对汽车 GPU 在 CDC 中进行图形处理的需…

Azure Machine Learning - 聊天机器人构建

目录 聊天机器人架构概述消耗成本环境准备打开开发环境部署和运行将聊天应用部署到 Azure使用聊天应用从 PDF 文件获取答案使用聊天应用设置更改答复行为 本文介绍如何部署和运行适用于 Python 的企业聊天应用示例。 此示例使用 Python、Azure OpenAI 服务和 Azure AI 搜索中的…

数据库-数据库分类

数据库可以分为关系型数据库和非关系型数据库&#xff0c;常见的数据库如下 关系型数据库 关系型数据库是一种采用关系模型来组织数据的数据库&#xff0c;它以行和列的形式存储数据&#xff0c;以便于用户理解。关系型数据库中的数据以二维表的形式组织&#xff0c;被称为表…

Android CarService源码分析

文章目录 一、CarService的基本架构1.1、Android Automative整体框架1.2、Framework CarService1.3、目录结构1.3.1、CarService1.3.2、Car APP 二、CarService的启动流程2.1、系统启动后在SystemServer进程中启动CarServiceHelperService2.2、CarService启动 三、CarService源…