7.深度学习概述

深度学习概述

  • 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 npdef fn(x):"""原始函数"""return 2 * x ** 2def dfn(x):"""导函数"""return 4 * xdef 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 npdef df_x(x, y, z):"""f 对 x 求偏导"""return 2 * xdef df_y(x, y, z):"""f 对 y 求偏导"""return 2 * ydef 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-2for _ 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 * fxy0 = y0 - learning_rate * fyz0 = 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.gradx0 -= 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 torchdef 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.grady0 -= learning_rate * y0.gradz0 -= 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.mzph.cn/news/869624.shtml

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

相关文章

使用“nvm use 版本号“命令无效

使用"nvm use 版本号"命令无效 为什么无效?解决 为什么无效? 解决 将这个nodejs文件夹删除,然后在运行nvm use 版本号,则 node生效.

FastAPI 学习之路(三十四)数据库多表操作

之前我们分享的是基于单个表的数据库表的操作,我们在设计数据库的时候也设计了跨表,我们可以看下数据库的设计 class User(Base):__tablename__ "users"id Column(Integer, primary_keyTrue, indexTrue)email Column(String(10), uniqueTr…

不想成为失业大军,就要学习六西格玛?

最近,优思学院收到一封邮件,这封邮件的发送者是一位完成了我们六西格玛绿带课程的学生。 他的公司裡有20%的工程师被裁员,但值得注意的是,留下来的工程师中有70%人竟然都持有六西格玛绿带或黑带证书。 他的公司不仅希望利用这些…

el-table封装popver組件,点击列筛选行数据功能,支持筛选,搜索,排序功能

子组件&#xff1a; <template><div class"tableTool" ref"tableTool" click.stop><el-button click"shengFnc">升序</el-button><el-button click"jiangFnc">降序</el-button><el-input v-m…

安卓 APK 安装过程详解

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 开机后连上网线 2. 查看网线的IP地址 3. 检查ADB连接 4. 修改文件权限 步骤 结语 我的其他博客 前言 在安卓设备上安装…

python3 ftplib乱码怎么解决

其实很简单。ftplib.FTP里面有个参数叫encoding。 如上图最后一行。所以在使用FTP时&#xff0c;主动指定编码格式即可。 ftp ftplib.FTP() ftp.encoding "utf-8" 再使用就可以了。

!vue3中defineEmits接收父组件向子组件传递方法,以及方法所需传的参数及类型定义,避免踩坑!

使用说明 1、在子组件中调用defineEmits并定义要发射给父组件的方法 const emits defineEmits([‘foldchange’]) 2、使用defineEmits会返回一个方法&#xff0c;使用一个变量emits(变量名随意)去接收 3、在子组件要触发的方法中&#xff0c;调用emits并传入发射给父组件的方法…

Kimi携手思维链,点亮论文写作之路!

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术的海洋中&#xff0c;思想的火花常常在静谧的图书馆角落或深夜的电脑屏幕前迸发。今天分享的内容是一种高阶的论文写作方法&#xff1a;Kimi思维链。 Kimi&#xff0c;一个由月之…

【数据结构和算法的概念等】

目录 一、数据结构1、数据结构的基本概念2、数据结构的三要素2.1 数据的逻辑结构2.2 数据的存储&#xff08;物理&#xff09;结构2.3 数据的运算 二、算法1、算法概念2、算法的特性及特点3、算法分析 一、数据结构 1、数据结构的基本概念 数据&#xff1a; 是所有能输入到计…

D634-341C电液伺服系统比例控制阀 R40KO2M0NSS2

D634-341C/R40KO2M0NSS2宁波秉圣现货供应 宁波秉圣工业技术有限公司是一家专门从事于欧洲,美国等多国家的进口备件进出口销售、技术咨询、技术服务、自动化设备服务为一体的贸易公司。公司的优势品牌如下&#xff1a;德国REXROTH&#xff08;力士乐&#xff09;、德国MOOG、美…

全球数字贸易中心解析_保税区保的是什么税_为什么保税区还要交税

保税区税收机制深度解析&#xff1a;保税免的是什么税&#xff1f;为何仍需缴税&#xff1f; 保税区概述 保税区&#xff0c;作为海关特殊监管区域的重要一环&#xff0c;享有国家高度开放的政策优惠与功能齐全的海关监管服务。它专为保税加工、保税物流和保税服务而设&#…

【Python】已解决:ModuleNotFoundError: No module named ‘pip‘(重新安装pip的两种方式)

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例 四、重新安装pip的两种方式方式一&#xff1a;使用get-pip.py脚本方式二&#xff1a;使用ensurepip模块五、注意事项 已解决&#xff1a;ModuleNotFoundError: No module named ‘pip’&#xff08;重新安装pip的…

GLM4大模型微调入门实战-命名实体识别(NER)任务

[GLM4]是清华智谱团队最近开源的大语言模型。 以GLM4作为基座大模型&#xff0c;通过指令微调的方式做高精度的命名实体识别&#xff08;NER&#xff09;&#xff0c;是学习入门LLM微调、建立大模型认知的非常好的任务。 显存要求相对较高&#xff0c;需要40GB左右。 知识点1&…

Unity之王牌飞行员申请出战

目录 &#x1f4da;一、准备工作 &#x1f4bb;二、飞机的两套控制器 &#x1f3ae;2.1 起飞前 &#x1f579;️2.2 起飞后 &#x1f680;三、实现射击功能 &#x1f4a5;3.1 射击脚本 &#x1f4a5;3.2 爆炸脚本 &#x1f4a5;3.3 爆炸特效脚本 &#x1f6e0;️四、组…

AGE 可比性、相等性、可排序性和等效性

AGE已经对原始类型&#xff08;布尔值、字符串、整数和浮点数&#xff09;和映射的相等性有了良好的语义。此外&#xff0c;Cypher对整数、浮点数和字符串的可比性和可排序性也有很好的语义。然而&#xff0c;处理不同类型的值与Postgres定义的逻辑和openCypher规范存在偏差&am…

Linux_网络编程_TCP

服务器客户端模型&#xff1a; client / server brow / ser b / s http p2p socket——tcp 1、模式 C/S 模式 》服务器/客户端模型 server :socket()-->bind()--->listen()-->accept()-->recv()-->close()client :socket()-->conn…

STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)

