1.数据集介绍

CIFAR10数据集:包含50000张训练样本,10000张测试样本分为飞机,汽车,鸟,猫,鹿,狗,蛙,马,船,卡车十个类别.图像为彩色图像,其大小为32*32
在这里插入图片描述

2.图像类型

1.二进制图像:非黑即白
2.灰度图像,取值为0至255
3.彩色图像,有三个值RGB

3.图像表示

大多数分类算法都要求输入向量
将图像转化为向量的方法有很多种,我们这里使用最简单的方法,直接将图像矩阵转换成向量
在这里插入图片描述
那么CIFAR10中每一张图像转换为向量是多少维?
答:32323(这个3代表的RGB)->3072维

4.线性分类器

4.1.为什么从线性分类器开始

1.形式简单,易于理解
2.通过层级结构(神经网络)或者高维映射(支撑向量机)可以形成功能强大的非线性模型(线性分类器是神经网络的基础)

4.2.什么是线性分类器

线性分类器是一种线性映射,将输入的图像特征映射为类别分数

4.3.线性分类器定义

x代表输入的d(3072)维图像向量,c为类别个数
第i个类的线性分类器:在这里插入图片描述

其中Wi的转置也要是d维的,因为其与x点乘了要与x的维度一样(3072维),所以Wi是一行d列
Wi为第i个类别的权值向量,bi为偏置
每一个类都有自己的参数w和b
下面是决策规则:在这里插入图片描述

4.4.线性分类器示例

任务:为图片分配类别标签(汽车类,猫类,鸟类)在这里插入图片描述

线性分类器决策步骤:
1.将图像表示成向量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
w的行数由类别个数决定,列数由图像维度决定
权值看做是一种模版,输入图像和评估模版的匹配度越高,分类器输出的分数就越高

现在有一个问题:CIFAR10数据集分类任务的分类器,w,x,b的维度是多少?
答:CIFAR10有10个类别且图像大小为32323,所以x是图像向量为3072维,w是权值矩阵,其维度为103072,b是偏置向量其维度为101,f是得分向量,其维度是10*1的向量

4.5.线性分类器的决策边界

在这里插入图片描述
分数为0的线就是决策面
在这里插入图片描述
分类器的目的就是划分出决策面,然后要找的东西落在哪一个面就是什么,且越靠近边界得分越低,远离边界就得分越高
在这里插入图片描述
w控制着线的方向,b控制线的偏离
在这里插入图片描述
箭头方向代表分类器的正方向
在这里插入图片描述

5.损失函数

5.1什么是损失函数

损失函数是模型性能和模型参数之间的桥梁,指导模型参优化数
损失函数是一个函数,用于度量给定分类器的预测值和真实值的不一定程度,其输出通常是一个非负实值
其输出的非负值可以作为反馈信号来对分类器参数进行调整,以降低当前示例对应的损失值,提升分类器的分类效果
损失函数的定义:在这里插入图片描述
在这里插入图片描述

5.2多类支撑向量机损失

在这里插入图片描述
正确类别的得分比不正确类别的得分高出1分就是没有损失,否则就会产生损失
下面举一个例子:在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 损失函数:

L = 1 N ∑ i L i ( f ( x i , W ) , y i ) L = \frac{1}{N} \sum_i L_i \big( f(x_i, W), y_i \big) L=N1​i∑​Li​(f(xi​,W),yi​)

  • 单样本的多类支持向量机损失:

L i = ∑ j ≠ y i max ⁡ ( 0 , s i j − s y i + 1 ) L_i = \sum_{j \ne y_i} \max(0, s_{ij} - s_{y_i} + 1) Li​=j=yi​∑​max(0,sij​−syi​​+1)

  • 线性分类器:

s i j = W j T x i + b j s_{ij} = W_j^T x_i + b_j sij​=WjT​xi​+bj​
损失函数用来度量损失值和与真实值之间的差异
优化算法则依靠损失值进行参数更新

5.3再谈损失函数

问题:假设存在一个W使得损失函数L=0,这个W是唯一的吗?
答:不唯一,像下面的这个例子

示例:假设两个线性器分类f₁(x, W₁) = W₁x , f₂(x, W₂) = W₂x 其中W2=2W1对于下面图像,
已知分类器1的打分结果(如表所示),请计算分类器2的打分结果,以及两个分类器对当前样本的多
类支撑向量机损失:

鸟猫汽车损失
分类器13.1-2.64.3?
分类器2????
鸟猫汽车损失
分类器13.1-2.64.30
分类器26.2-5.28.60

分类器1的损失:=max(0,3.1-4-3+1)+max(0,-2,6-8.6+1)=0
分类器2的损失:=max(0,6.2-8.6+1)+max(0,-5.2-8.6+1)=0
从上面可以看出W2同样也有W2=0

5.4正则项

