文章目录
第二章 单变量线性回归(Univariate Linear Regression)
1 模型表示(model representation)
在数据集中
m表示训练样本的个数
x表示输入变量/特征
y表示输出变量/目标变量
(x,y)表示一个训练样本
( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i))表示第i个训练样本(这里的上标i不是幂函数,只是数据集训练样本的索引)
接下来我们看看监督学习算法是怎么工作的:我们向学习算法提供训练集,学习算法的任务是输出一个函数h,h代表假设函数(hypothesis),假设函数的作用是由输入变量x得到输出变量y
下一步我们要做的就是决定怎么表示这个建设函数h
h
θ
(
x
)
=
θ
0
+
θ
1
(
x
)
h_\theta(x) = \theta_0 + \theta_1(x)
hθ(x)=θ0+θ1(x)
这个函数预测y是关于x的线性函数
这个模型被称为单变量线性回归
2 代价函数(cost function)
代价函数也被称为成本函数、平方误差函数、平方误差代价函数
要使输入变量得到尽量准确的y值,就要使h假设函数尽量正确,所以求解正确的 θ 0 \theta_0 θ0和 θ 1 \theta_1 θ1就显得尤为关键
我们希望预测值和实际值的差的平方误差和尽量小,用数学公式表达就是
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
\frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^2
2m1i=1∑m(h(x(i))−y(i))2
除以m是为了消除训练样本个数产生的影响,除以2是为了抵消求导所产生的2倍
因此我们得到了代价函数
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
h
(
x
(
i
)
)
=
θ
0
+
θ
1
x
(
i
)
J(\theta_0,\theta_1) = \frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^2\\ h(x^{(i)}) = \theta_0 + \theta_1x^{(i)}
J(θ0,θ1)=2m1i=1∑m(h(x(i))−y(i))2h(x(i))=θ0+θ1x(i)
这个表达式随着
θ
0
\theta_0
θ0,
θ
1
\theta_1
θ1的变化而变化,也有其它代价函数,但是平方误差代价函数可能是解决回归问题最常用的手段,平方误差代价函数对于大多数问题,特别是回归问题,都是一个合理的选择
训练的目标为最小化代价函数即
m
i
n
i
m
i
s
e
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
minimiseJ(\theta_0,\theta_1) = \frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^2
minimiseJ(θ0,θ1)=2m1i=1∑m(h(x(i))−y(i))2
这就是线性回归的目标函数,minimize
θ
0
\theta_0
θ0
θ
1
\theta_1
θ1的意思是我们要找到合适的
θ
0
,
θ
1
\theta_0,\theta_1
θ0,θ1使得后面的式子值最小,即我们通过选择
θ
0
\theta_0
θ0,
θ
1
\theta_1
θ1的值,来获得最小的
J
(
θ
0
,
θ
1
)
J(\theta_0,\theta_1)
J(θ0,θ1),每一个成本函数都对应一个代价函数。我对代价函数的理解其实就是误差,误差越小,代表假设函数越好
但我们希望有一种算法能够自动计算出最小代价函数 J J J(这里高亮是因为我觉得这是这一章最重要的,包括后面讲的梯度下降算法也是为了得到最小的代价函数 J J J),于是就引出了接下来讲的梯度下降算法
3 梯度下降(gradient decent)
梯度下降是很常用的算法,它不仅被用在线性回归上,还被广泛应用与机器学习的众多领域,梯度下降算法可以最小化任意函数 J J J,在这一节,我们用梯度下降法应用于线性回归中将代价函数J最小化。
在实际问题中函数 J J J的参数可能有很多个,如 J ( θ 0 , θ 1 , . . . , θ n ) J(\theta_0,\theta_1,...,\theta_n) J(θ0,θ1,...,θn),但这里为了简便演示,只取两个参数, J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1),目标函数是 m i n J ( θ 0 , θ 1 ) minJ(\theta_0,\theta_1) minJ(θ0,θ1),梯度下降算法步骤为:首先给定 θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1的初始值,一般都赋值0,随后我们不停的一点点地改变 θ 0 , θ 1 \theta_0,\theta_1 θ0,θ1的值,来使得 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1)变小,直到我们找到 J J J的最小值或者局部最小值。
根据步骤我们可以得到梯度下降算法的公式为:
r
e
p
e
a
d
u
n
t
i
l
c
o
n
v
e
r
g
e
n
c
e
{
θ
j
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
,
(
f
o
r
j
=
0
a
n
d
j
=
1
)
}
repead \ \ until \ \ convergence\{\\\theta_j=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1),\ \ (for\ \ j = 0\ \ and\ \ j =1)\\\}
repead until convergence{θj=θj−α∂θj∂J(θ0,θ1), (for j=0 and j=1)}
这里有一个小细节需要我们注意,参数
θ
0
,
θ
1
\theta_0,\theta_1
θ0,θ1应该是同步更新的,而不是先更新
θ
0
\theta_0
θ0,再更新
θ
1
\theta_1
θ1,这样就可能得到不正确的结果
正确的计算方式为:
t
e
m
p
0
=
θ
0
−
α
∂
∂
θ
0
J
(
θ
0
,
θ
1
)
t
e
m
p
1
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
0
,
θ
1
)
θ
0
=
t
e
m
p
0
θ
1
=
t
e
m
p
1
temp0 = \theta_0-\alpha\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)\\ temp1 = \theta_1-\alpha\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1)\\ \theta_0 = temp0\\ \theta_1 = temp1
temp0=θ0−α∂θ0∂J(θ0,θ1)temp1=θ1−α∂θ1∂J(θ0,θ1)θ0=temp0θ1=temp1
不正确的计算方式为:
t
e
m
p
0
=
θ
0
−
α
∂
∂
θ
0
J
(
θ
0
,
θ
1
)
θ
0
=
t
e
m
p
0
t
e
m
p
1
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
0
,
θ
1
)
(
这
里
计
算
t
e
m
p
1
的
时
候
,
θ
0
的
值
已
经
被
改
变
了
)
θ
1
=
t
e
m
p
1
temp0 = \theta_0-\alpha\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1)\\ \theta_0 = temp0\\ temp1 = \theta_1-\alpha\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1)\\ (这里计算temp1的时候,\theta_0的值已经被改变了)\\ \theta_1 = temp1
temp0=θ0−α∂θ0∂J(θ0,θ1)θ0=temp0temp1=θ1−α∂θ1∂J(θ0,θ1)(这里计算temp1的时候,θ0的值已经被改变了)θ1=temp1
上式中的
α
\alpha
α代表学习率(learning rate),
α
\alpha
α决定了我们在梯度下降时沿着下降方向最大的方向下降时迈出多大的步子。如果
α
\alpha
α很大,那么梯度下降就会很迅速,我们会迈着大步子下山。如果
α
\alpha
α很大,可能导致更新赋值时代价函数越过收敛点,从而导致无法收敛。
所以我们需要选择合适的学习率 α \alpha α值,在那之后也不需要去改变 α \alpha α的值,梯度下降算法会自动采用更小的幅度,因为每一步更新赋值后导数项 ∂ ∂ θ 0 J ( θ 0 , θ 1 ) \frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1) ∂θ0∂J(θ0,θ1)会越来越小,如下图所示,在到达最小值前,梯度下降的每一步下降的幅度都要比前一步要小,这里吴恩达老师为了更直观地演示,选择了一个参数的代价函数。在到达最小值后,导数项为0,这时再进行梯度下降就相当于什么都没做,它使你的解始终保持在局部最优点
4 梯度下降与代价函数相结合
我们将梯度下降与代价函数相结合,就得到了在单变量线性回归中应用梯度下降的算法
将
J
(
θ
0
,
θ
1
)
=
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta_0,\theta_1) = \frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^2
J(θ0,θ1)=2m1∑i=1m(h(x(i))−y(i))2 和
h
(
x
(
i
)
)
=
θ
0
+
θ
1
x
(
i
)
h(x^{(i)}) = \theta_0 + \theta_1x^{(i)}
h(x(i))=θ0+θ1x(i) 代入到
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1)
∂θj∂J(θ0,θ1) 中可得到
∂
∂
θ
j
J
(
θ
0
,
θ
1
)
=
∂
∂
θ
j
1
2
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
2
=
∂
∂
θ
j
1
2
m
∑
i
=
1
m
(
θ
0
+
θ
1
x
(
i
)
−
y
(
i
)
)
2
j
=
0
:
∂
∂
θ
0
J
(
θ
0
,
θ
1
)
=
1
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
j
=
1
:
∂
∂
θ
1
J
(
θ
0
,
θ
1
)
=
1
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
x
(
i
)
\frac{\partial}{\partial\theta_j}J(\theta_0,\theta_1) = \frac{\partial}{\partial\theta_j}\frac{1}{2m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})^2 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \\ \\ =\frac{\partial}{\partial\theta_j}\frac{1}{2m}\sum_{i=1}^{m}(\theta_0 + \theta_1x^{(i)}-y^{(i)})^2\\ j = 0:\ \ \frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1) = \frac{1}{m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})\ \ \ \ \ \ \\ j = 1:\ \ \frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1) = \frac{1}{m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})x^{(i)}
∂θj∂J(θ0,θ1)=∂θj∂2m1i=1∑m(h(x(i))−y(i))2 =∂θj∂2m1i=1∑m(θ0+θ1x(i)−y(i))2j=0: ∂θ0∂J(θ0,θ1)=m1i=1∑m(h(x(i))−y(i)) j=1: ∂θ1∂J(θ0,θ1)=m1i=1∑m(h(x(i))−y(i))x(i)
当我们算出代价函数
J
J
J的斜率后,现在可以将它们代回我们的梯度下降算法(公式5)得到
r
e
p
e
a
d
u
n
t
i
l
c
o
n
v
e
r
g
e
n
c
e
{
θ
0
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
θ
1
=
θ
1
−
α
1
m
∑
i
=
1
m
(
h
(
x
(
i
)
)
−
y
(
i
)
)
x
(
i
)
)
}
repead \ \ until \ \ convergence\{\\ \theta_0=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})\\\ \ \ \ \ \ \ \theta_1=\theta_1-\alpha\frac{1}{m}\sum_{i=1}^{m}(h(x^{(i)})-y^{(i)})x^{(i)})\\ \}
repead until convergence{θ0=θ0−αm1i=1∑m(h(x(i))−y(i)) θ1=θ1−αm1i=1∑m(h(x(i))−y(i))x(i))}
这样是不是就很容易用代码的方式写出来了(虽然我不会哈哈哈哈)
梯度下降弊端
梯度下降算法有一个弊端就是容易陷入到局部最优解,不同的初始值决定了最终取到不同的局部最优解,如图所示
但线性回归中的代价函数 J J J总是一个凸函数,所以完全可以使用梯度下降算法来解决线性回归问题
凸函数(convex function)
凸函数没有局部最优解(local optimum),只有一个全局最优解(global optimum),当计算这种代价函数的梯度下降时,只要使用的是线性回归,它总会收敛到全局最优
后言
讲到这里,吴恩达老师说我们已经学会了第一个机器学习的算法,很高兴。我会永远都记得我人生中学会的第一个机器学习算法是梯度下降算法,这是我在ML、AI道路上的开端。好了,这一章的笔记更到这里,欢迎大家纠错