AndrewNg MachineLearning 学习笔记 02

本贴最后更新于 2200 天前,其中的信息可能已经天翻地覆

第二课 线性回归和梯度下降

1. 摘要

本课内容从一个无人驾驶的案例引入回归的概念,借用上次 Portland Oregon 房价的例子,推导出梯度下降和最小二乘两个算法。

2. 基本概念及符号

在无人驾驶的案例中,汽车试图预测驾驶的方向,是一种连续的量。
因此可以总结下述概念(自己总结的并不严格)

回归问题:给定一组输入,算法输出一组连续变化的量,称为回归问题。

然后来看 Portland Oregon 房价案例,我们有以下数据

Living area (feet2) #bedrooms Price (1000$s)
2104 3 400
1600 3 330
2400 3 369
1416 2 232
3000 4 540

m: 训练样本数量(上述例子中就是 5)
x: 输入变量(上述例子中就是(2104, 3)等)
y: 输出变量或叫目标(上述例子中就是 400 等)
(x, y): 训练样本(上述例子中就是((2103, 3), 400))
i: 训练样本的编号(上述例子中((2103, 3), 400)就是 1 号样本, 即 i=1,记为\((x^1, y^1)\), 这里 i 并不表示乘方只是一个序号,下文同样。

h: 表示一个假设,一般记为\\(h(x)\\),或者\\(h_\theta(x)\\) \\(\theta\\): 假设中的参数,如上述例子会有如下表示\\(h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2\\),其中\\(x_1\\)表示房屋面积,\\(x_2\\)表示卧室数量

再进一步,我们规定\(x_0=1\),那么
\begin{align}
h_\theta(x) = \sum_{i=0}^n\theta_ix_i = \theta^TX
\end{align}
这里 n 表示输入变量的特征数,比如上述例子中 n 就为 2。

3. 梯度下降

为了使我们的模型在训练数据上尽量准确,我们定义如下误差项损失函数:

\frac12\sum_{i=0}^m(h_\theta(x^i) - y^i)^2

显然,这里是模型对训练集所有数据误差平方的一个求和,前面的\(\frac12\)是为了后面计算方便。如果一个模型在训练集上有更好的表现,那么上述算式的值一定更小。于是我们定义

J(\theta) = \frac12\sum_{i=0}^m(h_\theta(x^{(i)}) - y^{(i)})^2

我们要找到\(\min\limits_{\theta}J(\theta)\)时的\(\theta\)值,也就确定了模型参数。

有这样一种思路,我们首先给的一个\(\theta\)的初始值(一般为零向量),然后我们通过不断改变\(\theta\)的值,似的\(J(\theta)\)不断减小,直到一个我们满意的最小值。该思路可以表现为如下图像。

就像一个人站在山顶,他想尽快下山,那么他首先环视一周,找到最陡的下坡路,然后向这个方向迈出一步,然后再环视一周,找到最陡的下坡路,再向这个方向走一步。。。重复以上过程,可以想象这个人一定会下到山脚。当然有一个问题是,根据这个人在山顶初始位置的不同,他下到山脚的位置也不尽相同,但我们遇到的问题大多是只有一个全局最小值,所以不必担心这样的情况。于是,我们依照如下公式更新\\(\theta\\): $$\theta_i := \theta_i - \alpha\frac{\partial}{\partial \theta_i}J(\theta)$$ 公式中“:=”表示赋值,把右边的值赋给左边。此外,\\(\alpha\\)是一个参数,通常是手动设定的,代表了“步长”。如果\\(\alpha\\)设定过小,那上述公式收敛的速率会很慢,相反如果设置过大,那么在接近极小值时有可能直接“迈过”去了。 视频中Andrew教授以单训练样本对上面的公式进行了计算,下面我直接以更一般的m个训练样本进行推导。

\begin{align}
\frac{\partial}{\partial \theta_i}J(\theta) & = \frac{\partial}{\partial \theta_i}\frac12\sum_{j=0}^m(h_\theta(x^{(j)}) - y^{(j)})^2 \\
& = \frac12\sum_{j=0}^m\frac{\partial}{\partial \theta_i}(h_\theta(x^{(j)}) - y^{(j)})^2 \\
& = \frac12 * 2 * \sum_{j=0}^m(h_\theta(x^{(j)}) - y^{(j)})\frac{\partial}{\partial \theta_i}(h_\theta(x^{(j)}) - y^{(j)})
\end{align}
这里,
\begin{align}
\frac{\partial}{\partial \theta_i}(h_\theta(x^{(j)}) - y^{(j)}) & = \frac{\partial}{\partial \theta_i}(\sum_{i=0}^n\theta_ix_i^{(j)} - y^{(j)}) \\
& = \frac{\partial}{\partial \theta_i}(\theta_0x_0^{(j)} + \theta_1x_i^{(j)} + ... + \theta_nx_n^{(j)} - y^{(j)}) \\
& = x_i^{(j)}
\end{align}
因此,

\frac{\partial}{\partial \theta_i}J(\theta) = \sum_{j=0}^m(h_\theta(x^{(j)}) - y^{(j)})x_i^{(j)}

最终,我们得到了\(\theta\)的更新公式

\theta_i := \theta_i - \alpha\sum_{j=0}^m(h_\theta(x^{(j)}) - y^{(j)})x_i^{(j)}

通常,上述算法被称为批梯度下降算法(Batch Gradient Descent),因为每迭代一个\(\theta_i\)我们都会使用所有的训练集,因而当训练集非常庞大的时候,该算法收敛的速率通常让人崩溃。这种时候,我们通常选择另一种称为**随机梯度下降算法(Stochastic Gradient Descent)**来进行计算。该算法更新参数的公式如下:
对于每个训练样本\((x^{(j)}, y^{(j)})\)

\theta_i := \theta_i - \alpha(h_\theta(x^{(j)}) - y^{(j)})x_i^{(j)}\quad(for\,all\,i)

上述算法的思想在于,每次迭代只使用一个训练样本,然后用这个样本更新所有参数,如果还有更多样本则重复上述过程。
这种算法的效率通常比批梯度下降要快,但每次迭代的方向有可能是负梯度方向,最终有可能在极小值附近徘徊,但结果会很接近极小值。

4. 最小二乘法

前面介绍的两种算法属于迭代算法,需要大量运算,而最小二乘法则只需要把数据代入一个公式即可得到结果。为此,我们需要定义一些符号,并且后面的运算都是基于向量或矩阵的。

4.1 符号系统

  1. 向量及矩阵求导

    设\(f : \mathbb{R}^{mn} \to \mathbb{R}\),并且\(A \in \mathbb{R}^{mn}\),定义

\nabla_A f(A) = \begin{pmatrix} \frac{\partial f}{\partial A_{11}} & \cdots & \frac{\partial f}{\partial A_{1n}} \\\\ \vdots & \ddots & \vdots \\\\ \frac{\partial f}{\partial A_{m1}} & \cdots & \frac{\partial f}{\partial A_{mn}} \end{pmatrix}
  1. 关于矩阵迹(trace)的一些定理

    定义:设\(A \in \mathbb{R^{n*n}}\),则称\(trA = \sum_{i = 0}^n A_{ii}\)为矩阵\(A\)的迹
    \begin{eqnarray}
    & trAB = trBA\quad(1)\\
    & trABC = trCAB = trBCA\quad(2)\\
    & f(A) = trAB, \nabla f(A) = B^T\quad(3)\\
    & trA = trA^T\quad(4)\\
    & tra = a, a \in \mathbb{R}\quad(5)\\
    & \nabla_A trABA^TC = CAB + C^TAB^T\quad(6)
    \end{eqnarray}

4.2 最小二乘公式推导

首先回忆一下在梯度下降算法中,我们定义的模型偏差损失函数

J(\theta) = \frac12\sum_{i=0}^m(h_\theta(x^{(i)}) - y^{(i)})^2

现在我们要把上述公式的变量都替换为矩阵或向量。

我们所有的训练样本输入、输出及参数可以表示为如下矩阵

X = \begin{pmatrix} (x^{(1)})^T \\\\ \vdots \\\\ (x^{(m)})^T \\\\ \end{pmatrix} \quad Y = \begin{pmatrix} y^{(1)} \\\\ \vdots \\\\ y^{(m)} \\\\ \end{pmatrix} \quad \theta = \begin{pmatrix} \theta_1 \\\\ \vdots \\\\ \theta_n \\\\ \end{pmatrix}

那么,模型预测值与实际值的差可以表示为
\begin{align}
X\theta - Y & =
\begin{pmatrix}
(x^{(1)})^T \\
\vdots \\
(x^{(m)})^T \\
\end{pmatrix}
\begin{pmatrix}
\theta_1 \\
\vdots \\
\theta_n \\
\end{pmatrix} -
\begin{pmatrix}
y^{(1)} \\
\vdots \\
y^{(m)} \\
\end{pmatrix} \\
& =
\begin{pmatrix}
(x^{(1)})^T\theta \\
\vdots \\
(x^{(m)})^T\theta \\
\end{pmatrix} -
\begin{pmatrix}
y^{(1)} \\
\vdots \\
y^{(m)} \\
\end{pmatrix} \\
& =
\begin{pmatrix}
h_\theta(x^{(1)}) \\
\vdots \\
h_\theta(x^{(m)}) \\
\end{pmatrix} -
\begin{pmatrix}
y^{(1)} \\
\vdots \\
y^{(m)} \\
\end{pmatrix} \\
& =
\begin{pmatrix}
h_\theta(x^{(1)}) - y^{(1)} \\
\vdots \\
h_\theta(x^{(m)}) - y^{(m)} \\
\end{pmatrix}
\end{align}
由向量内积的定义,我们可以得到

\frac12(X\theta - Y)^T(X\theta - Y) = \frac12\sum_{i=0}^m(h_\theta(x^{(i)}) - y^{(i)})^2 = J(\theta)

如同梯度下降,我们希望求得\(J(\theta)\)取得极小值时\(\theta\)的值,此时一个办法就是对\(J(\theta)\)求导
因此,我们设

\nabla_\theta J(\theta) = \vec 0

其中,
\begin{align}
\nabla_\theta J(\theta) & = \nabla_\theta \frac12(X\theta - Y)^T(X\theta - Y) \\
& = \frac12\nabla_\theta (\theta^TX^TX\theta - \theta^TX^TY - Y^TX\theta + Y^TY) \\
\end{align}
由于上式括号中表达式是向量内积的得到的,因此其实际上只是一个实数,由定理(5),我们可以得到
\begin{align}
& \frac12\nabla_\theta (\theta^TX^TX\theta - \theta^TX^Ty - y^TX\theta + y^Ty) \\
& = \frac12\nabla_\theta tr(\theta^TX^TX\theta - \theta^TX^Ty - y^TX\theta + y^Ty) \\
& = \frac12(\nabla_\theta tr\theta\theta^TX^TX - \nabla_\theta trY^TX\theta - \nabla_\theta trY^TX\theta)\quad\text{(use theory (2)(4)(5))} \\
& = \frac12(\nabla_\theta tr\theta\theta^TX^TX - 2\nabla_\theta trY^TX\theta) \\
& = \frac12\nabla_\theta tr\theta\theta^TX^TX - X^TY\quad\text{(use theory (3))}
\end{align}
接下来,我们再看上式第一项,求导部分可以作如下变换

\nabla_\theta tr\theta\theta^TX^TX = \nabla_\theta tr\theta I\theta^TX^TX

然后我们记

A = \theta \quad B = I \quad C = X^TX

那么由定理(6),可以得出

\frac12\nabla_\theta tr\theta\theta^TX^TX = \frac12(X^TX\theta I + X^TX\theta I) = X^TX\theta

最终,我们求得

\nabla_\theta J(\theta) = X^TX\theta - X^TY = \vec 0

\begin{align}
X^TX\theta & = X^TY \\
\theta & = (X^TX)^{-1}X^TY
\end{align}

  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...