(作者:陈玓玏)
假设有一组数据 X X X,包含 m m m个样本,其中每一个样本有 n n n个特征值,每一个样本还对应其label y i y_i yi,也就是说这组数据是一个 m ∗ n m*n m∗n的矩阵,那么我们可以通过一组参数 θ \theta θ来实现对label的预测,这样当新来一个样本时,我们可以通过找到的这一组参数 θ \theta θ和样本的运算(实际是一个函数)来预测其 y y y值。
1. 代价函数
那怎么评估我们的预测是否准确呢?
先来科普一个三个概念:
损失函数(Loss Function):是定义在单个样本上的,是指一个样本的误差。
代价函数(Cost Function):是定义在整个训练集上的,是所有样本误差的平均,也就是所有损失函数值的平均。
目标函数(Object Function):是指最终需要优化的函数,一般来说是经验风险+结构风险,也就是(代价函数+正则化项)。
基于以上的概念,再加上线性回归的损失函数是平方损失函数,最终得到的代价函数公式为:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
2
J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}{(h_\theta(x^i)-y^i)}^2
J(θ)=2m1i=1∑m(hθ(xi)−yi)2
h
θ
(
x
i
)
h_\theta(x^i)
hθ(xi)表示第
i
i
i个样本的预测值,其公式为
h
θ
(
x
i
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
…
+
θ
m
x
m
h_\theta(x^{i})=\theta_0+\theta_1x_1+\theta_2x_2+…+\theta_mx_m
hθ(xi)=θ0+θ1x1+θ2x2+…+θmxm,
y
i
y^i
yi表示第
i
i
i个样本的真实值。
θ
0
\theta_0
θ0是截距项,可以理解为样本矩阵有一列全为1,这一列的系数是
θ
0
\theta_0
θ0。
我们拟合的目标是使得代价函数最小,表示每个样本预测值与真实值之间的差距平均值最小。既然样本值是确定的,那么我们要找的就是使得代价函数最小的一组
θ
\theta
θ值,考虑一个足够简单的场景,即所有样本只有一个特征且
θ
0
\theta_0
θ0为0。此时我们可以知道,代价函数转换为以下形式:
J
(
θ
1
)
=
1
2
m
∑
i
=
1
m
(
θ
1
x
i
−
y
i
)
2
J(\theta_1) =\frac{1}{2m}\sum_{i=1}^{m} (\theta_1x^i-y^i)^2
J(θ1)=2m1i=1∑m(θ1xi−yi)2
这个函数只有一个参数
θ
1
\theta_1
θ1,且展开平方项的系数必然大于0,因此和项中的每一项都是一个自变量为
θ
1
\theta_1
θ1的开口向上的抛物线,
m
m
m项的和仍然是一个开口向上的抛物线,因此我们总能找到一个使得
J
(
θ
1
)
J(\theta_1)
J(θ1)最小的
θ
1
\theta_1
θ1。扩展到多参数以后仍然成立。
2. 最小二乘法及梯度下降法
2.1 求解及更新参数
那么如何求解
θ
\theta
θ向量呢?
有两种方法可以考虑,一种是最小二乘法,一种是梯度下降法。两者的原理其实是一样的,那就是当
J
(
θ
)
J(\theta)
J(θ)对
θ
\theta
θ的偏导为0时,所得到的
θ
\theta
θ值即为我们要求的结果。但最小二乘法是将整个代价函数转化为向量相乘的结果整体求解,
这里的
ω
\omega
ω就是我们说的
θ
\theta
θ,求解的结果为
θ
=
(
X
T
X
)
−
1
X
T
Y
\theta = (X^TX)^{-1}X^TY
θ=(XTX)−1XTY
这个结果求解的困难之处在于求逆。矩阵无法求逆的原因在于存在多余的特征(因为共线性),会导致
X
T
X
X^TX
XTX的行列式为0,因而不能求导。此时应该去分析各特征之间的共线性情况,相关性极高的特征群中留一个就可以了。
因为最小二乘法在存在共线性特征时无法求解,且在特征多时求解很慢(毕竟需要求一个
(
n
+
1
)
∗
(
n
+
1
)
(n+1)*(n+1)
(n+1)∗(n+1)矩阵的逆),所以我们通常喜欢用另一种方法来求解,即梯度下降法。
梯度下降法的原理是沿着梯度下降的方向逐步逼近最低点。下面来看一张图:
当前处于极值点左边时,梯度为负值,参数需要往增大的方向变化,因此我们更新参数时需要用当前参数值减去一个负数,而处于极值点右边时,梯度为正,参数需要往减小的方向变化,也是要减去一个正数,总之就是越来越接近极小值点。
也就是说,我们只需要按照梯度下降的方向(也就是
J
(
θ
)
J(\theta)
J(θ)在
θ
i
\theta_i
θi上下降最快的方向)每次跨出一小步,经过多次前进之后我们总能到达一个最近的极小值。
梯度可以由以下公式求得:
∂
J
(
θ
)
∂
θ
0
=
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
\frac{\partial J(\theta)}{\partial \theta_0} = \frac{1}{m}\sum_{i=1}^{m}{(h_\theta(x^i)-y^i)}
∂θ0∂J(θ)=m1i=1∑m(hθ(xi)−yi)
∂
J
(
θ
)
∂
θ
i
=
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
x
i
\frac{\partial J(\theta)}{\partial \theta_i} = \frac{1}{m}\sum_{i=1}^{m}{(h_\theta(x^i)-y^i)}x^i
∂θi∂J(θ)=m1i=1∑m(hθ(xi)−yi)xi
而梯度更新的方式为:
θ
i
=
θ
i
−
α
∂
J
(
θ
)
∂
θ
i
\theta_i = \theta_i-\alpha \frac{\partial J(\theta)}{\partial \theta_i}
θi=θi−α∂θi∂J(θ)
即:
θ
0
=
α
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
\theta_0 = \alpha \frac{1}{m}\sum_{i=1}^{m}{(h_\theta(x^i)-y^i)}
θ0=αm1i=1∑m(hθ(xi)−yi)
θ
i
=
α
1
m
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
x
i
\theta_i = \alpha \frac{1}{m}\sum_{i=1}^{m}{(h_\theta(x^i)-y^i)}x^i
θi=αm1i=1∑m(hθ(xi)−yi)xi
2.2 学习率的选择
那么在以上公式中,还有一个疑惑就是,
α
\alpha
α参数是什么?这个参数就是步长,又称学习率,它能够控制我们学习的速度,具体看下图:
当学习率很小时,我们每次只会随着梯度的方向往前前进一点点,需要更多的迭代次数才能到达极小值点,找到合适的参数。当学习率很大时,每次更新的长度过大导致越过极值点,容易走成之字形,难以收敛,所以要将学习率控制在合理范围内,可以从一个较小的值开始尝试,逐步增大到合适的大小。
2.3 特征归一化
除了学习率,另外一个值得注意的问题就是特征归一化。看图说话:
左图是未归一化的代价函数等高线图(也就是不同的
J
(
θ
)
J(\theta)
J(θ)值的横截面边缘,因为两个参数的
J
(
θ
)
J(\theta)
J(θ)是抛物面,因此是这个形状),右图是归一化之后的。归一化简单来说就是将各个特征缩放到同一个scale上,如果不进行这个操作,容易出现左图的情况,也就是说
J
(
θ
)
J(\theta)
J(θ)在scale较小的
x
2
x_2
x2对应的参数
θ
2
\theta_2
θ2上的每一步都是在逐渐减小的,但scale较大的
x
1
x_1
x1对应的参数
θ
1
\theta_1
θ1每次下降时,梯度公式中是包含数值较大的
x
1
i
x_1^i
x1i的(可以自己推导一下),这样即使步长小,
θ
1
\theta_1
θ1也容易因为过度更新而产生过学习。
不进行归一化产生z字形的另一个原因是,我们对所有特征使用的都是同等学习率,如果学习率对于取值范围比较大的 θ 2 \theta2 θ2来说能够很好地逼近损失函数的极小值的话,对于本身取值范围较小的 θ 1 \theta1 θ1来说,学习率就可能偏大,因为很容易取到离极小值点的 θ 1 \theta1 θ1作为初始化的 θ 1 \theta1 θ1参数,从而导致之字形。
所以我们需要进行归一化,以期学习过程能够像右图那样进行。
参考文献: