7.深度学习概述

news2024/9/28 19:22:33

深度学习概述

  • 1. 线性回归
    • 1.1 线性回归一般表达式
    • 1.2 线性回归内积表达方式:
    • 1.3 多个样本时,线性回归的进一步表达:
    • 1.4 线性回归方程的解析
    • 1.5 线性回归就是求loss函数的最小值
  • 2. 如何求函数最小值
    • 2.1 一个例子
    • 2.2 求导法——求最小值
    • 2.3 求导法存在的问题
    • 2.4 迭代法——求最小值
  • 3. 代码实现
    • 3.1 手动求函数最小值
    • 3.2 使用pytorch求函数最小值

原文: https://blog.csdn.net/Deadwalk/article/details/139606252?spm=1001.2014.3001.5502

1. 线性回归

1.1 线性回归一般表达式

  • y = f ( x ) = x 1 w 1 + x 2 w 2 + . . . + x n w n + b y = f(x) = x_1w_1 + x_2w_2 + ... + x_nw_n + b y=f(x)=x1w1+x2w2+...+xnwn+b
    • ( x 1 、 x 2 、 x n ) :输入特征向量 ( x ) 的各个特征值,代表输入数据的特征。 (x_1、x_2、x_n):输入特征向量 ( x ) 的各个特征值,代表输入数据的特征。 (x1x2xn):输入特征向量(x)的各个特征值,代表输入数据的特征。
    • ( w 1 、 w 2 、 w n ) :权重向量 ( w ) 的各个权重值,用来衡量每个特征对输出的影响程度。 (w_1、w_2、w_n):权重向量 ( w ) 的各个权重值,用来衡量每个特征对输出的影响程度。 (w1w2wn):权重向量(w)的各个权重值,用来衡量每个特征对输出的影响程度。
    • ( b ) :偏置项,也称为截距项,用来调整模型的输出值,即在没有特征输入时的输出值。 ( b ):偏置项,也称为截距项,用来调整模型的输出值,即在没有特征输入时的输出值。 (b):偏置项,也称为截距项,用来调整模型的输出值,即在没有特征输入时的输出值。
    • ( y ) :模型的输出值,即线性回归模型对输入特征的预测值。 ( y ):模型的输出值,即线性回归模型对输入特征的预测值。 (y):模型的输出值,即线性回归模型对输入特征的预测值。

1.2 线性回归内积表达方式:

  • y = f ( x ) = x @ w + b y = f(x) = x@w+ b y=f(x)=x@w+b
    • x @ w :特征向量 ( x ) 与权重向量 ( w ) 的内积 x@w:特征向量 ( x ) 与 权重向量( w ) 的内积 x@w:特征向量(x)与权重向量(w)的内积

1.3 多个样本时,线性回归的进一步表达:

  • y = f ( X ) = X @ w + b y = f(X) = X@w+ b y=f(X)=X@w+b
    • X :特征矩阵,矩阵的行是一条一条的样本,矩阵的列是多个特征向量。 X:特征矩阵,矩阵的行是一条一条的样本,矩阵的列是多个特征向量。 X:特征矩阵,矩阵的行是一条一条的样本,矩阵的列是多个特征向量。

1.4 线性回归方程的解析

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

  • 在训练时,xy是训练集中的特征和标签,看作是常量wb是待优化的参数值,看作是变量
  • 在推理时,wb已经找到了比较合适的值固定下来,看作常量;此时x是待预测的样本的特征,是变量
  • 预测的本质:把x,求解y

1.5 线性回归就是求loss函数的最小值

  • 训练过程
    在这里插入图片描述
    • 从训练集中取出一对x 和y
    • 把x带入模型,求解预测结果y_pred
    • 找到一种方法,度量y和y_pred的误差loss
    • 由此推导:
      • loss是y和y_pred的函数;
      • y_pred是模型预测的结果,是w和b的函数;
      • 所以简单来说,loss也是w和b的函数
  • 训练的本质
    由上图推导结果可知,训练的本质就是求解loss什么时候是最小值。当w和b取得什么值的时候,loss最小。

2. 如何求函数最小值

2.1 一个例子

  • y = 2 x 2 y= 2x^2 y=2x2
    在这里插入图片描述
  • 上述这个示例中,求y最小值是比较简单的,从图形中可以看到x=0时,y=0为最小值。但是实际工程中,并不是所有的函数y=f(x)都能画出来,简单地找到最小值,此时就需要使用导数求最小值。

2.2 求导法——求最小值

  • 通过回归导数求极值的方法,我们知道大致步骤如下:
    • 第一步:求函数的导数
    • 第二步:令导数等于零
    • 第三步:解方程,求出疑似极值点
    • 第四步:验证该点是否是极值点以及是什么极值点

