本次分享的目的:
希望还不太了解模型是什么的伙伴对模型有一个概念,并和我一起做一个超浓缩版本的例子.
因为本次的目的是为了让大家了解模型是什么,因此有些地方是经过故意设置并修改(为了便于说明和减少本文章的篇幅设定).所以文章会有一些不严谨之处,还望大佬们见谅.请不要较真.
转载请注明出处,CSDN博客 https://blog.csdn.net/zhanghao3389, github博客 https://Mrzhang3389.github.io
目录
一. 模型存在的形态(抽象)
二. 模型存在的形态(具体)
三. 在不使用框架的情况下训练一个模型
四. 迁移学习是怎样的一个存在
作者博客,CSDN 博客 https://blog.csdn.net/zhanghao3389, github 博客 https://Mrzhang3389.github.io
模型(抽象)
下面是对模型的一个抽象理解
模型接受一个输入,它可以是图像,可以是文本,也可以是语音.
经过模型映射后,可以得到一个输出,我们可以定义模型的输出为给图像中的对象画框,也可以是文本数据的分类结果,也可以是语音翻译成文字的输出,等等一些你能想到的输出.
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
其他微缩型的模型的表示:
- f(x) = wx
- f(x) = x + b
- f(x) = w1x + b1
- 令y = f(x) = w1x + b1
- f(y) = w2x + b2
- 这样我们就可以得到多层映射的模型
- 等等形式的映射…
转载请注明作者博客,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
在开始训练之前需要了解的几个名词:(也可跳过不看,自由选择.)
- 正态分布 或 高斯分布
- 维基百科解释: 正态分布是自然科学与行为科学中的定量现象的一个方便模型。各种各样的心理学测试分数和物理现象比如光子计数都被发现近似地服从正态分布。尽管这些现象的根本原因经常是未知的,理论上可以证明如果把许多小作用加起来看做一个变量,那么这个变量服从正态分布(在R.N.Bracewell的Fourier transform and its application中可以找到一种简单的证明)。正态分布出现在许多区域统计:例如,采样分布均值是近似地正态的,即使被采样的样本的原始群体分布并不服从正态分布。另外,正态分布信息熵在所有的已知均值及方差的分布中最大,这使得它作为一种均值以及方差已知的分布的自然选择。正态分布是在统计以及许多统计测试中最广泛应用的一类分布。在概率论,正态分布是几种连续以及离散分布的极限分布。
- 梯度
- 维基百科解释:梯度也可以告诉我们一个数量在不是最快变化方向的其他方向的变化速度。再次考虑山坡的例子。可以有条直接上山的路其坡度是最大的,则其坡度是梯度的大小。
- 损失函数
整体流程
现在我们准备数据和模型
转载请注明出处,C S D N博客, g i t h u b博客
数据如下(特意设定的理想数据):
data | label |
---|---|
1 | 3 |
2 | 4 |
4 | 6 |
… | … |
为便于后续计算,此处只使用3条数据
模型如下(特意设定的理想模型):
数学中如下形式:
f(x) = x + b
代码中如下形式(此处使用Python版):
def model(x):
return x + b
正态分布初始化权重值后的模型(此处使用Python版, 此处的权重值是特意设定.):
def model(x):
return x + 4
此时我们的准备工作在这里:
我们拥有一批数据
data | label |
---|---|
1 | 3 |
2 | 4 |
3 | 6 |
一个初始化好的模型(未训练但已初始化的模型)
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值
接下来和我一起将模型参数带入计算两个epoch:
第一个epoch:
数据 | 标签值 | 预测值 | 损失或梯度 |
---|---|---|---|
1 | 3 | 5 | 2 |
2 | 4 | 6 | 2 |
4 | 6 | 8 | 2 |
此时:
梯度: gradient = 6
更新模型权重: b = 4 - 0.5 / 3 * 6
此时模型权重: b = 3
# 此时模型为:
def model(x):
return x + 3
第二个epoch:
数据 | 标签值 | 预测值 | 损失或梯度 |
---|---|---|---|
1 | 3 | 4 | 1 |
2 | 4 | 5 | 1 |
4 | 6 | 7 | 1 |
此时:
梯度: gradient = 3
更新模型权重: b = 3 - 0.5 / 3 * 3
此时模型权重: b = 2.5
# 此时模型为:
def model(x):
return x + 2.5
至此可以看出
损失值和更新模型权重是使用的一个极限概念(可以参考维基百科了解极限)
- 当模型的权重 b 值越来越小的时候
- 预测值会越来越接近标签值
- 那么损失值越来越接近 0
- 训练的次数越多,模型的优化会越小.直到逼进正确的模型.
假如我们训练的epoch足够
则会得到一个正确的模型
def model(x):
return x + 2
此时我们回顾整个模型流程:
- 收集数据,定义模型.
- 计算模型梯度,更新模型权重.
- 得到最后的模型
- 加载模型, 加载参数并传入模型的输入值即可得到模型的输出值
迁移学习
迁移学习是怎样的一个存在
它解决的问题:
各个领域数据量不足减少解决当前任务所需的时间成本和金钱成本
怎么实施:
使用 数据集1 训练一个模型再使用 数据集2 对 数据集1 预训练出来的模型微调这样的模型称迁移学习.
为什么迁移学习有效:
举个小例子,从前一章的模型中 微调一个模型.
小例子:
随机初始化的模型
def model(x):
return x + 4
数据集1 的目标模型
def model(x):
return x + 2
假如现在我们有个任务是 训练一个加法器使输入的值 +1
则我们 数据集2 目标模型就是:
def model(x):
return x + 1
则我们可以很轻易的使用一个小 数据集2 将模型从 数据集1 的预训练模型上微调到 数据集2 的目标模型上
回顾整个分享内容
- 模型(抽象)
- 用图抽象的表示了下模型
- 模型(具体)
- 在数学中模型的表示
- 模型(具体)
- 在代码里模型是如何表示的
- 名词解释
- 常用的名字解释
- 如何手动的训练一个模型
- 不使用框架的时候,模型是怎么诞生的
- 迁移学习
- 迁移学习相关概念