一文讲清楚机器学习中的正则化、神经网络、机器学习诊断法

前言

学习吴恩达机器学习视频的第二篇笔记,内容包括:

  1. 第七章————正则化
  2. 第八、九章————神经网络
  3. 第十章————机器学习诊断法

个人博客页:一文讲清楚机器学习中的正则化、神经网络、机器学习诊断法 | Andrew的个人博客 (andreww1219.github.io)

一、正则化

1. 应用背景

在前面对线性回归、逻辑回归的学习中,我们都是构造一个假设 h θ ( x ) h_\theta(x) hθ(x),然后得到他的损失函数 J ( θ ) J(\theta) J(θ),对其进行梯度下降操作使损失函数的值尽可能小。总而言之,就是对我们的训练集作出最好的拟合。

然而,当我们增加特征的维度,完美地去拟合我们的训练集时,会得到一条相当扭曲,不具有泛化性地曲线,这就是过拟合的问题。解决过拟合问题主要有以下两个手段:

  1. 减少特征的数量 n n n
  2. 采用正则化(也就是我们今天要介绍的内容)

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=1m(hθ(x(i))y(i))2+λj=1nθ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] θjJ(θ)=m1[i=1m(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=θ0mαi=1m(hθ(x(i))y(i))θj=θjmα[i=1m(hθ(x(i))y(i))xj(i)+λθj]=θj(1mαλ)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[(Y)T(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[XTXTY+λθ]

∂ 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=θ0mαi=1m(hθ(x(i))y(i))θj=θjmα[i=1m(hθ(x(i))y(i))xj(i)+λθj]=θj(1mαλ)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=0j层的结点数Θ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(Θ(L1)a(L1))),其中 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=21i=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(Θ)=m1i=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(Θ)=m1i=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(L1)E=ai(L)Ezi(L)ai(L)Θi,k(L1)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)(1ai(L)),Θi,k(L1)zi(L)=ak(L1)

∂ 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(L1)E=(ai(L)yi)ai(L)(1ai(L))ak(L1)

我们将 ∂ 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)Ezi(L)ai(L)=(ai(L)yi)ai(L)(1ai(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)} Θ(L1)的偏导数,即标量对矩阵的求导,使用分母布局,得到与 Θ ( L − 1 ) \Theta^{(L-1)} Θ(L1)相同维度的矩阵,方便减法运算作梯度下降。

由链式求导法则,有

∂ 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)}} Θ(L1)E=z(L)EΘ(L1)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)=Θ(L1)a(L1),则有 ∂ 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 Θ(L1)z(L)=Θ(L1)Θ(L1)α(L1)=(α(L1))T(使用分母布局)

综上所述, ∂ E ∂ Θ ( L − 1 ) = δ ( L ) ( α ( L − 1 ) ) T \frac{\partial E}{\partial \Theta^{(L-1)}} = \delta^{(L)} (\alpha^{(L-1)})^T Θ(L1)E=δ(L)(α(L1))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 Δ(L1)=δ(L)(α(L1))T

3.3 推导递推公式

已知 δ ( l − 1 ) = ∂ E ∂ z ( l − 1 ) \delta^{(l-1)} = \frac{\partial E}{\partial z^{(l-1)}} δ(l1)=z(l1)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)}) δ(l1)=z(l)Ez(l1)z(l)=δ(l)a(l1)z(l)z(l1)a(l1)=(Θ(l1))Tδ(l).g(z(l1))

δ ( l − 1 ) = ( Θ ( l − 1 ) ) T δ ( l ) . ∗ g ′ ( z ( l − 1 ) ) \delta^{(l-1)} = (\Theta^{(l-1)})^T \delta^{(l)} .* g'(z^{(l-1)}) δ(l1)=(Θ(l1))Tδ(l).g(z(l1)) ,这就是误差反向传导的递推公式

∂ z ( l − 1 ) ∂ Θ ( l − 1 ) = ( a ( l − 1 ) ) T \frac{\partial z^{(l-1)}}{\partial \Theta^{(l-1)}} = (a^{(l-1)})^T Θ(l1)z(l1)=(a(l1))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 Δ(l1)=Θ(l1)E=δ(l)(a(l1))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)=m1mΔi,j(l)=m1mδi(l)aj(l1)

若引入正则化项,则有

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)=m1mΔi,j(l)=m1mδi(l)aj(l1)+λΘ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. 小结

当模型高方差时,我们可以选择:

  1. 增大数据集规模
  2. 减小特征数 d d d
  3. 增大正则化参数 λ \lambda λ

当模型高偏差时,我们可以选择:

  1. 增加特征数 d d d
  2. 减小正则化参数 λ \lambda λ
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值