同一系列的神经网络无监督学习相关笔记点击查看

机器学习两种常见算法

监督学习Supervised Learning

监督学习的目的是根据给定的数据集,来预测某一个想知道的结果,而数据集中的每一个数据都是有对应结果的。来看两个例子:

  • 在预测房价的数据集中,保存着如100平米的房子的售价是1000万元、300平米的房子的售价是2500万元这样的信息。这里我们想知到的结果就是x平米的房子能卖多少钱,比如我们输入200,希望得到一个价格。

  • 在乳腺癌的数据集中,记录着如肿瘤大小为0.75mm是恶性的、肿瘤大小为0.01mm是良性的这种信息。这里我们想知道结果就是一个x大小的肿瘤是否为良性,比我我们输入0.45,希望他告诉我们是良性还是恶性。

回归问题Regression

在上述第一个举例中,我们要预测的房价其实是一种连续值,可以从几百万到几千万不等。回归问题就是针对这种连续值问题

分类问题Classification

在上述第二个举例中,我们要判断的是一个肿瘤是否为良性,只可能有两种结果,要么是良性,要么不是良性,明显这是一个离散值分类问题解决的就是这种离散值问题

无监督学习Unsupervised Learning

无监督学习的目的是分析给定的数据集,寻找数据集中各数据的关系而不是想要得到一个结果。

比如监督学习中预测房价的例子,监督学习做的是根据数据集中的房子大小这一特征来预测某一大小房子的价格。

而在无监督学习中,房子大小和房子价格都会作为房子的特征,来分析房子之间的关系。比如他也许会将房子面积很大价格很高的那些房子归为一类,将房子面积很小但价格很高又归为一类等等.

下面是Google news的一部分,可以看到新闻被分为了很多类别,这也许就可以用无监督学习分析每个新闻的特征,将特征相似的新闻归为一类:

google news

线性回归模型

单变量线性回归

先介绍几个符号以便说明:

m:训练样本的数量

x:输入变量(或特征)

y:输出变量(或目标变量)

hypothesis函数

单变量线性回归模型中,我们的目标是找到一条线性的hypothesis函数fw,b(x)=wx+bf_{w,b}(x)= wx + b来拟合数据集中的数据,这样输入一个变量就能得到估计的结果。将数据集作为样本,通过学习算法的训练,就可以得到wbw、b,这样也就得到了目标函数。对于该函数,我们自然希望得到使误差尽可能小的wbw、b,因此我们又引入了代价函数来计算fw,b(x)f_{w,b}(x)的误差。

cost function代价函数

可以选取均方误差函数J(w,b)=12mi=1m(fw,b(x(i))y(i))2J(\vec{w},b) = \frac{1}{2m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})^2},我们的目标就是求得bwb和w,使该函数的值最小。其中fw,b(x(i))f_{\vec{w},b} (\vec{x}^{(i)})是输入第i个样本得到的估计值,y(i)y^{(i)}是第i个样本的实际值。比如样本为(1,1)、(2,2)、(3,3),fw,b(x)=0.5xf_{\vec{w},b}(\vec{x})=0.5x,即b=0,w=0.5b=0,w=0.5.如图所示:

J(w,b)=12mi=1m(fw,b(x(i))y(i))20.58J(\vec{w},b) = \frac{1}{2m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})^2}\approx 0.58

当然,不难看出当w=1b=0w=1、b=0时,J(w,b)=0J(\vec{w},b) = 0,此时便找到了我们所需要的bwb 、 w.


上边的情况实际上我所选择的样本可以使b=0b=0,相当于只有ww一个参数,简化了问题。下面讨论一下更为实际的线性回归即两个参数都可以为任意值。

此时不难发现,J(w,b)J(\vec{w},b)是关于wbw、b的二元函数。为了方便描述,可以使用等高线来绘制J(w,b)J(\vec{w},b).下图所示为一组J(w,b)J(\vec{w},b)fw,b(x)f_{\vec{w},b}(\vec{x})

等高线各椭圆的中心是我们的目标,此时我们得到的点(右图的红叉❌)很明显举例目标还有一段距离,因此反映在左图中,得到的假设函数与数据集的拟合程度肉眼可见的差。此时便需要重新计算wbw、b的值以生成更优秀的假设函数。一种比较常见的算法就是梯度下降算法。

