【课程总结】Day7:深度学习概述

前言

本篇文章,我们将通过示例来逐步学习理解导数、求函数最小值、深度学习的本质、以及使用numpy和pytorch实操深度学习训练过程。

线性回归

线性回归内容回顾

在《【课程总结】Day5(下):PCA降维、SVD分解、聚类算法和集成学习》中,我们已经了解到线性回归以及线性回归可以表示为:

y = f ( x ) = x 1 w 1 + x 2 w 2 + . . . + x 13 w 13 + b y=f(x)=x_1w_1 + x_2w_2 + ... + x_{13}w_{13} + b y=f(x)=x1w1+x2w2+...+x13w13+b

其中:

  • ( x*1, x2, …, x_{13} ):输入特征向量 ( x ) 的各个特征值,代表输入数据的各个特征。*
  • ( w_1, w2, …, w{13} ):权重向量 ( w ) 的各个权重值,用来衡量每个特征对输出的影响程度。
  • ( b ):偏置项,也称为截距项,用来调整模型的输出值,即在没有特征输入时的输出值。
  • ( y ):模型的输出值,即线性回归模型对输入特征的预测值。

该公式也可以表示为内积相乘的方式,如下:

y = f ( x ) = x @ w + b y=f(x)=x@w+b y=f(x)=x@w+b

其中:

x@w:特征向量 ( x ) 与 权重向量( w ) 的内积

如果有多个样本的话,那么上面的公示可以进一步表示为:

y = f ( X ) = X @ w + b y=f(X)=X@w+b y=f(X)=X@w+b

其中:

X代表特征矩阵,矩阵的行为一条一条的样本,矩阵的列为多个特征向量。

线性回归方程的解析

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

线性回归=求损失loss函数的最小值

训练过程

由上图可知,训练的大致过程是:

  1. 从训练集中取出一对x 和y
  2. 把x带入模型,求解预测结果y_pred
  3. 找到一种方法,度量y和y_pred的误差loss
  4. 由此推导:
    • loss是y和y_pred的函数;
    • y_pred是模型预测的结果,是w和b的函数;
    • 所以简单来说,loss也是w和b的函数
训练的本质

由上图推导结果可知,训练的本质:求解loss什么时候是最小值。

数学表达:当w和b取得什么值的时候,loss最小

通俗表达:求loss函数的最小值

如何求函数的最小值?

一个例子

y = 2 x 2 y = 2x^2 y=2x2

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

如果你和我一样忘了导数相关的知识,可以查看《【重拾数学知识】导数、极值和最值》回顾一下。

求解方法(理论方法)

通过回归导数求极值的方法,我们知道大致步骤如下:

  • 第一步:求函数的导数
  • 第二步:令导数等于零
  • 第三步:解方程,求出疑似极值点
  • 第四步:验证该点是否是极值点以及是什么极值点

求解的问题

上述的方法是有一定前提条件的,即:

  • 第一步的求(偏)导数是可以求得的;
  • 第三步(偏)导数为零后,方程(组)是可以解的。

实际工程中,上述方法是不可行的。以Llama3-8B模型为例,其有80亿个输入参数x,按照上述的求解方法是无法求得最小值的!

由此可知,通过推导公式期望一次性求得最小值是不现实的;而我们可以借鉴人工智能中一个重要的思想:迭代法来逐步求解最小值。

求解方法(迭代法)

仍然以 y = 2 x 2 y = 2x^2 y=2x2为例,我们可以通过以下方法求得最小值。

随机选择一个出生点 x 0 x_0 x0

  • x 0 x_0 x0在最小值的左侧时, x 0 x_0 x0 + 正数(一个非常小的正数)向右侧移动;
  • x 0 x_0 x0在最小值的右侧时, x 0 x_0 x0 - 正数(一个非常小的正数)向左侧移动;
  • x 0 x_0 x0在最小值的时候,不用移动,此时就是最小值。

由导数的单调性可知:

  • x 0 x_0 x0在左侧时,由于函数是单调递减的,所以导数<0
  • x 0 x_0 x0在右侧时,由于函数是单调递增的,所以导数>0

因此上述的计算方法可以推导得到:

  • x 0 x_0 x0在0的左侧时, x 0 x_0 x0 + 正数 → x 0 x_0 x0 + 导数 → x 0 x_0 x0 - 导数

    因为导数<0,加上一个小于的导数相当于减去导数

  • x 0 x_0 x0在0的右侧时, x 0 x_0 x0 - 正数 → x 0 x_0 x0 - 导数

    因为导数>0,减去一个大于的导数相当于减去导数

  • x 0 x_0 x0=0时,也可以看作是 x 0 x_0 x0 - 导数