2.3 求导法存在的问题

  • 求导的方法是有一定前提条件的,即:
    • 第一步的求(偏)导数是可以求得的;
    • 第三步(偏)导数为零后,方程(组)是可以解的。
    • 实际工程中,上述方法是不可行的。以Llama3-8B模型为例,其有80亿个输入参数 x,按照上述的求解方法是几乎无法求得最小值的!
    • 由此可知,通过推导公式期望一次性求得最小值是不现实的;而我们可以借鉴人工智能中一个重要的思想:迭代法来逐步求解最小值。

2.4 迭代法——求最小值

  • 原理如下图:
    在这里插入图片描述
  • 随机选择一个出生点 x 0 : 随机选择一个出生点x_0: 随机选择一个出生点x0
    • 当 x 0 在最小值的左侧时: x 0 + 正数(一个非常小的正数),向右侧移动,而最小值左侧的导数是负数,所以可以看作 x 0 − 导数 当x_0在最小值的左侧时:x_0 + 正数(一个非常小的正数),向右侧移动,而最小值左侧的导数是负数,所以可以看作 x_0 - 导数 x0在最小值的左侧时:x0+正数(一个非常小的正数),向右侧移动,而最小值左侧的导数是负数,所以可以看作x0导数
    • 当 x 0 在最小值的右侧时: x 0 − 正数(一个非常小的正数),向左侧移动,而最小值右侧的导数是正数,所以也可以看作 x 0 − 导数 当x_0在最小值的右侧时:x_0 - 正数(一个非常小的正数),向左侧移动,而最小值右侧的导数是正数,所以也可以看作 x_0 - 导数 x0在最小值的右侧时:x0正数(一个非常小的正数),向左侧移动,而最小值右侧的导数是正数,所以也可以看作x0导数
    • 当 x 0 是最小值时: x 0 不需要移动,而此处的导数也正是 0 ,所以依然可以看作 x 0 − 导数 当x_0是最小值时:x_0不需要移动,而此处的导数也正是0,所以依然可以看作 x_0 - 导数 x0是最小值时:x0不需要移动,而此处的导数也正是0,所以依然可以看作x0导数
  • 梯度下降的概念
    • 在一元函数中,求函数f(x)在某一点的斜率为导数;在多元函数中,称为偏导数,也就是梯度。
    • 减去导数也就是减去梯度,这就是梯度下降法!

3. 代码实现

3.1 手动求函数最小值

  • y = 2 x 2 y= 2x^2 y=2x2
import numpy as np

def fn(x):
    """
    原始函数
    """
    return 2 * x ** 2

def dfn(x):
    """
    导函数
    """
    return 4 * x

def gradient_descent(x0, learning_rate, dfn, epochs):
    """
    使用梯度下降法求函数的最小值

    Parameters:
        x0 (float): 初始点的位置
        learning_rate (float): 学习率
        dfn (function): 导函数
        epochs (int): 迭代次数

    Returns:
        x_min (float): 最小值点的位置
    """
    for _ in range(epochs):
        x0 = x0 - learning_rate * dfn(x0)
    
    return x0

# 随机选择一个出生点
x0 = np.random.randint(low=-1000, high=1000, size=1)

# 迭代次数
epochs = 1000

# 学习率
learning_rate = 1e-2

# 使用梯度下降法求最小值
x_min = gradient_descent(x0, learning_rate, dfn, epochs)

# 输出最小值
print("最小值点的位置:", x_min)
  • f ( x , y , z ) = x 2 + y 2 + z 2 f ( x , y , z ) = x^2 + y^2 + z^2 f(x,y,z)=x2+y2+z2
import numpy as np

def df_x(x, y, z):
    """
    f 对 x 求偏导
    """
    return 2 * x

def df_y(x, y, z):
    """
    f 对 y 求偏导
    """
    return 2 * y

def df_z(x, y, z):
    """
    f 对 z 求偏导
    """
    return 2 * z

# 随机选择出生点
x0 = np.random.randint(low=-1000, high=1000, size=(1,))
y0 = np.random.randint(low=-1000, high=1000, size=(1,))
z0 = np.random.randint(low=-1000, high=1000, size=(1,))

# 迭代次数
epochs = 1000

# 学习率
learning_rate = 1e-2

for _ in range(epochs):
    # 求解每个变量的偏导
    fx = df_x(x0, y0, z0)
    fy = df_y(x0, y0, z0)
    fz = df_z(x0, y0, z0)
    
    # 每个变量都减去自己的偏导
    x0 = x0 - learning_rate * fx
    y0 = y0 - learning_rate * fy
    z0 = z0 - learning_rate * fz

# 输出更新后的变量值
print("更新后的 x 值:", x0)
print("更新后的 y 值:", y0)
print("更新后的 z 值:", z0)