Gradient descent梯度下降算法

使用梯度下降算法可以一次次迭代,最终找到可以使得J(w,b)J(\vec{w},b)最小的wbw、b.梯度下降算法可以应用于更一般的J(w1,w2,...,wn,b)J(w_1,w_2,...,w_n,b)函数,而不是仅仅能应用于线性回归的代价函数。

单变量梯度下降算法描述如下:

repeatuntilconvergence{repeat\quad until\quad convergence \quad\{

w=wαJ(w,b)w\quad\quad w=w-\alpha\frac{\partial J(\vec{w},b)}{\partial w}
b=bαJ(w,b)b\quad\quad b=b -\alpha\frac{\partial J(\vec{w},b)}{\partial b}

}\}

其中α\alpha为学习速率,反映了每次迭代时,wbw、b变化的跨度,不宜太大也不宜太小; 对于一个固定不变的α\alpha,由于偏导数是越来越小的,因此wbw、b的变化也会越来越小,最后收敛。

另外再仔细观察一下该算法和J(w,b)J(\vec{w},b)会发现一个事实:由于J(w,b)J(\vec{w},b)是对m个样本的某种运算的求和形式,因此此处的偏导数也是一种求和形式,因此每次更新参数都遍历了整个样本,这种形式梯度下降可以叫做Batch gradient descent即批量梯度下降。还有两种方法是:1.每次迭代只采集一个样本,计算该样本损失函数的梯度并更新参数,这种方式叫随机梯度下降。当经过足够多迭代后,随机梯度下降也会收敛到全局最优。2.每次迭代选取一小部分训练样本,他是批量梯度下降和随机梯度下降的这种方法,叫小批量梯度下降,是现在常用的一种方法。

wbw、b初值可以都取为0,当然这不是固定的,根据具体情况可以灵活调整。但有一点要格外注意:二者要同时变化而不能先变一个,另一个再变

Correct:

temp_w=wαJ(w,b)wtemp\_w=w-\alpha\frac{\partial J(\vec{w},b)}{\partial w}

temp_b=bαJ(w,b)btemp\_b=b-\alpha\frac{\partial J(\vec{w},b)}{\partial b}

w=temp_ww=temp\_w

b=temp_bb=temp\_b

Incorrect:

temp_w=wαJ(w,b)wtemp\_w=w-\alpha\frac{\partial J(\vec{w},b)}{\partial w}

w=temp_ww=temp\_w

temp_b=bαJ(w,b)btemp\_b=b-\alpha\frac{\partial J(\vec{w},b)}{\partial b}

b=temp_bb=temp\_b

对于一般的代价函数,其形状不一定是图函数,因此对于不同的起点,可能找到不同的局部最优点:

case1

case2

尽管起点相差很小,但最终得到的代价函数完全不一样。


将该算法应用到线性回归模型中:

说明一点:线性回归的代价函数总是一个凸函数,因此他不会出现一般代价函数的局部最优的情况,他总会收敛到全局最优。

fw,b(x)=wx+bf_{\vec{w},b}(\vec{x})=\vec{w} \vec{x}+b

J(w,b)=12mi=1m(fw,b(x(i))y(i))2J(\vec{w},b) = \frac{1}{2m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})^2}

w:J(w,b)w=1mi=1m(fw,b(x(i))y(i))x(i)w:\frac{\partial J(\vec{w},b)}{\partial w}=\frac{1}{m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})x^{(i)}}

b:J(w,b)b=1mi=1m(fw,b(x(i))y(i))b:\frac{\partial J(\vec{w},b)}{\partial b}=\frac{1}{m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})}

Gradient descent algorithm:

repeatuntilconvergence{repeat\quad until\quad convergence\quad \{

w=wα1mi=1m(fw,b(x(i))y(i))x(i)\quad\quad w=w-\alpha\frac{1}{m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})x^{(i)}}

b=bα1mi=1m(fw,b(x(i))y(i))\quad\quad b=b-\alpha\frac{1}{m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})}

}\}

gradient descent

这样就得到了一条拟合程度还不错的假设函数。

多变量线性回归

向量化多特征