由此,我们可以得到结论:不管$$x_0$$在何处,求最小值时减去导数即向极值逼近。

概念补充
  • 在一元函数中,求函数f(x)在某一点的斜率为导数;在多元函数中,称为偏导数,也就是梯度。
  • 减去导数也就是减去梯度,这就是梯度下降法!

备注:深度学习在兴起之前,人工智能只能靠支持向量机撑门面;伴随着互联网+GPU芯片的兴起,梯度下降法拥有了使用的土壤,以此人工智能才真正兴起。

代码实现(手动求函数最小值)

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)

运行结果:

代码实现(使用pytorch求函数最小值)

上述通过求导数得到函数最小值的方法,也可以通过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())

运行结果:

内容小结

  • 线性回归

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

    • 由训练的过程可知:损失函数loss也是w和b的函数
    • 训练的本质:求损失loss函数的最小值
  • 求函数最小值

    • 理论的求解方法,在现实工程中由于参数巨大,实际不可行。
    • 实际的求解方式是使用迭代思想逐步求解。
    • 不管 x 0 x_0 x0在何处,求最小值时减去导数即向极值逼近,所以我们可以通过迭代法+迭代中减去导数求最小值,这就是梯度下降法。
  • 求导即可使用numpy方法,也可以使用pytorch

    • 梯度下降法使用过程中,一般需要定义epochs迭代次数、learning_rate学习率
    • 梯度下降法的一般过程为:正向传播计算损失→反向传播计算梯度→获取梯度并更新参数→梯度清零
    • 在循环减去梯度的过程中,需要记得使用.grad.zero_()进行梯度清零

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

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

相关文章

6.Hugging Face Transformers 快速入门

Hugging Face Transformers 库独特价值 丰富的预训练模型&#xff1a;提供广泛的预训练模型&#xff0c;如BERT、GPT、T5等&#xff0c;适用于各种NLP任务。易于使用&#xff1a;设计注重易用性&#xff0c;使得即使没有深厚机器学习背景的开发者也能快速上手。最新研究成果的…

数据结构下的线性回归模型

文章目录 1. 线性回归模型的基本概念与原理2. 数据结构在构建线性回归模型中的应用2.1 数组和矩阵2.2 列表2.3 字典2.4 数据框架 3. 线性回归模型的实现方法4. 示例代码演示总结 线性回归是统计学中最基础也是应用最广泛的预测模型之一&#xff0c;主要用于分析两个或两个以上变…

Unity图集

概述 相信在同学们学习过程中&#xff0c;在UI的的使用时候一定经常听说过图集的概念。 Unity有UI的组件&#xff0c;有同学们好奇&#xff0c;那为什么还要使用图集呢&#xff1f; 这就需要提到一个性能优化的问题了&#xff0c;因为过多的UI图片&#xff0c;会大幅增加Dra…

pip切换至国内镜像超简单方法

新配置的python环境&#xff0c;pip安装包超时 这里给出最简单配置国内镜像的方法 这里将服务器地址切换为国内清华镜像&#xff0c;具体执行的命令如下&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 执行完&#xff0c;看到上面提…

6月11日 C++day6

#include <iostream>using namespace std; class Animal //讲解员 { public:Animal(){}virtual void perform(){cout << "" << endl;} }; class Lion:public Animal //狮子 { public:Lion(){}void perform(){Animal::perform();cout <<…

SpringCloud微服务架构(eureka、nacos、ribbon、feign、gateway等组件的详细介绍和使用)

一、微服务演变 1、单体架构&#xff08;Monolithic Architecture&#xff09; 是一种传统的软件架构模式&#xff0c;应用程序的所有功能和组件都集中在一个单一的应用中。 在单体架构中&#xff0c;应用程序通常由一个大型的、单一的代码库组成&#xff0c;其中包含了所有…

【ARM Cache 与 MMU 系列文章 7.5 -- ARMv8/v9 MMU FEAT_XS(XS Attribute)与 FEAT_MTE2 介绍】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 MMU FEAT_XSXS AttributeXS Attribute 兼容性和影响XS Attribute 应用场景MMU FEAT_MTE2MTE2 主要目的和用途MTE2 工作原理MTE2 特性实现MTE2 注意事项MMU FEAT_XS 在ARMv8架构中,FE…

【投稿优惠|权威主办】2024年物联网、土木建筑与城市工程国际学术会议(ICITCEUE 2024)

