读书学习笔记入门 # Datawhale X 李宏毅苹果书 AI夏令营

文章目录

  • 学习目标:
  • 学习内容:
  • Task 1 通过案例了解机器学习
    • 机器学习(Machine Learning,ML)和深度学习(Deep Learning,DL)的基本概念
    • 什么是回归(regression)
    • 什么是分类(classification)
    • 什么是结构化学习
    • 机器学习找函数的三个步骤
      • 第1个步骤是写出一个带有未知参数的函数`f`,其能预测未来观看次数。
      • 第2个步骤是定义损失(loss),损失也是一个函数。
      • 机器学习的第 3 步:解一个最优化的问题。
    • 为什么损失可以是负的?
    • 梯度下降有一个很大的问题
  • Task 2 了解线性模型
    • 线性模型
      • 分段线性曲线
      • 如何表示方程
        • 优化是找一个可以让损失最小的参数,是否可以穷举所有可能的未知参数的值?
        • 刚才的例子里面有 3 个 Sigmoid,为什么是 3 个,能不能 4 个或更多?
      • 定义损失
      • 实现上的细节
        • 批量(batch)
        • 回合(epoch)
    • 模型变形
      • 激活函数(activation function)
      • 深度学习
  • Task 3 机器学习框架&实践攻略
    • 机器学习框架
      • 定义函数fθ(x)
      • 定义损失函数
      • 优化问题求解
      • 应用于测试数据
      • 提交到Kaggle进行评估
    • 实践方法论
      • 为什么会出现模型偏差
      • 优化问题
      • 如何判断模型是否足够大?
      • 过拟合
      • 为什么会有过拟合这样的情况呢?
      • 灵活性太大带来的问题
      • 如何解决过拟合问题
      • 交叉验证
      • k 折交叉验证
      • 不匹配

学习目标:

  • Task 1 《深度学习详解》- 1.1 通过案例了解机器学习
  • Task 2 《深度学习详解》- 1.2 了解线性模型
  • Task 3 《深度学习详解》- 2 机器学习框架&实践攻略

学习内容:

欢迎去大家各大电商平台选购纸质版苹果书《深度学习详解》
基于上述书籍拓展

引用内容为书本原话 图片基本上来源于书中
我以自问自答的方式输出内容


Task 1 通过案例了解机器学习


机器学习(Machine Learning,ML)和深度学习(Deep Learning,DL)的基本概念

什么是机器学习

人工智能的一个分支。机器学习范畴比人工智能概念略小,深度学习的底层是神经网络。机器学习是指用计算机模拟人类学习行为的的技术用来从已知的数据中获取新的知识。

机器学习,顾名思义,机器具备有学习的能力。具体来讲,机器学习就是让机器具备找一个函数的能力。机器具备找函数的能力以后,它可以做很多事。

比如语音识别,机器听一段声音,产生这段声音对应的文字。我们需要的是一个函数,该函数的输入是声音信号,输出是这段声音信号的内容。

就是让机器的输入映射到某个函数之后可以得到输出

什么是回归(regression)

随着要找的函数不同,机器学习有不同的类别。假设要找的函数的输出是一个数值,一个标量(scalar),这种机器学习的任务称为回归

机器要找一个函数 f,其输入是可能是种种跟预测 PM2.5 有关的指数,包括今天的 PM2.5 的数值、平均温度、平均的臭氧浓度等等,输出是明天中午的 PM2.5的数值,找这个函数的任务称为回归(regression)

机器要找一个函数f(x),其输入是可能是与预测目标有关的数值x,输出是对于下一次的预测值f(x),找这个函数的任务称为回归(regression)。

隐藏任务①: 找出本篇中形如回归(regression)加粗字体的术语,并用自己的话进行解释,列成表格,与学习群的其他小伙伴讨论你的理解和搜索到的相关案例

术语解释
分类将数据划分为多个离散的类别的任务,预测输入的样本所属的类别
回归通过对输入数据进行学习,建立一个连续的函数关系,预测数值型的输出结果
机器学习一种从数据中自动学习模式和模型的方法,使计算机能够根据之前的经验来进行预测或决策
深度学习一种机器学习的子领域,通过模拟人脑的神经网络结构,对大规模数据进行学习和表达复杂模式
损失衡量预测的输出与实际值之间的差异的函数,用于评估模型的训练效果
梯度下降一种优化算法,通过反复迭代的方式,沿着目标函数的负梯度方向调整模型参数的值,以最小化损失函数

什么是分类(classification)

分类任务要让机器做选择题。人类先准备好一些选项,这些选项称为类别(class),现在要找的函数的输出就是从设定好的选项里面选择一个当作输出,该任务称为分类。
举个例子,每个人都有邮箱账户,邮箱账户里面有一个函数,该函数可以检测一封邮件是否为垃圾邮件。分类不一定只有两个选项,也可以有多个选项。

根据某些特征把不同数据分成不同的类别。

什么是结构化学习

机器不只是要做选择题或输出一个数字,而是产生一个有结构的物体,比如让机器画一张图,写一篇文章。这种叫机器产生有结构的东西的问题称为结构化学习。

就是根据输入的东西的某种规律生产某种相似结构的东西

机器学习找函数的三个步骤

隐藏任务③:找出机器学习找函数的3个步骤!并查找资料,交叉佐证这些步骤。

机器学习找函数的过程,分成3个步骤。

第1个步骤是写出一个带有未知参数的函数f,其能预测未来观看次数。

y = b + w ∗ x1,而 b 跟 w 是未知的。
带有未知的参数(parameter)的函数称为模型(model)。
模型在机器学习里面,就是一个带有未知的参数的函数,特征(feature) x 1 x_1 x1 是这个函数里面已知的,它是来自于后台的信息,2 月 25 日点击的总次数是已知的,而 w 跟 b 是未知的参数。
w 称为权重(weight),b 称为偏置(bias)。

第2个步骤是定义损失(loss),损失也是一个函数。

估测的值跟实际的值之间的差距,其实有不同的计算方法,计算 y 与 yˆ 之间绝对值的差距,如式 (1.6) 所示,称为平均绝对误差(Mean Absolute Error,MAE)

在这里插入图片描述

如果算 y 与 yˆ 之间平方的差距,如式 (1.7) 所示,则称为均方误差(Mean SquaredError,MSE)。
在这里插入图片描述

有一些任务中 y 和 yˆ 都是概率分布,这个时候可能会选择交叉熵(cross entropy),这个是机器学习的第 2 步。

交叉熵是信息论中用来度量两个概率分布之间差异的一种方法。在机器学习中,交叉熵经常被用来作为损失函数,用来度量预测结果与真实结果之间的差异。

对于分类问题,交叉熵可以用来度量预测结果的概率分布与真实结果的概率分布之间的差异。交叉熵的计算公式如下:

H ( p , q ) = − ∑ p ( x ) ∗ l o g ( q ( x ) ) H(p,q) = -∑ p(x) * log(q(x)) H(p,q)=p(x)log(q(x))

其中,p(x)表示真实结果的概率分布,q(x)表示预测结果的概率分布。

交叉熵的值越小,表示预测结果与真实结果越接近,模型的性能也越好。因此,通过最小化交叉熵,可以优化模型的预测能力。

在深度学习中,交叉熵通常作为损失函数与激活函数一起使用,用来训练神经网络模型。通过反向传播算法,可以根据交叉熵的值来调整模型的参数,使得模型的预测结果与真实结果更加接近。

机器学习的第 3 步:解一个最优化的问题。

找一个 wb,把未知的参数找一个数值出来,看代哪一个数值进去可以让损失 L 的值最小,就是要找的 wb,这个可以让损失最小的 wb 称为 w∗b∗ 代表它们是最好的一组 wb,可以让损失的值最小。

梯度下降(gradient descent)是经常会使用优化的方法。

试了不同的参数,计算它的损失,画出来的等高线图称为误差表面(error surface)。
在这个等高线图上面,越偏红色系,代表计算出来的损失越大,就代表这一组 w 跟 b 越差。如果越偏蓝色系,就代表损失越小,就代表这一组 w 跟 b 越好,拿这一组 w 跟 b,放到函数里面,预测会越精准。在这里插入图片描述

学习率(learning rate)η 也会影响步伐大小
学习率是自己设定的,如果 η 设大一点,每次参数更新就会量大,学习可能就比较快。如果 η 设小一点,参数更新就很慢,每次只会改变一点点参数的数值。
这种在做机器学习,需要自己设定,不是机器自己找出来的,称为超参数(hyperparameter)。

为什么损失可以是负的?

在这里插入图片描述

梯度下降有一个很大的问题

梯度下降有一个很大的问题,没有找到真正最好的解,没有找到可以让损失最小的 w。
在图 1.4 所示的例子里面,把 w 设定在最右侧红点附近这个地方可以让损失最小。但如果在梯度下降中, w 0 w^0 w0 是随机初始的位置,也很有可能走到 wT 这里,训练就停住了,无法再移动 w 的位置。右侧红点这个位置是真的可以让损失最小的地方,称为全局最小值(global minima),而 wT 这个地方称为局部最小值(local minima),其左右两边都比这个地方的损失还要高一点,但是它不是整个误差表面上面的最低点。

在这里插入图片描述
推广到多参数(w,b)的话

假设有两个参数,随机初始值为 w 0 w^0 w0, b 0 b^0 b0。要计算 w, b 跟损失的微分,计算在 w = w 0 w^0 w0 的位置,b = b 0 b^0 b0 的位置,要计算 w 对 L 的微分,计算 b 对 L 的微分计算完后更新 w 跟 b,把 w 0 w^0 w0 减掉学习率乘上微分的结果得到 ,把 b 0 b^0 b0 减掉学习率乘上微分的结果得到 b 1 b^1 b1

