第一部分主要讲了Regression。【我曾经纠结于regression的意思很久,在中文regression是回归的意思。刚开始我一直纠结于回归究竟是啥意思,但后来忘记听哪个课,老师说不用在意regression的意思,他没有特别的含义,但是大家一直这么叫regression,所以就用regression了。如果还是纠结就想想高中学的线性回归,好像就没那么神秘了】
Regression类的问题主要用来根据输入量预测某一数值。常见的应用场景有:股票市场,自动驾驶,广告推荐。那么我们来举例看看Regression究竟是怎么用的吧。
Example:Estimating the CP of Pokemon
这里的例子用到的是:Estimating the CP of Pokemon (估计宝可梦的CP值)
CP值是各种宝可梦角色的一种类似攻击值的东西,CP值越高说明你这个宝可梦越厉害。
问题陈述
利用宝可梦的不同属性值,对他的CP值进行估测。这里每一个宝可梦都有不同的属性,我们用不同属性构成的特征向量 ${\bf x} = {x_1, x_2, …,x_n}$ 来表示每个宝可梦, 而他们的CP值则是输出结果 $y$。 因此,这里我们的模型就变成了一个根据特征来预测输出数值的模型,所以我们选择有监督regression的模型。
Set function Models
这里我们首先选择线性模型 $y = b + w \cdot x_{m}$ ,即这里我们只选择一个特征 $x_m$ 来估测宝可梦的CP值。
Goodenss of function
这里我们选择的loss function是计算标准CP值和估计CP值之间的平方差。
若输入的训练数据是 ${(x^1_m, \hat y ^1), (x^2_m, \hat y ^2), (x^3_m, \hat y ^3)…}$, 对于每组训练数据而言,他们的CP预测值分别是 ${y^1, y^2, y^3,…}$, 那么计算出来的loss function的值为:$L = \sum\limits_n(\hat y^n - (b+w\cdot x^n_m))^2$ 这里的 n 代表的是训练集中的每一组数据。
Minimize Loss function
在得到 loss function 之后,就可以寻找在选择的mode下,b 和 w 最佳的选择数值是多少。这里利用的是Gradient Descent的方法。所谓Gradient Descent,字面上来讲就是梯度下降。我们可以想象,在求函数的极值的时候,我们一般会对函数求导,然后取导数为零的值。【对于Linear Regression来讲,函数一般是convex的,所以我们不需要担心得到的值是local minima(局域最小值)的情况。】,所以当我们不断进行梯度下降的操作,直到梯度最小的时候,就可以得到loss 最低时对应的w和b的值。
Gradient Descent
具体梯度下降的原理就是基于现有的梯度值,如何进一步找到更小的梯度值。
下图拿一个简单的二次函数为例, 假设 y 是我们的损失函数,x 是我们希望优化的值。可以发现,不管x 取在最低点的左侧还是右侧,用 $x_0 - \eta\frac{\partial y}{\partial x_0}$ 来更新 x 的值,总能到达最低点。这里的 $\eta$ 代表的是学习率 (Learning Rate),这个值决定了在更新 x 的时候,一步要“跨”多大,也是个很重要的值。
如何选择模型
虽然说经历了三步,我们找到了最佳的模型参数,但还是有问题的,我们怎么知道最开始选择的模型是合适的呢?
(不,你不知道)
所以就需要尝试一些别的模型,看看在别的模型的最佳参数下,得到的损失会不会更小。比如说现在选择的模型是关于 $x_m$ 的线性模型,我们也可以选择关于 $x_m$ 的二次模型,或者引入更多的宝可梦参数,来估计CP值。
所以我们选择,或者更改模型的依据是什么的?当然还是根据loss来分析了。
一般我们的模型给出的error有两种,一种是基于bias,一种是基于variance。
如何理解这两种误差呢,可以想象打靶的例子。比如我们现在最好的结果就是10环,如果你每次打靶,次次都在9-10范围内,那你得bias和variance都很小;如果你每次打靶都集中在一个很小的范围内,但是这些点都集中在3环,那么你得bias很大,但是variance很小;如果你打靶散落在整个靶面上,但是他们的平均值还是在9,那么你得bias很小,但是variance很大。bias是用来形容所有数据平均值的和标准值的偏差,variance是用来形容你这些数据内部的差异是大是小。
所以根据error不同,我们更换模型的策略也不同。
Bias比较大,一般也成为是underfitting的问题
也就是说,现有的模型不能很好的模拟由输入到输出的这个过程,模型本身就不好。
一般体现在training data 上的loss/ error就很大
- 解决办法是重新设计模型
Variance比较大,一般被称为是overfitting的问题
也就是说,现有的模型对于training data set的数据产生了过拟合的现象,也就是太依赖于trainning model的特殊性,可不能普遍用于其他数据上。
一般体现在training data上的loss/error比较小,但testing 数据上的error很大。
- 解决办法是增加训练数据,丰富训练数据的多样性;加入regularization
正则化
在损失函数 $L = \sum\limits_n(\hat y^n - (b+w\cdot x^n_m))^2$ 后面加上 $\lambda \sum(w_i)^2$ 对损失函数进行penalize。在最小化过程中加上这项,表示我们期望权重 $\sum(w_i)^2$ 比较小,使得我们在更新 $w_i$ 的时候,步伐平缓一些。
之后也会见到L1 和 L2 正则化,也是为了防止过拟合,但是更大程度上L1正则化为了做特征选择,L2正则化可以使权重趋于零。
Gradient Descent 梯度下降
之前说到Gradient Descent梯度下降的基本操作方法,以及基本原理。这里我们在详细介绍一些关于梯度下降的优化,和操作细节。
在做梯度下降的时候,需要明确两点:
- 明确目标函数,也叫损失函数。我们做梯度下降的目的是为了找到一个最优的参数向量 $\bf w$ 使得损失函数值最小化。
- 明确梯度,即损失函数对参数求导之后的表达式。根据损失函数的不同格式,对参数求导也会有不同的表达方式。
假设 $L$ 为损失函数,训练数据为 $(\bf x, \hat y)$, 预测值为 $\bf y = xw$。$\bf w$ 是它的参数(正常情况下的 ${\bf y = x w +} b$,直接将 b放在参数向量 $\bf w$ 中,也就是 $\left[\begin{equation}\begin{array}{c}\bf x_1\\bf x_2\…\\bf x_N\1\end{array}\end{equation}\right] $ 和 $\left[\begin{equation}\begin{array}{c}w_1\ w_2\…\w_N\b\end{array}\end{equation}\right]$ 相乘)。标准的梯度下降中,学习率 $\eta$ 是固定的,学习的速度会随着当前点的梯度的大小而变化。然而,我们希望根据不同的参数制定不同的学习速度。
Adjust Learning Rate
$\frac{1}{t}$ decay
根据更新次数来改变学习率,更新次数越多,学习率越小,即更新速度越慢
Adagrad
根据之前更新的参数和现在的参数之间的差别来定。
更新的公式是:
Gradient Update Stretagy
标准的梯度下降是在计算了所有训练集中的数据之后,对参数进行更新。这样的话可以保证在考虑了每个训练数据之后做出更新。
但也有许多其他的策略可以让我们更快做出梯度更新,比如Stochastic Gradient Descent(SGD),指每一次任选一个数据,然后进行更新;还有Mini-Batch的更新,每次在对一小组的损失函数计算完之后,进行更新。虽然这些每一次的更新并没有遍历所有的训练数据,但是对于模型的收敛也很有帮助。
Feature scaling
这个优化tip旨在将所有的特征都转化到同一个维度上,这样可以更好的实现收敛。也就是对数据做归一化的操作,注意是要对所有数据的同一个特征做归一化的操作,即 $x = \frac{x - x{mean}}{x{std}}$
HW_1
相关第一次作业的内容可以移步 这里