实际情况往往不仅含一个特征,比如房价的预测不仅仅和房子大小有关,也和楼层、层高、位置等有关,此时就会出现多个特征。而要对多个特征逐一使用梯度下降算法的话,不仅代码冗长,且运算速度慢。为了解决这个问题,可以将多个特征记为向量x=(x1,x2,...,xn)\vec{x}=(x_1,x_2,...,x_n).此时可以将假设函数记为fw,b(x)=wx+b.f_{\vec{w},b}(\vec{x})=\vec{w} \cdot \vec{x}+b.NumPy为向量运算提供了的方法,可以并行让硬件工作以加速运算。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def my_dot(a, b): 
"""
Compute the dot product of two vectors

Args:
a (ndarray (n,)): input vector
b (ndarray (n,)): input vector with same dimension as a

Returns:
x (scalar):
"""
x=0
for i in range(a.shape[0]):
x = x + a[i] * b[i]
return x

np.random.seed(1)
a = np.random.rand(10000000) # very large arrays
b = np.random.rand(10000000)

tic = time.time() # capture start time
c = np.dot(a, b)
toc = time.time() # capture end time

print(f"np.dot(a, b) = {c:.4f}")
print(f"Vectorized version duration: {1000*(toc-tic):.4f} ms ")

tic = time.time() # capture start time
c = my_dot(a,b)
toc = time.time() # capture end time

print(f"my_dot(a, b) = {c:.4f}")
print(f"loop version duration: {1000*(toc-tic):.4f} ms ")

del(a);del(b) #remove these big arrays from memory
1
2
3
4
5
# result
np.dot(a, b) = 2501072.5817
Vectorized version duration: 13.3328 ms
my_dot(a, b) = 2501072.5817
loop version duration: 1374.0389 ms

可以看出,本例中运算速度相差了100倍左右。

Normal equation正规方程求解w、b

在说明多特征值线性回归梯度下降算法之前,介绍一种快速求解线性回归问题中w、b的方法:正规方程法。相较于梯度下降算法,正规方程有以下下局限性:

  • 只能应用于线性回归
  • 特征数量很多时,效率较低

同时也有一些优点:

  • 不需要设置学习率α\alpha
  • 不需要迭代,对于规模较小的特征,有不错的效率

具体实现,留白,有空回来补

多特征线性回归梯度下降算法

和单特征线性回归梯度下降算法相似,只不过多了几个特征而已:

repeatuntilconvergence{repeat\quad until\quad convergence \quad\{

w1=w1α1mi=1m(fw,b(x(i))y(i))x1(i)\quad\quad w_1=w_1-\alpha\frac{1}{m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})x^{(i)}_1}

w2=w2α1mi=1m(fw,b(x(i))y(i))x2(i)\quad\quad w_2=w_2-\alpha\frac{1}{m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})x^{(i)}_2}

\quad\quad\quad \vdots

wn=wnα1mi=1m(fw,b(x(i))y(i))xn(i)\quad\quad w_n=w_n-\alpha\frac{1}{m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})x^{(i)}_n}

b=bα1mi=1m(fw,b(x(i))y(i))\quad\quad b=b -\alpha\frac{1}{m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})}

}\}

特征缩放

当多个特征的取值范围相差很大时,梯度下降算法运行的很慢,此时需要将多个特征值缩放到一个相近的范围内,同时保证这个范围不要太大像-100-100,或者太小像-0.0001-0.0001.

比如现在有两个特征房子的大小300x11000300\leqslant x_1 \leqslant1000和房子的层高0x260\leqslant x_2\leqslant6,此时两个特征的范围相差较大,需要对特征进行放缩以得到更好的梯度下降效果。

origin

除以最大值

比较简单的一个方法,就是将各特征除以该特征的最大值,这样就可以得到的新特征的范围便可以满足要求。x1x_1x2x_2进行该操作后,范围变成了0.3x1,scaled10.3\leqslant x_{1,scaled} \leqslant10x2,scaled10\leqslant x_{2,scaled} \leqslant 1,此时就可以很好的运行梯度下降算法。

divideMax

Mean normalization

均值归一化首先要计算每个特征的平均值μi\mu_i,然后将原特征xix_i放缩为xi,scaled=xiμiMaxMinx_{i,scaled}=\frac{x_i - \mu_i}{Max-Min},MaxMinMax、Min分别为原特征的最大和最小值。即使原特征都为正,均值归一化后的特征也会出现负数,且分布在原点附近。