在这里插入图片描述

就是反复同样的步骤,就不断的更新 wb,期待最后,可以找到一个最好的 w,w∗ 跟最好的 b∗. 如图 1.5 所示,随便选一个初始的值,先计算一下 w 对 L 的微分,跟计算一下 b 对 L 的微分,接下来更新 wb,更新的方向就是 ∂L/∂w,乘以 η 再乘以一个负号,∂L/∂b,算出这个微分的值,就可以决定更新的方向,可以决定 w 要怎么更新。把 wb 更新的方向结合起来,就是一个向量,就是红色的箭头,再计算一次微分,再决定要走什么样的方向,把这个微分的值乘上学习率,再乘上负号,我们就知道红色的箭头要指向那里,就知道如何移动 wb 的位置,一直移动,期待最后可以找出一组不错的 w, b

Task 2 了解线性模型

线性模型

书中举例了一个预测观看人数的例子

每隔 7 天它一个循环,如果一个模型参考前 7 天的数据,把 7天前的数据,直接复制到拿来当作预测的结果,也许预测的会更准也说不定,所以我们就要修改一下模型。通常一个模型的修改,往往来自于对这个问题的理解,即领域知识

机器学习领域的领域知识是指机器学习算法、技术和应用方面的专业知识。
包括机器学习算法、数据预处理、特征工程、模型评估和选择的知识。

这些模型都是把输入的特征 x 乘上一个权重,再加上一个偏置就得到预测的结果,这样的模型称为线性模型(linear model)

分段线性曲线

红色的曲线可以看作是一个常数再加上一群 Hard Sigmoid 函数。Hard Sigmoid 函数的特性是当输入的值,当 x 轴的值小于某一个阈值(某个定值)的时候,大于另外一个定值阈值的时候,中间有一个斜坡。所以它是先水平的,再斜坡,再水平的。所以红色的线可以看作是一个常数项加一大堆的蓝色函数(Hard Sigmoid)。常数项设成红色的线跟 x 轴的交点一样大。

在这里插入图片描述

常数项怎么加上蓝色函数后,变成红色的这一条线?

  1. 蓝线 1 函数斜坡的起点,设在红色函数的起始的地方,第 2 个斜坡的终点(最高点)|(第 1 个蓝色函数斜坡的终点) 设在第一个转角处,让第 1 个蓝色函数的斜坡和红色函数的斜坡的斜率是一样的,这个时候把 线0+线1 就可以得到红色曲线左侧的线段。
  2. 再加第 2 个蓝色的函数,所以第2 个蓝色函数的斜坡就在红色函数的第一个转折点到第 2 个转折点之间,让第 2 个蓝色函数的斜率跟红色函数的斜率一样,这个时候把 线0+线1+线2,就可以得到红色函数左侧和中间的线段。
  3. 接下来第 3 个部分,第 2 个转折点之后的部分,就加第 3 个蓝色的函数,第 3 个蓝色的函数坡度的起始点设的跟红色函数转折点一样,蓝色函数的斜率设的跟红色函数斜率一样
  4. 接下来把 线0+线1+线2+线3全部加起来,就得到完整红色的线。
    (线0、线1、线2、线3 为图1.8中线段)

在这里插入图片描述

所以红色线,即分段线性曲线(piecewise linear curve)可以看作是一个常数,再加上一堆蓝色的函数。

大量不同的蓝色函数,加上一个常数以后就可以组出任意的分段线性曲线。
如果分段线性曲线越复杂,转折的点越多,所需的蓝色函数就越多。
反之,越多蓝色函数的话可以组成越复杂的分段线性曲线。

可以在这样的曲线(图1.9)上面,先取一些点并连起来变成一个分段线性曲线。这个分段线性曲线跟非常接近原来的曲线,如果点取的够多或点取的位置适当,分段线性曲线就可以逼近这一个连续的曲线。

在这里插入图片描述

所以可以用分段线性曲线去逼近任何的连续的曲线,而每个分段线性曲线都可以用一大堆蓝色的函数组合起来。也就是说,只要有足够的蓝色函数把它加起来,就可以变成任何连续的曲线。

我们可以用任意多的蓝色函数来模拟出曲线。
极限的思路来看:就是只有取得足够多的点并且相连接,就可以无限多的直线代替曲线。

如何表示方程

在这里插入图片描述

如果 x1 的值,趋近于无穷大的时候,e−(b+wx1) 这一项就会消失,当 x1 非常大的时候,这一条就会收敛在高度为 c 的地方。如果 x1 负的非常大的时候,分母的地方就会非常大,y的值就会趋近于 0。
所以可以用这样子的一个函数逼近这一个蓝色的函数,即 Sigmoid 函数,Sigmoid 函数就是 S 型的函数。
因为它长得是有点像是 S 型,所以叫它 Sigmoid 函数。为了简洁,去掉了指数的部分,蓝色函数的表达式为