L ( W ) = 1 N ∑ i L i ( f ( x i , W ) , y i ) + λ R ( W ) L(W) = \frac{1}{N} \sum_i L_i \big( f(x_i, W), y_i \big) + \lambda R(W) L(W)=N1​∑i​Li​(f(xi​,W),yi​)+λR(W)这里面 λ R ( W ) \lambda R(W) λR(W)就是正则项(正则项是为了防止模型在训练集上训练的太好.R(W)也是一个与权值有关,跟图像数据无关的函数.而 λ \lambda λ是一个超参数,控制者正则损失在总损失里面所占的比例)
1 N ∑ i L i ( f ( x i , W ) , y i ) \frac{1}{N} \sum_i L_i \big( f(x_i, W), y_i \big) N1​∑i​Li​(f(xi​,W),yi​)是数据损失:模型预测需要和训练集相匹配(上面那个例子里面这一项就是0)

5.5什么是超参数

在开始学习之前设置的,不是学习得到的
超参数一般对模型的性能有着很大的影响

  • 当 λ = 0 \lambda = 0 λ=0 时,优化结果仅由数据损失决定。

  • 当 λ → ∞ \lambda \to \infty λ→∞ 时,优化结果与数据损失无关,仅由权重正则项决定,此时最优解为 W = 0 W = 0 W=0。

那么如何设置好一个超参数呢,后面会专门探讨

5.6 L2 正则项:

R ( W ) = ∑ k ∑ l W k , l 2 R(W) = \sum_k \sum_l W_{k,l}^2 R(W)=k∑​l∑​Wk,l2​
每一个元素的平方求和

下面举L2的损失示例
样本:x=[1,1,1,1]
分类器1:W1=[1,0,0,0]
分类器2:W2=[0.25,0.25,0.25,0.25]
分类器输出: w 1 T x = w 2 T x = 1 w_1^T x = w_2^T x = 1 w1T​x=w2T​x=1
正则损失:R(W1)=1,R(W2)=0.25
W2的总损失更小
那为什么会这样呢?
W1=[1,0,0,0]->可以理解为分类器一直关注一个特征,这样误差会很大
W2=[0.25,0.25,0.25,0.25]->关注多特征容错会很大
L2正则损失对大数值权值进行惩罚,喜欢分散权值,鼓励分类器将所有维度的特征都用起来,而不是强烈依赖其中的少数几维特征
所以正则项让模型有了偏好
L1正则项: R ( W ) = ∑ k ∑ l ∣ W k , l ∣ R(W) = \sum_k \sum_l |W_{k,l}| R(W)=∑k​∑l​∣Wk,l​∣

L2正则项: R ( W ) = ∑ k ∑ l W k , l 2 R(W) = \sum_k \sum_l W_{k,l}^2 R(W)=∑k​∑l​Wk,l2​

Elastic net (L1 + L2): R ( W ) = ∑ k ∑ l ρ W k , l 2 + ∣ W k , l ∣ R(W) = \sum_k \sum_l \rho W_{k,l}^2 + |W_{k,l}| R(W)=∑k​∑l​ρWk,l2​+∣Wk,l​∣

6.优化算法

61.什么是参数优化

参数优化是机器学习的核心步骤之一,它利用损失函数的输出值作为反馈信号来调整分类器参数,以提升分类器对与训练样本的性能预测

6.2优化算法目标

损失函数: L = 1 N ∑ i = 1 N L i + λ R ( W ) L = \frac{1}{N} \sum_{i=1}^{N} L_i + \lambda R(W) L=N1​i=1∑N​Li​+λR(W)
损失函数L是一个与参数W有关的函数,优化的目标就是找到使损失函数L达到最优的那组参数W.
直接方法: ∂ L ∂ W = 0 \frac{\partial L}{\partial W} = 0 ∂W∂L​=0
但是通常,L形式比较复杂,很难直接从这个等式直接求解出W

6.3梯度下降算法

去求 ∂ L ∂ W = 0 \frac{\partial L}{\partial W} = 0 ∂W∂L​=0
等于0的情况下W是什么
也是一种简单而高效的迭代优化方法

1.往哪走?
负梯度方向(走下坡)
2.走多远?
步长来决定(太长了不好,太短了也不好)
在这里插入图片描述
W*是最优的值,我们要得到的W要不断的靠近它
梯度下降:利用所有样本计算损失并更新梯度
while True(不断循环,直到认为走到谷底,也就是权值没有什么变化的时候)
权值的梯度<-计算梯度(损失,训练样本,权值)
权值(新的位置)<-权值(当前位置)-学习率(步长)*权值的梯度

6.4梯度计算

1.数值法 (计算量大,不精确!)
一维变量,函数求导:
d L ( w ) d w = lim ⁡ h → 0 L ( w + h ) − L ( w ) h \frac{dL(w)}{dw} = \lim_{h \to 0} \frac{L(w + h) - L(w)}{h} dwdL(w)​=h→0lim​hL(w+h)−L(w)​