meannormalization

Z-score normalize

Z-score归一化首先要计算每个特征的平均值μi\mu_i和标准差σi\sigma_i,然后将原特征xix_i放缩为xi,scaled=xiμiσix_{i,scaled}=\frac{x_i-\mu_i}{\sigma_i}.同样的,可以看出,归一化后的特征也会出现正负。

Znormalization


下面举个例子判断一下某个特征是否需要rescale:

0x132x20.5100x31000.001x10.00198.6x11050\leqslant x_1\leqslant3、-2\leqslant x_2\leqslant0.5、-100\leqslant x_3\leqslant100、-0.001\leqslant x_1\leqslant0.001、98.6\leqslant x_1\leqslant105

简单判断一下,其实x1x2x_1、x_2范围相差不太,且范围跨度合理,不需要rescale.而x3x4x5x_3、x_4、x_5要么太大,要么太小,因此需要放缩一下,向x1x2x_1、x_2看齐。

如果一个特征的范围比较暧昧,对他进行放缩就可以,因为放缩到合适的尺度不会对算法有什么负面效果。

判断梯度下降是否收敛

一个方法是可以观察y轴为J(w,b)J(\vec{w},b)、x轴为迭代次数的图像,通过斜率可以大概判断是否收敛:

当迭代次数达到400时,斜率几乎为0,此时便可以判断出函数J(w,b)J(\vec{w},b)已经收敛。


另一个方法是自动收敛测试,该方法需要选择一个合适的ε\varepsilon,当在某一次迭代中,J(w,b)J(\vec{w},b)的值小于ε\varepsilon时,则认为此时的w,b\vec{w},b可以是算法收敛。但是寻找合适的ε\varepsilon值不是容易的事情,因此第一种方法可能更常用。

学习率的设置

直观来讲,学习率是一个影响代价参数w,b\vec{w},b变化幅度的量,因此学习率的设置不宜过大也不宜过小。若过大可能会导致得到的新参数使J(w,b)J(\vec{w},b)每次都越过最小值点,进而使该函数发散。若学习率过小,则会使函数J(w,b)J(\vec{w},b)收敛的太慢了。要注意的是,合理的学习率总能使函数J(w,b)J(\vec{w},b)随迭代次数单调递减,若出现了下图上边的两种情况,要么是学习率设置太大了,要么是程序代码出现了Bug.

学习率

通常可以依次尝试这几个学习率:0.001、0.003、0.01、0.03、0.1、0.3、1、…

即从0.001开始,每次扩大大约3倍,或者缩小3倍左右。

这样一次次尝试后,可以找到一个最大值和一个最小值,为了使收敛的速度更快一些,可以选择比找到的最大值小一些的可以使J(w,b)J(\vec{w},b)收敛的α\alpha值。

特征工程

特征工程就是将原本的一些特征进行组合,得到一些新的特征,这样也许可以使模型更加精准。

如原数据集中有房子的长和宽两个特征x1x2x_1、x_2,此时的房价预测模型可以是fw,b(x)=w1x1+w2x2+bf_{\vec{w},b}(\vec{x})=w_1x_1+w_2x_2+b.

现在我们可以让x3=x1×x2x_3=x_1 \times x_2,这样就可以得到一个新的模型fw,b(x)=w1x1+w2x2+w3x3+bf_{\vec{w},b}(\vec{x})=w_1x_1+w_2x_2+w_3x_3+b.

多项式回归

线性回归中我们使用线性函数来拟合数据集,多项是回归中,我们可以使用非线性的函数来拟合数据集。

polyregression

如图,这个数据集如果用线性函数来拟合的话,很明显不太合适。可以选择fw,b(x)=w1x+w2x+bf_{\vec{w},b}(x)=w_1x+w_2 \sqrt{x}+b.这其实也用到了特征工程,因为我们对原始的特征取了根号。

需要注意的是,在使用多项式回归的时候,不同的特征范围的差别可能很大,比如对同一特征的平方和立方,这是要记得使用特征缩放让他们处于一个相对合理的范围。

逻辑回归模型