y = c σ ( b + w x 1 ) ( 1.15 ) y = cσ(b + wx1) (1.15) y=cσ(b+wx1)(1.15)

所以可以用 Sigmoid 函数逼近 Hard Sigmoid 函数。

y = c 1 + e − ( b + w x 1 ) y = \frac{c}{ 1+ e^{-(b+wx1)}} y=1+e(b+wx1)c

调整这里的 bw c 可以制造各种不同形状的 Sigmoid 函数, 用各种不同形状的 Sigmoid函数去逼近 Hard Sigmoid 函数。

如图 1.11 所示,如果改 w,就会改变斜率,就会改变斜坡的坡度。如果改了 b,就可以把这一个 Sigmoid 函数左右移动;如果改 c,就可以改变它的高度。所以只要有不同的 w 不同的 b 不同的 c,就可以制造出不同的 Sigmoid 函数,把不同的Sigmoid 函数叠起来以后就可以去逼近各种不同的分段线性函数;分段线性函数可以拿来近似各种不同的连续的函数。

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

我们可以不只用一个特征 x1,可以用多个特征代入不同的 c, b, w,组合出各种不同的函数,从而得到更有 灵活性(flexibility) 的函数,如图 1.13 所示。
j 来代表特征的编号。如果要考虑前 28 天,j 就是 1 到 28。

在这里插入图片描述

无论是拿行或拿列都可以,把 W 的每一列或每一行“拼”成一个长的向量,把 b, cT, b” 拼” 上来,这个长的向量直接用 θ 来表示。
所有的未知的参数,一律统称 θ。

优化是找一个可以让损失最小的参数,是否可以穷举所有可能的未知参数的值?

在这里插入图片描述

刚才的例子里面有 3 个 Sigmoid,为什么是 3 个,能不能 4 个或更多?

在这里插入图片描述

定义损失

之前是 L(w, b),因为 w 跟 b 是未知的。
现在未知的参数很多了,再把它一个一个列出来太累了,所以直接用 θ 来统设所有的参数,所以损失函数就变成 L(θ)

损失函数能够判断 θ 的好坏,其计算方法跟刚才只有两个参数的时候是一样的。
先给定 θ 的值,即某一组 W, b, cT, b 的值,再把一种特征 x 代进去,得到估测出来的 y,再计算一下跟真实的标签之间的误差 e。把所有的误差通通加起来,就得到损失。

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

要找到 θ θ θ让损失越小越好,可以让
损失最小的一组 θ θ θ称为 θ ∗ θ_∗ θ。一开始要随机选一个初始的数值 θ 0 θ_0 θ0
接下来计算每一个未知的参数对 L 的微分,得到向量 g g g,即可以让损失变低的函数

在这里插入图片描述

假设有 1000 个参数,这个向量的长度就是 1000,这个向量也称为梯度, ∇ L ∇L L代表梯度。
L( θ 0 θ_0 θ0) 是指计算梯度的位置,是在 θ 等于 θ 0 θ_0 θ0 的地方。
计算出 g 后,接下来跟新参数, θ 0 θ_0 θ0 代表它是一个起始的值,它是一个随机选的起始的值,代表 θ 1 θ_1 θ1 更新过一次的结果, θ 2 0 θ^0_2 θ20 减掉微分乘以,减掉 η 乘上微分的值,得到 θ 2 1 θ^1_2 θ21,以此类推,就可以把 1000 个参数都更新了。

在这里插入图片描述

假设参数有 1000 个, θ 0 θ_0 θ0 就是 1000 个数值,1000 维的向量,g 是 1000 维的向量, θ 1 θ_1 θ1 也是 1000 维的向量。 整个操作就是这样,由 θ 0 θ_0 θ0 算梯度,根据梯度去把 θ 0 θ_0 θ0 更新成 θ 1 θ_1 θ1,再算一次梯度,再根据梯度把 θ 1 θ_1 θ1 再更新成 θ 2 θ_2 θ2,再算一次梯度把 θ 2 θ_2 θ2 更新成 θ 3 θ_3 θ3,以此类推,直到不想做。
在这里插入图片描述

或者计算出梯度为 0 向量,导致无法再更新参数为止,不过在实现上几乎不太可能梯度为 0,通常会停下来就是我们不想做了。

实现上的细节

批量(batch)

在这里插入图片描述

实现上有个细节的问题,实际使用梯度下降的时候,如图 1.17 所示,会把 N 笔数据随机分成一个一个的批量(batch),一组一组的。

在深度学习中,批量(Batch) 指的是计算一次成本(cost) 需要的输入数据个数。当数据集比较大时,一次性处理所有样本在计算和存储上会有困难,因此会采用一次输入一定量的样本来进行训练。

如果数据集比较小,可以将全体数据看做一个批量,即把数据集中每个样本都计算损失(loss)然后取其平均值当做成本(cost)。