一&#xff1a;步进电机简介 步进电机又称为脉冲电机&#xff0c;简而言之&#xff0c;就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩&#xff0c;步进电机的角位移量与输入的脉冲个数严格成正比…

超越单兵作战:多智能体 Multi-Agent System (MAS)

超越单兵作战&#xff1a;多智能体 Multi-Agent System (MAS) Multi-Agent System 是指一个系统中有多个智能体同时工作的情况。在这样的系统中&#xff0c;每个智能体都具有一定程度的自主性&#xff0c;可以独立执行任务、做决定&#xff0c;并且能够与其他智能体进行交互&a…

STM32的Code、RO-data、RW-data、ZI-data和RAM以及flash的关系

对于刚接触stm32编程的同学来说&#xff0c;通常不知道如何选择合适型号的芯片来开发自己的项目&#xff0c;下面就分析一下多大的片内ram以及flash能符合我们项目的需求。 不知道大家有没有注意到&#xff0c;我们的项目每次编译完成后&#xff0c;都会出现这个Program Size&…

亚马逊卖家告别熬夜!批量定时上下架,自动调价

必用能功三个&#xff0c;不限制上传商品。 大家好&#xff0c;今天来讲下这款erp的定时上下架功能。 打开工具这栏选择智能调价&#xff0c;点击添加智能调价选择店铺&#xff0c;选择定时上架的商品添加也可以全部添加。每个商品的价格都是不同的&#xff0c;可以点击保底价…