一文看懂深度学习模型的优化过程

github博客传送门
博客园传送门

本次分享的目的:

希望还不太了解模型是什么的伙伴对模型有一个概念,并和我一起做一个超浓缩版本的例子.
因为本次的目的是为了让大家了解模型是什么,因此有些地方是经过故意设置并修改(为了便于说明和减少本文章的篇幅设定).所以文章会有一些不严谨之处,还望大佬们见谅.请不要较真.
转载请注明出处,CSDN博客 https://blog.csdn.net/zhanghao3389, github博客 https://Mrzhang3389.github.io



目录

一. 模型存在的形态(抽象)
二. 模型存在的形态(具体)
三. 在不使用框架的情况下训练一个模型
四. 迁移学习是怎样的一个存在
作者博客,CSDN 博客 https://blog.csdn.net/zhanghao3389, github 博客 https://Mrzhang3389.github.io



模型(抽象)

下面是对模型的一个抽象理解
模型接受一个输入,它可以是图像,可以是文本,也可以是语音.
经过模型映射后,可以得到一个输出,我们可以定义模型的输出为给图像中的对象画框,也可以是文本数据的分类结果,也可以是语音翻译成文字的输出,等等一些你能想到的输出.
输入
输入
输入
输出
图像
模型
文本
语音
任何想要的结果
作者博客https://Mrzhang3389.github.io
CSDN博客https://blog.csdn.net/zhanghao3389

Github博客http://Mrzhang3389.github.io CSDN博客http://blog.csdn.net/zhanghao3389



模型(具体)

数学上是如何表示的:

f(x) = wx + b
预测值 = 一个权重 * 输入 + 一个偏值

程序里是如何表示的:

这里以编程语言python为例.
# 这一部分实际上是由框架实现的 比如tensorflow keras pytorch 等等...
# 这样就可以定义一个 输入x到模型里面 然后经过权重w和偏值b的映射得到模型的预测值
def model(x):
	return wx + b
其他微缩型的模型的表示:
  1. f(x) = wx
  2. f(x) = x + b
  • f(x) = w1x + b1
  • 令y = f(x) = w1x + b1
  • f(y) = w2x + b2
  • 这样我们就可以得到多层映射的模型
  1. 等等形式的映射…
转载请注明作者博客,C S D N 博 客 blog.csdn.net/zhanghao3389, g i t h u b 博 客 Mrzhang3389.github.io



如何在不使用框架的情况下训练一个模型

目标:在不使用任何机器学习或深度学习框架的情况下使用梯度下降法手动训练一个模型
模型做什么事情呢?
我们实现一个简单的加法器.对于输入数据,我们要让模型对输入数据进行 加2 的一个操作.

转载请注明出处,CSDN博客 https://blog.csdn.net/zhanghao3389, github博客 https://Mrzhang3389.github.io

在开始训练之前需要了解的几个名词:(也可跳过不看,自由选择.)

  1. 正态分布 或 高斯分布
    • 维基百科解释: 正态分布是自然科学行为科学中的定量现象的一个方便模型。各种各样的心理学测试分数和物理现象比如光子计数都被发现近似地服从正态分布。尽管这些现象的根本原因经常是未知的,理论上可以证明如果把许多小作用加起来看做一个变量,那么这个变量服从正态分布(在R.N.Bracewell的Fourier transform and its application中可以找到一种简单的证明)。正态分布出现在许多区域统计:例如,采样分布均值是近似地正态的,即使被采样的样本的原始群体分布并不服从正态分布。另外,正态分布信息熵在所有的已知均值及方差的分布中最大,这使得它作为一种均值以及方差已知的分布的自然选择。正态分布是在统计以及许多统计测试中最广泛应用的一类分布。在概率论,正态分布是几种连续以及离散分布的极限分布
  2. 梯度
    • 维基百科解释:梯度也可以告诉我们一个数量在不是最快变化方向的其他方向的变化速度。再次考虑山坡的例子。可以有条直接上山的路其坡度是最大的,则其坡度是梯度的大小。
  3. 损失函数
    • 维基百科解释:在最优化统计学计量经济学决策论机器学习计算神经科学的领域中,损失函数成本函数是指一种将一个事件(在一个样本空间中的一个元素)映射到一个表达与其事件相关的经济成本或机会成本的实数上的一种函数,借此直观表示的一些"成本"与事件的关联。一个最佳化问题的目标是将损失函数最小化。一个目标函数通常为一个损失函数的本身或者为其负值。当一个目标函数为损失函数的负值时,目标函数的值寻求最大化。
    • 在统计学中,损失函数的作用是估计参数

整体流程

数据送入模型,优化参数
其他优化手段
重新分析数据,再调优
数据
模型
训练,保存
数据:我们想要模型应用场景的数据
模型:对数据提供一种映射能力
将训练好的参数进行保存,输入数据进行预测

现在我们准备数据和模型

转载请注明出处,C S D N博客, g i t h u b博客

数据如下(特意设定的理想数据):
datalabel
13
24
46
为便于后续计算,此处只使用3条数据
模型如下(特意设定的理想模型):
数学中如下形式:
f(x) = x + b
代码中如下形式(此处使用Python版):
def model(x):
	return x + b