示例: 损失函数 L ( w ) = w 2 L(w) = w^2 L(w)=w2,求 w = 1 w=1 w=1 点处的梯度

d L ( w ) d w = lim ⁡ h → 0 L ( w + h ) − L ( w ) h ≈ L ( 1 + 0.0001 ) − L ( 1 ) 0.0001 = 2.0001 \frac{dL(w)}{dw} = \lim_{h \to 0} \frac{L(w + h) - L(w)}{h} \approx \frac{L(1 + 0.0001) - L(1)}{0.0001} = 2.0001 dwdL(w)​=h→0lim​hL(w+h)−L(w)​≈0.0001L(1+0.0001)−L(1)​=2.0001
2.解析法 精确,速度快,导数函数推导易错
示例: 损失函数 L ( w ) = w 2 L(w) = w^2 L(w)=w2,求 w = 1 w=1 w=1 点处的梯度

∇ L ( w ) = 2 w \nabla L(w) = 2w ∇L(w)=2w

∇ w = 1 L ( w ) = 2 \nabla_{w=1} L(w) = 2 ∇w=1​L(w)=2
数值梯度有什么用
答:求梯度的时候一般使用解析梯度,而数值梯度主要用于解析梯度的正确性检验(梯度检查)
梯度下降:利用所有样本计算损失并更新梯度

L ( W ) = 1 N ∑ i = 1 N L i ( x i , y i , W ) + λ R ( W ) L(W) = \frac{1}{N} \sum_{i=1}^{N} L_i(x_i, y_i, W) + \lambda R(W) L(W)=N1​i=1∑N​Li​(xi​,yi​,W)+λR(W)

∇ W L ( W ) = 1 N ∑ i = 1 N ∇ W L i ( x i , y i , W ) + λ ∇ W R ( W ) \nabla_W L(W) = \frac{1}{N} \sum_{i=1}^{N} \nabla_W L_i(x_i, y_i, W) + \lambda \nabla_W R(W) ∇W​L(W)=N1​i=1∑N​∇W​Li​(xi​,yi​,W)+λ∇W​R(W)
当N很大的时候,权值的梯度计算量很大

6.5 随机梯度下降算法

每次从样本里面随机选取一个样本,把这个样本当做全部的数据集,去计算梯度,让这个梯度去更新权值
随机梯度算法会使得单个样本的训练会带来许多噪声,不是每次迭代都会朝着整体最优的方向.但是大量的迭代会朝着最优的方向.
iteration:表示一次迭代,每次迭代更新1次网络结构的参数
batch-size:1次迭代所使用的样本量
epoch:1个epoch表示过了一遍训练集中所以的样本

6.6总结

梯度下降方法

while True:

权值的梯度 ← 计算梯度(损失, 训练数据, 权值)

权值 ← 权值 - 学习率 × 权值的梯度

随机梯度下降算法(SGD)

while True:

数据 ← 从训练数据采样(训练数据, 1)

权值的梯度 ← 计算梯度(损失, 数据, 权值)

权值 ← 权值 - 学习率 × 权值的梯度

小批量梯度下降算法(Mini-batch)

while True:

小批量数据 ← 从训练数据采样(训练数据, 批量大小)

权值的梯度 ← 计算梯度(损失, 小批量数据, 权值)

权值 ← 权值 - 学习率 × 权值的梯度

7.数据集的划分

将所有带标签的数据称为一个数据集,数据集又划分为训练集和测试集(训练集用于训练模型,寻找最优分类器,测试集用于评估模型,来评估泛化模型)

问题: 如果模型含有超参数(比如正则化强度),如何找到泛化能力最强的超参数?
答:使用验证集(将数据集再划分出一部分作为验证集)

8.K折交叉验证

问题: 如果数据很少那么验证集的样本就很少,从而无法统计上代表数据局.

从这个问题可以看出:如果在进行划分数据前进行不同的随机打乱,最终得到的模型性能差别很大,那么就存在这个问题.
而K折验证与重复K折验证,它们是解决这个问题的两种方法

3折交叉验证原理

交叉验证(Cross Validation)是一种评估模型泛化能力的方法,3折交叉验证的具体流程如下:

  1. 将全部训练数据随机打乱,均匀划分为3份(称为3“折”)。
  2. 第1次:取第1份作为验证集,其余2份作为训练集,训练模型并得到第1个验证分数。
  3. 第2次:取第2份作为验证集,其余2份作为训练集,训练模型并得到第2个验证分数。
  4. 第3次:取第3份作为验证集,其余2份作为训练集,训练模型并得到第3个验证分数。
  5. 取3次验证分数的平均值,作为模型最终的交叉验证得分,以此评估模型的稳定性与泛化能力。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