前言
学习吴恩达机器学习视频的第二篇笔记,内容包括:
- 第七章————正则化
- 第八、九章————神经网络
- 第十章————机器学习诊断法
个人博客页:一文讲清楚机器学习中的正则化、神经网络、机器学习诊断法 | Andrew的个人博客 (andreww1219.github.io)
一、正则化
1. 应用背景
在前面对线性回归、逻辑回归的学习中,我们都是构造一个假设 h θ ( x ) h_\theta(x) hθ(x),然后得到他的损失函数 J ( θ ) J(\theta) J(θ),对其进行梯度下降操作使损失函数的值尽可能小。总而言之,就是对我们的训练集作出最好的拟合。
然而,当我们增加特征的维度,完美地去拟合我们的训练集时,会得到一条相当扭曲,不具有泛化性地曲线,这就是过拟合的问题。解决过拟合问题主要有以下两个手段:
- 减少特征的数量 n n n
- 采用正则化(也就是我们今天要介绍的内容)
2. 什么是正则化?
我们采集了许多特征,并且相信这些特征对假设的预测值是有用的,并不想去舍弃它,又担心过拟合的问题。所以我们尽可能减小每个特征或某个特征对整体预测值的影响,在损失函数中增加对高特征值的惩罚,这就是正则化的思想。
3. 线性回归中的正则化
3.1 梯度下降中的正则化
由2可知,我们要在损失函数 J ( θ ) J(\theta) J(θ)增加对高特征值的惩罚,得到:
J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ] J(\theta) = \frac{1}{2m} [ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda \sum_{j=1}^n \theta_j^2] J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑nθj2]
得到 ∂ J ( θ ) ∂ θ j = 1 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ θ j ] \frac{\partial J(\theta) }{\partial \theta_j}= \frac{1}{m} [ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \lambda \theta_j] ∂θj∂J(θ)=m1[i=1∑m(hθ(x(i))−y(i))xj(i)+λθj]
那么有:
{
θ
0
=
θ
0
−
α
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
θ
j
=
θ
j
−
α
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
+
λ
θ
j
]
=
θ
j
(
1
−
α
λ
m
)
−
α
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\begin{cases} \theta_0 = \theta_0 - \frac{\alpha}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) \\ \theta_j = \theta_j - \frac{\alpha}{m} [ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \lambda \theta_j] = \theta_j(1 - \frac{\alpha\lambda}{m}) - \frac{\alpha}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} \end{cases}
{θ0=θ0−mα∑i=1m(hθ(x(i))−y(i))θj=θj−mα[∑i=1m(hθ(x(i))−y(i))xj(i)+λθj]=θj(1−mαλ)−mα∑i=1m(hθ(x(i))−y(i))xj(i)
3.2 正规方程中的正则化
将损失函数表示为矩阵形式,可得:
J ( θ ) = 1 2 m [ ( X θ − Y ) T ( X θ − Y ) + λ θ T θ ] J(\theta) = \frac{1}{2m} [(X\theta - Y)^T(X\theta - Y) + \lambda \theta^T \theta] J(θ)=2m1[(Xθ−Y)T(Xθ−Y)+λθTθ]
得到 ∂ J ( θ ) ∂ θ = 1 m [ X T X θ − X T Y + λ θ ] \frac{\partial J(\theta) }{\partial \theta}= \frac{1}{m} [X^TX\theta - X^TY + \lambda \theta] ∂θ∂J(θ)=m1[XTXθ−XTY+λθ]
令 ∂ J ( θ ) ∂ θ = 0 \frac{\partial J(\theta) }{\partial \theta} = 0 ∂θ∂J(θ)=0,得
θ = ( X T X − λ E ) X T Y \theta = (X^TX - \lambda E)X^TY θ=(XTX−λE)XTY
由于约定俗成的规则, θ 0 \theta_0 θ0不参与正则化(实际参与得到的结果也差别不大),所以将上述式子中 E i , j E_{i,j} Ei,j的位置修改为0,就是正规方程带正则化的表达式。
4. 逻辑回归中的正则化
同线性回归中的梯度下降,我们可以得到相同的结果即:
{ θ 0 = θ 0 − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) θ j = θ j − α m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ θ j ] = θ j ( 1 − α λ m ) − α m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \begin{cases} \theta_0 = \theta_0 - \frac{\alpha}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})\\ \theta_j = \theta_j - \frac{\alpha}{m} [ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \lambda \theta_j] = \theta_j(1 - \frac{\alpha\lambda}{m}) - \frac{\alpha}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} \end{cases} {θ0=θ0−mα∑i=1m(hθ(x(i))−y(i))θj=θj−mα[∑i=1m(hθ(x(i))−y(i))xj(i)+λθj]=θj(1−mαλ)−mα∑i=1m(hθ(x(i))−y(i))xj(i)
二、神经网络
1. 问题描述
输入层(Input Layer):已知m组数据
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
m
)
x^{(1)}, x^{(2)}, ..., x^{(m)}
x(1),x(2),...,x(m),每组数据表示n个特征,可写为一个n+1维的向量
即:
(
x
(
i
)
)
T
=
(
x
0
(
i
)
,
x
1
(
i
)
,
.
.
.
,
x
n
(
i
)
)
(x^{(i)})^T = (x^{(i)}_0, x^{(i)}_1, ..., x^{(i)}_n)
(x(i))T=(x0(i),x1(i),...,xn(i)),其中,
x
0
(
i
)
=
1
x^{(i)}_0=1
x0(i)=1。
隐层(Hidden Layer):介于输入层和输出层之间,每个隐层的每个结点接收上一个隐层(或输入层)的信号,经过一定处理后得到新的信号并传递给下一个隐层(或输出层)
输出层(Output Layer):接受最后一个隐层的信号,经过加权处理后输出 y ( i ) y^{(i)} y(i)。在多元分类问题中,向量 y ( i ) y^{(i)} y(i)的维度就是所需要区分的类别的数量。
2. 前向传播(Forward Propagation)
我们用 z i ( j ) z_i^{(j)} zi(j)表示第 j j j层的第 i i i个结点接收到的前一层的值加权后的总和, a i ( j ) a_i^{(j)} ai(j)表示第 j j j层的第 i i i个结点的输出,矩阵 Θ ( j ) \Theta^{(j)} Θ(j)表示从第 j j j层到第 j + 1 j+1 j+1层的权值,行数为 j + 1 j+1 j+1层的节点数,列数为 j j j层的节点数+1(存在常数固定层,可看作激活阈值),即
z i ( j + 1 ) = ∑ k = 0 第 j 层的结点数 Θ i , k ( j ) a k j z_i^{(j+1)} = \sum_{k=0}^{第j层的结点数} \Theta_{i, k}^{(j)} a_k^j zi(j+1)=∑k=0第j层的结点数Θi,k(j)akj
a i ( j + 1 ) = g ( z i ( j + 1 ) ) a_i^{(j+1)} = g(z_i^{(j+1)}) ai(j+1)=g(zi(j+1))
写成矩阵形式,则有 a ( j + 1 ) = g ( Θ ( j ) a ( j ) ) a^{(j+1)} = g( \Theta^{(j)} a^{(j)} ) a(j+1)=g(Θ(j)a(j))
于是我们可以写出神经网络的假设 h θ ( x ( i ) ) = g ( Θ ( L − 1 ) a ( L − 1 ) ) ) h_\theta(x^{(i)}) = g( \Theta^{(L-1)} a^{(L-1)} )) hθ(x(i))=g(Θ(L−1)a(L−1))),其中 L L L为神经网络的层数。
3. 反向传播(Back Propagation)
3.1 定义损失函数
有了假设,我们想要优化现有的模型,就需要对原有参数进行梯度下降,需要定义损失函数 J ( Θ ) J(\Theta) J(Θ),并对每一个参数即 Θ i , k ( j ) \Theta_{i, k}^{(j)} Θi,k(j)求偏导数 ∂ J ( Θ ) ∂ Θ i , k ( j ) \frac{\partial J(\Theta)}{\partial \Theta_{i, k}^{(j)}} ∂Θi,k(j)∂J(Θ)
于是我们有预测值 h θ ( x ) = a ( L ) h_\theta(x) = a^{(L)} hθ(x)=a(L),真实值 y y y,第 j j j层的节点数为 s j s_j sj,则有
每个样本的均方误差 E = 1 2 ∑ i = 1 s L ( a i ( L ) − y i ) 2 E = \frac{1}{2} \sum_{i=1}^{s_L} (a_i^{(L)} - y_i)^2 E=21∑i=1sL(ai(L)−yi)2
损失函数 J ( Θ ) = 1 m ∑ i = 1 m E ( i ) J(\Theta) = \frac{1}{m} \sum_{i=1}^m E^{(i)} J(Θ)=m1∑i=1mE(i)
损失函数对参数的偏导数 ∂ J ( Θ ) ∂ Θ ( j ) = 1 m ∑ i = 1 m ∂ E ( i ) ∂ Θ ( j ) \frac{\partial J(\Theta)}{\partial \Theta^{(j)}} = \frac{1}{m} \sum_{i=1}^m \frac{\partial E^{(i)}}{\partial \Theta^{(j)}} ∂Θ(j)∂J(Θ)=m1∑i=1m∂Θ(j)∂E(i)
3.2 引入链式求导法
我们想要直接求 E E E对 Θ i , k ( j ) \Theta_{i, k}^{(j)} Θi,k(j)的偏导数不太容易,因为我们的预测值是前面一步一步传递过来的,离输出层越远, E E E和 Θ i , k ( j ) \Theta_{i, k}^{(j)} Θi,k(j)的关系就越复杂。但是其中项之间的关系简单,偏导数易求,所以我们可以通过链式求导法则,由中间项之间的偏导数累乘得到 E E E对 Θ i , k ( j ) \Theta_{i, k}^{(j)} Θi,k(j)的偏导数。
对输出层的参数,则有 ∂ E ∂ Θ i , k ( L − 1 ) = ∂ E ∂ a i ( L ) ∂ a i ( L ) ∂ z i ( L ) ∂ z i ( L ) ∂ Θ i , k ( L − 1 ) \frac{\partial E}{\partial \Theta_{i, k}^{(L-1)}} = \frac{\partial E}{\partial a_i^{(L)}} \frac{\partial a_i^{(L)}}{\partial z_i^{(L)}} \frac{\partial z_i^{(L)}}{\partial \Theta_{i, k}^{(L-1)}} ∂Θi,k(L−1)∂E=∂ai(L)∂E∂zi(L)∂ai(L)∂Θi,k(L−1)∂zi(L)
其中, ∂ E ∂ a i ( L ) = a i ( L ) − y i , ∂ a i ( L ) ∂ z i ( L ) = g ′ ( z i ( L ) ) = a i ( L ) ( 1 − a i ( L ) ) , ∂ z i ( L ) ∂ Θ i , k ( L − 1 ) = a k ( L − 1 ) \frac{\partial E}{\partial a_i^{(L)}} = a_i^{(L)} - y_i, \frac{\partial a_i^{(L)}}{\partial z_i^{(L)}} = g'(z_i^{(L)}) = a_i^{(L)}(1 - a_i^{(L)}), \frac{\partial z_i^{(L)}}{\partial \Theta_{i, k}^{(L-1)}} =a_k^{(L-1)} ∂ai(L)∂E=ai(L)−yi,∂zi(L)∂ai(L)=g′(zi(L))=ai(L)(1−ai(L)),∂Θi,k(L−1)∂zi(L)=ak(L−1)
得 ∂ E ∂ Θ i , k ( L − 1 ) = ( a i ( L ) − y i ) a i ( L ) ( 1 − a i ( L ) ) a k ( L − 1 ) \frac{\partial E}{\partial \Theta_{i, k}^{(L-1)}} = (a_i^{(L)} - y_i) a_i^{(L)}(1 - a_i^{(L)}) a_k^{(L-1)} ∂Θi,k(L−1)∂E=(ai(L)−yi)ai(L)(1−ai(L))ak(L−1)
我们将 ∂ E ∂ z i ( L ) = ∂ E ∂ a i ( L ) ∂ a i ( L ) ∂ z i ( L ) = ( a i ( L ) − y i ) a i ( L ) ( 1 − a i ( L ) ) \frac{\partial E}{\partial z_i^{(L)}} = \frac{\partial E}{\partial a_i^{(L)}} \frac{\partial a_i^{(L)}}{\partial z_i^{(L)}} = (a_i^{(L)} - y_i) a_i^{(L)}(1 - a_i^{(L)}) ∂zi(L)∂E=∂ai(L)∂E∂zi(L)∂ai(L)=(ai(L)−yi)ai(L)(1−ai(L)) 记作输出层的误差(error)为 δ i ( L ) \delta_i^{(L)} δi(L),即
δ
(
L
)
=
(
a
(
L
)
−
y
)
.
∗
g
′
(
z
(
L
)
)
\delta^{(L)} = (a^{(L)} - y) .* g'(z^{(L)})
δ(L)=(a(L)−y).∗g′(z(L))
(存疑,视频中取的
δ
(
L
)
=
a
(
L
)
−
y
\delta^{(L)} = a^{(L)} - y
δ(L)=a(L)−y)
于是我们用 δ ( l ) \delta^{(l)} δ(l)表示均方误差 E E E对第 l l l层 z z z的偏导
3.3 矩阵形式
矩阵/向量/标量之间求导参考:机器学习中的数学理论1:三步搞定矩阵求导
我们希望得到 E E E对结果层参数 Θ ( L − 1 ) \Theta^{(L-1)} Θ(L−1)的偏导数,即标量对矩阵的求导,使用分母布局,得到与 Θ ( L − 1 ) \Theta^{(L-1)} Θ(L−1)相同维度的矩阵,方便减法运算作梯度下降。
由链式求导法则,有
∂ E ∂ Θ ( L − 1 ) = ∂ E ∂ z ( L ) ∂ z ( L ) ∂ Θ ( L − 1 ) \frac{\partial E}{\partial \Theta^{(L-1)}} = \frac{\partial E}{\partial z^{(L)}} \frac{\partial z^{(L)}}{\partial \Theta^{(L-1)}} ∂Θ(L−1)∂E=∂z(L)∂E∂Θ(L−1)∂z(L)
由于 ∂ E ∂ z ( L ) = δ ( L ) \frac{\partial E}{\partial z^{(L)}} = \delta^{(L)} ∂z(L)∂E=δ(L),
又 z ( L ) = Θ ( L − 1 ) a ( L − 1 ) z^{(L)} = \Theta^{(L-1)} a^{(L-1)} z(L)=Θ(L−1)a(L−1),则有 ∂ z ( L ) ∂ Θ ( L − 1 ) = ∂ Θ ( L − 1 ) α ( L − 1 ) ∂ Θ ( L − 1 ) = ( α ( L − 1 ) ) T \frac{\partial z^{(L)}}{\partial \Theta^{(L-1)}} = \frac{\partial \Theta^{(L-1)} \alpha^{(L-1)}}{\partial \Theta^{(L-1)}} = (\alpha^{(L-1)})^T ∂Θ(L−1)∂z(L)=∂Θ(L−1)∂Θ(L−1)α(L−1)=(α(L−1))T(使用分母布局)
综上所述, ∂ E ∂ Θ ( L − 1 ) = δ ( L ) ( α ( L − 1 ) ) T \frac{\partial E}{\partial \Theta^{(L-1)}} = \delta^{(L)} (\alpha^{(L-1)})^T ∂Θ(L−1)∂E=δ(L)(α(L−1))T
记均方误差 E E E对 Θ ( j ) \Theta^{(j)} Θ(j)的偏导为 Δ ( j ) \Delta^{(j)} Δ(j),则有 Δ ( L − 1 ) = δ ( L ) ( α ( L − 1 ) ) T \Delta^{(L-1)} = \delta^{(L)} (\alpha^{(L-1)})^T Δ(L−1)=δ(L)(α(L−1))T
3.3 推导递推公式
已知 δ ( l − 1 ) = ∂ E ∂ z ( l − 1 ) \delta^{(l-1)} = \frac{\partial E}{\partial z^{(l-1)}} δ(l−1)=∂z(l−1)∂E,那么
δ ( l − 1 ) = ∂ E ∂ z ( l ) ∂ z ( l ) ∂ z ( l − 1 ) = δ ( l ) ∂ z ( l ) ∂ a ( l − 1 ) ∂ a ( l − 1 ) ∂ z ( l − 1 ) = ( Θ ( l − 1 ) ) T δ ( l ) . ∗ g ′ ( z ( l − 1 ) ) \delta^{(l-1)} = \frac{\partial E}{\partial z^{(l)}} \frac{\partial z^{(l)}}{\partial z^{(l-1)}} = \delta^{(l)} \frac{\partial z^{(l)}}{\partial a^{(l-1)}} \frac{\partial a^{(l-1)}}{\partial z^{(l-1)}} = (\Theta^{(l-1)})^T \delta^{(l)} .* g'(z^{(l-1)}) δ(l−1)=∂z(l)∂E∂z(l−1)∂z(l)=δ(l)∂a(l−1)∂z(l)∂z(l−1)∂a(l−1)=(Θ(l−1))Tδ(l).∗g′(z(l−1))
即 δ ( l − 1 ) = ( Θ ( l − 1 ) ) T δ ( l ) . ∗ g ′ ( z ( l − 1 ) ) \delta^{(l-1)} = (\Theta^{(l-1)})^T \delta^{(l)} .* g'(z^{(l-1)}) δ(l−1)=(Θ(l−1))Tδ(l).∗g′(z(l−1)) ,这就是误差反向传导的递推公式
又
∂
z
(
l
−
1
)
∂
Θ
(
l
−
1
)
=
(
a
(
l
−
1
)
)
T
\frac{\partial z^{(l-1)}}{\partial \Theta^{(l-1)}} = (a^{(l-1)})^T
∂Θ(l−1)∂z(l−1)=(a(l−1))T
同理
Δ ( l − 1 ) = ∂ E ∂ Θ ( l − 1 ) = δ ( l ) ( a ( l − 1 ) ) T \Delta^{(l-1)} = \frac{\partial E}{\partial \Theta^{(l-1)}} = \delta^{(l)} (a^{(l-1)})^T Δ(l−1)=∂Θ(l−1)∂E=δ(l)(a(l−1))T
3.4 小结
记损失函数对 Θ ( l ) \Theta^{(l)} Θ(l)的偏导数为 D ( l ) = ∂ J ( Θ ) ∂ Θ ( l ) D^{(l)} = \frac{\partial J(\Theta)}{\partial \Theta^{(l)}} D(l)=∂Θ(l)∂J(Θ),则有
D i , j ( l ) = 1 m ∑ m Δ i , j ( l ) = 1 m ∑ m δ i ( l ) a j ( l − 1 ) D_{i, j}^{(l)} = \frac{1}{m} \sum^m \Delta_{i, j}^{(l)} = \frac{1}{m} \sum^m \delta_i^{(l)} a_j^{(l-1)} Di,j(l)=m1∑mΔi,j(l)=m1∑mδi(l)aj(l−1)
若引入正则化项,则有
D i , j ( l ) = 1 m ∑ m Δ i , j ( l ) = 1 m ∑ m δ i ( l ) a j ( l − 1 ) + λ Θ i , j ( l ) D_{i, j}^{(l)} = \frac{1}{m} \sum^m \Delta_{i, j}^{(l)} = \frac{1}{m} \sum^m \delta_i^{(l)} a_j^{(l-1)} + \lambda \Theta_{i, j}^{(l)} Di,j(l)=m1∑mΔi,j(l)=m1∑mδi(l)aj(l−1)+λΘi,j(l)
三、机器学习诊断法
1. 问题描述
我们需要评估我们训练出来的模型,判断是否过拟合,即高方差(variance),还是欠拟合,即高偏差(bias)。通常情况下,我们有许多方式去改进模型,但是不知道应该选哪一种。我们将讨论各个参数与偏差、方差的关系,帮助我们确定模型是处于高方差还是高偏差,应该怎样采取调整策略。
2.讨论变量
我们将遵循同一分布的数据集划分为训练集和验证集,训练集用来训练得到某一变量在不同值下的模型,由验证集对该变量进行选择。
记训练集误差为 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ),验证集误差为 J c v ( θ ) J_{cv}(\theta) Jcv(θ)
我们选择测试集误差最小的模型作为结果
但是,要如何验证我们模型的泛化能力?即模型对不同但具有相似分布的数据集(测试集)的表现。
所以我们一开始将数据集划分为训练集、验证集和测试集,由验证集对变量进行选择,由测试集对模型的泛化能力进行评估,不能将测试集用于调整参数,否则会导致过拟合
2.1 特征数 d d d
我们记参数的多项式次数(相当于特征数)为d
当特征数过少时,训练集误差
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和验证集误差
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)都很大,模型欠拟合;
当特征数过多时,训练集误差
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)很小,而验证集误差
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)较大,模型过拟合
2.2 正则化参数 λ \lambda λ
当
λ
\lambda
λ很小时,训练集误差
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)很小,而验证集误差
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)较大,模型过拟合;
当
λ
\lambda
λ很大时,训练集误差
J
t
r
a
i
n
(
θ
)
J_{train}(\theta)
Jtrain(θ)和验证集误差
J
c
v
(
θ
)
J_{cv}(\theta)
Jcv(θ)都很大,模型欠拟合
2.3 数据集规模 m m m
我们将数据集规模 m m m与误差关系的曲线叫做学习曲线
在高偏差即欠拟合的情况下,随着数据集规模
m
m
m的增大,训练集误差将非常接近于验证集误差
在高方差即过拟合的情况下,随着数据集规模
m
m
m的增大,验证集误差能有效减小,说明在过拟合情况下,增大数据规模是有效的
3. 小结
当模型高方差时,我们可以选择:
- 增大数据集规模
- 减小特征数 d d d
- 增大正则化参数 λ \lambda λ
当模型高偏差时,我们可以选择:
- 增加特征数 d d d
- 减小正则化参数 λ \lambda λ