最小二乘法是一种典型的数学优化技术,其目的是通过最小化误差函数(也称为成本函数、损失函数)而求得最优的解。名称中关键的词语就是"最小"、"二乘",名称的英文为"Least Squares"。所谓最小就是使误差函数最小,"二乘"就是指的平方,因此,最小二乘法又称为最小平方法。
要想打好机器学习的数学基础,请参见清华大学出版社的人人可懂系列,包括《人人可懂的微积分》(已上市)、《人人可懂的线性代数》(即将上市)、《人人可懂的概率统计》(即将上市)。

先来看最为简单的在平面中拟合直线方程的情况,这种情况下只需要找出1个系数和截距。这种情况下,最小二乘法使用的误差函数为:
J ( θ ) = 1 2 m ∑ i = 0 m − 1 ( y p i − y i ) 2 J\left( \mathbf{\theta} \right) = \frac{1}{2m}\sum_{i = 0}^{m - 1}{(y_{pi} - y_{i})}^{2} J(θ)=2m1i=0∑m−1(ypi−yi)2
(公式1)
做线性拟合的目的就是要使 J ( θ ) J\left( \mathbf{\theta} \right) J(θ)这个误差函数的值尽可能的小。值更小就表明预测值与真实值的差值更小。公式1中, y pi y_{\text{pi}} ypi表示第i 个预测值; y i y_{i} yi即为 y t i y_{ti} yti,表示第i 个真实值; m m m表示 m m m个数据样本。因此这个函数表示计算预测值与真实值的差的平方和后再求平均。
这里有2个问题要说明,这2个问题初次接触者很容易困惑。
第1个问题是公式1中为什么要采用平方?因为平方计算后都变成了正数,就不必再担心预测值与真实值的差为负数的情况;二是平方后做导数计算。这还能有未知数存在;三是平方函数的图形是一根开口向上的抛线,必有极小值。从 J ( θ ) J\left( \theta \right) J(θ)来要求的未知数是 θ \theta θ,但是公式1中并未见 θ \theta θ?实际上是有的,只是隐含在 y pi y_{\text{pi}} ypi中罢了。要拟合的直线模型为:
y = θ 1 x + θ 0 y = \theta_{1}x + \theta_{0} y=θ1x+θ0
(方程1)
把这方程代入到公式1中,实际上就是:
J ( θ ) = 1 2 m ∑ i = 0 m − 1 ( ( θ 1 x i + θ 0 ) − y i ) 2 J\left( \mathbf{\theta} \right) = \frac{1}{2m}\sum_{i = 0}^{m - 1}{((\theta_{1}x_{i} + \theta_{0}) - y_{i})}^{2} J(θ)=2m1i=0∑m−1((θ1xi+θ0)−yi)2
(公式2)
这样把拟合方程1就转化了求得 J ( θ ) J\left( \theta \right) J(θ)的最小值,在做最小值优化的过程中来求得最合适的 θ 1 \theta_{1} θ1、 θ 0 \theta_{0} θ0这2个参数的值。
**提示:**再次提醒,求解模型是要求其中的 θ 1 \theta_{1} θ1、 θ 0 \theta_{0} θ0这些参数值,而不是x 、y 。x 、y的值事先都是已知的值。
要想打好机器学习的数学基础,请参见清华大学出版社的人人可懂系列,包括《人人可懂的微积分》(已上市)、《人人可懂的线性代数》(即将上市)、《人人可懂的概率统计》(即将上市)。
如果 θ \theta θ只有一次方,则求导数值就会变成1,这就没有办法再求解下去了。假定采用的公式是:
J ( θ ) = 1 2 m ∑ i = 0 m − 1 ( ( θ 1 x i + θ 0 ) − y i ) J\left( \mathbf{\theta} \right) = \frac{1}{2m}\sum_{i = 0}^{m - 1}{((\theta_{1}x_{i} + \theta_{0}) - y_{i})} J(θ)=2m1i=0∑m−1((θ1xi+θ0)−yi)
用这个公式对 θ 0 \theta_{0} θ0求偏导数:
∂ J ( θ ) ∂ θ 0 = ∂ ∂ θ 0 ( 1 2 m ∑ i = 0 m − 1 ( ( θ 1 x i + θ 0 ) − y i ) ) = 1 2 m ∑ i = 0 m − 1 ∂ ∂ θ 0 ( ( θ 1 x i + θ 0 ) − y i ) \frac{\partial J\left( \mathbf{\theta} \right)}{\partial\theta_{0}} = \frac{\partial}{\partial\theta_{0}}\left( \frac{1}{2m}\sum_{i = 0}^{m - 1}\left( \left( \theta_{1}x_{i} + \theta_{0} \right) - y_{i} \right) \right) = \frac{1}{2m}\sum_{i = 0}^{m - 1}{\frac{\partial}{\partial\theta_{0}}\left( \left( \theta_{1}x_{i} + \theta_{0} \right) - y_{i} \right)} ∂θ0∂J(θ)=∂θ0∂(2m1i=0∑m−1((θ1xi+θ0)−yi))=2m1i=0∑m−1∂θ0∂((θ1xi+θ0)−yi)
= 1 2 m ∑ i = 0 m − 1 1 = 1 2 m × m = 1 2 = \frac{1}{2m}\sum_{i = 0}^{m - 1}1 = \frac{1}{2m} \times m = \frac{1}{2} =2m1i=0∑m−11=2m1×m=21
这就使得导数值变成了一个常数,这就违背了做优化的初衷。因为在极值点, ∂ J ( θ ) ∂ θ 0 = 0 \frac{\partial J(\mathbf{\theta})}{\partial\theta_{0}} = 0 ∂θ0∂J(θ)=0,而这里 ∂ J ( θ ) ∂ θ 0 = 1 2 \frac{\partial J(\mathbf{\theta})}{\partial\theta_{0}} = \frac{1}{2} ∂θ0∂J(θ)=21,这就互相矛盾了。上述求导过程中,为什么 ∂ ∂ θ 0 ( ( θ 1 x i + θ 0 ) − y i ) = 1 \frac{\partial}{\partial\theta_{0}}\left( \left( \theta_{1}x_{i} + \theta_{0} \right) - y_{i} \right) = 1 ∂θ0∂((θ1xi+θ0)−yi)=1?前述数学知识中我们已经学过,求偏导数时,把 θ 0 \theta_{0} θ0看成未知数,则把 θ 1 \theta_{1} θ1看成是常量, x i x_{i} xi、 y i y_{i} yi是已知数,也看成是常量,常量的导数为0,因此:
∂ ∂ θ 0 ( ( θ 1 x i + θ 0 ) − y i ) = ∂ θ 0 ∂ θ 0 = 1 \frac{\partial}{\partial\theta_{0}}\left( \left( \theta_{1}x_{i} + \theta_{0} \right) - y_{i} \right) = \frac{\partial\theta_{0}}{\partial\theta_{0}} = 1 ∂θ0∂((θ1xi+θ0)−yi)=∂θ0∂θ0=1
同理,对 θ 1 \theta_{1} θ1求偏导数:
∂ J ( θ ) ∂ θ 1 = ∂ ∂ θ 1 ( 1 2 m ∑ i = 0 m − 1 ( ( θ 1 x i + θ 0 ) − y i ) ) = 1 2 m ∑ i = 0 m − 1 ∂ ∂ θ 1 ( ( θ 1 x i + θ 0 ) − y i ) = 1 2 m ∑ i = 0 m − 1 ∂ ∂ θ 1 ( θ 1 x i ) = 1 2 m ∑ i = 0 m − 1 x i \frac{\partial J(\mathbf{\theta})}{\partial\theta_{1}} = \frac{\partial}{\partial\theta_{1}}\left( \frac{1}{2m}\sum_{i = 0}^{m - 1}\left( \left( \theta_{1}x_{i} + \theta_{0} \right) - y_{i} \right) \right) = \frac{1}{2m}\sum_{i = 0}^{m - 1}{\frac{\partial}{\partial\theta_{1}}(\left( \theta_{1}x_{i} + \theta_{0} \right) - y_{i})} = \frac{1}{2m}\sum_{i = 0}^{m - 1}{\frac{\partial}{\partial\theta_{1}}(\theta_{1}x_{i})} = \frac{1}{2m}\sum_{i = 0}^{m - 1}x_{i} ∂θ1∂J(θ)=∂θ1∂(2m1i=0∑m−1((θ1xi+θ0)−yi))=2m1i=0∑m−1∂θ1∂((θ1xi+θ0)−yi)=2m1i=0∑m−1∂θ1∂(θ1xi)=2m1i=0∑m−1xi
在极值点, ∂ J ( θ ) ∂ θ 1 = 1 2 m ∑ i = 0 m − 1 x i = 0 \frac{\partial J(\mathbf{\theta})}{\partial\theta_{1}} = \frac{1}{2m}\sum_{i = 0}^{m - 1}x_{i} = 0 ∂θ1∂J(θ)=2m1∑i=0m−1xi=0,这个表达式里已经没有了 θ 1 \theta_{1} θ1,因此也没有办法求得 θ 1 \theta_{1} θ1。
此外,在求误差时,参照图3-3来看,已知点的分布实际情况多会是分布在线的上下,如果 θ \theta θ只有一次方,误差值有正有负,做加法时会相互抵消,也会使误差值不真实。要使误差值不相互抵消,可能您会想到可以使用绝对值,即:
J ( θ ) = 1 2 m ∑ i = 0 m − 1 ∣ ( θ 1 x i + θ 0 ) − y i ∣ J\left( \mathbf{\theta} \right) = \frac{1}{2m}\sum_{i = 0}^{m - 1}{|(\theta_{1}x_{i} + \theta_{0}) - y_{i}|} J(θ)=2m1i=0∑m−1∣(θ1xi+θ0)−yi∣
但是这样做,会使这个函数成了一个不可导的函数。前面的数学知识中已经学过,在 ∣ ( θ 1 x i + θ 0 ) − y i ∣ |(\theta_{1}x_{i} + \theta_{0}) - y_{i}| ∣(θ1xi+θ0)−yi∣这个函数的极值点, ( ( θ 1 x i + θ 0 ) − y i ) ((\theta_{1}x_{i} + \theta_{0}) - y_{i}) ((θ1xi+θ0)−yi)和 − ( ( θ 1 x i + θ 0 ) − y i ) - ((\theta_{1}x_{i} + \theta_{0}) - y_{i}) −((θ1xi+θ0)−yi)的导数值不同,产生矛盾,因此不可导。
第2个问题是公式1中系数 1 2 m \frac{1}{2m} 2m1为什么分母有个2?这是为了简化计算,当求导数时, d θ 2 dθ = 2 θ \frac{d\theta^{2}}{\text{dθ}} = 2\theta dθdθ2=2θ,这样就可以把 2 θ 2\theta 2θ前的2约掉。当然,不想要简化计算的话,用 1 m \frac{1}{m} m1也是可以的,因为并不影响求解参数 θ 1 \theta_{1} θ1、 θ 0 \theta_{0} θ0这2个参数的值,而且也不影响求做优化计算。在做优化过程中,函数前有系数 1 2 \frac{1}{2} 21和没有系数 1 2 \frac{1}{2} 21,使函数值往最小值的方向发展趋势是一样的。
要想打好机器学习的数学基础,请参见清华大学出版社的人人可懂系列,包括《人人可懂的微积分》(已上市)、《人人可懂的线性代数》(即将上市)、《人人可懂的概率统计》(即将上市)。
讲了这么多,都是为了让大家解开心中对取公式1这样的优化函数的疑团。我始终认为,只有清楚为什么这么做,才会对知识理解得透彻。