损失函数和优化
1 损失函数
损失函数是用来定量地分析我们的模型预测效果有多糟糕的函数。损失函数输出值越大,代表我们的模型效果越糟糕。
损失函数的通用表示:
假设我们的数据集有N个样本,
{
(
x
i
,
y
i
)
}
i
=
1
N
\{(x_i,y_i)\}^{N}_{i=1}
{(xi,yi)}i=1N其中
x
i
x_i
xi是样本图片,
y
i
y_i
yi是对应的整数标签;整个数据集的损失就是每个样本的损失之和。
L
=
1
N
∑
i
L
i
(
f
(
x
i
,
W
)
,
y
i
)
L = \frac{1}{N}\sum_iL_i(f(x_i,W),y_i)
L=N1i∑Li(f(xi,W),yi)
这里介绍两种损失函数
1.1 多分类SVM损失
SVM损失的形式是这样的:
L
i
=
∑
j
≠
y
i
{
0
i
f
s
y
i
≥
s
j
+
1
s
j
+
1
−
s
y
i
e
l
s
e
=
∑
j
≠
y
i
m
a
x
(
0
,
s
j
+
1
−
s
y
i
)
L_i = \sum_{j \ne y_i} \left\{ \begin{aligned} 0 &&if && s_{y_i} \ge s_j + 1 \\ s_j + 1 - s_{y_i} && else \\ \end{aligned} \right. = \sum_{j \ne y_i} max(0,s_j + 1 - s_{y_i} )
Li=j=yi∑{0sj+1−syiifelsesyi≥sj+1=j=yi∑max(0,sj+1−syi)
这里的
+
1
+1
+1代表一个边界(margin),即正分类比误分类大的程度,其实这个是可以自由设置的,但是也要依据问题去考虑。
也可以把SVM Loss叫做Hinge Loss,横轴是 s y i s_{y_i} syi,随着 s y i s_{y_i} syi的增大,HInge Loss是逐渐下降的,最终降为0。
在这个问题中,我们的 s s s就是模型跑到最后,给每个样本image的分类的一个分数值。
关于SVM Loss,有几个问题:
-
损失的最大/最小值分别是什么?
最小值是0,对应全部分类正确的情况;
最大值是无穷大 -
在初始化阶段, W W W很小,所以所有的 s ≃ 0 s \simeq 0 s≃0,这个时候的损失是多少?
答案是 c − 1 c-1 c−1, c c c代表分类的数量。
L = 1 N ∑ i = 1 N ∑ j ≠ y i m a x ( 0 , s j + 1 − s y i ) = 1 N ∑ i = 1 N ∑ j ≠ y i m a x ( 0 , 1 ) = 1 N ∑ i = 1 N ∑ j ≠ y i 1 = 1 N ∑ i = 1 N c − 1 = N ( c − 1 ) N L = \frac{1}{N} \sum_{i=1}^N\sum_{j \ne y_i} max(0,s_j + 1 - s_{y_i} ) = \frac{1}{N} \sum_{i=1}^N \sum_{j \ne y_i} max(0,1) = \\ \frac{1}{N} \sum_{i=1}^N \sum_{j \ne y_i} 1 = \frac{1}{N} \sum_{i=1}^Nc-1 = \frac{N(c-1)}{N} L=N1∑i=1N∑j=yimax(0,sj+1−syi)=N1∑i=1N∑j=yimax(0,1)=N1∑i=1N∑j=yi1=N1∑i=1Nc−1=NN(c−1),就是 c − 1 c-1 c−1 -
如果包含 j = y i j = y_i j=yi的情况,所有损失的和应该是多少呢?
损失的和应该会加上 1 1 1 -
如果我们使用平均值而非求和,损失会有怎样的变化呢?
没什么变化,只是缩放而已 -
如果我们使用 m a x ( 0 , s j + 1 − s y i ) 2 max(0,s_j + 1 - s_{y_i} )^2 max(0,sj+1−syi)2,会有什么变化呢?
这就形成了一个新的损失函数。 -
如果我们找到了一个 W W W,使得损失为0,那么损失是惟一的吗?
不是, 2 W 2W 2W也能令损失为0。
既然 W W W和 2 W 2W 2W都能使损失降为0,那么我们应该选哪个 W W W呢?
这里我们引入正则
正则项存在的意义,一般是防止过拟合。因为即使我们把损失调到最低,也只是使得模型尽可能地去拟合训练集,但是我们的目标是让模型尽可能拟合测试集。所以过拟合是不好的,我们可以通过增加一个
R
(
W
)
R(W)
R(W)正则惩罚项,使得模型尽可能地简单。
简单的正则化的例子有L1正则、L2正则;更复杂的有Dropout,批正则,随机深度、fractional pooling。
1.2 softmax损失(多项Logistic回归)
softmax的主要思想是将分类分数的值转化为概率值。
首先是对分数取 e e e的指数,然后归一化;得到概率值。然后对概率值取对数再取负值。
关于softmax也有几个问题:
- softmax的损失的最小值/最大值分别是?
最小值为0,最大值是无穷大 - 最开始的时候,
s
s
s值是大致相等的,损失是多少呢?
结果是 l o g ( C ) log(C) log(C)
可以做一个简单的推导,如上图,cat,frog,car有三个类,某一个图像三个类的得分都是 s s s,再取指数,每个类的得分是 e s e^s es,再归一化,每个类的得分是 1 C \frac{1}{C} C1,再取 l o g log log加负数,就是 − l o g ( 1 C ) = − ( l o g 1 − l o g C ) = l o g ( C ) -log(\frac{1}{C}) = -(log1 - logC) = log(C) −log(C1)=−(log1−logC)=log(C)
2 优化
优化就是寻找使损失函数最小的那个超参数,这里就是找最优的
W
W
W。
最直观的想法是随机优化方法:
#best Loss 是正无穷
bestLoss = float('inf')
for num in range(100):
W = np.random.randn(10,3073)*0.0001 #得到随机的W
Loss = L(x_train,y_train,W) #计算在整个数据集上的loss
if loss <bestLoss:
bestLoss = loss
bestW= W
随机方法是一个没有办法的办法。
英语时间
slope:斜率,坡度
derivative:导数
gradient: 梯度
优化的一个经典想法是使用梯度。
一维,也就是当只有一个自变量
x
x
x时,如下图,这里斜率的计算其实就是ABC这个三角形的
t
a
n
tan
tan 值。
多维时,梯度就是,各个维度的导数组成的向量。
各个方向的斜率,就是各个方向的梯度点乘方向单位向量。
如上图,是使用数值梯度计算法计算梯度。在每次迭代,都要对 W W W的每个维度根据图中公式计算一遍数值。
这种方法是简单的,但是他有两个缺点
- 太慢,每次迭代都要对每个维度算一遍,如果有1000+维度,100次迭代,计算的成本一下就上去了。
- 不够精确。
感谢牛顿和莱布尼兹,让我们可以使用微积分工具来计算梯度。和numerical gradient相对应,这种计算梯度的方式叫analytical gradient。
分析梯度是准确的,快速的,但是易于出错的。
在实践中,使用分析梯度计算,使用数值梯度进行结果检查。这个叫做gradient check。
当样本量 N N N很大时,计算损失函数的和还是很耗计算量的。因此产生了一种随机梯度下降(sgd)。每次迭代都从数据集中选取一小撮样本,计算损失函数,执行梯度下降算法。这个一小撮样本叫做minibatch,它的数值一般为2的指数次方,32、64、128、256等等。
3 图像特征
在深度学习还没有兴起之前,直接使用像素值作为图像特征丢进模型里的效果是很差的。所以在丢进模型之前,会进行一步特征选择。
老师介绍的特征选择方法有这几种
- 颜色直方图,将每个像素值对应到一个色块中,这种不同的色块就会包含不同数量的像素点,可以形成一个直方图。比如“青蛙”这张图片,绿色色块的像素点就很多
- 定向梯度直方图
- 词袋。这个是从nlp中获得的灵感。
但是,深度学习的出现给我们提供了另一种进行特征选择的方式。使用模型帮助我们选择更合适的特征。