批量学习的优点:能更好地代表样本总体从而更准确地确定下降方向,对梯度向量有更精确的估计等。

回合(epoch)

把所有的批量都看过一次,称为一个回合(epoch),每一次更新参数叫做一次更新。更新跟回合是不同的东西。每次更新一次参数叫做一次更新,把所有的批量都看过一遍,叫做一个回合。

回合(Epoch) 指的是遍历全部数据集一次。
在一个回合中,模型会对数据集中的所有样本都进行处理和学习。

模型变形

其实还可以对模型做更多的变形,不一定要把 Hard Sigmoid 换成 Soft Sigmoid。

在这里插入图片描述

HardSigmoid 可以看作是两个修正线性单元(Rectifed Linear Unit, ReLU) 的加总, ReLU 的图像有一个水平的线,走到某个地方有一个转折的点,变成一个斜坡, 其对应的公式为

c ∗ m a x ( 0 , b + w x 1 ) c ∗ max(0, b + wx1) cmax(0,b+wx1)

输出0或b+ w1为正的。

在这里插入图片描述

把两个 ReLU 叠起来就可以变成 Hard 的 Sigmoid,想要用 ReLU,就把 Sigmoid 的地方,换成

m a x ( 0 , b i + w i j x j ) max(0, b_i + w_{ij}x_{j}) max(0,bi+wijxj)

合成 i 个 Hard Sigmoid, 需要 i 个 Sigmoid,如果 ReLU 要做到一样的事情,则需要 2i 个 ReLU,因为 2 个 ReLU 合 起来才是一个 Hard Sigmoid。因此表示一个 Hard 的 Sigmoid 不是只有一种做法

激活函数(activation function)

在机器学习里面, Sigmoid 或 ReLU 称为激活函数(activation function)

在这里插入图片描述

Sigmoid 跟 ReLU 是最常见的激活函数,接下来的实
验都选择用了 ReLU,显然 ReLU 比较好,实验结果如图 1.20 所示。

连续使用 10 个 ReLU作为模型,跟用线性模型的结果是差不多的

但连续使用 100 个 ReLU 作为模型,结果就有显著差别了, 100 个 ReLU 在训练数据上的损失就可以从 320 降到 280,有 100 个 ReLU 就可以制造比较复杂的曲线,本来线性就是一直线,但 100 个 ReLU 就可以产生 100 个折线的函数,在测试数据上也好了一些。
接下来使用 1000 个 ReLU 作为模型,在训练数据上损失更低了一些,但是在没看过的数据上,损失没有变化

Sigmoid 跟 ReLU 是最常见的激活函数

继续改模型

在这里插入图片描述

如图 1.21 所示,从 x 变成 a,就是把 x 乘上 w 加 b,再通过 Sigmoid 函数

不一定要通过Sigmoid 函数,通过 ReLU 也可以得到 a,同样的事情再反复地多做几次。 所以可以把 x 做这一连串的运算产生 a,接下来把 a做这一连串的运算产生 a′。 反复地多做的次数又是另外一个超参数。
注意, w, b 和 w′, b′ 不是同一个参数,是增加了更多 的未知的参数。

深度学习

在这里插入图片描述

如图 1.24 所示, Sigmoid 或 ReLU 称为神经元(neuron),很多的神经元称为神经网络(neural network)
每一排称为一层,称为隐藏层(hiddenlayer),很多的隐藏层就“深”,这套技术称为深度学习

人们把神经网络越叠越多越叠越深
残差网络(Residual Network, ResNet) 有 152 层,错误率降到 3.57%。

在这里插入图片描述

如图 1.25 所示。在训练数据和测试数据上的结果是不一致的,这种情况称为过拟合(overftting)

Task 3 机器学习框架&实践攻略

机器学习框架

定义函数fθ(x)

定义一个函数 f θ ( x ) f_θ(x) fθ(x),其中θ表示模型中的所有未知参数。该函数接收输入特征x,并根据参数θ计算输出。

定义损失函数

定义一个损失函数,用于评估给定参数组合θ的好坏程度。损失函数的选择依赖于具体的问题和模型类型。常见的损失函数包括均方误差、交叉熵等。

优化问题求解

的目标是寻找一个最优的参数组合θ∗,使得损失函数的值最小化。这可以通过求解一个优化问题来实现。常用的优化算法包括梯度下降、牛顿法等。

应用于测试数据

找到最优参数θ∗后,可以将其应用于测试数据。将测试集中的输入特征x带入函数 f θ ( x ) f_θ(x) fθ(x),得到预测结果。

提交到Kaggle进行评估

将预测结果提交到Kaggle等竞赛平台进行评估。该平台会根据预测结果与真实值之间的差异进行评分,以衡量模型的性能。

总结一下就是定义一个函数 f θ ( x ) f_θ(x) fθ(x),其中θ代表模型中的未知参数。然后,定义一个损失函数来评估参数组合的好坏程度。然后,通过优化问题求解找到最优参数θ∗使损失函数最小化。然后,将最优参数应用于测试数据,得到预测结果。最后,将预测结果提交到评估平台进行性能评估。

