计算机视觉学习(三)线性分类器
线性分类器
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=N1i∑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=WjTxi+bj
损失函数用来度量损失值和与真实值之间的差异
优化算法则依靠损失值进行参数更新
5.3再谈损失函数
问题:假设存在一个W使得损失函数L=0,这个W是唯一的吗?
答:不唯一,像下面的这个例子
示例:假设两个线性器分类f₁(x, W₁) = W₁x , f₂(x, W₂) = W₂x 其中W2=2W1对于下面图像,
已知分类器1的打分结果(如表所示),请计算分类器2的打分结果,以及两个分类器对当前样本的多
类支撑向量机损失:
| 鸟 | 猫 | 汽车 | 损失 | |
|---|---|---|---|---|
| 分类器1 | 3.1 | -2.6 | 4.3 | ? |
| 分类器2 | ? | ? | ? | ? |
| 鸟 | 猫 | 汽车 | 损失 | |
|---|---|---|---|---|
| 分类器1 | 3.1 | -2.6 | 4.3 | 0 |
| 分类器2 | 6.2 | -5.2 | 8.6 | 0 |
分类器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∑iLi(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∑iLi(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
w1Tx=w2Tx=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∑lWk,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=N1i=1∑NLi+λ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→0limhL(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→0limhL(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=1L(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)=N1i=1∑NLi(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)
∇WL(W)=N1i=1∑N∇WLi(xi,yi,W)+λ∇WR(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折交叉验证的具体流程如下:
- 将全部训练数据随机打乱,均匀划分为3份(称为3“折”)。
- 第1次:取第1份作为验证集,其余2份作为训练集,训练模型并得到第1个验证分数。
- 第2次:取第2份作为验证集,其余2份作为训练集,训练模型并得到第2个验证分数。
- 第3次:取第3份作为验证集,其余2份作为训练集,训练模型并得到第3个验证分数。
- 取3次验证分数的平均值,作为模型最终的交叉验证得分,以此评估模型的稳定性与泛化能力。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)