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

news2024/12/23 5:32:01

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

  • 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的偏导数,依此类推。
    所以,链式法则可以用来计算复合函数的偏导数

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【复现】SpringBlade SQL 注入漏洞_22

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 SpringBlade 是由一个商业级项目升级优化而来的SpringCloud微服务架构,采用Java8 API重构了业务代码,完全…

具有中国特色的普及工厂数字化转型的新路子

工业互联网浪潮来袭,你准备好了吗? 国家智能制造专委会委员、浙江省智能制造专家委员会毛光烈主任在“第七届中国工业大数据大会”上的演讲,《具有中国特色的普及工厂数字化转型的新路子》,阐述了关于工厂订单全流程业务数据体系运…

C++核心编程之通过类和对象的思想对文件进行操作

目录 ​​​​​​​一、文件操作 1. 文件类型分类: 2. 操作文件的三大类 二、文本文件 1.写文件 2.读文件 三、二进制文件 1.写二进制文件 2.读二进制文件 一、文件操作 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 通过文件可以将…

GPT APP的开发步骤

开发一个GPT(Generative Pre-trained Transformer) Store(存储)涉及到使用预训练的语言模型(例如GPT-3)来生成和管理内容。以下是一般的步骤,希望对大家有所帮助。北京木奇移动技术有限公司&…

2024年美国大学生数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

适合进阶学习的 机器学习 开源项目(可快速下载)

目录 开源项目合集[>> 开源的机器学习平台:mlflow/mlflow](https://gitcode.com/mlflow/mlflow)[>> 机器学习路线图:mrdbourke/machine-learning-roadmap](https://gitcode.com/mrdbourke/machine-learning-roadmap)[>> 机器学习理论和…

VsCode 常见的配置

转载:Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】 - 知乎 (zhihu.com) 一、VsCode 常见的配置 1、取消更新 把插件的更新也一起取消了 2、设置编码为utf-8:默认就是了,不用设置了 3、设置常用的…

阿里云云原生弹性方案:用弹性解决集群资源利用率难题

作者:赫曦 随着上云的认知更加普遍,我们发现除了以往占大部分的互联网类型的客户,一些传统的企业,一些制造类的和工业型企业客户也都开始使用云原生的方式去做 IT 架构的转型,提高集群资源使用率也成为企业上云的一致…

【51单片机】数码管的静态与动态显示(含消影)

数码管在现实生活里是非常常见的设备,例如 这些数字的显示都是数码管的应用。 目录 静态数码管:器件介绍:数码管的使用:译码器的使用:缓冲器: 实现原理:完整代码: 动态数码管&#…

Linux Shell脚本入门

目录 介绍 编写格式与执行方式 Shell脚本文件编写规范 脚本文件后缀名规范 首行格式规范 注释格式 shell脚本HelloWord入门案例 需求 效果 实现步骤 脚本文件的常用执行三种方式 介绍 3种方式的区别 小结 多命令处理 Shell变量 环境变量 目标 Shell变量的介绍 变量类型 系统环境…

Java 方法中参数类型后写了三个点?什么意思?

1、...代表什么意思? 2、如何使用 3、注意事项 4、两个list,一个新的,一个旧的,旧列表中可能有新列表中存在的数据,也可能存在新列表中不存在的数据(注:新旧列表中都不存在重复元素)…

【数据结构】堆:堆的构建,堆的向上调整算法,堆的向下调整算法、堆排序

目录 一、堆的定义 1、堆的定义: 2、根节点与其左、右孩子间的联系 二、堆的创建 1、堆的向下调整算法 2、堆的向上调整算法 三、堆排序 一、堆的定义 1、堆的定义: 堆可以被看作是一棵完全二叉树的数组对象。即在存储结构上是数组&#xff0c…

2024 年 10 款最佳 Windows 免费分区管理器软件

买了一台现成的全新电脑,出于多种原因希望对硬盘进行分区,例如,为了更好地组织文件。我们整理了一份最佳分区软件列表,可以帮助您轻松完成这项任务。 适用于 Windows 11/10/8.1/8/7 的最佳 10 个磁盘分区工具 1.奇客分区大师 兼容…

vue3自定义按钮点击变颜色(切换)

实现效果图&#xff1a; 默认选中第一个按钮&#xff0c;未选中按钮为粉色&#xff0c;点击时颜色变为红色 利用动态类名&#xff0c;当定义isChange数值和下标index相同时&#xff0c;赋予act类名&#xff0c;实现变色效果 <template><view class"page"&g…

FPGA 多路分频器实验

1 概述 在 FPGA 中&#xff0c;时钟分频是经常用到的。本节课讲解 2 分频、3 分频、4 分频和 8 分频的 Verilog 实现并且学习 generate 语法功能的应。 2 程序设计思路 1&#xff09;整数倍分频&#xff0c;为 2、4、8&#xff0c;这种 2^n 次方倍数倍数关系的…

Spring Security 中 Authentication和Authorization的区别

Authentication Spring Security提供了全面的认证支持。认证是用来验证试图访问特定资源的用户身份的方式。验证用户的常见方式是要求用户输入用户名和密码。一旦认证完成&#xff0c;我们就知道了用户的身份并且可以进行授权。 Spring Security内置支持对用户进行认证。 简…

el-date-picker如果超过限制跨度则提示

需求&#xff1a;实现日期时间选择组件跨度如果超过限制天数&#xff0c;点击查询则提示超过限制时间 封装一个方法&#xff0c;传入开始和结束时间以及限制天数&#xff0c;如果超过则返回false //计算时间跨度是否超过限制天数isTimeSpanWithinLimit(startTime, endTime, li…

Android Text View 去掉默认的padding的实现方法

先看下最终实现效果&#xff0c;满意您在往下看&#xff1a; TextView 绘制的时候自带一定的Padding值&#xff0c;要想实现去掉默认的padding值&#xff0c;xml文件可以设置一个属性值 &#xff1a; android:includeFontPadding"false" 然后运行起来就会发现&…

【C++干货铺】红黑树 (Red Black Tree)

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 红黑树的插入操作 插入新的结点 检查规则进行改色 情况一 情况二 情况三 插入完整代码 红黑树的验…

ArcGIS Pro 如何新建布局

你是否已经习惯了在ArcGIS中数据视图和布局视图之间来回切换&#xff0c;到了ArcGIS Pro中却找不到二者之间切换的按钮&#xff0c;即使新建布局后却发现地图怎么却是一片空白。 这一切的一切都是因为ArcGIS Pro的功能框架完全不同&#xff0c;这里为大家介绍一下在ArcGIS Pro…