实践方法论

为什么会出现模型偏差

模型偏差可能会影响模型训练。

假设模型过于简单,一个有未知参数的函数代 θ 1 θ_1 θ1 得到一个函数 f θ 1 ( x ) f_θ1(x) fθ1(x),同理可得到另一个函数 f θ 2 ( x ) f_θ2(x) fθ2(x),把所有的函数集合起来得到一个函数的集合。但是该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不在模型可以描述的范围内

如何解决

  1. 用深度学习,增加更多的灵活性
  2. 所以如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模型,可以用深度学习来增加模型的灵活性,这是第一个可以的解法。
  3. 但是并不是训练的时候,损失大就代表一定是模型偏差,可能会遇到另外一个问题:优化做得不好

优化问题

一般只会用到梯度下降进行优化,这种优化的方法很多的问题。

比如可能会卡在局部最小值的地方,无法找到一个真的可以让损失很低的参数,如图 2.3(a) 所示。如图 2.3(b) 所示蓝色部分是模型可以表示的函数所形成的集合,可以把 θ 代入不同的数值,形成不同的函数,把所有的函数通通集合在一起,得到这个蓝色的集合。这个蓝色的集合里面,确实包含了一些函数,这些函数它的损失是低的。
但问题是梯度下降这一个算法无法找出损失低的函数,梯度下降是解一个优化的问题,找到 θ∗ 就结束了。但 θ∗ 的损失不够低。

在这里插入图片描述
还是可能会出现卡在局部最小值的地方,仍未能找到真正的最优解

如何判断模型是否足够大?

一个建议判断的方法,通过比较不同的模型来判断模型现在到底够不够大。

在这里插入图片描述

很多人看到这张图认为这个代表过拟合,深度学习不奏效, 56 层太深了不奏效,根本就不需要这么深。但个不是过拟合,并不是所有的结果不好,都叫做过拟合。在训练集上, 20 层的网络损失其实是比较低的, 56 层的网络损失是比较高的,如图 2.4(b) 所示,这代表 56 层的网络的优化没有做好,它的优化不给力。

层数多但是反而效果不好,不一定是过拟合,可能是因为它的优化没有做好。

看到一个从来没有做过的问题,可以先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(Support Vector Machine,SVM), SVM 可能是比较容易做优化的,它们比较不会有优化失败的问题。

对于一个新的问题可以多种不同的模型综合考量一下。
先跑一个小的模型试一下,在逐步加深模型。

过拟合

为什么会有过拟合这样的情况呢?

举一个极端的例子,这是训练集。

假设根据这些训练集,某一个很废的机器学习的方法找出了一个一无是处的函数。这个一无是处的函数,只要输入 x 有出现在训练集里面,就把它对应的 y 当做输出。如果 x 没有出现在训练集里面,就输出一个随机的值。这个函数啥事也没有干,其是一个一无是处的函数,但它在训练数据上的损失是 0。把训练数据通通丢进这个函数里面,它的输出跟训练集的标签是一模一样的,所以在训练数据上面,这个函数的损失可是 0 呢,可是在测试数据上面,它的损失会变得很大,因为它其实什么都没有预测,这是一个比较极端的例子,在一般的情况下,也有可能发生类似的事情

灵活性太大带来的问题

在这里插入图片描述

如图 2.6 所示,举例来说,假设输入的特征为 x,输出为 y, x 和 y 都是一维的。
x 和 y之间的关系是 2 次的曲线,曲线用虚线来表示,因为通常没有办法,直接观察到这条曲线。我们真正可以观察到的是训练集,训练集可以想像成从这条曲线上面,随机采样出来的几个点

模型的能力非常的强,其灵活性很大,只给它这 3 个点。在这 3 个点上面,要让损失低,所以模型的这个曲线会通过这 3 个点,但是其它没有训练集做为限制的地方,因为它的灵活性很大,它灵活性很大,所以模型可以变成各式各样的函数,没有给它数据做为训练,可以产生各式各样奇怪的结果

如果再丢进测试数据,测试数据和训练数据,当然不会一模一样,它们可能是从同一个分布采样出来的,测试数据是橙色的点,训练数据是蓝色的点

如何解决过拟合问题

  1. 增加数据集,数据增强
    在这里插入图片描述

  2. 给模型一些限制,让模型不要有过大的灵活性。

如图 2.8 所示,要用多限制的模型才会好取决于对这个问题的理解。因为这种模型是自己设计的,设计出不同的模型,结果不同。解决过拟合的问题,要给模型一些限制,最好模型正好跟背后产生数据的过程,过程是一样的就有机会得到好的结果。

如果是深度学习的话,就给它比较少的神经元的数量,本来每层一千个神经元,改成一百个神经元之类的,或者让模型共用参数,可以让一些参数有一样的数值

