吴恩达机器学习笔记
Supervised Learning,我们为算法提供了“标准答案”,并希望算法去学习标准输入 - 标准答案之间的联系。
房屋价格预测的问题,自变量为平米数,因变量为价格。这类问题属于回归(Regression)问题 —— 需要预测的变量是连续的。
分类问题,例如癌症诊断,简化为自变量为大小,因变量为是否恶性。这类问题是离散的。
自变量可以有多个,甚至无限个,每个自变量叫做一个特征(Feature)。支持向量机算法,用于将数据映射到无限维空间。
需要多少样本才能满足目标?
没有“标准答案“,算法必须从样本中发现结构(规律)。
聚类问题就是无监督学习的例子。所谓聚类,不同于分类,后者已经知道有哪些类别,聚类需要通过分析数据集来发现类别 —— 自动将数据聚合到不同的簇(Cluster)中。
聚类算法的例子,包括谷歌新闻。它能够分析成千上万的新闻,并进行分类,识别新闻主题。
鸡尾酒会问题:从叠加的数据中分离出信息。
建议先使用Octave建立模型进行研究,最后才迁移到工业级语言。
1 2 3 |
sudo add-apt-repository ppa:octave/stable sudo apt-get update sudo apt-get install octave |
第一个介绍的算法是线性回归(Linear Regression),本节课程将了解到模型长什么样子、监督学习的过程。
在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归(Multivariable linear regression)。
Least squares method,也叫最小平方法。从字面上看,此方法追求平方值的最小化。算术平均法是最小二乘法的特例,也是它的起源。
测量可能因为各种原因导致误差,最自然的处理误差的方式就是求算术平均:
\[\bar{x}=\frac{10.2+10.3+9.8+9.9+9.8}{5}=10\]如何证明这种处理误差的方式是合理的呢?
如果误差是随机的,应该围绕真值上下波动 —— 从这个猜想可以衍生出:如果真值为y,那么,所有测量值与y的差的绝对值之和应该最小。为了免去处理绝对值的正负号,直接将求绝对值转换为求平方:
\[\left|y-y_{i}\right| \rightarrow\left(y-y_{i}\right)^{2}\]求真值就转换为求解下面的表达式何时最小:
\[S_{\epsilon^{2}}=\sum\left(y-y_{i}\right)^{2}\]很明显,这是一个二次函数,底部(导数为零时)的值最小(\({\epsilon}\)表示误差):
\[\begin{aligned} \frac{d}{d y} S_{\epsilon^{2}} &=\frac{d}{d y} \sum\left(y-y_{i}\right)^{2}=2 \sum\left(y-y_{i}\right)=2\left(\left(y-y_{1}\right)+\left(y-y_{2}\right)+\left(y-y_{3}\right)+\left(y-y_{4}\right)+\left(y-y_{5}\right)\right)=0 \end{aligned}\]注意求导的方式,是把求和式作为整体看待,\(x^{2}\)的导函数是\({2x}\)
上述等式即算术平均数:
\[y=\frac{y_{1}+y_{2}+y_{3}+y_{4}+y_{5}}{5}\]算术平均数只是最小二乘法的特例 —— 根据多个测量值求一个真值。推广起来,就是求真值的函数,最简单的情况是一元函数,每个自变量对应一个测量值。
下面是根据温度预测冰淇淋销量的例子,已知数据采样如下:
温度 | 销量 |
25 | 110 |
27 | 115 |
31 | 155 |
33 | 160 |
35 | 180 |
我们假设销量和温度之间是一种线性关系:\(f(x)=a x+b\),带入最小二乘法,误差平方和为:
\[S_{\epsilon^{2}}=\sum\left(f\left(x_{i}\right)-y_{i}\right)^{2}=\sum\left(a x_{i}+b-y_{i}\right)^{2}\]不同的a,b会导致不同的\(S_{\epsilon^{2}}\),根据多元微积分的知识,对系数a,b求偏导,偏导数都为0时\(S_{\epsilon^{2}}\)达到最小值:
\[\left\{\begin{array}{l}{\frac{\partial}{\partial a} S_{\epsilon^{2}}=2 \sum\left(a x_{i}+b-y_{i}\right) x_{i}=0} \\ {\frac{\partial}{\partial b} S_{\epsilon^{2}}=2 \sum\left(a x_{i}+b-y_{i}\right)=0}\end{array}\right.\]将\(x_{i}\)和\(y_{i}\)用上面的数据采样带入,解线性方程组,可得到大概:\(f(x)=7.2 x - 73\),是一条拟合了采样数据的直线。
销量和温度之间也可能不是线性的,例如可以假设是\(f(x)=a x^{2}+b x+c\),参考上面的方式带入,可以得到一条拟合了采样数据的二次曲线。
在监督学习中,我们需要一个数据集,叫做训练集(Traning Set),房价预测的例子中,训练集可以如下:
输入变量x(平方数) | 输出变量y(价格) |
2104 | 460 |
1416 | 232 |
1534 | 315 |
852 | 178 |
…… | …… |
机器学习的目标就是从训练集中学习如何预测房价。
本课程定义了一系列的符号:
符号 | 定义 |
$m$ | 训练样本的数量,训练集的长度 |
$x^{'}$ | 输入变量,也叫特征 |
$y^{'}$ | 输出变量,也叫目标变量 |
$(x, y)$ | 表示单个训练样本(Example) |
$(x^{(i)},y^{(i)})$ | 第i个训练样本 |
所谓假设函数(Hypothesis Function),其作用是以特征为输入, 以目标变量的预测值为输出的函数,这是机器学习领域的标准术语。
对于一元 (单变量,Univariate)线性回归,假设函数的形状如下:
\[ h_θ(x) = θ_0 + θ_1*x \]
上述公式中的$θ_0$、$θ_1$称为模型参数,x是输入变量。选择合理的参数是得到合理假设函数的关键,好的假设函数能更好的拟合。
在线性回归中,我们需要解决的是一个最小化问题,寻找合理的模型参数$θ_0$、$θ_1$使得右侧的求和值最小:
\[ \begin{array}{c}{\text { minimize }} \\ {\theta_{0} \ \theta_{1}}\end{array} \frac{\sum_{i = 1}^m \Big( h_θ(x^{(i)}) - y^{(i)} \Big)^2}{2m} \]
也就是说,尽可能的选择一个假设函数,使得针对所有训练样本的预测值与真实值的差的平方和最小,亦即预测值的平均误差最小。这其实就是一个最小二乘法的思路。
能解决最小化问题的假设函数,也叫目标函数。而\[ J(θ_0,θ_1) = \frac{\sum_{i = 1}^m \Big( h_θ(x^{(i)}) - y^{(i)} \Big)^2}{2m} \]叫做代价函数(Cost Function)。代价函数也叫平方误差(代价)函数,这种函数对于大部分问题,特别是回归问题,是一个合理的选择。除以$m$表示求平均值,除以$2$没有任何意义,仅用于求导时消除,让等式更加自然。
代价函数,也较损失函数(Loss Function),代价函数的自变量就是模型参数。尝试寻求代价函数的最小值,就是解决最小化问题。
我们首先把问题简化一下,仅仅考虑一个模型参数$θ_1$。这种情况下,假设函数是穿过原点的一条斜线,$θ_1$控制它的斜率。代价函数假设为:
\[ J(θ_1) = \frac{\sum_{i = 1}^m \Big( θ_1 x^{(i)} - y^{(i)} \Big)^2}{2m} \]
讲训练样本带入进行计算,可以看到函数$J(θ_1)$的图像是一条抛物线。其底部值(也就是平均误差)最小,对应的$θ_1$就是我们的调参结果。
我们再看看保留两个模型参数的情况。代价函数会变成抛物面的形状,类似的,$J(θ_0,θ_1)$会在抛物面的底部达到最小值。
为了展示的方便,一般将三维抛物面转换为等高线图,两个参数分别对应纵横轴。
机器学习算法的目标就是最小化代价函数,梯度下降(Gradient descent)就是这样的一种算法。
梯度下降是一种很通用的算法,被广泛应用在机器学习的众多领域。 它不仅仅可以最小化线性回归的代价函数$J$。
梯度下降算法的工作方式如下:
- 从某个$θ_0,θ_1,...θ_n$初始值开始,通常初始值中,每个模型参数都取值$0$
- 不断的一点点的 改变$θ_0,θ_1,...θ_n$,来减小代价函数$J(θ_0,θ_1,...θ_n)$。直到获取$J$的最小值,或者局部最小值(Local minium)
考虑下面的代价函数图像:
纵轴方向的值代表了代价函数的大小,下方深蓝色是它的最小值所在。可以把这图像看做一座山,当你站在红色的山顶上,环视四周,并问自己,如果我想尽快下山的话,应该向什么方向走?
你可能尝试向各个方向分别试探一小步(这个步长称为$\alpha$),然后判断哪个方向下降的最快。这意味着选择不同的初始点,可能走的路径不一样。例如你可能到达图像右侧的局部最优(Local Optimum)处。
当到达局部最优解处时,导数项为0,$\theta$不会再变化。逼近最优解的过程中,导数项趋向于无穷小,$\alpha$和它的乘积也趋向于无穷小。这意味着我们不需要在逼近的过程中减小$\alpha$,梯度下降算法会自动减小步进。
- 选择不同的初值,可能达到不同的局部最优解
梯度下降算法的数学定义是,对于每个模型参数$j$,反复同步执行$ \theta_{j}:=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J\left(\theta_{0}, \theta_{1}...\right) $直到收敛。
在本课程中$:=$表示赋值,$=$则表示断言/比较。
$\alpha$是一个数字,叫做学习率(Learning Rate),它控制梯度下降时,迈的步子有多大。
学习率后面的是一个偏导数项(Derivative Term),它表示了在某个特征方向上代价函数变化的激烈程度。
梯度算法的一个微妙之处是,要求所有特征同步更新:
\[\begin{array}{l}{\operatorname{temp} 0:=\theta_{0}-\alpha \frac{\partial}{\partial \theta_{0}} J\left(\theta_{0}, \theta_{1}\right)} \\ {\operatorname{temp} 1:=\theta_{1}-\alpha \frac{\partial}{\partial \theta_{1}} J\left(\theta_{0}, \theta_{1}\right)} \\ {\theta_{0}:=\operatorname{temp} 0} \\ {\theta_{1}:=\operatorname{temp} 1}\end{array}\]
把上述代码的第2、3行交换位置,是不正确的实现方法,尽管它可能有效。
从单个模型参数开始理解。对于$J(\theta_{1})$,梯度下降的过程是反复进行$\theta_{1}:=\theta_{1}-\alpha \frac{d}{d \theta_{1}} J\left(\theta_{1}\right)$。右边的微分项,即$\theta_{1}$点处的斜率。
我们可以用一个抛物线(代价函数是误差平方和,二次函数)来带入测试,可以发现梯度下降会逐步的将$\theta_{1}$移向最低点,也就是达成最小化的目标:
- 学习率总是取一个小的正数
- 在左侧,斜率(Slope)为负,导致$\theta_{1}$右移
- 在右侧,斜率为正,导致$\theta_{1}$左移
回到两个模型参数的房价预测。求导变为求偏导:
\[ \frac{\partial}{\partial \theta_{j}} J\left(\theta_{0}, \theta_{1}\right)=\frac{\partial}{\partial \theta_{j}} \cdot \frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2} =\frac{\partial}{\partial \theta_{j}} \cdot \frac{1}{2 m} \sum_{i=1}^{m}\left(\theta_0 + \theta_1x^{(i)}-y^{(i)}\right)^{2} \]
即(这里不写具体计算过程,总之求偏导时将其它模型参数看做常量,应用求导公式即可):
\[\begin{cases} \frac{\partial}{\partial \theta_{0}} J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) \\ \frac{\partial}{\partial \theta_{1}} J\left(\theta_{0}, \theta_{1}\right)=\frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) \cdot x^{(i)} \end{cases} \]
现在可以把上面的偏导数带入到线性回归算法:
\[\begin{array}{l}{\text { repeat until convergence }\{} \\ {\qquad \begin{aligned} \theta_{0} &:=\theta_{0}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) \\ \theta_{1} &:=\theta_{1}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) \cdot x^{(i)} \end{aligned}} \\ {\}}\end{array}\]
如果学习率太小,则梯度下降的速度会很慢,需要很多次迭代才能达到全局最优解。
如果学习率太大,则可能无法收敛甚至发散(Diverge)。一次迭代就可能从抛物线左侧跳到右侧。
使用梯度下降算法,很容易陷入到局部最优解。
不过对于线性回归来说,其代价函数总是凸函数(Convex Function),其形状类似于一个碗。这种函数很简单,没有局部最优解(Loal Optimum),只有一个全局最优解。
本节介绍的梯度下降的每个步骤,都需要使用所有训练样本(带入偏导数求出模型参数),因此叫做Batch梯度下降。后续会讲解不需要迭代整个训练集的方法。
在线性代数中有一种方法叫做正规方程组(Normal Equations),可以最小化代价函数$J$,而不需要使用梯度下降算法。但是梯度下降更加适合大规模数据集。
通常矩阵用大写,向量用小写。
矩阵的维度(Dimension)即$rownum \times column $。
$\mathbb{R}^{4 \times 2}$表示所有4x2矩阵的集合。
$A_{ij}$表示矩阵A的第i行j列的元素。
向量可以看做是特殊的矩阵,只有一列的矩阵。其行数为向量的维度,4维向量的集合记作$\mathbb{R}^{4}$。$v_i$表示向量的第i个维。本课程默认第一个维为1而非0。
形状(维度)相同才可以相加,对应元素相加即可。
所有元素都分别乘以此标量即可。满足交换律。本课程中,讨论乘法的时候,需要考虑行图像,每行代表了一组自变量,将其和模型参数(一个列)进行线性组合,结果就是预测值。
矩阵乘以向量,结果是向量。
假设有假设函数$h_{(\theta)} = -40 + 0.25 x$,怎么一次性预测$\begin{bmatrix} 2104 \\ 1416 \\ 1534 \\ 852 \end{bmatrix}$这4个尺寸房子的价格?
我们可以将其看做矩阵$\begin{bmatrix} 1 & 2104 \\ 1 &1416 \\ 1 &1534 \\ 1 &852 \end{bmatrix}$,应用矩阵乘法即可,在它右边乘以$\begin{bmatrix} -40 \\ 0.25 \end{bmatrix}$。以行图像角度理解,相当于40个1+*个x的线性组合,结果是一个向量,对应每个尺寸的预测价格。
在Octave或者工业语言中,这种矩阵乘法更加简洁,运行效率也更加高效。
矩阵乘以矩阵,结果是矩阵。
假设我们有三个假设函数$\begin{array}{l}{h_{\theta}(x)=-40+0.25 x} \\ {h_{\theta}(x)=200+0.1 x} \\ {h_{\theta}(x)=-150+0.4 x}\end{array}$,都要应用来预测上面四个房子的价格,实际上可以转换为高效的矩阵计算:
\[\left[\begin{array}{cc}{1} & {2104} \\ {1} & {1416} \\ {1} & {1534} \\ {1} & {852}\end{array}\right] \times\left[\begin{array}{ccc}{-40} & {200} & {-150} \\ {0.25} & {0.1} & {0.4}\end{array}\right]= \left[\begin{array}{ccc}{486} & {410} & {692} \\ {314} & {342} & {416} \\ {344} & {353} & {464} \\ {173} & {285} & {191}\end{array}\right]\]
右侧矩阵的每列,对应一个假设函数。结果矩阵的每列,对应不同的假设函数。这里单次矩阵运算就可以完成12次预测。
不支持交换律。支持结合律。
单位矩阵是n阶方阵,任何同阶矩阵乘以它,不变。$A I = I A = A$
方阵和它的逆相乘,得到单位矩阵。
不是所有方阵都有逆,例如明显的零矩阵就没有逆。
没有逆的矩阵也叫奇异(Singular)或退化(Degenerate)矩阵。
之前房价预测的例子,仅仅有一个特征,就是尺寸。实际上房价和多个维度有关系,包括尺寸、房间数量、楼层数量、房龄,等等。这种情况下可以使用更强大的多变量线性回归。
$x_1$、$x_2$、$x_3$、$x_4$分别表示第1、2、3、4个特征。
$n$表示特征的数量。
$x_{j}^{(i)}$表示第$i$个副本的第$j$个特征的值。
向量$x^{(i)}$表示第$i$的训练样本,例如$ x ^{(2)} = \begin{bmatrix} 1416 \\ 2 \\ 2 \\ 40 \end{bmatrix} $
线性回归算法下,即使有多个特征,假设函数仍然是线性的:
\[ h_{\theta}(x) = \theta_0 + \theta_1x_1+ \theta_2x_2+ \theta_3x_3+ \theta_4x_4\]
为了矩阵计算的方便,我们为样本加一个特征$x_0$,其值总是为$1$,对应到参数$\theta_0$:
\[ h_{\theta}(x) = \theta_0x_0 + \theta_1x_1+ \theta_2x_2+ \theta_3x_3+ \theta_4x_4 \ (x_0 = 1) \]
现在具有$n$个特征的训练样本可以记作$n+1$维向量:$x=\left[\begin{array}{c}{x_{0}} \\ {x_{1}} \\ {x_{2}} \\ {\vdots} \\ {x_{n}}\end{array}\right] \ \ \in \mathbb{R}^{n+1}$,相应的$n+1$个模型参数可以记作:$\Theta=\left[\begin{array}{c}{\theta_{0}} \\ {\theta_{1}} \\ {\theta_{2}} \\ {\vdots} \\ {\theta_{n}}\end{array}\right] \in \mathbb{R}^{n+1}$。
而假设函数可以简单的记作$h_{\theta}(x) = \theta^Tx$,此向量内积(Inner Product,点积,两个等维向量得到一个标量,几何意义是第一个向量和它在第二个向量方向上投影的乘积,因此两个向量方向越接近则点积越大)即本节最上面的假设函数。
仍然是误差项的平方和:
\[ J\left(\theta_{0}, \theta_{1}, \ldots, \theta_{n}\right) = J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2} \]
梯度下降的逻辑是类似的,仍然是对$n+1$个模型参数中得每一个重复进行:
\[ \begin{array}{l}{\text { Repeat }\{} \\ {\qquad \begin{aligned} \theta_{j}:= \theta_{j} - \alpha\frac{\partial}{\partial \theta_{j}} J(\theta) = \theta_{j}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{j}^{(i)} \\ \text { (simultaneously update } \theta_{j} \text { for } \\j=0, \ldots, n) \end{aligned}} \\ \} \end{array} \]
\[\begin{array}{l}{\theta_{0}:=\theta_{0}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{0}^{(i)}} \\ {\theta_{1}:=\theta_{1}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{1}^{(i)}} \\ {\theta_{2}:=\theta_{2}-\alpha \frac{1}{m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right) x_{2}^{(i)}} \\ \cdots \end{array}\]
即从一组任意选择的模型参数(通常选择零向量)开始,对每个参数、同步的减去学习率乘以偏导数,直到收敛。
这些技巧的目的都是让梯度下降算法快速收敛,减少计算量。
特征缩放(Feature Scaling),它的想法是,保证所有特征在相似的范围(Scale)上,也就是说让所有特征的值大小近似,不要差距过大。
以房价预测为例,假设有两个维度,尺寸和房间数。尺寸的数量级是1000,房间则是个位数。以这两个维的模型参数作为轴绘制等高线,你会发现它的等值线近似于长短轴比非常大椭圆。在这种等值线上梯度下降需要消耗相当多的步骤。
特征缩放的具体做法就是,对各特征除以适当的倍数,使它们近似的都落入$-1 \leq x_{i} \leq 1$这个(没有数量级差异即可,例如小至$\frac{1}{3}$大至$3$)范围,进而让等高线更接近于圆形。这样,梯度下降的过程就不会是剧烈的来回震荡,而是更加直接的朝着最优解方向。
算法应用完成后,只需要对最小化后得到的模型参数反向的缩放一下即可。
均值归一化(Mean Normalization),就是对所有样本的每个特征进行转换,让它的平均值接近零。
以房价预测为例,假设尺寸取值在0-2000之间,平均值大概1000,房间数取值在1-5之间,平均值大概5,则可以用下面的公式进行归一化:
\[\begin{array}{l}{x_{1}=\frac{\operatorname{size}-1000}{2000}} \\ {x_{2}=\frac{\# \text { bedrooms }-2}{5}}\end{array}\]
更一般的说,对于第i个特征$x_i$,归一化使用公式$\frac{x_i - u_i}{s_i}$。其中$u_i$是此特征的平均值,$s_i$是此特征最大值和最小值之差。同样的,$s_i$或$u_i$不需要非常精确。
以迭代次数为横轴,代价函数(平均误差)为纵轴,绘制图像,理想情况下曲线应该逐步下降,并且从陡峭渐渐变得平缓。
可能第300次迭代到400次迭代之间,平均误差基本没有什么变化,这提示迭代到这里就足够了。
解决不同问题,需要迭代的次数可能差异很大。
如果此曲线不降反升、或者反复升降,这提示算法有问题,通常意味着需要选择更小的学习率$\alpha$。
从数学上已经证明,只要学习率足够小,那么梯度下降的每一步都会让代价函数变小。但是,如果学习率太小,就会导致需要迭代很多次数,收敛太慢。调参时,可以去足够小的值开始,然后每次增加N倍,绘制曲线看效果。
多项式回归(Polynomial Regression)允许你基于线性回归的方法来拟合(Fit)非常复杂的函数,甚至是非线性函数。
仍然是房价预测的例子,假设我们需要关注的两个特征是临街宽度(frontage)和纵深(depth,垂直于道路的那边长度)。应用线性回归时,假设函数长这个样子:
\[h_{\theta}(x)=\theta_{0}+\theta_{1} \times \text { frontage }+\theta_{2} \times \text { depth }\]
但是实际上,决定房子价格的可能是其面积,因此我们可以根据上面两个特征,创造出新的特征area,这样问题就变成了经典的单变量线性回归。有时候审视特征可以创建出更理想的模型。
多项式回归是和特征选取紧密相关的想法。所谓多项式,是由称为未知数的变量和称为系数的常数通过有限次加减法、乘法以及自然数幂次的乘方运算得到的代数表达式,多项式是整式的一种。未知数只有一个的多项式称为一元多项式。
考虑下面的训练样本,它体现了平方数和房价的关系:
从图像上看,明显两者不是线性关系。你可能考虑用二次模型$h(\theta)(x) = \theta_0 + \theta_1 x + \theta_2 x^2$来拟合,但是二次模型最终会下降,而房价明显是随着面积是递增的。所以另一个多项式模型,例如三次函数(Cubic Function)$h(\theta)(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 $。
利用特征选取的技巧,我们很容易修改上述模型,让其可以进行线性回归:
\[\begin{aligned} h_{\theta}(x) &=\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}+\theta_{3} x_{3} \\ &=\theta_{0}+\theta_{1}(\text {size})+\theta_{2}(\text {size})^{2}+\theta_{3}(\text {size})^{3} \\ x_{1} &=(\text {size}) \\ x_{2} &=(\text {size})^{2} \\ x_{3} &=(\text {size})^{3} \end{aligned}\]
也就是,将多项式中的高次部分看做是从原始特征衍生出来的新特征。现在问题已经转换为具有三个特征:面积、面积平方、面积三次方的线性回归了。
需要提及的一点是,这种特征抽取后,特征缩放更加重要了,因为面积和它的三次方差了很多数量级。
根据图像的形状,你也可以选择$h_{\theta}(x)=\theta_{0}+\theta_{1}(s i z e)+\theta_{2} \sqrt{(\operatorname{size})}$这样的假设函数而非三次方。手工选择模型可能很困难,有一些算法可以根据给出的训练集,自动选择2次,3次或者其他函数作为模型。
正规方程法(Normal Equation)能够解析式的求解线性回归,而不需要像梯度下降那样一步步的迭代。
为数据集加一个额外的特征$x_0$,对应假设函数中的常数项。然后,将所有特征写成矩阵:
\[X=\left[\begin{array}{ccccc}{1} & {2104} & {5} & {1} & {45} \\ {1} & {1416} & {3} & {2} & {40} \\ {1} & {1534} & {3} & {2} & {30} \\ {1} & {852} & {2} & {1} & {36}\end{array}\right]\]
将所有目标变量写成向量:$\begin{bmatrix}460\\232\\315\\178\end{bmatrix}$。
然后用公式:$\theta=\left(X^{T} X\right)^{-1} X^{T} y$即可立即求出最小化的模型参数。 在Octave中,此公式对应代码 pinv(X' * X) *X'*y,pinv函数表示求伪逆矩阵,即使矩阵不可逆也能计算。
使用正规方程法,不需要特征缩放。
和梯度下降相比,正规方程法的优势是:
- 不需要尝试和选择学习率
- 不需要进行迭代
它的缺点是:
- 特征数量极大,例如上百万,会非常慢。因为矩阵求逆的复杂度大概是$O(n^3)$。一般上万级别的特征数量就需要犹豫了
绝大部分情况下不会出现不可逆的情况。
导致不可逆的原因可能是:
- 存在冗余特征(线性相关),例如$x_1$、$x_2$都表示面积,只是单位不同,一个是平方英尺,一个是平方米
- 特征数量太多,例如样本数量$m$小于等于特征数量$n$。解决办法可以是删除部分特征,或者使用正则化(Regularization)
对于Yes/No型分类(两个值1/0),缺陷包括:
- 引入一个自变量很大或很小的样本,会导致预测结果严重错误
- 会出现预测值大于1或小于0的情况
这是一个分类算法,名字中带有回归是历史原因。此算法用于目标变量是离散值1或0的情况。
此算法期望分类器输出0或1,对应着假设函数值的范围$0 \leq h_{\theta}(x) \leq 1$。此算法的假设函数是一个复合函数:
\[\begin{array}{c}{h_{\theta}(x)=g\left(\theta^{T} x\right)} \end{array}\]
其中:
\[ {g(z)=\frac{1}{1+e^{-z}}} \]
这个$g(z)$叫做Sigmoid函数,也叫Logistic函数。也就是说,此算法的假设函数,就是在线性回归假设函数外面套了一层Logistic函数。
把复合函数展开来写,假设函数即:
\[h_{\theta}(x)=\frac{1}{1+e^{-\theta^{\top} x}}\]
Logistic函数能够把值映射到0到1的范围内,它的图像如下:
上节我们了解到Logistic回归的假设函数是Sigmoid,也就是说它的值域是0-1之间。
那么其值的含义是什么?在Logistic回归中,假设函数的值表示$y=1$的概率。以肿瘤良恶分类的例子来说,特征$x = \begin{bmatrix}x0\\x1\end{bmatrix} = \begin{bmatrix}1\\tumorSize\end{bmatrix} $应用假设函数后的结果是$h_{\theta}(x) = 0.7$,这意味着病人有70%的概率得了恶性肿瘤。
用概率学的术语可以表述为:$h_{\theta}(x)=p(y=1 | x ; \theta)$ ,即对于给定的$x$,在基于${\theta}$进行参数化的情况下,$y = 1$的概率是多少。另外需要注意:
\[\begin{array}{l}{P(y=0 | x ; \theta)+P(y=1 | x ; \theta)=1} \\ {P(y=0 | x ; \theta)=1-P(y=1 | x ; \theta)}\end{array}\]
由于这是一个分类算法,因此结果只能是0或1,而不是给个概率。我们的做法是,当假设函数输出大于等于0.5的情况下,设置结果为1。
看一下Sigmoid的样子,我们可以知道,当自变量大于等于0时,其值大于等于0.5。也就是说,当$\theta^{\top} x \geq 0$的情况下$y = 1$。
所谓决策边界(Descsion Boundary),就是指划分了样本类别的那条边界。
对于有两个特征的训练集,如果我们应用线性的假设函数,即:$h_{\theta}(x)=g\left(\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}\right)$,则样本分布情况可能如下(两个轴表示特征值,圆圈和红叉分别表示0和1):
我们可以画出一条粉色的直线,其左边都预测为0,右边都预测为1,该直线就是假设函数的决策边界。
这条直线怎么画?上节提到过,Sigmoid函数的自变量也就是内层函数的值大于等于0时预测为1。也就是 $\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2} \geq 0$的情况预测为1,如果参数取值-3、1、1时,则决策边界如上图粉色线。
对于更加复杂的假设函数,例如包含高阶多项式的$\begin{aligned} h_{\theta}(x)=g\left(\theta_{0}+\theta_{1} x_{1}+\theta_{2} x_{2}\right.\left.+\theta_{3} x_{1}^{2}+\theta_{4} x_{2}^{2}\right) \end{aligned}$,我们会得到更加复杂的决策边界,如右上图。
绘制上面两个例子时,我们都是手工选择了模型参数,后续我们会介绍自动选择模型参数的方法。
再次强调一下,决策边界不是训练集的属性,而是假设函数及其模型参数的属性。给定模型参数,决策边界的图像就确定了。训练集的价值在于可以用来拟合模型参数。
我们回顾一下线性回归的代价函数:$J(\theta)=\frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}$,此代价函数的目标是选择适当的模型参数,让误差平方和最小。
我们可以改写一下上面的代价函数:$\operatorname{cost}\left(h_{\theta}\left(x^{(i)}\right), y^{(i)}\right)=\frac{1}{2}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}$。
上述代价函数的本质是最小二乘法,在线性回归中能够很好的工作。但是,将这种代价函数应用到Logistic回归时,我们会得到一个非凸函数。因为Logistic的假设函数是一个Sigmoid函数,它不是关于$\theta$的线性函数。将训练样本带入代价函数,你无法得到类似线性回归的抛物线,而是会得到具有多个局部最小值的复杂的非凸函数。
我们期望的是,得到一个凸的代价函数,这样才能够利用梯度下降迭代出全局最优解。
我们通过极大似然法得到的,用于Logistic回归的代价函数如下:
\[ \operatorname{cost}\left(h_{\theta}(x), y\right)=\left\{\begin{aligned}-\log \left(h_{\theta}(x)\right) & \text { if } y=1 \\-\log \left(1-h_{\theta}(x)\right) & \text { if } y=0 \end{aligned}\right. \]
对于目标变量$y$,假设函数$h_\theta(x)$的代价的计算方式取决于$y$,我们看一下该代价函数的图像。
对于分类为“是”(也就是$ y = 1 $)的训练样本,代价函数的图像(纵轴为代价,横轴为假设函数的输出)如下:
此高阶函数的定义域仅仅在$(0, 1)$之间,因为Sigmoid函数的值域即$(0, 1)$。
这个代价函数具有很好且有趣的性质:
- 如果$ y = 1 $且预测结果为$h_\theta(x) = 1$,则代价为0
- 反之,当预测结果趋向于0时,代价变得无穷大
假设你选取了一些模型参数,然后应用假设函数进行预测。带入$y = 1$的样本,却预测得到0.00001,代价就是高昂的。对于肿瘤预测的场景,相当于告诉恶性肿瘤病人你绝对没问题。
从另外一个角度来说,你选取不同的模型参数,也势必对应到此曲线上不同的值,我们算法的目标就是自动找出合理的模型参数,让代价值尽量小。
对于分类为“否”(也就是y=0)的训练样本,该代价函数有着类似的性质:预测结果趋向于1时代价变得无穷大。
凸分析不在本课程的讨论范围,但是可以证明我们选择的这种代价函数是一种凸函数。
本节将用一个简化版本来替换上一节的代价函数,同时阐述如何利用梯度下降拟合出Logistic回归的参数。
上节的代价函数等价于:$cost\left(h_{0}(x), y\right)=-y \log (\log (x))-(1-y) \log \left(1-h_{0}(x)\right)$这种简写形式。
相应的平均代价:
\[\begin{aligned}
J(\theta) &=\frac{1}{m} \sum_{i=1}^{m} \operatorname{cost}\left(h_{\theta}\left(x^{(i)}\right), y^{(i)}\right) \\
&=-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right]
\end{aligned}\]
对于这个代价函数,我们要做的是,尝试找到使$J(\theta)$最小的$\theta$。具体做法仍然是梯度下降:$\theta_{j}:=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J(\theta)$,也就是对所有模型参数同步的减去学习率和偏导数的乘积,直到收敛。
你可能会注意到,这里的算法和线性回归完全一样。但是需要注意,两者的假设函数是不同的。线性回归是$h_\theta(x)=\theta^Tx$,Logistic回归则是$h_{0}(x)=\frac{1}{1+e^{-0^{T} x}}$。
监控梯度下降是否收敛的方法、以及特征缩放,在这里同样适用。
本节介绍一些优化技巧,可以提升Logistic回归的速度,以适合大规模机器学习的场景。
可以用来替换梯度下降的最小化算法包括共轭梯度法(Conjugate Gradient)、BFGS、L-BFGS等。这些算法有一些共同的特点:
- 不需要手工选择学习率,算法会有一个内部“智能”循环,来选择一个好的学习率,甚至可以每次迭代选取不同的学习率
- 收敛速度远远高于梯度下降
- 更加复杂
除非你是数值计算方面的专家,不需要手工实现这些算法。
本章一直讨论非黑即白的分类问题,实际上多类别分类(Multiclass Classification)也很常见,这类问题的特点是$y$的离散值超过2个。
多类别分类问题的解决方案是,转换为多个二元分类问题。例如从症状诊断是健康、感冒、还是流感,可以转换为是否健康、是否感冒、是否流感这三个独立的二元分类问题。
对于第一个二元分类,我们需要从原始训练集导出一个“伪”训练集,将健康设定为正类,感冒、流感设定为负类。对于第二、第三个二元分类,进行类似的处理。
在预测阶段,对于任何输入,我们需要带入三个分类器,然后选择$y$最大,也就是是正类可能性最大的分类器。
当将线性回归、Logistic回归应用于某些场景下时,可能会面临过拟合(Overfitting)问题,导致算法表现很差。
所谓欠拟合(Underfitting)是指假设函数不能很好的你和训练数据,偏差较大。
所谓过拟合,也叫高方差(High Variance,在概率论和统计学中,一个随机变量的方差描述的是它的离散程度,也就是该变量离其期望值的距离),则是假设函数太过努力的尝试通过所有的数据点,却导致它无法泛化到新的样本中的情况。所谓泛化是指假设函数拟合不存在于训练集的样本的能力。
上图是房价预测(线性回归)的三个假设函数,线性函数存在欠拟合问题,二次函数很好的拟合,而四次多项式函数则存在过拟合,它的波动曲线很明显不符合房价随着尺寸变化的实际情况。
过拟合往往发生在具有很多特征的情况下,学习得到的假设函数可能很好的拟合训练集,但是无法生成新的样本,也就是无法正确的进行预测。
对于Logistic回归,同样存在欠拟合、过拟合的问题:
上面是癌症预测的三个假设函数,可以看到第三个假设函数为了拟合训练样本,过分的扭曲了其决策边界。
在最初的房价预测的例子中,特征只有1+1个,因此可以绘制图像来发现过拟合。
实际应用中,特征数量会非常多,没法绘图。如果训练样本过少,而特征过多,则很难确定哪些特征和目标变量有关,也就很容易出现过拟合问题。
解决过拟合的思路有:
- 减少特征数量:
- 手工选择哪些特征需要保留
- 建模出一种自动化的特征选取算法
- 正则化:
- 保留所有特征,但是降低特征$J$的数量级,或者减小模型变量$\theta_j$的大小
减少特征数量的缺点是:你舍弃了某些和问题相关的信息。
正则化的优点是:在特征很多的场景下能够很好的工作,每个特征都可以对$y$的预测作出应有的贡献。
Leave a Reply