逻辑回归模型可用于二元分类问题,其形式为fw,b(x)=g(z)=11+ez,f_{\vec{w},b}(\vec{x}) = g(z) = \frac{1}{1+e^{-z}},其中z=wx+bz=\vec{w} \cdot \vec{x}+b.不难看出limzg(z)=0,limz+g(z)=1\displaystyle \lim_{z \to -\infin} g(z) = 0,\displaystyle \lim_{z \to +\infin} g(z) = 1,即该函数的输出值y^\hat{y}在零和一之间,因此可以用于表示某事件发生的概率,则P(y=1x;w,b)+P(y=0x;w,b)=1.P(y=1|x;\vec{w},b)+P(y=0|x;\vec{w},b)=1.

sigomid

我们可以设置一个threshold=0.5,当0<g(z)<0.50<g(z)<0.5y^=0\hat{y} = 0,当0.5g(z)<10.5 \le g(z)<1y^=1\hat{y} = 1.

可以看出当z=0z=0时,g(z)=0.5g(z)=0.5.而z=wx+b=0z=\vec{w} \cdot \vec{x}+b=0这条线称之为决策边界。和线性回归一样,w,x\vec{w},\vec{x}可以是线性组合,也可以是多项式,因此决策边界也可以是线性或者非线性。它的作用就是区分出模型预测出的结果,即决策边界的两侧代表着不同的预测结果。如下图两种不同的决策边界:

decisionboundaryline decision boundarylog

下面以肿瘤为例看一下为什么对于二元分类问题,线性回归模型不能解决:

linearmodel1 linearmodel2

对比以上两幅图片不难看出,若肿瘤大小分别在较小处和较大处的聚集,线性回归对于肿瘤性质的判断会出现越来越大的误差,这显然是不正确的。而逻辑回归模型则可以解决这一问题:

logistic1 logistic2

可以看出,逻辑回归模型在两端数据聚集时的表现仍然出色。

代价函数

线性回归中使用平方误差函数J(w,b)=12mi=1m(fw,b(x(i))y(i))2J(\vec{w},b) = \frac{1}{2m}\sum_{i=1}^m {(f_{\vec{w},b} (\vec{x}^{(i)}) - y^{(i)})^2}作为代价函数。对于线性回归,该函数总是严格的凸函数,因此总会找到是该函数收敛到全局最低的w、b.而逻辑回归中若使用该函数作为代价函数,会发现其图像并不是严格的凸函数,也就无法找到w、b使其收敛到全局最小值,因此需要使用其他函数作为代价函数。

costfunvs

逻辑回归中的代价函数为J(w,b)=1mi=0m1[loss(fw,b(x(i)),y(i))]J(\vec{w},b) = \frac{1}{m} \sum_{i=0}^{m-1} \left[ loss(f_{\vec{w},b}(\vec{x}^{(i)}), y^{(i)}) \right],其中