全连接网络(fully-connected network) 其实是一个比较有灵活性的架构,而卷积神经网络(Convolutional Neural Network, CNN) 是一个比较有限制的架构。 CNN 是一种比较没有灵活性的模型,其是针对图像的特性来限制模型的灵活性。所以全连接神经网络,可以找出来的函数所形成的集合其实是比较大的, CNN 所找出来的函数,它形成的集合其实是比较小的,其实包含在全连接网络里面的,但是就是因为CNN 给了,比较大的限制,所以 CNN 在图像上,反而会做得比较好

在这里插入图片描述
但也不要给太多的限制。有可能会因为模型太大的限制,大到有了模型偏差的问题。

  1. 比如早停(early stopping)、正则化(regularization)和丢弃法(dropout
    method)。

交叉验证

一种比较合理的选择模型的方法是将训练数据分成训练集和验证集,通常是将90%的数据用作训练集,剩余的10%作为验证集。训练集用于训练模型,验证集用于评估模型的性能。
在训练集上训练出的模型会使用验证集来衡量模型的分数。根据验证集上的分数选择最佳的模型,并将该模型的结果上传到Kaggle等平台上得到公开分数。
这个过程中,使用验证集来选择模型,因此公开测试集的分数可以反映私人测试集的分数。然而,如果这个过程重复太多次,根据公开测试集的结果调整模型太多次,就有可能在公开测试集上过拟合,导致在私人测试集上得到差的结果。

在这里插入图片描述
因此,需要在选择模型时找到平衡,避免过度拟合,并注意不要过多地根据公开测试集的结果调整模型。

在选择模型时,常用的方法是将训练数据分成训练集和验证集。训练集用于训练模型,验证集用于评估模型在未知数据上的性能。通常情况下,将大约90%的数据用作训练集,剩余的10%作为验证集。模型在验证集上的表现可以作为选择模型的依据

然而,在选择模型的过程中需要注意,过多地根据公开测试集上的结果调整模型可能会导致在私人测试集上得到较差的结果,即过拟合的问题。因此,在选择模型时需要找到一个平衡,避免过度拟合模型

最好的做法,就是用验证损失,最小的直接挑就好了,不要管公开测试集的结果
在实现上,不太可能这么做,因为公开数据集的结果对模型的选择,可能还是会有些影响的。理想上就用验证集挑就好,有过比较好的基线(baseline) 算法以后,就不要再去动它了,就可以避免在测试集上面过拟合

k 折交叉验证

在这里插入图片描述

用 k 折交叉验证(k-fold cross validation),如图 2.11 所示。 k 折交叉验证就是先把训练集切成 k 等份。在这个例子,训练集被切成 3 等份,切完以后,拿其中一份当作验证集,另外两份当训练集,这件事情要重复 3 次。即第一份第 2 份当训练,第 3 份当验证;第一份第 3 份当训练,第 2 份当验证;第一份当验证,第 2 份第 3 份当训练

在这里插入图片描述

不匹配

反常的情况。这种情况应该算是另外一种错误的形式,这种错误的形式称为不匹配(mismatch)

在这里插入图片描述

不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了

增加数据也不能让模型做得更好,所以这种问题要怎么解决,匹不匹配要看对数据本身的理解了,我们可能要对训练集跟测试集的产生方式有一些理解,才能判断它是不是遇到了不匹配的情况

在这里插入图片描述

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

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

相关文章

深入解析Linux轻量级进程:线程的概念、原理、优缺点及其与进程的关系与区别

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 📚Linux线程📕什么是线程*可以使用多进程去并发的执行一个进程的代码,那为什么要由线程呢&#x…

基于CloudflareSpeedTest项目实现git clone加速

1.网络测速 「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP 更多内容参考项目:https://github.com/XIU2/CloudflareSpeedTest 国外很多网站都在使用 Cloudflare CDN,但分配给中国内地访客的 IP 并不友好(延迟高、丢…

Pixelmator Pro for Mac 专业图像处理软件【媲美PS的修图软件】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试安装完成!!! 效果 一、下载软件 下载软件…

【STM32+HAL库】---- 通用定时器输入捕获PWM信号

硬件开发板:STM32G0B1RET6 软件平台:cubemaxkeilVScode1 新建cubemax工程 1.1 配置系统时钟RCC 1.2 配置定时器 1.2.1 配置输入捕获 选择通用定时器TIM2-Channel 1为输入捕获引脚,对应IO口是PA0,时钟源选择内部时钟源Internal clock,工作模…

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 预制体 在这个小案例中,水可以做成圆形但是带碰撞体,碰撞体比图形小一圈,顺便加上Trail renderer组件 材质 将碰撞…

Win11 / Win10 系统极化工具,降低游戏延迟效果明显

Win11 / Win10 系统优化工具,降低游戏延迟效果明显 Windows 系统优化就是精简系统一些功能组件、对一些系统功能进行设置等,这样可以减少不必要的硬件资源占用。 全面的系统优化功能外,据不少网友表示通过优化后 CS GO 游戏降低输入延迟效果明显。 免费…