正态分布初始化权重值后的模型(此处使用Python版, 此处的权重值是特意设定.):
def model(x):
	return x + 4

此时我们的准备工作在这里:

我们拥有一批数据
datalabel
13
24
36
一个初始化好的模型(未训练但已初始化的模型)
def model(x): 
	return x + 4
只剩模型的参数了(目标模型)
def model(x):
	return x + 2

现在我们开始训练模型

此处常规操作BP算法,梯度下降 或 其他优化算法

学习率:0.5(用来调节模型学习快慢的参数)

算法思路:
lr  = 0.5
# 此处有个小bug为了便于本次分享的主题,所以小bug保留
# bug在于模型参数的 b 值是传参数进去,而不是写死.
def model(x):
        return x + 4
for _ in range(epoch):
        gradient =  0
        gradient += model(x) - label  # 此处遍历每一条数据与label的差值更新梯度值, 实际中操作这里是矩阵计算 不需要循环和 += (此处理解前面的解释循环遍历即可)
        b = b - lr / len(data) * gradient  # 然后更新模型的参数 b 值

# 每一个for循环更新b值过后,相应的
# def model(x):
#        return x + 更新后的b值

CSDN 博客, github 博客

接下来和我一起将模型参数带入计算两个epoch:

第一个epoch:
数据标签值预测值损失或梯度
1352
2462
4682
此时:

梯度: gradient = 6

更新模型权重: b = 4 - 0.5 / 3 * 6

此时模型权重: b = 3

# 此时模型为:
def model(x):
	return x + 3
第二个epoch:
数据标签值预测值损失或梯度
1341
2451
4671
此时:

梯度: gradient = 3

更新模型权重: b = 3 - 0.5 / 3 * 3

此时模型权重: b = 2.5

# 此时模型为:
def model(x):
	return x + 2.5

至此可以看出

作者博客,CSDN 博客, github 博客

损失值和更新模型权重是使用的一个极限概念(可以参考维基百科了解极限)

  • 当模型的权重 b 值越来越小的时候
  • 预测值会越来越接近标签值
  • 那么损失值越来越接近 0
  • 训练的次数越多,模型的优化会越小.直到逼进正确的模型.

假如我们训练的epoch足够

则会得到一个正确的模型

def model(x):
	return x + 2

此时我们回顾整个模型流程:

  1. 收集数据,定义模型.
  2. 计算模型梯度,更新模型权重.
  3. 得到最后的模型
  4. 加载模型, 加载参数并传入模型的输入值即可得到模型的输出值



迁移学习

迁移学习是怎样的一个存在

它解决的问题:

各个领域数据量不足减少解决当前任务所需的时间成本和金钱成本

怎么实施:

使用 数据集1 训练一个模型再使用 数据集2 对 数据集1 预训练出来的模型微调这样的模型称迁移学习.

为什么迁移学习有效:

举个小例子,从前一章的模型中 微调一个模型.

CSDN, github

小例子:

随机初始化的模型

def model(x):
	return x + 4

数据集1 的目标模型

def model(x):
	return x + 2

假如现在我们有个任务是 训练一个加法器使输入的值 +1

则我们 数据集2 目标模型就是:

def model(x):
	return x + 1
则我们可以很轻易的使用一个小 数据集2 将模型从 数据集1 的预训练模型上微调到 数据集2 的目标模型上

回顾整个分享内容

C S D N, g i t h u b

  1. 模型(抽象)
    • 用图抽象的表示了下模型
  2. 模型(具体)
    • 在数学中模型的表示
  3. 模型(具体)
    • 在代码里模型是如何表示的
  4. 名词解释
    • 常用的名字解释
  5. 如何手动的训练一个模型
    • 不使用框架的时候,模型是怎么诞生的
  6. 迁移学习
    • 迁移学习相关概念
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
深度学习模型预测代码可以使用Python及相关的库来实现。在深度学习模型预测中,常用的库包括keras、scikit-learn、pandas和tensorflow。这些库提供了丰富的功能和工具,可以帮助我们构建和训练深度神经网络模型。 在使用深度学习模型进行预测之前,我们需要先准备好数据集,并对数据进行预处理。然后,我们可以使用keras库来构建深度神经网络模型。根据不同的任务和数据类型,可以选择不同的模型结构,如LSTM、GRU、CNN、LSTM-CNN、BiLSTM、Self-Attention、LSTM-Attention、Transformer等。 在构建模型后,我们可以使用优化算法来更新模型参数值,以使任务的指标表现变好。常用的优化算法包括梯度下降法和随机梯度下降法。通过迭代训练模型,我们可以得到一个“好”的模型。 最后,我们可以使用训练好的模型对新的数据进行预测。通过调用模型的预测函数,我们可以得到预测结果。 具体的深度学习模型预测代码可以根据具体的任务和数据集进行编写。可以参考相关的教程和文档,以及使用示例代码来帮助实现深度学习模型的预测功能。 #### 引用[.reference_title] - *1* *3* [一文深度学习建模预测全流程(Python)](https://blog.csdn.net/qq_40877422/article/details/121301741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码+数据集+原理介绍)](https://blog.csdn.net/m0_47256162/article/details/128585814)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值