loss(fw,b(x(i)),y(i))={log(fw,b(x(i))),ify(i)=1log(1fw,b(x(i))),ify(i)=0loss(f_{\vec{w},b}(\vec{x}^{(i)}), y^{(i)}) = \left\{\begin{matrix} -\log\left(f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \right), & if \quad y^{(i)}=1\\ -\log \left( 1 - f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \right), & if \quad y^{(i)}=0\\ \end{matrix}\right.

可化简为:

loss(fw,b(x(i)),y(i))=y(i)log(fw,b(x(i)))(1y(i))log(1fw,b(x(i)))loss(f_{\vec{w},b}(\vec{x}^{(i)}), y^{(i)}) = -y^{(i)} \log\left(f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \right) - \left( 1 - y^{(i)}\right) \log \left( 1 - f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \right)

loss(fw,b(x(i)),y(i))loss(f_{\vec{w},b}(\vec{x}^{(i)}), y^{(i)})表示单个样本的误差(代价函数J()J()则需要遍历整个样本),不要忘记0fw,b(x(i))10 \le f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \le 1,其图像如下:

loss1 loss0

可以看出:

  • ify=1if \quad y=1

    • fw,b(x(i))1,loss()0f_{\vec{w},b}(\vec{x}^{(i)}) \rightarrow1,loss() \rightarrow0,即损失很小,说明预测结果准确

    • fw,b(x(i))0,loss()f_{\vec{w},b}(\vec{x}^{(i)}) \rightarrow 0,loss() \rightarrow \infin,即损失很大,说明预测结果不准确

    而此时y=1y=1表明恶性肿瘤,这与这与损失很小的情况即fw,b(x(i))1f_{\vec{w},b}(\vec{x}^{(i)}) \rightarrow 1预测的结果相吻合。

  • ify=0if \quad y=0

    • fw,b(x(i))0,loss()0f_{\vec{w},b}(\vec{x}^{(i)}) \rightarrow 0,loss() \rightarrow 0,即损失很小,说明预测结果准确

    • fw,b(x(i))1,loss()f_{\vec{w},b}(\vec{x}^{(i)}) \rightarrow 1,loss() \rightarrow \infin,即损失很大,说明预测结果不准确

    而此时y=0y=0表明是良性肿瘤,这与损失很小的情况即fw,b(x(i))0f_{\vec{w},b}(\vec{x}^{(i)}) \rightarrow 0预测的结果相吻合。

别忘记了代价函数是要寻找参数wb,\vec{w}、b,loss()loss() \rightarrow \infin时说明此时的wb\vec{w}、b并不合适,接下来就可以利用梯度下降迭代寻找wb.\vec{w}、b.

对了还有一点需要指出,高等数学中常用lnln表示底数为ee的对数函数,但是此处的loglog实际上也是底数为ee,不过没有采用前边的写法。

梯度下降

算法的原理与线性回归类似,只不过由于预测函数和代价函数都不一样:

repeat until convergence:  {      wj=wjαJ(w,b)wj  for j = 0,...,n-1          b=bαJ(w,b)b}\begin{align*} &\text{repeat until convergence:} \; \lbrace \\ & \; \; \;w_j = w_j - \alpha \frac{\partial J(\vec{w},b)}{\partial w_j} \; & \text{for j = 0,...,n-1} \\ & \; \; \; \; \;b = b - \alpha \frac{\partial J(\vec{w},b)}{\partial b} \\ &\rbrace \end{align*}

其中:

J(w,b)wj=1mi=0m1(fw,b(x(i))y(i))xj(i)J(w,b)b=1mi=0m1(fw,b(x(i))y(i))\begin{align*} \frac{\partial J(\vec{w},b)}{\partial w_j} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_{j}^{(i)} \\ \frac{\partial J(\vec{w},b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)}) \end{align*}

于是,逻辑回归的梯度下降算法就变成了:

repeatuntilconvergence:  {      wj=wjα1mi=0m1(fw,b(x(i))y(i))xj(i)  for j = 0,...,n-1          b=bα1mi=0m1(fw,b(x(i))y(i))}simultaneousupdates\begin{align*} &repeat \quad until \quad convergence: \; \lbrace \\ & \; \; \;w_j = w_j - \alpha \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_{j}^{(i)} \; & \text{for j = 0,...,n-1} \\ & \; \; \; \; \;b = b - \alpha \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)}) \\ &\rbrace simultaneous \quad updates \end{align*}

但是经过计算后会发现,即使代价函数不一样,但是对于wb\vec{w}、b的偏导数计算后的形式还是与线性回归一样的,让我不由得发出感叹,妙啊。这里可能有朋友想要自己动手算一下,我稍微提个醒,注意这里的预测函数与线性回归的预测函数是不一样的,求到的时候别带错模型了,我第一次算的时候就使用线性回归模型带入的,然后发现模型带错了。

Linearregression:fw,b(x)=wx+bLinear \quad regression: \quad f_{\vec{w},b}(\vec{x})=\vec{w} \cdot \vec{x}+b

Logisticregression:fw,b(x)=11+e(wx+b)Logistic \quad regression: \quad f_{\vec{w},b}(\vec{x})=\frac{1}{1+e^{-(\vec{w} \cdot \vec{x}+b)}}

过拟合

对于预测模型,我们通常希望他能得到较为准确的预测结果,一个方法来提高准确性是通过多项式来拟合数据集。但是如果追求能完美拟合某数据集的模型,该模型往往会出现过拟合的现象。

x1 x2
x3 x4

上边的四张图片分别代表了4个不同的模型对于同一数据集的拟合情况。可以看到,对于更为复杂的模型,对数据集的拟合程度越好。接下来我会对数据集进行一些改动,然后再次用相同次数的多项式分别对数据集进行拟合。

x11 x22
x33 x44