沃飞长空联合极氪亮相2024世界动力电池大会

9月1日至2日,2024世界动力电池大会在四川宜宾举办,沃飞长空与同属吉利控股集团旗下的新时代豪华科技品牌极氪汽车一同亮相。 现场,双方携手展出了AE200电动垂直起降航空器、极氪009光辉版、极氪001,以及极氪能源、金砖电池、威睿…

开源 AI 智能名片 O2O 商城小程序在营销中的应用

摘要:本文探讨了开源 AI 智能名片 O2O 商城小程序在营销中的应用,重点分析了喜好原则、互惠互利和高度认可三个方面对小程序推广和用户忠诚度提升的重要性。通过融入这些原则,开源 AI 智能名片 O2O 商城小程序能够更好地满足用户需求&#xf…

HTML静态网页成品作业(HTML+CSS)——动漫大耳朵图图网页(4个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有4个页面。 二、作品演示 三、代…

VUE2.0 elementUI el-input-number 数据更新,视图不更新——基础积累

今天遇到一个问题,是关于el-input-number组件的,发现数据明明已经更改了,但是页面上组件输入框中还是之前的值。 比如上方输入框中,我输入120.5,就会出现下面的诡异现象 回显此值是120.779,但是页面上输入…

协同开发工具Git

网上对于Git的使用方法介绍的很多,在日常工作中,Git是团队开发必不可少的工具之一,我想为一些刚使用Git的小伙伴们介绍一下常遇到的小问题。 1:拼写错误。这应该是每个初学者都会犯得错误,当出现这种错误还是比较好排…

供应链管理平台开发指南:从食堂采购系统源码开始

本篇文章,小编将围绕如何从食堂采购系统源码出发,构建一个完整的供应链管理平台进行详细解读,帮助开发人员掌握实现技术要点,并为企业打造高效的供应链系统提供技术参考。 一、供应链管理平台的核心功能概述 供应链管理平台的核心…

RK3568 Android 11 蓝牙BluetoothA2dpSink 获取用于生成频谱的PCM

Android 中的 A2DP Sink A2DP Sink 在 Android 系统中主要用于 接收 其他蓝牙设备(如手机、平板、电脑等)发送过来的 高质量的立体声音频。简单来说,它让你的 Android 设备可以充当一个 蓝牙音箱 或 耳机 的角色。 核心功能: 接…

中国农村政策与改革统计年报(2015-2022年)

中国农村经营管理统计年报、政策与改革统计年报(2015-2022年) 数据年限:2015-2022年,目前最新 数据格式:pdf 数据范围:全国各省市自治区(不含港澳台) 数据内容:《中国农村…

win系统安装mysql,使用mysqldump,pycharm使用mysqldump,避坑

文章目录 下载mysql的win客户端设置系统环境变量验证是否可用pycharm使用mysqldump异常问题排查 下载mysql的win客户端 官网下载地址如果下载旧版本,需自行到Archives里面找 本人使用的是mysql5.7,找到相应版本后,点击Download下载 设置系统…

多模态大模型中,融合后如何知道最终结果受哪种模态影响更大?

本篇介绍多模态大模型中如何基于最终结果分析各模态的影响。 具身智能被众多大佬看好,通往AGI的路最终肯定需要多个模态的大模型互相融合。多个模态配合好也是有可能去构建一个模拟现实的世界模型的。 最近一直在研究和尝试多模态大模型在一些VQA领域的前瞻研究和…

9、Django Admin优化查询

如果你的Admin后台中有很多计算字段,那么你需要对每个对象运行多个查询,这会使你的Admin后台变得非常慢。要解决此问题,你可以重写管理模型中的get_queryset方法使用annotate聚合函数来计算相关的字段。 以下示例为Origin模型的中ModelAdmin…

CSS总结——瀑布流布局

瀑布流布局 瀑布流布局是一种新型的布局方式,可以将大小不一的图片完整的显示在页面上,并且在杂乱的布局中保持着一定的美感,今天学习了一下如何使用瀑布流布局,总结了有以下三种方式。(瀑布流还可以使用grid布局实现…

Nginx 部署前端 Vue 项目实战指南

一、环境准备 1. 安装 Nginx 首先,需要在服务器上安装 Nginx。Nginx 是一款轻量级、高性能的 HTTP 和反向代理服务器。安装方式因操作系统而异。 Linux 系统(以 Ubuntu 为例): sudo apt-get update sudo apt-get install nginxWi…

【Android】Material Design编写更好的UI

Toolbar 对于控件ActionBar我们非常熟悉,就是我们常见的标题栏,但ActionBar只能位于活动的顶部,因此我们更建议使用Toolbar。在新建一个项目的时候都是默认显示ActionBar,我们要使用Toolbar就需要先将标题栏改为不显示 先来看看…