3.2 使用pytorch求函数最小值

  • y = 2 x 2 y= 2x^2 y=2x2
import torch

# 定义原始函数和导函数
def fn(x):
    return 2 * x ** 2

# 说明:pytorch可以通过grad函数求导,所以可以省去写导函数
# def dfn(x):
#     return 4 * x

# 随机选择出生点
# requires_grad=True用来告诉框架该变量是一个张量,需要计算梯度。
x0 = torch.randint(low=-1000, high=1001, size=(1,), 
                   dtype=torch.float32, 
                   requires_grad=True)

# 迭代次数
epochs = 1000

# 学习率
learning_rate = 1e-2

# 使用 PyTorch 进行梯度下降
for _ in range(epochs):
    # 正向传播计算损失
    loss = fn(x0)
    
    # 反向传播计算梯度
    loss.backward()
    
    # 获取梯度并更新参数
    with torch.no_grad():
        grad = x0.grad
        x0 -= learning_rate * grad
    
    # 梯度清零
    x0.grad.zero_()

# 输出最小值点的位置
print("最小值点的位置:", x0.item())

  • f ( x , y , z ) = x 2 + y 2 + z 2 f ( x , y , z ) = x^2 + y^2 + z^2 f(x,y,z)=x2+y2+z2 为例
import torch

def fn(x, y, z):
    """
        函数定义
    """
    return x**2 + y**2 + z**2


# 说明:pytorch可以通过grad函数求导,所以可以省去写导函数
# def df_x(x, y, z):
#     return 2 * x

# def df_y(x, y, z):
#     return 2 * y

# def df_z(x, y, z):
#     return 2 * z

# 随机选择出生点
x0 = torch.randint(low=-1000, high=1001, size=(1,), 
                   dtype=torch.float32, 
                   requires_grad=True)
y0 = torch.randint(low=-1000, high=1001, size=(1,), 
                   dtype=torch.float32, 
                   requires_grad=True)
z0 = torch.randint(low=-1000, high=1001, size=(1,), 
                   dtype=torch.float32, 
                   requires_grad=True)

# 迭代次数
epochs = 1000

# 学习率
learning_rate = 1e-2

# 使用 PyTorch 进行梯度下降
for _ in range(epochs):
    # 正向传播计算损失
    loss = fn(x0, y0, z0)
    
    # 反向传播计算梯度
    loss.backward()
    
    # 获取梯度并更新参数
    # 在测试阶段或者不需要计算梯度的情况下使用 torch.no_grad()
    # 以提高计算效率并避免不必要的梯度计算。
    with torch.no_grad():
        x0 -= learning_rate * x0.grad
        y0 -= learning_rate * y0.grad
        z0 -= learning_rate * z0.grad
    
    # 梯度清零
    x0.grad.zero_()
    y0.grad.zero_()
    z0.grad.zero_()

# 输出更新后的变量值
print("更新后的 x 值:", x0.item())
print("更新后的 y 值:", y0.item())
print("更新后的 z 值:", z0.item())


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

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

相关文章

CVE-2024-34351 漏洞复现

CVE-2024-34351&#xff0c;由Next.js异步函数createRedirectRenderResult导致的SSRF。 影响版本&#xff1a;13.4.0< Next.js < 14.1.1 参考文章&#xff1a; Next.js Server-Side Request Forgery in Server Actions CVE-2024-34351 GitHub Advisory Database Gi…

Ubuntu22.04.4 LTS系统/安装Anaconda【GPU版】

安装过程 1.wget命令行下载 下载Anaconda并保存文件至本地指定目录 wget -c https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh -P ~/Downloads/anaconda3 查看是否下载好了 2.安装Anaconda 2.1 bash命令安装 bash后面是anaconda3下载好的路径 bash …

节点的真相:纠正大众对区块链安全概念的误解

​​发表时间&#xff1a;2024年4月25日 长期以来&#xff0c;人们都在对区块链及其基本原则进行讨论&#xff0c;但是只有“节点”这个概念被精准地定义&#xff0c;才能让我们穿越“去中心化”这个复杂概念的迷雾。在网络学的理论中&#xff0c;节点代表网络或图形中的一个实…

防火墙实验配置

实验要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00-18&#xff1a;00&#xff09;可以访问&#xff0c;生产区全天都能访问 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3&#xff0c;…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现(论文7000字参考+源码+LW+部署讲解)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

【Android】基于 LocationManager 原生实现定位打卡

目录 前言一、实现效果二、定位原理三、具体实现1. 获取权限2. 页面绘制3. 获取经纬度4. 方法调用5. 坐标转换6. 距离计算7. 完整代码 前言 最近公司有个新需求&#xff0c;想要用定位进行考勤打卡&#xff0c;在距离打卡地一定范围内才可以进行打卡。本文将借鉴 RxTool 的 Rx…