可以看出来,在对数据集行进了一些改动后,有两个现象:

  • 上边两个较为低次的多项式模型对数据集的拟合程度仍然不如下面两个高次模型
  • 对同一数据集进行微调前后,上边两个低次模型的拟合情况变化并不大;而下边两个高次模型在微调前后的拟合情况相差非常大

这个时候下面两个高次的模型实际上已经出现了过拟合的现象。

模型应该随着数据集的变化而变化,但是不应该因为数据集中的某个或某几个样本而发生明显的巨大变化。比如样本有10000个,而仅仅在添加或更改了其中一个样本后,模型前后就发生了巨大的变化,尽管他能完美拟合数据集中的样本,但是该模型其实并不能有效预测一个合理的值。比如在10000个肿瘤的样本中,如果我们的模型是过拟合的,那么很有可能出现这样一种情况:变化之前的模型在拟合数据集后,预测大小0.1的肿瘤是良性的,这个时候又多了一个样本,由于过拟合现象的存在,该模型发生了很大变化,变化后它很有可能预测刚刚那个0.1的肿瘤是恶性的。而没有过拟合现象的模型仍然会认为0.1的肿瘤是良性的。而这对比一下,明显是没有过拟合模型更合理一些。

一些术语:欠拟合underfit<=>高偏差high bias、过拟合overfit<=>高方差high variance

解决过拟合

解决过拟合的方法有三种,分别是增加数据集的样本数量、选取和预测结果最相关的特征作为子集训练而不是训练整个数据集、正则化。

  • 增加样本数量:局限性比较大,毕竟实际情况中样本的数量不可能想有多少就有多少
  • 特征选择:这么做是为了选择与结果最为相关的特征进行训练,但是可能每一个特征都与预测结果直接相关,选择一个子集就会丢掉一些有用的特征
  • 正则化:如果说特征选择是直接消灭掉不太相关的特征,那么正则化做的就不那么绝对,它会削弱这些不太相关特征的影响,算是一种弱化版的“特征选择”

正则化实现的方法是对代价函数进行改进,在原有的代价函数基础上增加一个正则化项以减小不同特征对于模型的影响,一般来讲只需要将w\vec{w}进行正则化而不需要对bb进行正则化,因为bb是否正则化对结果影响并不大。所以正则化项往往只有λ2mj=0n1wj2\frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2(若想对bb正则化,相应的添加λ2mb2\frac{\lambda}{2m}b^2即可).其中λ\lambda是正则化参数。


线性回归的正则化:

J(w,b)=12mi=0m1(fw,b(x(i))y(i))2+λ2mj=0n1wj2J(\vec{w},b) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})^2 + \frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2

其中:

fw,b(x(i))=wx(i)+bf_{\vec{w},b}(\vec{x}^{(i)}) = \vec{w} \cdot \vec{x}^{(i)} + b


逻辑回归的正则化:

J(w,b)=1mi=0m1[y(i)log(fw,b(x(i)))(1y(i))log(1fw,b(x(i)))]+λ2mj=0n1wj2J(\vec{w},b) = \frac{1}{m} \sum_{i=0}^{m-1} \left[ -y^{(i)} \log\left(f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \right) - \left( 1 - y^{(i)}\right) \log \left( 1 - f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \right) \right] + \frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2

其中:

fw,b(x(i))=sigmoid(wx(i)+b)=11+e(wx+b)f_{\vec{w},b}(\vec{x}^{(i)}) = sigmoid(\vec{w} \cdot \vec{x}^{(i)} + b)= \frac{1}{1+e^{-(\vec{w} \cdot \vec{x} + b)}}


对于改进后的代价函数,可以直观的看出λ\lambda的作用(不要忘记我们的目的是缩小代价函数):若λ\lambda过小,那么正则化项对参数w\vec{w}的约束作用就不大。不妨想象λ=0,\lambda=0,此时相当于没有对参数w\vec{w}正则化,也就无法有效解决过拟合的问题;若λ\lambda太大,为了使代价函数尽可能小,参数w\vec{w}不得不很小很小,那么参数bb最终对模型起到了决定性作用,这显然也是不合理的。这样看来λ\lambda似乎可以理解成正则化项的权重。

正则化后再进行梯度下降


线性回归梯度下降:

repeat until convergence:  {      wj=wjαJ(w,b)wj  for j = 0,...,n-1          b=bαJ(w,b)b}\begin{align*} &\text{repeat until convergence:} \; \lbrace \\ & \; \; \;w_j = w_j - \alpha \frac{\partial J(\vec{w},b)}{\partial w_j} \; & \text{for j = 0,...,n-1} \\ & \; \; \; \; \;b = b - \alpha \frac{\partial J(\vec{w},b)}{\partial b} \\ &\rbrace \end{align*}

其中:

J(w,b)=12mi=0m1(fw,b(x(i))y(i))2+λ2mj=0n1wj2J(\vec{w},b) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})^2 + \frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2

于是:

J(w,b)wj=1mi=0m1(fw,b(x(i))y(i))xj(i)+λmwjJ(w,b)b=1mi=0m1(fw,b(x(i))y(i))\begin{align*} \frac{\partial J(\vec{w},b)}{\partial w_j} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_{j}^{(i)} + \frac{\lambda}{m} w_j \\ \frac{\partial J(\vec{w},b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)}) \end{align*}


逻辑回归梯度下降:

repeat until convergence:  {      wj=wjαJ(w,b)wj  for j = 0,...,n-1          b=bαJ(w,b)b}\begin{align*} &\text{repeat until convergence:} \; \lbrace \\ & \; \; \;w_j = w_j - \alpha \frac{\partial J(\vec{w},b)}{\partial w_j} \; & \text{for j = 0,...,n-1} \\ & \; \; \; \; \;b = b - \alpha \frac{\partial J(\vec{w},b)}{\partial b} \\ &\rbrace \end{align*}

其中:

J(w,b)=1mi=0m1[y(i)log(fw,b(x(i)))(1y(i))log(1fw,b(x(i)))]+λ2mj=0n1wj2J(\vec{w},b) = \frac{1}{m} \sum_{i=0}^{m-1} \left[ -y^{(i)} \log\left(f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \right) - \left( 1 - y^{(i)}\right) \log \left( 1 - f_{\vec{w},b}\left( \vec{x}^{(i)} \right) \right) \right] + \frac{\lambda}{2m} \sum_{j=0}^{n-1} w_j^2

于是:

J(w,b)wj=1mi=0m1(fw,b(x(i))y(i))xj(i)+λmwjJ(w,b)b=1mi=0m1(fw,b(x(i))y(i))\begin{align*} \frac{\partial J(\vec{w},b)}{\partial w_j} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_{j}^{(i)} + \frac{\lambda}{m} w_j \\ \frac{\partial J(\vec{w},b)}{\partial b} &= \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)}) \end{align*}


同样,而这除了模型不一样,其余地方都是一样的。

一个问题

对正则化后的代价函数运行梯度下降时,对w\vec{w}的偏导数进行整理可以得到:

wj=wjαJ(w,b)wj=(1αλm)wjα1mi=0m1(fw,b(x(i))y(i))xj(i)w_j = w_j - \alpha \frac{\partial J(\vec{w},b)}{\partial w_j} =(1-\alpha \frac{\lambda}{m})w_j- \alpha \frac{1}{m} \sum\limits_{i = 0}^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})x_{j}^{(i)}

吴恩达依据αλ\alpha 、\lambda都不大,因此wjw_j每次迭代都是乘一个小于1的数,于是每次他都会减小,以此来达到正则化的目的,对此有三个疑问:

第一:学习率α\alpha可以很小,因为过大了可能导致不收敛。但是λ\lambda一定也是一个比较小的值吗?或者说其与m的比值乘α\alpha一定小于1吗?

第二:第一项仅仅是一次迭代中的一部分,并没有计算完,还有第二项呢,第二项的正负也没办法确定吧,那每次迭代wjw_j是变大变小不是都有可能吗?

第三:正则化过程中参数w\vec{w}不一定要每次减小吧,不是找到一组合适的就可以吗?

有这个问题是因为在没有正则化的梯度下降中,我们的目的是寻找一组合适的而不是最小的wb\vec{w} 、b使得代价函数最小,而在该过程中只能保证代价函数是递减的,但是没有规定wb\vec{w}、b的增减变化。为此我也回去看了一下JupyterLab的C1_W1_Lab05_Gradient_Descent_Soln,证实了确实没有这样的规定,所以听到他那么说就有点儿不理解。