无论在深度学习还是在机器学习中,我们都绕不开几个名词,训练集,模型,损失函数。一般来说选择一个好的损失函数可以让我们尽量避免局部最优点以及有一个比较理想的训练速度。
之前在看吴恩达的深度学习课程的时候,只是从逻辑上明白,在训练模型的时候,训练集和测试集要有相同的分布,即它们是同分布的。这样不至于让我们在训练集上面的到的模型在我们的实际应用中的表现表现的不尽人意。今天有兴趣又看了吴恩达的机器学习的课程,里面对于损失函数的讲解又一次让我从损失函数的角度重新审视训练数据。
下面让我们以最简单的线性回归来进行说明。
我们知道,在线性回归中,我们想要得到的模型函数是
f
(
x
)
=
W
X
+
b
f(x) = WX + b
f(x)=WX+b
而在模型的训练过程中,我们要训练出来一个比较好的参数
W
,
b
W, b
W,b 就需要通过迭代优化损失函数
J
(
W
,
b
)
J(W, b)
J(W,b) 来进行模型的优化。一般来说线性回归通常用平方和误差来进行表示,例如
J
(
W
,
b
)
=
1
m
∑
i
=
1
m
(
W
x
(
i
)
+
b
−
y
(
i
)
)
2
J(W, b) = \frac{1}{m} \sum_{i=1}^m(Wx^{(i)} + b - y^{(i)})^2
J(W,b)=m1i=1∑m(Wx(i)+b−y(i))2
上面两个函数其实涉及两个过程
- 预测过程。其实是固定参数 W , b W, b W,b, 通过给定输入 x x x 获取模型给我们预测 y ^ = f ( x ) \hat y = f(x) y^=f(x), 那么这里的 f ( x ) f(x) f(x)其实就是关于 x x x 的函数。
- 优化过程。这里需要优化的就是 m i n i m i z e W , b J ( W , b ) minimize_{W,b}J(W, b) minimizeW,bJ(W,b), 这个过程中就需要我们的训练数据,我们可以换个角度来想,不管训练数据有多少个,训练数据确定的时候我们就可以认定,在损失函数中的 x ( i ) , y ( i ) x^{(i)}, y^{(i)} x(i),y(i), 也就是说把他们看做是常数,那么 J J J 也就是 W , b W,b W,b的函数。也就是说这里的训练数据的分布其实就相当于损失函数的参数。
首先,一个最简单的道理是,参数不一样的时候,函数 J J J 是不一样的。那么就说明如何我们的训练集合分布和现实数据的分布不一样的话,那么在训练机上面即便将损失函数优化到一个最小值,那么它在真实数据上面的损失值依旧可能会很大,也就是说误差很大,也就无法起到预测的作用。
举个最简单的例子,假如说我们在训练集上面要优化的损失函数可能是
J
(
W
)
=
(
W
−
3
)
2
J(W) =(W - 3)^2
J(W)=(W−3)2
有几点说明:
首先,方便举例忽略了偏置参数b。去掉偏置不会影响函数的优化性质。
其次,由于训练数据分布确定,我们最简化,把里面的输入和输出具体化为某个常数。
上面的损失函数就比较简单了。它的函数图像和非常简单,而且在 W = 3 处取得最小值。当然我们可以发挥我们的想象力,想想这个一个有非常多参数的损失函数(比如一个亿?…)。我们费尽心机用了很多努力终于把参数 W 迭代到了近似3的数值。接下来应用。
可是如果应用的数据集的分布和训练的数据集分布不同,也就是说他们的的损失函数其实也是不一样的,我们假设它的损失函数可能是 J ( W ) = ( W − 10 ) 2 J(W) = (W - 10)^2 J(W)=(W−10)2。这个差的其实就够离谱了。
那么,从真实数据的损失函数来看,它的最优的参数应该是 W=10。
也就是说假如我们想要预测 x = 2 x = 2 x=2 ,真实数据可能更接近于 10 ∗ 2 = 20 10*2 = 20 10∗2=20。 但是通过训练数据训练好的数据的预测却是 3 ∗ 2 = 6 3*2 = 6 3∗2=6。当然现实中可能不会有差的这么离谱的训练集和真实数据。
以上从损失函数的角度说明了为什么我们要谨慎选择数据集,因为数据集的分布不同导致我们优化的损失函数和真实数据的损失函数不同,也就是说可能导致我们的优化方向本身就是错的。可怕的不是我们虽然在前行的路上步履蹒跚,最悲观的是,我们走的还是一条错路。
同时,个人认为由于深度学习它的黑盒性质,某种程度上,我们尽心设计模型结构,尽心挑选合适的损失函数,但其实认真准备训练数据或许是最有效也有可能是最有可能大幅度提醒模型准确率的一种方式了。所以在挑选训练集的时候无论怎么认真,谨慎,负责都不为过。