nodejs实现文件的分片写入和读取

&#xff08;1&#xff09;创建 test.cjs 文件 &#xff08;2&#xff09;代码 const {readFileSync,writeFileSync} require(fs); const {dirname} require(path); const chunkSize 1024 * 8; // 切片大小 const path C:\\Users\\cat\\De…

高速电吹风方案介绍,多档温度风速调节,转速可达105000RPM

高速电吹风是这几年很火的一种电动小家电&#xff0c;能够在较短时间内完成头发干燥&#xff0c;减少对头发的热损伤。可以通过高速电机和风扇来产生高速风流&#xff0c;迅速将头发表面的水分吹干。高速电吹风通常配有多种档位风速和温度可以设置&#xff0c;用户可以根据需要…

vue中,图片在div中按照图片原来大小等比例显示

图片在div中按照图片原来大小等比例显示&#xff0c;可以保证web上显示的图片和实际图片形状一样&#xff0c;保留原始图片效果 实现代码如下&#xff1a; <div style"padding: 0; width:400px;height:400px;position: absolute;border: 1px solid #eff2f6;">…

学习笔记——动态路由——OSPF链路状态通告(LSA)

十、OSPF链路状态通告(LSA) 1、链路状态通告简介 (1)LAS概述 链路状态通告(Link State Advertisement&#xff0c;LSA)是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位&#xff0c;LSDB由一条条LSA构成的。是OSPF中计算路由的重要依据。 LSA用于向其它邻接OSPF路…

Selenium使用注意事项:

find_element 和 find_elements 的区别 WebDriver和WebElement的区别 问题&#xff1a; 会遇到报错&#xff1a; selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector",&…

UML类图的概述

新书速览|《UML 2.5基础、建模与设计实践》新书速览|《UML 2.5基础、建模与设计实践 类是对一组具有相同属性、操作、关系和语义的对象的抽象&#xff0c;主要包括名称&#xff08;Name&#xff09;部分、属性&#xff08;Attribute&#xff09;部分和操作&#xff08;Operati…

碳化硅陶瓷膜的基本性能

碳化硅陶瓷膜作为一种由碳化硅(SiC)材料制成的高温陶瓷膜&#xff0c;以其独特的性能在多个领域得到了广泛的应用。以下是碳化硅陶瓷膜的基本性能&#xff0c;详细阐述如下&#xff1a; 一、电绝缘性 碳化硅陶瓷膜通常具有较好的电绝缘性&#xff0c;这一特性在高温环境中尤为重…

两年经验前端带你重学前端框架必会的ajax+node.js+webpack+git等技术 Day3

前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;个人学习心得作业及bug记录 Day3 你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本…

flask模块化、封装使用缓存cache(flask_caching)

1.安装flask_caching库 pip install flask_caching 2.创建utils Python 软件包以及cache_helper.py 2.1cache_helper.py代码 from flask_caching import Cachecache Cache()class CacheHelper:def __init__(self, app, config):cache.init_app(app, config)staticmethoddef…

Objective-C 中的 isa 不再是简单的结构体指针

了解 Objective-C 中的 isa 指针内存结构 在 Objective-C 中&#xff0c;isa 指针是对象和类之间的重要桥梁。它不仅帮助运行时系统识别对象的类型&#xff0c;还参与了一些内存和性能优化。本文将深入讲解 isa 指针的内存结构&#xff0c;包括其在早期和现代实现中的演变。 …

科普文:深入理解Mybatis

概叙 (1) JDBC JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 优点…

openWrt入门(2) - ubus

ubus - 帮助输出 ubus list - 列表 要了解当前总线上正在运行哪些服务&#xff0c;只需使用以下 ubus list 命令即可。这将显示向 RPC 服务器注册的所有命名空间的完整列表&#xff1a; 列表显示如下: 指定服务路径来筛选列表 -v选项 要找出特定服务提供哪些过程/方法及其参…

PDManer使用教程及安装包

以下安装包版本比较低&#xff0c;用习惯了&#xff0c;需要高版本可以去官网下载 链接&#xff1a;https://pan.baidu.com/s/1Hj4zJ0UCcdk0YQTlteVCTQ?pwdv72v 提取码&#xff1a;v72v 使用教程 连接数据库 导入表信息 创建关系图 第一步 第二步 如果列显示不全 &#x…

windows10设置环境变量Path步骤

1、鼠标右键“我的电脑”&#xff0c;点击“属性”&#xff0c;打开控制面板窗口&#xff0c;如图&#xff1a; 2、点击“高级系统设置”&#xff0c;弹出设置窗口&#xff0c;如图&#xff1a; 3、点击底部的“环境变量”&#xff0c;弹出环境变量窗口&#xff0c;如图&#x…