2024年物联网、土木建筑与城市工程国际学术会议&#xff08;ICITCEUE 2024&#xff09; 2024 International Academic Conference on the Internet of Things, Civil Engineering and Urban Engineering&#xff08;ICITCEUE 2024&#xff09; ▶会议简介 2024年物联网、土木建…

苹果WWDC 2024:十三大亮点公布,一切都有关AI|TodayAI

在刚刚结束的苹果全球开发者大会(WWDC 2024)上,苹果公司展示了一系列令人瞩目的新功能,特别是在人工智能(AI)领域的重大进展。以下是本次大会的十三大亮点。 1. 苹果推出首个AI系统 苹果宣布推出其首个AI系统——Apple Intelligence,这一系统将强大的生成模型直接集成到…

苹果WWDC开幕发布AI大模型,股价却跌近2%

KlipC报道&#xff1a;北京时间6月11日凌晨&#xff0c;苹果一年一度的“全球开发者大会”&#xff08;WWDC&#xff09;开幕。会上&#xff0c;先后介绍了iOS 18、iPadOS 18、watchOS 11等系统的更新&#xff0c;同时还展示了多个AI功能。宣布与OpenAI构建合作伙伴关系。然而&…

Charles复制出的CURL无法转换为curl bash

如图所示&#xff0c;复制CURL Request 当复制出来的Charles CURL数据不能成功转换为burl bash时&#xff0c;如下所示 这时候查看复制出来的数据&#xff1a; curl -H Host: xxx.com -H Accept: application/json -H User-Agent: kwai-ios -H Accept-Language: zh-Hans-CN;…

健康节能台灯的设计电子实践

1.1 功能描述 根据主要功能要求&#xff0c;该设计利用 51 单片机实现了电子时钟、温度的显示以 及整点报时等功能。具体可分为一下几种&#xff1a; 1) 显示当前的日期及时间&#xff0c;24 时制的时、分、秒&#xff1b; 2) 可调节时间&#xff1b; 3) 整点报时并响铃。 4) 能…

深度学习模型调试的9个方法

第一个计算机漏洞实际上是一个 bug。1947 年&#xff0c;一只飞蛾飞进哈佛大学的一台计算机&#xff0c;导致计算中断。当工程师打开计算机机箱时&#xff0c;他们很快就发现了导致问题的 bug。如今&#xff0c;bug 不太可能爬进我们的计算机并破坏计算流程。但是&#xff0c;原…

“解锁用户留存与复购:链动2+1模式的创新应用与策略“

大家好&#xff0c;我是吴军&#xff0c;担任一家知名软件开发公司的产品经理。 今天&#xff0c;我想和大家分享的是关于如何通过链动21模式来提升用户留存和复购率的策略。 尽管链动模式已经存在一段时间&#xff0c;但许多人认为它已经过时了。实际上&#xff0c;链动模式具…

四款视频转文字工具推荐,一键提取视频文字

在这个信息爆炸的时代&#xff0c;我们每天都在接触海量的视频内容。无论是在线课程、会议记录还是社交媒体上的短视频&#xff0c;视频已成为我们获取信息的重要渠道之一。然而&#xff0c;当需要回顾或整理视频内容时&#xff0c;手动记录往往耗时耗力。这时&#xff0c;一款…

K8s 卷快照类

卷快照类 卷快照类 这个警告信息通常出现在使用 kubectl 删除 Kubernetes 集群资源时&#xff0c;如果尝试删除的是集群作用域&#xff08;cluster-scoped&#xff09;的资源&#xff0c;但指定了命名空间&#xff08;namespace&#xff09;&#xff0c;就会出现这个警告。 集…

小白学RAG:大模型 RAG 技术实践总结

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 汇总合集…

数据集笔记:DGraph 大规模动态图数据集

dgraph-web (xinye.com) 1 数据集介绍 DGraph 是一个有向无权的动态图&#xff0c;包含超过 370 万个节点以及 430 万条动态边DGraph 中的节点表示金融借贷用户&#xff0c;有向边表示紧急联系人关系&#xff0c;每个节点包含脱敏后的属性特征&#xff0c;以及表示是否为金融…

算法:94. 二叉树的中序遍历--扩展前中后层序遍历

中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 中遍历结果为&#xff1a;H D I B E J A F K C G 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#x…

汇编语言作业(七)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验总结 一、实验目的 熟悉无符号数和有符号数乘法和除法指令的使用掌握无符号位扩展指令的使用掌握逻辑指令的使用 二、实验内容 1、编写一个汇编程序&#xff0c;要求从键盘中输入一个小写字母&#xff0c;将其转…