本文是对吴恩达老师机器学习视频的总结笔记。全文4w多字数,主要是希望在以后对这方面知识有所遗忘的时候,看到这篇笔记能回想起每个算法的设计思路。我认为最快入门的方式还是视频,靠文本信息来学习知识还是不够清晰。建议配合视频食用更佳!
文章目录
1. 概念
1.1. 什么是人工智能?
按照UCLA教授朱松纯教授的定义,Al大概可以分为一下六类:
(1)计算机视觉->人类的视觉能力
(2)自然语言处理->人类的语言文字能力
(3)语音识别与生成->人类的听与说能力
(4)机器人学->人类的运动能力和运动智能
(5)博弈与合作->人类对抗与合作的能力
(6)机器学习->人类的学习能力
1.2. 什么是机器学习?
-
Arthur Samuel对机器学习的定义:
在没有明确设置的情况下,是计算机具有学习能力的研究领域
-
Tom Mitchell对机器学习的定义:
一个适当的学习问题定义为:计算机程序从经验E中学习,解决某一任务T进行某一性能度量P,通过P测定在T上的表现因经验E而提高(对于跳棋游戏,经验E指程序与自己下几万次跳棋;任务T就是玩跳棋;性能度量P指与新对手玩跳棋时赢的概率)
1.3. 机器学习算法:
-
监督学习(我们教计算机做某件事情)
解释:我们给算法一个数据集,其中包含了标签(e.g. 我们要根据房屋预测它的价格,给定一栋房屋的面积,并告诉我们这栋房屋多少钱,这里多少钱就是标签)。在这个数据集的每个样本里,我们都给出正确的答案,算法的目的就是给出更多的正确答案。
监督学习问题分为:
-
回归问题
解释:我们想要预测连续的数值输出,即设法预测连续值的属性(更浅显易懂的解释:我们希望通过学习得到一个连续的函数,我们可以基于这个函数得到我们给定自变量对应的预测因变量)
-
分类问题
解释:我们设法预测一个离散值输出,来预测输入样本对应的类别
-
-
无监督学习(计算机自己学习)
解释:给定一个没有标签的数据集,我们希望电脑为我们找出其中的某种结构,一个典型的算法是无监督学习的聚类算法(e.g. 我想要根据现有的用户身高体重信息来设计衣服每个尺码具体的长短,我们可以告诉算法我们打算将这些用户信息分为几类,算法会自动为我们划分这些类别)。
-
强化学习
-
推荐系统
2. 回归问题
2.1. 用到的符号汇总
m:训练样本的个数;
n:特征值的数量;
x:输入的特征值;
y:输出变量(真实结果);
(x,y):一个训练样本;
( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i)):某个特定的训练样本;
x j ( i ) x_j^{(i)} xj(i):第i个训练样本中第j个特征量的值(特征值的数量可能有多个);
h Θ ( x ) h_Θ(x) hΘ(x):假设函数hypothesis,有时缩写为h(x)。根据h(x)函数的最高次n,称该模型为“n元线性回归”。
2.2. 演示例子
问题描述:根据给定一个房屋和价格的数据集,通过训练得出假设函数。
-
用到的假设函数模型:
h θ ( x ) = θ 0 + θ 1 x + . . . + θ n x n h_θ(x)=θ_0+θ_1x+...+θ_nx^n hθ(x)=θ0+θ1x+...+θnxn
其中 θ n θ_n θn 表示模型参数,我们训练其实就是为了得到 θ ( 1... n ) θ_{(1...n)} θ(1...n) 参数所对应的具体数值。 -
代价函数(cost function) 是用来检验预测的精度,为了更准确的预测,一般使代价函数的值越小越好。
代价函数的一般公式为:
J ( θ 1 , . . . , θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(θ_1,...,θ_n)=\frac{1}{2m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})^2} J(θ1,...,θn)=2m1i=1∑m(hθ(x(i))−y(i))2
其实就是计算预测结果和真实结果的平方差,前面加 1 2 m \frac{1}{2m} 2m1 的我认为比较合理的解释: 1 2 m \frac{1}{2m} 2m1 是个常数,其中 1 m \frac{1}{m} m1 的目的是使代价函数的大小不依赖训练集中元素的数量, 1 2 \frac{1}{2} 21 是为了求导方便,因为求导出来各项平方项刚好和它抵消。
2.3. 代价函数最小化的方法之一:梯度下降法
思路: 对于 h θ ( x ) = θ 0 + θ 1 x + . . . + θ n x n h_θ(x)=θ_0+θ_1x+...+θ_nx^n hθ(x)=θ0+θ1x+...+θnxn ,给定 θ 0 , . . . , θ n θ_0,...,θ_n θ0,...,θn 的初始值(通常将它们都设置为0),然后每次都往使代价函数值更小的方向迈出一小步,直到代价函数值足够小。
特点: 梯度下降法可能由于起点不同( θ 0 , θ 1 θ_0,θ_1 θ0,θ1 的初始值),而最终得到不同的局部最优解
梯度下降公式:
重复直至收敛 {
θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , . . . , θ n ) θ_j:=θ_j-α\frac{∂}{∂θ_j}J(θ_0,...,θ_n) θj:=θj−α∂θj∂J(θ0,...,θn) for(j=0,…,j=n)
}
公式解释:
-
:=
表示赋值
或定义为
; -
-
公式中的减号是因为我们希望代价函数值往代价函数导数上升的相反方向迈进; -
α
学习速率,表示我们设置梯度下降时前进一步的大小,也即梯度下降的步长; -
∂ ∂ θ j J ( θ 0 , . . . , θ n ) \frac{∂}{∂θ_j}J(θ_0,...,θ_n) ∂θj∂J(θ0,...,θn) 表示对代价函数求偏导。
注意事项: θ 0 , . . . , θ n θ_0,...,θ_n θ0,...,θn 需要同步进行更新,如下:
代价函数与梯度下降算法结合(以两个参数 θ 0 和 θ 1 θ_0和θ_1 θ0和θ1为例):
已有公式:
假设函数: h θ ( x ) = θ 0 + θ 1 x 1 h_θ(x)=θ_0+θ_1x_1 hθ(x)=θ0+θ1x1
代价函数: J ( θ 1 , . . . , θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(θ_1,...,θ_n)=\frac{1}{2m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})^2} J(θ1,...,θn)=2m1i=1∑m(hθ(x(i))−y(i))2
梯度下降公式:
重 复 直 至 收 敛 { θ j : = θ j − α ∂ ∂ θ j J ( θ 0 , . . . , θ n ) , f o r ( j = 0 , . . . , j = n ) } \begin{aligned} 重复直至收敛 \{&\\ &\quad θ_j:=θ_j-α\frac{∂}{∂θ_j}J(θ_0,...,θ_n),\quad for(j=0,...,j=n)\\ &\} \end{aligned} 重复直至收敛{θj:=θj−α∂θj∂J(θ0,...,θn),for(j=0,...,j=n)}
三个式子结合得梯度下降公式:
重 复 直 至 收 敛 { θ 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 1 ( i ) } \begin{aligned} 重复直至收敛 \{&\\ &\quad θ_0:=θ_0-α\frac{1}{m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})}\\ &\quad θ_1:=θ_1-α\frac{1}{m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})}*x_1^{(i)}\\ &\} \end{aligned} 重复直至收敛{θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))θ1:=θ1−αm1i=1∑m(hθ(x(i))−y(i))∗x1(i)}
2.3.1 特征缩放
如果某些特征的值相差过大,对于多元梯度下降法我们需要考虑特征缩放。这样做的好处是使我们代价函数不会在某一特征值维度过分倾斜,加快梯度下降算法尽快收敛到全局最小点。
吴恩达的建议是我们通常进行梯度下降时是把特征的取值约束到-1到+1的范围内,这不是个绝对的概念,比如 0 - 3,-2 - 0.5 都是不错的,即同一个数量级即可。
2.3.1.1. 特征缩放具体方法:均值归一化
通常我们的特征值取:
x
i
=
x
i
−
μ
i
s
i
x_i=\frac{x_i-\mu_i}{s_i}
xi=sixi−μi
其中,
μ
i
\mu_i
μi 指在训练集
x
i
x_i
xi 的平均值,
s
i
s_i
si 指该特征值的范围,即
x
i
x_i
xi 在训练集中最大值和最小值之差,这样我们可以确保计算得到的
x
i
x_i
xi 在-0.5 - 0.5 的大致范围内。
2.3.2. 学习率
数学家已经证明:只要学习率 α \alpha α 足够小,那么每次迭代之后代价函数 J ( θ ) J(\theta) J(θ) 都会下降。因此代价函数如果没有随着迭代次数下降,很可能是因为学习率过大。
吴恩达的做法:通常选择 α \alpha α 从0.001开始,然后每一次 α \alpha α 变为原来的三倍(0.001, 0.003, 0.01, 0.03,…),并查看代价函数随迭代次数变化的图像,最终确定尽可能大的合理值 α \alpha α。
2.4. 矩阵知识
2.4.1. 一元线性回归
矩阵结合假设函数的运用:
不可逆的矩阵也称为奇异矩阵或退化矩阵,可逆矩阵成为非奇异矩阵。
2.4.2. 多元线性回归
对于假设函数:
h
θ
(
x
)
=
θ
0
+
θ
1
x
+
.
.
.
+
θ
n
x
n
h_θ(x)=θ_0+θ_1x+...+θ_nx^n
hθ(x)=θ0+θ1x+...+θnxn
令
x
=
(
x
0
x
1
x
2
.
.
.
x
n
)
,
θ
=
(
θ
0
θ
1
θ
2
.
.
.
θ
n
)
x=\begin{pmatrix} x_0\\x_1\\x_2\\...\\x_n \end{pmatrix},\quad \theta=\begin{pmatrix} θ_0\\θ_1\\θ_2\\...\\θ_n \end{pmatrix}
x=⎝⎜⎜⎜⎜⎛x0x1x2...xn⎠⎟⎟⎟⎟⎞,θ=⎝⎜⎜⎜⎜⎛θ0θ1θ2...θn⎠⎟⎟⎟⎟⎞ 有
h
θ
(
x
)
=
θ
T
x
h_θ(x)=θ^Tx
hθ(x)=θTx
2.5. 代价函数最小化的方法之二:正规方程
思路: 我们对某个具体问题希望给出一个具体函数进行拟合,就是确定假设函数 h(x) ,然后通过代价函数 J ( θ 1 , . . . , θ n ) J(θ_1,...,θ_n) J(θ1,...,θn) 对拟合结果进行评估,并希望找到 J ( θ 1 , . . . , θ n ) J(θ_1,...,θ_n) J(θ1,...,θn) 值最小时 θ i \theta_i θi 的取值。梯度下降是让 θ i \theta_i θi 的取值往 J ( θ 1 , . . . , θ n ) J(θ_1,...,θ_n) J(θ1,...,θn) 减小的方向前进。但其实我们可以直接令 J ( θ 1 , . . . , θ n ) J(θ_1,...,θ_n) J(θ1,...,θn) 对每个特征值 x i x_i xi 求偏导,令偏导为零,求得具体的 θ 1 , . . . , θ n \theta_1,...,\theta_n θ1,...,θn,即可得到最终的假设方程。遍历所有的偏微分比较麻烦,所以我们一般使用更好的方式正规方程 。
注意: 使用正规方程不需要进行特征缩放。
具体实现:
假设某个样本的特征值:
x
(
i
)
=
(
x
0
(
i
)
x
1
(
i
)
x
2
(
i
)
⋮
x
n
(
i
)
)
x^{(i)}=\begin{pmatrix} x_0^{(i)}\\x_1^{(i)}\\x_2^{(i)}\\\vdots\\x_n^{(i)}\end{pmatrix}\\
x(i)=⎝⎜⎜⎜⎜⎜⎜⎛x0(i)x1(i)x2(i)⋮xn(i)⎠⎟⎟⎟⎟⎟⎟⎞
令设计矩阵(包含所有样本特征值的矩阵):
X
=
(
(
x
(
1
)
)
T
(
x
(
2
)
)
T
⋮
(
x
(
m
)
)
T
)
=
(
x
0
(
1
)
x
1
(
1
)
x
2
(
1
)
.
.
.
x
n
(
1
)
x
0
(
2
)
x
1
(
2
)
x
2
(
2
)
.
.
.
x
n
(
2
)
⋮
⋮
⋮
⋮
x
0
(
m
)
x
1
(
m
)
x
2
(
m
)
.
.
.
x
n
(
m
)
)
X=\begin{pmatrix} (x^{(1)})^T\\(x^{(2)})^T\\\vdots\\(x^{(m)})^T\end{pmatrix} =\begin{pmatrix}x_0^{(1)}&x_1^{(1)}&x_2^{(1)}&...&x_n^{(1)}\\x_0^{(2)}&x_1^{(2)}&x_2^{(2)}&...&x_n^{(2)}\\\vdots&\vdots&\vdots&&\vdots\\x_0^{(m)}&x_1^{(m)}&x_2^{(m)}&...&x_n^{(m)}\end{pmatrix}
X=⎝⎜⎜⎜⎛(x(1))T(x(2))T⋮(x(m))T⎠⎟⎟⎟⎞=⎝⎜⎜⎜⎜⎛x0(1)x0(2)⋮x0(m)x1(1)x1(2)⋮x1(m)x2(1)x2(2)⋮x2(m).........xn(1)xn(2)⋮xn(m)⎠⎟⎟⎟⎟⎞
令样本特征值对应输出结果:
y
=
(
y
(
1
)
y
(
2
)
y
(
3
)
⋮
y
(
m
)
)
y=\begin{pmatrix} y^{(1)}\\y^{(2)}\\y^{(3)}\\\vdots\\y^{(m)}\end{pmatrix}\\
y=⎝⎜⎜⎜⎜⎜⎛y(1)y(2)y(3)⋮y(m)⎠⎟⎟⎟⎟⎟⎞
则正规方程法求
θ
θ
θ 公式为:
θ
=
(
X
T
X
)
−
1
X
T
y
\theta=(X^TX)^{-1}X^Ty
θ=(XTX)−1XTy
对于 θ = ( X T X ) − 1 X T y \theta=(X^TX)^{-1}X^Ty θ=(XTX)−1XTy , ( X T X ) (X^TX) (XTX) 可能是不可逆的,不可逆的两种常见原因是:① 你的学习问题可能包含了多余的特征;② 你在运行的学习算法包含太多的特征,比如 m<=n,也即样本数小于特征数量(解决办法是减少特征的数量或者使用正则化的方法)。
即使 ( X T X ) (X^TX) (XTX) 是不可逆的,我们也可以通过现代机器算出它的伪逆。
2.6. 梯度下降与正规方程对比
梯度下降 | 正规方程 |
---|---|
需要选择学习率 α \alpha α | 不需要选择学习率 α \alpha α |
需要更多次的迭代 | 不需要迭代 |
在特征数量大时也能很好地运行 | 当特征数量多时运算很慢。因为需要计算 ( X T X ) − 1 (X^TX)^-1 (XTX)−1 ,X是一个n阶矩阵,一般计算机应用计算矩阵的逆时间复杂度是 O ( n 3 ) O(n^3) O(n3) |
其他问题也适用 | 分类问题等不适用 |
10000个特征是选择梯度下降还是正规方程的界限:低于10000选正规方程,高于10000选梯度下降。
3. 分类问题
3.1. 二分类问题
预测结果用0和1表示
例子:
- 垃圾邮件分类
- 判断某次线上交易是否存在欺诈
- 肿瘤是恶性还是良性
3.1.1. 逻辑回归算法
3.1.1.1. 假设函数模型(也被称为:sigmoid函数、logistic函数)
已知线性回归假设函数:
h
θ
(
1
)
(
x
)
=
θ
T
x
h^{(1)}_\theta(x)=\theta^Tx\\
hθ(1)(x)=θTx
得逻辑回归假设函数:
h
θ
=
g
(
h
θ
(
1
)
(
x
)
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
其
中
:
g
(
z
)
=
1
1
+
e
−
z
h_\theta=g(h^{(1)}_\theta(x))=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}\\ 其中:g(z)=\frac{1}{1+e^{-z}}
hθ=g(hθ(1)(x))=g(θTx)=1+e−θTx1其中:g(z)=1+e−z1
- 假设函数(sigmoid函数、logistic函数)图像(以下均称为sigmoid函数):
-
sigmoid函数的特点:
能够保证函数值: 0 ⩽ h θ ( x ) ⩽ 1 0\leqslant h_\theta(x) \leqslant1 0⩽hθ(x)⩽1
-
sigmoid函数的理解:
对于输入值x,预测结果为1的可能性(如果要预测结果为0的可能性,可以用 1 − h θ ( x ) 1-h_\theta(x) 1−hθ(x))。
例子: 对于恶性肿瘤的预测,假设恶性肿瘤结果用1表示,良性肿瘤用0表示。则假设函数预测某个肿瘤为恶性肿瘤的几率
用概率公式表示为:
h θ ( x ) = P ( y = 1 ∣ x ; θ ) h_\theta(x)=P(y=1|x;\theta) hθ(x)=P(y=1∣x;θ)对于给定的输入值x,参数为 θ \theta θ 时 y=1 的可能性。
如果sigmoid函数 h θ ( x ) = g ( θ T x ) h_\theta(x)=g(\theta^Tx) hθ(x)=g(θTx) 预测 y=1 的概率 h θ ( x ) ≥ 0.5 h_\theta(x) \geq 0.5 hθ(x)≥0.5 ,我们认为最终分类为1;否则认为最终分类为0。
根据sigmoid图像可以知道,由于 z = θ T x z=\theta^Tx z=θTx ,上述说法等价为:如果 θ T x ≥ 0 \theta^Tx\geq 0 θTx≥0 ,我们认为最终分类为1;否则认为最终分类为0。这条线 θ T x \theta^Tx θTx 被称为决策边界。
3.1.1.2. 代价函数
代价函数定义为:
J
(
θ
)
=
1
m
∑
i
=
1
m
C
o
s
t
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
=
−
1
m
[
∑
i
=
1
m
y
(
i
)
l
o
g
h
θ
(
x
(
i
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
]
\begin{aligned} J(\theta)&=\frac{1}{m}\sum_{i=1}^{m}{Cost(h_\theta(x^{(i)})-y^{(i)})}\\&=-\frac{1}{m}\bigg[\sum_{i=1}^m{y^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)})log\big(1-h_\theta(x^{(i)})\big)}\bigg] \end{aligned}
J(θ)=m1i=1∑mCost(hθ(x(i))−y(i))=−m1[i=1∑my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]
其中
C
o
s
t
(
h
θ
(
x
)
,
y
)
Cost(h_\theta(x),y)
Cost(hθ(x),y) 具体为:
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
{
−
l
o
g
(
h
θ
(
x
)
)
,
y
=
1
−
l
o
g
(
1
−
h
θ
(
x
)
)
,
y
=
0
=
−
y
∗
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
l
o
g
(
1
−
h
θ
(
x
)
)
\begin{aligned} Cost(h_\theta(x),y)&=\begin{cases} -log\big(h_\theta(x)\big)\quad ,\quad y=1\\ -log\big(1-h_\theta(x)\big)\quad ,\quad y=0\end{cases}\\ &=-y*log\big(h_\theta(x)\big)-(1-y)log\big(1-h_\theta(x)\big) \end{aligned}
Cost(hθ(x),y)={−log(hθ(x)),y=1−log(1−hθ(x)),y=0=−y∗log(hθ(x))−(1−y)log(1−hθ(x))
3.1.1.3. 代价函数最小化的方法之一:梯度下降法
m i n θ J ( θ ) = R e p e a t { θ j : = θ j − α ∂ ∂ θ j J ( θ ) } = R e p e a t { θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) } \begin{aligned} min_\theta{J(\theta)} &= Repeat\quad\quad\{\theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j}J(\theta) \}\\ &= Repeat\quad\quad\{\theta_j:=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}}\}\\ \end{aligned} minθJ(θ)=Repeat{θj:=θj−α∂θj∂J(θ)}=Repeat{θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)}
我们会惊奇地发现这个梯度下降算法和我们在线性回归中用到的梯度下降的算法形式上是一样的,但其实这里的 h θ ( x ) h_\theta(x) hθ(x) 和我们线性回归中的假设函数是不一样的,这点要注意!
3.1.1.4. 其他代价函数最小化方法
- 共轭矩阵法
- BFGS
- L-BFGS
这些矩阵的优点是不需要我们手动选择学习率 α \alpha α ,这些算法有一个智能内循环,称为线搜索算法,它们会自动选择一个好的学习速率;同时通常比梯度下降算法更快。缺点是这些算法更加复杂。
3.2. 多分类问题
例子:
- 为不同类型的右键自动加上不同的标签
- 自动检测今天的天气是晴天、多云、暴雨。。。
多分类问题在这里老师将它们简化为多个二分类问题,然后将这个二分类问题得到的假设函数结合起来,对输入值x找出最大的假设函数的值,则该假设函数对应的类别就是最后预测的结果。
4. 过拟合
定义: 当我们对一个问题使用太多的特征,得到该问题的假设可能可以很好地拟合实验的数据集,但正因为它千方百计地拟合训练集,导致它无法泛化到新的样本中。
4.1. 处理过拟合的方法
4.1.1. 减少特征的数量
- 手动选择我们需要保留的特征变量;
- 使用模型选择算法帮我们选择保留哪些特征变量。
4.1.2. 正则化
保留所有特征变量,但是减少量级或者特征值 θ j \theta_j θj 的大小。正则化其实就是如果某个特征对原假设函数影响太大,我们需要修改对应的 θ \theta θ 值,使得其对假设函数影响变小。
正则化需要我们对代价函数进行处理,处理如下:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
m
θ
j
2
]
J(\theta)=\frac{1}{2m}\left[\sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})^2}\textcolor{#FF0000}{+\lambda\sum_{j=1}^m{\theta_j^2}}\right]
J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑mθj2]
其中,
λ
\lambda
λ 称为正则化参数。
注意,这里红色部分 θ \theta θ 不包括 θ 0 \theta_0 θ0 ,只是一种大家认可的写法,而且有没有包括$\theta_0 $ 其实对结果影响不大。
4.1.2.1. 线性回归的正则化
-
正则化后的梯度下降公式如下:
R e p e a t { θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) θ j : = θ j − α [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j ] : = θ j ( 1 − α λ m ) − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) , ( j = 1 , 2 , 3 , . . . , n ) } \begin{aligned} Repeat\{\\& θ_0:=θ_0-α\frac{1}{m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})}x_0^{(i)} \\& θ_j:=θ_j-α\textcolor{#FF0000}{[}\frac{1}{m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})}x_j^{(i)}\textcolor{#FF0000}{+\frac{\lambda}{m}\theta_j]} \\& \quad:=θ_j(1\textcolor{#FF0000}{-\alpha\frac{\lambda}{m}})-α\frac{1}{m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})}x_j^{(i)}\quad,\quad(j=1,2,3,...,n) \\& \} \end{aligned} Repeat{θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)θj:=θj−α[m1i=1∑m(hθ(x(i))−y(i))xj(i)+mλθj]:=θj(1−αmλ)−αm1i=1∑m(hθ(x(i))−y(i))xj(i),(j=1,2,3,...,n)}
对于上式中 1 − α λ m 1-\alpha\frac{\lambda}{m} 1−αmλ 这一项有一个特别的性质,即 1 − α λ m 1-\alpha\frac{\lambda}{m} 1−αmλ 略小于1。因为学习率 α \alpha α 通常很小,而训练样本的个数m通常很大,且 α λ m \alpha\frac{\lambda}{m} αmλ 是个正数。这样使得每次梯度下降都会让 θ \theta θ 比原梯度下降小一点点,就可以解释为什么 J ( θ ) J(\theta) J(θ) 增加标红的一项可以达到解决过拟合的作用。 -
正则化后的正规方程如下:
有 : X = ( ( x ( 1 ) ) T . . . ( x ( m ) ) T ) , y = ( y ( 1 ) . . . y ( m ) ) 得 : θ = ( X T X + λ ( 0 1 . . . 1 ) ( n + 1 ) ∗ ( n + 1 ) ) − 1 X T y 有:X=\begin{pmatrix} (x^{(1)})^T\\...\\(x^{(m)})^T\end{pmatrix}, y=\begin{pmatrix} y^{(1)}\\...\\y^{(m)}\end{pmatrix}\\ 得:\theta=\Bigg(X^TX\textcolor{#ff0000}{+\lambda\begin{pmatrix} 0&\\&1\\&&...\\&&&1\end{pmatrix}_{(n+1)*(n+1)}}\Bigg)^{-1}X^Ty 有:X=⎝⎛(x(1))T...(x(m))T⎠⎞,y=⎝⎛y(1)...y(m)⎠⎞得:θ=(XTX+λ⎝⎜⎜⎛01...1⎠⎟⎟⎞(n+1)∗(n+1))−1XTy
上述正规方程中如果 λ > 0 \lambda>0 λ>0 ,那么可以证明该正则化后的正规方程是可逆的。
4.1.2.2. 逻辑回归的正则化
- 正则化后的梯度下降公式同 “线性回归” :
R e p e a t { θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) θ j : = θ j − α [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j ] : = θ j ( 1 − α λ m ) − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) , ( j = 1 , 2 , 3 , . . . , n ) } \begin{aligned} Repeat\{\\& θ_0:=θ_0-α\frac{1}{m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})}x_0^{(i)} \\& θ_j:=θ_j-α\textcolor{#FF0000}{[}\frac{1}{m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})}x_j^{(i)}\textcolor{#FF0000}{+\frac{\lambda}{m}\theta_j]} \\& \quad:=θ_j(1\textcolor{#FF0000}{-\alpha\frac{\lambda}{m}})-α\frac{1}{m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})}x_j^{(i)}\quad,\quad(j=1,2,3,...,n) \\& \} \end{aligned} Repeat{θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)θj:=θj−α[m1i=1∑m(hθ(x(i))−y(i))xj(i)+mλθj]:=θj(1−αmλ)−αm1i=1∑m(hθ(x(i))−y(i))xj(i),(j=1,2,3,...,n)}
5. 神经网络
为什么学习神经网络:
使用线性回归,逻辑回归如果特征数量n太多,那么多项式个数会呈指数增长。对于一个特征数量n=100 的分类问题,使用二次假设函数进行预测,得到的二次多项式为 n 2 2 \frac{n^2}{2} 2n2 ,这导致多项式数量随特征值数量指数增长,最后的结果往往是过拟合。存在这么多项时,也存在运算量过大的问题。
神经网络是一种非线性的假设,即使特征数量很大也能很好地运行,是一种好得多的算法。
5.1. 神经网络模型
输入层和输出层只能有一层,隐藏层可以有多层。
用到的符号汇总
a i ( j ) a_i^{(j)} ai(j) : 表示第 j 层第 i 个神经元或单元的激活项;
Θ ( j ) \Theta^{(j)} Θ(j) : 控制从第 j 层到第 j+1 层函数映射(从第 j 层到第 j+1 层数值的计算)的权重矩阵;
Θ m n ( j ) \Theta^{(j)}_{mn} Θmn(j) : 控制从第 j 层第 n 个单元到第 j+1 层第 m 个单元函数映射(从第 j 层到第 j+1 层数值的计算)的权重;
L : 神经网络的总层数;
s l s_l sl : 神经网络第l层的单元数(神经元数量);
K : 输出层的单元数(也可以用 s L s_L sL 表示);
δ j ( l ) \delta_j^{(l)} δj(l) : 第 l 层第 j 个单元的误差。
5.3. 假设函数模型
前向传播表示计算方向从输入层到隐藏层到输出层一步一步向前计算
5.3.1. 起步
在图5-1,
a
i
(
j
)
a_i^{(j)}
ai(j) 和
Θ
(
j
)
\Theta^{(j)}
Θ(j) 的关系为:
a
1
(
2
)
=
g
(
Θ
10
(
1
)
x
0
+
Θ
11
(
1
)
x
1
+
Θ
12
(
1
)
x
2
+
Θ
13
(
1
)
x
3
)
a
2
(
2
)
=
g
(
Θ
20
(
1
)
x
0
+
Θ
21
(
1
)
x
1
+
Θ
22
(
1
)
x
2
+
Θ
23
(
1
)
x
3
)
a
3
(
2
)
=
g
(
Θ
30
(
1
)
x
0
+
Θ
31
(
1
)
x
1
+
Θ
32
(
1
)
x
2
+
Θ
33
(
1
)
x
3
)
h
Θ
(
x
)
=
a
1
(
3
)
=
g
(
Θ
10
(
2
)
a
0
(
2
)
+
Θ
11
(
2
)
a
1
(
2
)
+
Θ
12
(
2
)
a
2
(
2
)
+
Θ
13
(
2
)
a
3
(
2
)
)
a_1^{(2)}=g(\Theta_{10}^{(1)}x_0+\Theta_{11}^{(1)}x_1+\Theta_{12}^{(1)}x_2+\Theta_{13}^{(1)}x_3)\\ a_2^{(2)}=g(\Theta_{20}^{(1)}x_0+\Theta_{21}^{(1)}x_1+\Theta_{22}^{(1)}x_2+\Theta_{23}^{(1)}x_3)\\ a_3^{(2)}=g(\Theta_{30}^{(1)}x_0+\Theta_{31}^{(1)}x_1+\Theta_{32}^{(1)}x_2+\Theta_{33}^{(1)}x_3)\\ h_\Theta(x)=a_1^{(3)}=g(\Theta_{10}^{(2)}a_0^{(2)}+\Theta_{11}^{(2)}a_1^{(2)}+\Theta_{12}^{(2)}a_2^{(2)}+\Theta_{13}^{(2)}a_3^{(2)})
a1(2)=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)a2(2)=g(Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3)a3(2)=g(Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3)hΘ(x)=a1(3)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))
图 5-1 ,
Θ
(
1
)
\Theta^{(1)}
Θ(1) 是一个
3
×
4
3\times4
3×4 的矩阵。
更通用的结论是: 如果某个神经网络在第 j 层有 s j + 1 s_{j+1} sj+1 个单元,那么 Θ ( j ) \Theta^{(j)} Θ(j) 是一个 s j + 1 × ( s j + 1 ) s_{j+1}\times(s_j+1) sj+1×(sj+1) 的矩阵。
5.3.2. 向量化
上述公式中,令
z
i
(
j
)
=
Θ
10
(
j
−
1
)
x
0
+
Θ
11
(
j
−
1
)
x
1
+
Θ
12
(
j
−
1
)
x
2
+
Θ
13
(
j
−
1
)
x
3
z_i^{(j)}=\Theta_{10}^{(j-1)}x_0+\Theta_{11}^{(j-1)}x_1+\Theta_{12}^{(j-1)}x_2+\Theta_{13}^{(j-1)}x_3
zi(j)=Θ10(j−1)x0+Θ11(j−1)x1+Θ12(j−1)x2+Θ13(j−1)x3
有:
a
1
(
2
)
=
g
(
z
1
(
2
)
)
=
g
(
Θ
10
(
1
)
x
0
+
Θ
11
(
1
)
x
1
+
Θ
12
(
1
)
x
2
+
Θ
13
(
1
)
x
3
)
a
2
(
2
)
=
g
(
z
2
(
2
)
)
=
g
(
Θ
20
(
1
)
x
0
+
Θ
21
(
1
)
x
1
+
Θ
22
(
1
)
x
2
+
Θ
23
(
1
)
x
3
)
a
3
(
2
)
=
g
(
z
3
(
2
)
)
=
g
(
Θ
30
(
1
)
x
0
+
Θ
31
(
1
)
x
1
+
Θ
32
(
1
)
x
2
+
Θ
33
(
1
)
x
3
)
a_1^{(2)}=g(z_1^{(2)})=g(\Theta_{10}^{(1)}x_0+\Theta_{11}^{(1)}x_1+\Theta_{12}^{(1)}x_2+\Theta_{13}^{(1)}x_3)\\ a_2^{(2)}=g(z_2^{(2)})=g(\Theta_{20}^{(1)}x_0+\Theta_{21}^{(1)}x_1+\Theta_{22}^{(1)}x_2+\Theta_{23}^{(1)}x_3)\\ a_3^{(2)}=g(z_3^{(2)})=g(\Theta_{30}^{(1)}x_0+\Theta_{31}^{(1)}x_1+\Theta_{32}^{(1)}x_2+\Theta_{33}^{(1)}x_3)
a1(2)=g(z1(2))=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)a2(2)=g(z2(2))=g(Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3)a3(2)=g(z3(2))=g(Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3)
可以构造矩阵如下:
x
=
(
x
0
x
1
x
2
x
3
)
,
z
(
2
)
=
(
z
1
(
2
)
z
2
(
2
)
z
3
(
2
)
)
,
z
(
2
)
=
Θ
(
1
)
x
=
Θ
(
1
)
a
(
1
)
,
a
(
2
)
=
g
(
z
(
2
)
)
x=\begin{pmatrix} x_0\\x_1\\x_2\\x_3 \end{pmatrix},\quad z^{(2)}=\begin{pmatrix} z_1^{(2)}\\z_2^{(2)}\\z_3^{(2)} \end{pmatrix},\quad z^{(2)}=\Theta^{(1)}x=\Theta^{(1)}a^{(1)},\quad a^{(2)}=g(z^{(2)})
x=⎝⎜⎜⎛x0x1x2x3⎠⎟⎟⎞,z(2)=⎝⎜⎛z1(2)z2(2)z3(2)⎠⎟⎞,z(2)=Θ(1)x=Θ(1)a(1),a(2)=g(z(2))
神经网络很像是逻辑回归算法:
若输出结果设为
h
Θ
(
x
)
h_\Theta(x)
hΘ(x) ,则可以得到:
h
Θ
(
x
)
=
g
(
Θ
10
(
2
)
a
0
(
2
)
+
Θ
11
(
2
)
a
1
(
2
)
+
Θ
12
(
2
)
a
2
(
2
)
+
Θ
13
(
2
)
a
3
(
2
)
)
h_\Theta(x)=g(\Theta_{10}^{(2)}a_0^{(2)}+\Theta_{11}^{(2)}a_1^{(2)}+\Theta_{12}^{(2)}a_2^{(2)}+\Theta_{13}^{(2)}a_3^{(2)})
hΘ(x)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))
这个公式和逻辑回归假设函数形式上是一样的。
个人体会:
神经网络很像数字电路的电路设计,可以通过门电路设计出复杂的判断逻辑。神经网络主要运用于分类问题。
输出结果
h Θ ( x ) ∈ R K , 其 中 ( h Θ ( x ) ) i = i t h o u t p u t h_\Theta(x)\in R^K,\quad 其中(h_\Theta(x))_i=i^{th} output hΘ(x)∈RK,其中(hΘ(x))i=ithoutput
代价函数:
正因为神经网络算法很像逻辑回归算法,我们把逻辑回归和神经网络代价函数进行对比。
-
逻辑回归代价函数:
J ( θ ) = − 1 m [ ∑ i = 1 m y ( i ) l o g h θ ( x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ j = 1 n θ j 2 J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^m{y^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)})log(1-h_\theta(x^{(i)}))}\right]+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2 J(θ)=−m1[i=1∑my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2 -
神经网络代价函数:
J ( Θ ) = − 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) l o g ( h Θ ( x ( i ) ) ) k + ( 1 − y k ( i ) ) l o g ( 1 − ( h Θ ( x ( i ) ) ) k ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j i ( l ) ) 2 J(\Theta)=-\frac{1}{m}\left[\sum_{i=1}^{m}\sum_{k=1}^{K}y_k^{(i)}log(h_\Theta(x^{(i)}))_k+(1-y_k^{(i)})log(1-(h_\Theta(x^{(i)}))_k\right] \\+\frac{\lambda}{2m}\sum_{l=1}^{L-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_l+1}(\Theta_{ji}^{(l)})^2 J(Θ)=−m1[i=1∑mk=1∑Kyk(i)log(hΘ(x(i)))k+(1−yk(i))log(1−(hΘ(x(i)))k]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θji(l))2
我们知道得出的结果是一个K维向量,这里 ∑ k = 1 K \sum^K_{k=1} ∑k=1K 是对输出层K维向量每一维度进行预测结果和真实结果求误差。
5.6. 最小化代价函数——反向传播算法
假设神经网络模型如下:
假定
δ
j
(
l
)
\delta_j^{(l)}
δj(l) 为第 l 层第 j 个单元的误差,对于每个输出层的单元,有:
δ
j
(
4
)
=
a
j
(
4
)
−
y
j
\delta_j^{(4)}=a_j^{(4)}-y_j
δj(4)=aj(4)−yj
我们把每一层所有单元的误差用矩阵表示得:
δ
(
4
)
=
a
(
4
)
−
y
\delta^{(4)}=a^{(4)}-y
δ(4)=a(4)−y
一层一层反向传播:
δ
(
4
)
=
a
(
4
)
−
y
δ
(
3
)
=
(
Θ
(
3
)
)
T
δ
(
4
)
.
∗
g
′
(
z
(
3
)
)
δ
(
2
)
=
(
Θ
(
2
)
)
T
δ
(
3
)
.
∗
g
′
(
z
(
2
)
)
\begin{aligned} &\delta^{(4)}=a^{(4)}-y\\ &\delta^{(3)}=(\Theta^{(3)})^T\delta^{(4)}.*g'(z^{(3)})\\ &\delta^{(2)}=(\Theta^{(2)})^T\delta^{(3)}.*g'(z^{(2)}) \end{aligned}
δ(4)=a(4)−yδ(3)=(Θ(3))Tδ(4).∗g′(z(3))δ(2)=(Θ(2))Tδ(3).∗g′(z(2))
累计计算得出的误差项:
Δ
i
j
(
l
)
:
=
Δ
i
j
(
l
)
+
a
j
(
l
)
δ
i
(
l
+
1
)
矩
阵
表
示
:
Δ
(
l
)
:
=
Δ
(
l
)
+
δ
(
l
+
1
)
(
a
(
l
)
)
T
\Delta^{(l)}_{ij}:=\Delta^{(l)}_{ij}+a_j^{(l)}\delta_i^{(l+1)}\\ 矩阵表示:\Delta^{(l)}:=\Delta^{(l)}+\delta^{(l+1)}(a^{(l)})^T
Δij(l):=Δij(l)+aj(l)δi(l+1)矩阵表示:Δ(l):=Δ(l)+δ(l+1)(a(l))T
则代价函数偏导为:
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
=
D
i
j
(
l
)
:
=
{
1
m
Δ
i
j
(
l
)
+
λ
Θ
i
j
(
l
)
,
j
≠
0
1
m
Δ
i
j
(
l
)
,
j
=
0
\frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=D_{ij}^{(l)}:= \begin{cases} \frac{1}{m}\Delta_{ij}^{(l)}+\lambda\Theta_{ij}^{(l)},\quad j\neq0\\ \frac{1}{m}\Delta_{ij}^{(l)},\quad j=0 \end{cases}
∂Θij(l)∂J(Θ)=Dij(l):={m1Δij(l)+λΘij(l),j=0m1Δij(l),j=0
5.6.1. 反向传播算法的理解
对于神经网络代价函数,如果省略正则化项,设:
c
o
s
t
(
i
)
=
y
(
i
)
l
o
g
(
h
Θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
l
o
g
(
1
−
h
Θ
(
x
(
i
)
)
)
,
J
(
Θ
)
=
−
1
m
c
o
s
t
(
i
)
\mathrm{cost}(i)=y^{(i)}log(h_\Theta(x^{(i)}))+(1-y^{(i)})log(1-h_\Theta(x^{(i)})),\\ J(\Theta)=-\frac{1}{m}cost(i)
cost(i)=y(i)log(hΘ(x(i)))+(1−y(i))log(1−hΘ(x(i))),J(Θ)=−m1cost(i)
对于损失函数 cost(i),我们可以把它想象成:
c
o
s
t
(
i
)
≈
(
h
Θ
(
x
(
i
)
)
−
y
(
i
)
)
2
)
\mathrm{cost}(i)\thickapprox(h_\Theta(x^{(i)})-y^{(i)})^2)
cost(i)≈(hΘ(x(i))−y(i))2)
有如下关系:
δ
j
(
l
)
=
∂
∂
z
j
(
l
)
c
o
s
t
(
i
)
\delta_j^{(l)}=\frac{\partial}{\partial z_j^{(l)}}\mathrm{cost}(i)
δj(l)=∂zj(l)∂cost(i)
δ
j
(
l
)
\delta_j^{(l)}
δj(l) 实际上是损失函数关于这些所计算出的中间项的偏导数。
5.7. 梯度检验
反向传播算法有很多细节,因此实现起来比较困难。并且它有一个不好的特性,很容易产生一些微妙的bug,当它与梯度下降或者其他算法一同工作时,即使代价函数值越来越小,但到最后所得出的神经网络的误差会比无bug时高出一个量级。为了解决这种问题,我们需要学习使用梯度检验方法。
假设有代价函数如下,蓝色线代表反向传播算法求得的导数,红色线表示我们通过给定一个区间算出的该点导数的近似值,梯度检测的意思即我们要保证我们求得的某点导数近似值要和反向传播算法求得的导数大致相等 。吴恩达老师在这里建议 ε \varepsilon ε 的取值为 1 0 − 4 10^{-4} 10−4 。
对于
θ
\theta
θ 是一个向量时,这里的
θ
\theta
θ 是
Θ
(
1
)
,
.
.
.
,
Θ
(
l
)
\Theta^{(1)},...,\Theta^{(l)}
Θ(1),...,Θ(l) 的展开项,
θ
=
θ
1
,
.
.
.
,
θ
n
\theta=\theta_1,...,\theta_n
θ=θ1,...,θn ,某点偏导近似值求解公式如下:
∂
∂
θ
1
J
(
θ
)
≈
J
(
θ
1
+
ε
,
θ
2
,
.
.
.
,
θ
n
)
−
J
(
θ
1
−
ε
,
θ
2
,
.
.
.
,
θ
n
)
2
ε
∂
∂
θ
2
J
(
θ
)
≈
J
(
θ
1
,
θ
2
+
ε
,
.
.
.
,
θ
n
)
−
J
(
θ
1
,
θ
2
−
ε
,
.
.
.
,
θ
n
)
2
ε
⋮
∂
∂
θ
n
J
(
θ
)
≈
J
(
θ
1
,
θ
2
,
.
.
.
,
θ
n
+
ε
)
−
J
(
θ
1
,
θ
2
,
.
.
.
,
θ
n
−
ε
)
2
ε
\frac{\partial}{\partial\theta_1}J(\theta)\thickapprox\frac{J(\theta_1+\varepsilon,\theta_2,...,\theta_n)-J(\theta_1-\varepsilon,\theta_2,...,\theta_n)}{2\varepsilon}\\ \frac{\partial}{\partial\theta_2}J(\theta)\thickapprox\frac{J(\theta_1,\theta_2+\varepsilon,...,\theta_n)-J(\theta_1,\theta_2-\varepsilon,...,\theta_n)}{2\varepsilon}\\ \vdots\\ \frac{\partial}{\partial\theta_n}J(\theta)\thickapprox\frac{J(\theta_1,\theta_2,...,\theta_n+\varepsilon)-J(\theta_1,\theta_2,...,\theta_n-\varepsilon)}{2\varepsilon}\\
∂θ1∂J(θ)≈2εJ(θ1+ε,θ2,...,θn)−J(θ1−ε,θ2,...,θn)∂θ2∂J(θ)≈2εJ(θ1,θ2+ε,...,θn)−J(θ1,θ2−ε,...,θn)⋮∂θn∂J(θ)≈2εJ(θ1,θ2,...,θn+ε)−J(θ1,θ2,...,θn−ε)
如果求得的偏导近似值和真正的偏导相差不多,可能只是小数点后几位小数,则说明我们的反向传播算法是正确的。
反向传播梯度检验的具体过程:
- 通过反向传播计算代价函数偏导矩阵DVec;
- 通过上述式子计算代价函数偏导矩阵近似值gradApprox;
- 保证DVec和gradApprox得到相似的值;
- 如果检验结果是正确的,在使用代码进行训练之前,我们需要关闭梯度检验,因为梯度检验计算量很大。
5.8. 随机初始化
当运行梯度下降算法和其他高级的优化算法时,我们需要给 Θ \Theta Θ 选取一些初始值。如果我们选取的所有权重 Θ \Theta Θ 是一样的,那么我们每一层各个神经元所计算的输出值(激活项)a 都会是一样的,那么该算法冗余度很高,且运行不出一些比较奇妙的结果。
这就需要我们掌握一些选取初始值的方法,在选取初始值的时候,要应用随机初始化的思想。为了训练神经网络,应该首先将权重初始化为一个接近0的,范围在 − ε -\varepsilon −ε 到 ε \varepsilon ε 之间的数。(这个 ε \varepsilon ε 和梯度下降的 ε \varepsilon ε 没有半毛钱关系! )
例子:
T
h
e
t
a
=
r
a
n
d
(
10
,
11
)
∗
(
2
∗
I
N
I
T
_
E
P
S
I
L
O
N
)
−
I
N
I
T
_
E
P
S
I
L
O
N
;
Theta=rand(10,11)*(2*INIT\_EPSILON)\\ -INIT\_EPSILON;
Theta=rand(10,11)∗(2∗INIT_EPSILON)−INIT_EPSILON;
5.9. 隐藏层层数和每层单元数的选取
默认比较合理的隐藏层层数是1层,如果隐藏层层数大于1层,那么每个隐藏层的单元数都必须相等,每个隐藏层的单元数一般来说越多越好。
5.10. 训练神经网络步骤总结
- 把权重 Θ \Theta Θ 初始化为很小,接近于零的值;
- 执行前向传播算法;
- 通过代码计算代价函数 J ( θ ) J(\theta) J(θ) ;
- 执行反向传播算法计算代价函数偏导数项 ∂ ∂ Θ j k ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{jk}^{(l)}}J(\Theta) ∂Θjk(l)∂J(Θ) ;
- 进行梯度检验,计算代价函数偏导数值并与实际偏导数值进行比较,检验之后关闭梯度检验;
- 使用梯度下降或者其他高级优化算法和反向传播算法相结合减小代价函数 J ( Θ ) J(\Theta) J(Θ) 的值。
神经网络代价函数是一个非凸函数,因此存在局部最优解,因此理论上不论使用何种算法都可能收敛于局部最小值。
5.11. 机器学习诊断法
5.11.1. 评估假设
为了验证我么训练的学习算法的准确性,我们将数据集分为训练集、交叉验证集(验证集)和测试集,这里吴恩达老师给我们的分割方式是训练集占60%、验证集20%、测试集占20%。
5.11.2. 模型选择
训练集、验证集、测试集的样本的数量分别用 m , m c v , m t e s t m,m_{cv},m_{test} m,mcv,mtest 表示。假设有模型如下:
从一到十我们用训练集算出每个模型的最小代价函数值所对应的 θ \theta θ 值,然后将得到的 θ \theta θ 与验证集计算代价函数 J c v ( θ ) J_{cv}(\theta) Jcv(θ) ,然后选择 J c v ( θ ) J_{cv}(\theta) Jcv(θ) 最小的那个模型作为我们训练的模型。剩下的测试集可以给我们估测所选模型训练结果的泛化误差 J t e s t ( θ ( i ) ) 。 J_{test}(\theta^{(i)})。 Jtest(θ(i))。
5.11.3. 正则化参数 λ \lambda λ 的选择
定义如下代价函数:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
m
θ
j
2
]
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J
c
v
(
θ
)
=
1
2
m
c
v
∑
i
=
1
m
c
v
(
h
θ
(
x
c
v
(
i
)
)
−
y
c
v
(
i
)
)
2
J
t
e
s
t
(
θ
)
=
1
2
m
t
e
s
t
∑
i
=
1
m
t
e
s
t
(
h
θ
(
x
t
e
s
t
(
i
)
)
−
y
t
e
s
t
(
i
)
)
2
J(\theta)=\frac{1}{2m}\left[\sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})^2}+\lambda\sum_{j=1}^m{\theta_j^2}\right]\\ J_{train}(\theta)=\frac{1}{2m}\sum_{i=1}^m{(h_\theta(x^{(i)})-y^{(i)})^2}\\ J_{cv}(\theta)=\frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}{(h_\theta(x^{(i)}_{cv})-y^{(i)}_{cv})^2}\\ J_{test}(\theta)=\frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}{(h_\theta(x^{(i)}_{test})-y^{(i)}_{test})^2}\\
J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑mθj2]Jtrain(θ)=2m1i=1∑m(hθ(x(i))−y(i))2Jcv(θ)=2mcv1i=1∑mcv(hθ(xcv(i))−ycv(i))2Jtest(θ)=2mtest1i=1∑mtest(hθ(xtest(i))−ytest(i))2
λ \lambda λ 的选取一般从零开始,每次为前一次的两倍,每次对 λ \lambda λ 选取后计算代价函数最小值所对应的参数 θ \theta θ ,将得到的 θ \theta θ 带入 J c v ( θ ) J_{cv}(\theta) Jcv(θ) ,选择交叉验证集误差 J c v ( θ ) J_{cv}(\theta) Jcv(θ) 最小所对应的 λ \lambda λ 值。最后测试集误差 J t e s t ( θ ) J_{test}(\theta) Jtest(θ) 用来测试训练结果对新样本的泛化能力。
5.12. 学习曲线
绘制学习曲线的目的是判断训练结果是否是高偏差(欠拟合)还是高分差(过拟合)。
-
正常训练结果的学习曲线
横坐标是训练集中训练样本的数量,纵坐标是误差值。随着训练样本的增加,训练集误差会越来越大,因为随着训练集的增加,假设函数拟合所有训练样本的难度更大。与此相反,由于更多训练集,所得到的训练模型拟合新样本更好,因此交叉验证集误差越来越小。
-
高偏差(欠拟合)情况
虽然两条误差曲线随着训练样本的增加很快趋于相等,并且交汇点偏高。因为无论训练样本如何增加,太简单的模型始终无法很好地拟合。
-
高方差(过拟合)情况
训练集误差和交叉验证集误差距离相差非常远。因为由于给定模型过于复杂,所以对于训练样本拟合地非常好;但对于新样本拟合能力不行。
5.13. 解决高偏差(欠拟合)和高方差(过拟合)
5.13.1. 处理高偏差(过拟合)
- 增加特征数量;
- 增加多项式特征(增加多项式最高项次数);
- 减小 λ \lambda λ 的取值。
5.13.2. 处理高方差(欠拟合)
- 获得更多的训练样本;
- 使用更少的特征;
- 增加 λ \lambda λ 的取值。
6. 设计复杂学习系统
设计一个复杂系统最推荐的方式:
- 通过一个简单的算法快速地实现它,吴恩达老师说他最多用一天24小时的时间简单除暴地做出来,然后通过交叉验证来测试数据;
- 画出学习曲线检验误差来确定我的算法是否存在高误差或者高方差等问题,再决定使用更多的数据和特征等等;
- 误差分析:手动检查被算法错误标记的例子,并设法找出他们有什么共同的特征和规律,设计新的特征,想办法改进它。
6.1. 不对称性分类的误差评估
对于一个分类问题,例如分类某肿瘤患者患良性肿瘤还是恶性肿瘤,如果在测试样本中只有0.5%的恶性肿瘤,那么即使预测的正确率是99.5%,这个算法也不见得多好,因为即使这个算法只是把所有肿瘤患者都预测为良性肿瘤,那么正确率也有99.5%。这种分类问题称为偏斜类或者不对称性分类。 这种算法不能简单地用预测准确性来评估算法的好坏,下面引入几个评价这类算法的指标:
6.1.1. 查准率和召回率
对于二分类问题,y=1 是我们想要预测的==稀有== 类别(即该类别在所给样本中比较少出现)。
如图,如果某个类分类结果为1,如果算法预测结果也为1,称为真阳性,如果算法预测结果为0,称为假阴性;如果某个类分类结果为0,如果算法预测结果也为0,称为真阴性,如果算法预测结果为1,称为假阳性。
查
准
率
=
真
阳
性
所
有
预
测
阳
性
样
本
=
真
阳
性
真
阳
性
+
假
阳
性
召
回
率
=
真
阳
性
样
本
中
的
阳
性
样
本
数
=
真
阳
性
真
阳
性
+
假
阴
性
\quad\\ 查准率=\frac{真阳性}{所有预测阳性样本}=\frac{真阳性}{真阳性+假阳性}\\\quad\\ 召回率=\frac{真阳性}{样本中的阳性样本数}=\frac{真阳性}{真阳性+假阴性}
查准率=所有预测阳性样本真阳性=真阳性+假阳性真阳性召回率=样本中的阳性样本数真阳性=真阳性+假阴性真阳性
拥有高查准率和高召回率的算法是一个好算法。
6.1.2. 平衡查准率和召回率
对于一个逻辑回归问题,以癌症预测为例,我们之前是设定如果 h θ ( x ) ≥ 0.5 h_\theta(x)\ge0.5 hθ(x)≥0.5 ,判断 y=1,即患癌症;如果 h θ ( x ) ≤ 0.5 h_\theta(x)\le0.5 hθ(x)≤0.5 ,判断 y=0,即为良性肿瘤,这时候的查准率和召回率处在一个平衡的水平。
但如果以上面的方法进行预测,那么很有可能在没有准确把握的情况下将病人诊断为患癌。我们希望只有在有准确把握的情况下将病人诊断为癌症,于是修改算法如下:
当
h
θ
(
x
)
≥
0.9
,
预
测
y
=
1
当
h
θ
(
x
)
≤
0.9
,
预
测
y
=
0
当\quad h_\theta(x)\ge0.9,\quad预测\quad y=1\\ 当\quad h_\theta(x)\le0.9,\quad预测\quad y=0
当hθ(x)≥0.9,预测y=1当hθ(x)≤0.9,预测y=0
这样子的话会导致查准率变高,召回率变低;反之,当我们想要尽可能让所有患癌的患者被正确诊断不错过最佳治疗时期,我们需要将假阴性样本提高,算法修改如下:
当
h
θ
(
x
)
≥
0.3
,
预
测
y
=
1
当
h
θ
(
x
)
≤
0.3
,
预
测
y
=
0
当\quad h_\theta(x)\ge0.3,\quad预测\quad y=1\\ 当\quad h_\theta(x)\le0.3,\quad预测\quad y=0
当hθ(x)≥0.3,预测y=1当hθ(x)≤0.3,预测y=0
这样子的话会导致查准率变低,召回率变高。
正因为查准率和召回率总是以相反的方向发展,有时候我们在选择算法的时候就会产生困扰,如下:
查准率(P) | 召回率(R) | |
---|---|---|
算法1 | 0.5 | 0.4 |
算法2 | 0.7 | 0.1 |
算法3 | 0.02 | 1.0 |
我们可以用一些指标来帮助我们选择:
-
F 1 值 F_1值 F1值
F 1 = 2 P R P + R F_1=2\frac{PR}{P+R} F1=2P+RPR查准率(P) 召回率(R) F 1 值 F_1值 F1值 算法1 0.5 0.4 0.444 算法2 0.7 0.1 0.175 算法3 0.02 1.0 0.0392 选择 F 1 F_1 F1 值最高的。
7. 支持向量机(SVM 或 大间距分类器)
支持向量机就是对于逻辑回归问题得到的损失函数,进行以直线替代曲线,从而起到优化的作用。
从逻辑回归开始一步步演进支持向量机,已知逻辑回归假设函数为:
h
θ
(
x
)
=
1
1
+
e
−
θ
T
x
=
1
1
+
e
z
,
z
=
−
θ
T
x
h_\theta(x)=\frac{1}{1+e^{-\theta^Tx}}=\frac{1}{1+e^z},\quad z=-\theta^Tx
hθ(x)=1+e−θTx1=1+ez1,z=−θTx
损失函数cost(x)为:
C
o
s
t
(
h
θ
(
x
)
,
y
)
=
−
y
∗
l
o
g
(
h
θ
(
x
)
)
−
(
1
−
y
)
l
o
g
(
1
−
h
θ
(
x
)
)
Cost(h_\theta(x),y)=-y*log(h_\theta(x))-(1-y)log(1-h_\theta(x))
Cost(hθ(x),y)=−y∗log(hθ(x))−(1−y)log(1−hθ(x))
建立
z
—
—
C
o
s
t
(
h
θ
(
x
)
,
y
)
z——Cost(h_\theta(x),y)
z——Cost(hθ(x),y) 坐标系:
左图为 y=1 时得到的图像,右图是 y=0 时得到的图像。可以看到该函数为一条曲线,我们用两条直线可以得到与图中一条曲线差不多的图像,分别将左图由直线组成的函数称为 c o s t 1 ( z ) cost_1(z) cost1(z) ,将右图由直线组成的函数称为 c o s t 0 ( z ) cost_0(z) cost0(z) 。
7.1. 构建支持向量机
逻辑回归整体优化目标如下:
m
i
n
θ
1
m
[
∑
i
=
1
m
y
(
i
)
(
−
l
o
g
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
(
(
−
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
)
)
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
min_\theta \frac{1}{m}\left[ \sum_{i=1}^my^{(i)}(-logh_\theta(x^{(i)})) + (1-y^{(i)})((-log(1-h_\theta(x^{(i)}))) \right] + \frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
minθm1[i=1∑my(i)(−loghθ(x(i)))+(1−y(i))((−log(1−hθ(x(i))))]+2mλj=1∑nθj2
根据图 7-1 我们做如下变换:
将
−
l
o
g
h
θ
(
x
(
i
)
)
替
换
为
c
o
s
t
1
(
θ
T
x
(
i
)
)
将
−
l
o
g
(
1
−
h
θ
(
x
(
i
)
)
替
换
为
c
o
s
t
0
(
θ
T
x
(
i
)
)
将\quad-logh_\theta(x^{(i)})\quad替换为\quad cost_1(\theta^Tx^{(i)})\\ 将\quad-log(1-h_\theta(x^{(i)})\quad替换为\quad cost_0(\theta^Tx^{(i)})
将−loghθ(x(i))替换为cost1(θTx(i))将−log(1−hθ(x(i))替换为cost0(θTx(i))
继续做如下改动:
- 由于在逻辑回归代价函数中, 1 m \frac{1}{m} m1 只是一个常数,把它去掉并不会影响代价函数求偏导的结果,因此一般支持向量机把 1 m \frac{1}{m} m1 去掉;
- 支持向量机的正则化一般不采用在正则化项 采用正则化参数 λ \lambda λ ,而是在被正则化项 采用参数 C 进行正则化。这在本质上没什么区别,只是写法上的不同,C 在这里的作用类似于 1 λ \frac{1}{\lambda} λ1 。
得到支持向量机SVM整体优化目标函数:
m
i
n
θ
C
∑
i
=
1
m
[
y
(
i
)
c
o
s
t
1
(
θ
T
x
(
i
)
)
+
(
1
−
y
(
i
)
)
c
o
s
t
0
(
θ
T
x
(
i
)
)
]
+
1
2
∑
j
=
1
n
θ
j
2
min_\theta C\sum_{i=1}^m \left[ y^{(i)}cost_1(\theta^Tx^{(i)})+(1-y^{(i)})cost_0(\theta^Tx^{(i)}) \right] + \frac{1}{2}\sum_{j=1}^n\theta_j^2
minθCi=1∑m[y(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i))]+21j=1∑nθj2
支持向量机并不会输出概率,而是进行直接的预测,打个比方,对于图 7-1,我们可以做出如下预测:
h θ ( x ) { 1 , θ T x ≥ 1 0 , θ T x ≤ − 1 h_\theta(x) \begin{cases} 1\quad,\quad \theta^Tx\ge1\\ 0\quad,\quad \theta^Tx\le-1 \end{cases} hθ(x){1,θTx≥10,θTx≤−1
7.2. 核函数
我们可以通过改造支持向量机来构造复杂的非线性分类器,这需要用到核函数。
如果我们要对以下非线性模型进行分类:
根据逻辑回归的做法是:
构
造
假
设
函
数
:
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
θ
3
x
1
x
2
+
θ
4
x
1
2
+
θ
5
x
2
2
+
.
.
.
根
据
假
设
函
数
判
断
类
别
:
h
θ
(
x
)
=
{
1
,
h
θ
≥
0
0
,
h
θ
<
0
构造假设函数: h_\theta(x)=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_1x_2+\theta_4x_1^2+\theta_5x_2^2+...\\ 根据假设函数判断类别:h_\theta(x)= \begin{cases} 1,\quad h_\theta\ge0\\ 0,\quad h_\theta\lt0 \end{cases}
构造假设函数:hθ(x)=θ0+θ1x1+θ2x2+θ3x1x2+θ4x12+θ5x22+...根据假设函数判断类别:hθ(x)={1,hθ≥00,hθ<0
7.2.1. 基于核函数的分类问题
构造假设函数:
h
θ
(
f
)
=
θ
0
+
θ
1
f
1
+
θ
2
f
2
+
θ
3
f
3
+
.
.
.
根
据
假
设
函
数
判
断
类
别
:
h
θ
(
f
)
=
{
1
,
h
θ
(
f
)
≥
0
0
,
h
θ
(
f
)
<
0
h_\theta(f)=\theta_0+\theta_1f_1+\theta_2f_2+\theta_3f_3+...\\ 根据假设函数判断类别:h_\theta(f)= \begin{cases} 1,\quad h_\theta(f)\ge0\\ 0,\quad h_\theta(f)\lt0 \end{cases}
hθ(f)=θ0+θ1f1+θ2f2+θ3f3+...根据假设函数判断类别:hθ(f)={1,hθ(f)≥00,hθ(f)<0
f 值表示我们用来描述给定初始特征变量 x 与我们所给定的坐标 l (landmarks) 的接近程度:
f
i
=
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
i
)
)
=
k
(
x
,
l
(
i
)
)
=
e
x
p
(
−
∥
x
−
l
(
i
)
∥
2
2
σ
2
)
=
e
x
p
(
−
∑
j
=
1
n
(
x
j
−
l
j
(
i
)
)
2
2
σ
2
)
\begin{aligned} f_i &=similarity(x,l^{(i)})=k(x,l^{(i)})=exp(-\frac{\parallel x-l^{(i)}\parallel^2}{2\sigma^2})\\ &=exp(-\frac{\sum_{j=1}^n(x_j-l_j^{(i)})^2}{2\sigma^2}) \end{aligned}
fi=similarity(x,l(i))=k(x,l(i))=exp(−2σ2∥x−l(i)∥2)=exp(−2σ2∑j=1n(xj−lj(i))2)
这里
∥
a
−
b
∥
\parallel a-b \parallel
∥a−b∥ 表示 a 到 b 两点间距离,
s
i
m
i
l
a
r
i
t
y
(
x
,
l
(
i
)
)
similarity(x,l^{(i)})
similarity(x,l(i)) 和
k
(
x
,
l
(
i
)
)
k(x,l^{(i)})
k(x,l(i)) 称为核函数 。本例中的核函数为高斯核函数 ,没有核函数的支持向量机也称为线性核函数的向量机 。
对于
f
i
f_i
fi 有如下性质:
如
果
x
≈
l
(
i
)
,
f
i
≈
1
如
果
x
远
大
于
或
远
小
于
l
(
i
)
,
f
i
≈
0
如果\quad x\approx l^{(i)},\quad f_i\approx1\\ 如果\quad x\quad远大于或远小于\quad l^{(i)},\quad f_i\approx0\\
如果x≈l(i),fi≈1如果x远大于或远小于l(i),fi≈0
如图7-3, σ \sigma σ 值越大,特征变量值 f 随着 x 与 l 距离的变化越缓慢;反之则反。
由核函数根据输入的初始特征变量 x 和我们选择的标记点 l 计算的到的假设函数 h θ ( f ) h_\theta(f) hθ(f) 的每一个特征变量 f,带入假设函数 h θ ( f ) h_\theta(f) hθ(f) 并预测输入样本属于哪一类。
7.2.2. 如何选择标记点 l
假设我们由m个测试样本,我们只需要在每个测试样本相同的位置设置标记点,总共设置m 个标记点。这样的话假设有 m 个样本,我们的假设函数就有 m 个 f,m+1 个 θ \theta θ 。
7.2.3. 整体优化目标
m i n θ C ∑ i = 1 m [ y ( i ) c o s t 1 ( θ T f ( i ) ) + ( 1 − y ( i ) ) c o s t 0 ( θ T f ( i ) ) ] + 1 2 ∑ j = 1 m θ j 2 min_\theta C\sum_{i=1}^m \left[ y^{(i)}cost_1(\theta^Tf^{(i)})+(1-y^{(i)})cost_0(\theta^Tf^{(i)}) \right] + \frac{1}{2}\sum_{j=1}^{m}\theta_j^2 minθCi=1∑m[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+21j=1∑mθj2
核函数的想法理论上可以用于其他的算法,但由于总总原因,核函数在其他算法无法很好推广,比如核函数结合逻辑回归会变得很慢。
7.2.4. 线性核函数与高斯核函数的选择
已知特征数量 n,训练样本数量 m:
- 如果 n ≫ m n\gg m n≫m ,选择线性核函数。(eg. n=10,000 m=10-1000)
- 如果 n ≈ m n\approx m n≈m ,选择高斯核函数。(eg. n=1-1000 m=10-10,000)
- 如果 n ≪ m n\ll m n≪m ,选择逻辑回归或者线性核函数的SVM。(eg. n=1-1000 m=50,000+)
逻辑回归和线性核函数往往做着相似的事情,得到相似的结果。
8. 无监督学习
8.1. 聚类算法之 K-Means 算法(K 均值算法)
8.1.1. 用到的符号汇总
K : 表示我们要分类的种类个数;
c ( i ) c^{(i)} c(i) : 当前样本 x ( i ) x^{(i)} x(i) 所属的簇的索引或者序号;
μ k \mu_k μk : 表示当前第 k 个聚类的中心位置( k ∈ { 1 , 2 , . . . , K } k\in\{1,2,...,K\} k∈{1,2,...,K} );
μ c ( i ) \mu_{c^{(i)}} μc(i) : 当前样本 x ( i ) x^{(i)} x(i) 所属的簇的索引代表的聚类的中心位置。
8.1.2. 算法思路
K-Means 中的 K 表示我们要分类的种类个数
-
思路详解
假设我们打算将输入样本分为两个类,即 K=2。K-Means 算法在刚开始随机生成两个坐标点,这两个坐标点代表两个类。
接下来进入迭代过程:
- 遍历所有样本,计算每个样本与这些坐标点的距离,并将样本点归为与它距离最短的坐标点的那一类;
- 移动坐标点,坐标点的位置是属于该坐标点的所有样本的平均值;
- 迭代第一步和第二步,知道坐标点的位置不再移动。
-
伪代码如下:
R e p e a t { f o r i = 1 t o m c ( i ) : = 第 1 到 K 个 聚 簇 索 引 离 x ( i ) 最 近 的 一 个 索 引 值 f o r k = 1 t o K μ k : = 第 k 个 聚 簇 中 所 有 样 本 点 的 平 均 值 \begin{aligned} Repeat\{&\\ &for\quad i=1\quad to\quad m\\ &\quad\quad c^{(i)}:=第1到K个聚簇索引离x^{(i)}最近的一个索引值\\ &for\quad k=1\quad to\quad K\\ &\quad\quad \mu_k:=第k个聚簇中所有样本点的平均值 \end{aligned} Repeat{fori=1tomc(i):=第1到K个聚簇索引离x(i)最近的一个索引值fork=1toKμk:=第k个聚簇中所有样本点的平均值
8.1.3. 优化目标函数
J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) = 1 m ∑ i = 1 m ∥ x ( i ) − μ c ( i ) ∥ 2 min c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ K ) J(c^{(1)},...,c^{(m)},\mu_1,...,\mu_K)=\frac{1}{m}\sum^m_{i=1}\parallel x^{(i)}-\mu_{c^{(i)}}\parallel^2\\ \min_{c^{(1)},...,c^{(m)},\mu_1,...,\mu_K}J(c^{(1)},...,c^{(m)},\mu_1,...,\mu_K) J(c(1),...,c(m),μ1,...,μK)=m1i=1∑m∥x(i)−μc(i)∥2c(1),...,c(m),μ1,...,μKminJ(c(1),...,c(m),μ1,...,μK)
此代价函数也被称为失真代价函数 或者 K均值算法的失真 。
8.1.4. 随机初始化
在随机初始化中我们一般随机选取K个样本点直接作为初始聚簇中心点。
为什么要进行随机初始化:
如图8-2,一眼看上去图中的样本点可以分为两个聚簇,如果随机采用样本中的两个点作为聚簇中心点,很有可能将两个聚簇中心点同时设定在同一个聚簇中,这样就会使算法陷入局部最优。解决这个问题的办法是进行多次随机初始化,找到学习结果最好的初始化聚簇中心点,如下:
8.1.5. 选取聚类数量 K —— “肘部法则”
大多数时候聚类数量 K还是通过我们自己手动选取,但吴恩达老师在这里介绍了“肘部法则”。
作出代价函数 J 随着聚簇数量的变化的曲线,然后选取函数的畸变点(导数变化最大的点,如图8-3左图,因很像一个肘部而得名),这个点就是我们想要的聚簇分类数量最合理的点。
但大多数时候“肘部函数”会像图8-3右图那样看不出肘部在哪里,这时肘部法则的缺陷。
9. 降维
9.1. 降维作用——数据压缩
如果一个数据集有多个特征,且多个特征之间存在某种相关性,这样我们可以把这些具有相关性的特征通过降低维度来进行数据的压缩,以达到减少特征冗余的目的。
将数据从二维降到一维:
将数据从三维降到二维:
9.2. 降维作用——可视化
如果一个数据集包含50个特征,那么它的特征是五十维的,我们很难绘制五十维的图像来表示该数据集中的每一个样本。但如果我们把这个数据集的50个特征压缩为2个特征,那么我们可以在二维图像上清晰地看到每个样本点的分布,这样有助于我们分析问题。
9.3. 降维算法——主成分分析方法(PCA)
PCA算法试图找到一个低维的平面对数据进行投影,以便最小化每个样本点与投影后的对应点之间距离的平方。
二维数据变一维数据:
可以看到各个样本点投影到PCA算法运行后生成的红色线的距离是最短的。
9.3.1. PCA算法和线性回归的比较
左图为线性回归,右图为PCA。虽然两种算法表面上看上去都是对样本点进行拟合。但仔细研究图9-4就会发现,线性回归算法根据样本点所对应的y值拟合直线,而PCA算法根据样本点同拟合直线的距离拟合直线。
9.3.2. 使用主成分分析方法(PCA)
9.3.2.1. 数据预处理
-
对于训练集: x ( 1 ) , x ( 2 ) , . . . , x ( m ) x^{(1)},x^{(2)},...,x^{(m)} x(1),x(2),...,x(m) ;
-
我们先计算这些样本的均值: μ j = 1 m ∑ i = 1 m x j ( i ) \mu_j=\frac{1}{m}\sum_{i=1}^mx_j^{(i)} μj=m1∑i=1mxj(i) ;
-
令: x j ( i ) = x j ( i ) − μ j x_j^{(i)}=x_j^{(i)}-\mu_j xj(i)=xj(i)−μj (这样的好处是能使处理后的样本均值为零);
-
进行特征缩放——均值归一化。
9.3.2.2. PCA计算过程
假设我们要将数据从n维降到k维,我们首先要计算“协方差”:
Σ
=
1
m
∑
i
=
1
n
(
x
(
i
)
)
(
x
(
i
)
)
T
\Sigma=\frac{1}{m}\sum_{i=1}^n(x^{(i)})(x^{(i)})^T
Σ=m1i=1∑n(x(i))(x(i))T
计算矩阵
Σ
\Sigma
Σ 的特征向量,octave公式如下(svd称为奇异值分解):
[
U
,
S
,
V
]
=
s
v
d
(
S
i
g
m
a
)
;
[U,S,V]=svd(Sigma);
[U,S,V]=svd(Sigma);
我们获得矩阵U:
U
=
(
∣
∣
∣
u
(
1
)
u
(
2
)
.
.
.
u
(
n
)
∣
∣
∣
)
∈
R
n
×
n
U= \begin{pmatrix} \mid&\mid&&\mid\\ u^{(1)}&u^{(2)}&...&u^{(n)}\\ \mid&\mid&&\mid \end{pmatrix} \in R^{n\times n}
U=⎝⎛∣u(1)∣∣u(2)∣...∣u(n)∣⎠⎞∈Rn×n
取矩阵U的前k列,将
x
∈
R
n
⟶
z
∈
R
k
x\in R^n\longrightarrow z\in R^k
x∈Rn⟶z∈Rk:
z
(
i
)
=
(
∣
∣
∣
u
(
1
)
u
(
2
)
.
.
.
u
(
k
)
∣
∣
∣
)
T
x
(
i
)
z^{(i)}= \begin{pmatrix} \mid&\mid&&\mid\\ u^{(1)}&u^{(2)}&...&u^{(k)}\\ \mid&\mid&&\mid \end{pmatrix}^Tx^{(i)}
z(i)=⎝⎛∣u(1)∣∣u(2)∣...∣u(k)∣⎠⎞Tx(i)
9.3.3. 选择主成分数量(降低的维度)k
9.3.3.1. 选择标准
概念一:PCA算法的平均投影误差平方:
1
m
∑
i
=
1
m
∥
x
(
i
)
−
x
a
p
p
r
o
x
(
i
)
∥
2
\frac{1}{m}\sum_{i=1}^m\parallel x^{(i)}-x_{approx}^{(i)}\parallel^2
m1i=1∑m∥x(i)−xapprox(i)∥2
概念二:样本数据总方差(所有样本与原点距离的平方):
1
m
∑
i
=
1
m
∥
x
(
i
)
∥
2
\frac{1}{m}\sum^m_{i=1}\parallel x^{(i)}\parallel^2
m1i=1∑m∥x(i)∥2
一般来说,我们会从1开始,尝试选择最小的 k 值使得上述两个概念比值小于等于 0.01(99%的方差性会被保留):
1
m
∑
i
=
1
m
∥
x
(
i
)
−
x
a
p
p
r
o
x
(
i
)
∥
2
1
m
∑
i
=
1
m
∥
x
(
i
)
∥
2
≤
0.01
\frac{\frac{1}{m}\sum_{i=1}^m\parallel x^{(i)}-x_{approx}^{(i)}\parallel^2}{\frac{1}{m}\sum^m_{i=1}\parallel x^{(i)}\parallel^2}\le0.01
m1∑i=1m∥x(i)∥2m1∑i=1m∥x(i)−xapprox(i)∥2≤0.01
9.3.3.2. Octave中的应用
对于公式:
[
U
,
S
,
V
]
=
s
v
d
(
S
i
g
m
a
)
;
[U,S,V]=svd(Sigma);
[U,S,V]=svd(Sigma);
输出矩阵S如下:
S
=
(
s
11
0
.
.
.
0
0
s
22
⋱
⋮
⋮
⋱
⋱
0
0
…
0
s
n
n
)
n
×
n
S= \begin{pmatrix} s_{11}&0&...&0\\ 0&s_{22}&\ddots&\vdots\\ \vdots&\ddots&\ddots&0\\ 0&\dots&0&s_{nn} \end{pmatrix}_{n\times n}
S=⎝⎜⎜⎜⎜⎛s110⋮00s22⋱…...⋱⋱00⋮0snn⎠⎟⎟⎟⎟⎞n×n
则上述选择标准公式可以用如下公式代替:
1
−
∑
i
=
1
k
s
i
i
∑
i
=
1
n
s
i
i
≤
0.01
也
即
:
∑
i
=
1
k
s
i
i
∑
i
=
1
n
s
i
i
≥
0.99
1-\frac{\sum_{i=1}^ks_{ii}}{\sum_{i=1}^ns_{ii}}\le0.01\\\quad\\ 也即:\frac{\sum_{i=1}^ks_{ii}}{\sum_{i=1}^ns_{ii}}\ge0.99
1−∑i=1nsii∑i=1ksii≤0.01也即:∑i=1nsii∑i=1ksii≥0.99
9.3.4. PCA在监督学习中的应用
监督学习中有时候输入样本的特征很多,我们也要想办法把它们减低维度,具体步骤如下:
-
对于监督学习的输入样本(训练集): ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( m ) , y ( m ) ) (x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)}) (x(1),y(1)),(x(2),y(2)),...,(x(m),y(m)) ;
-
我们从中提取输入值 x: x ( 1 ) , x ( 2 ) , . . . , x ( m ) ∈ R n x^{(1)},x^{(2)},...,x^{(m)}\in R^{n} x(1),x(2),...,x(m)∈Rn ;
-
通过PCA算法降维至k维: z ( 1 ) , z ( 2 ) , . . . , z ( m ) ∈ R k z^{(1)},z^{(2)},...,z^{(m)}\in R^{k} z(1),z(2),...,z(m)∈Rk ,并得到降维映射 M a p p i n g x ( i ) → z ( i ) Mapping\quad x^{(i)}\to z^{(i)} Mappingx(i)→z(i);
-
得到新的训练集: ( z ( 1 ) , y ( 1 ) ) , ( z ( 2 ) , y ( 2 ) ) , . . . , ( z ( m ) , y ( m ) ) (z^{(1)},y^{(1)}),(z^{(2)},y^{(2)}),...,(z^{(m)},y^{(m)}) (z(1),y(1)),(z(2),y(2)),...,(z(m),y(m)) ;
-
在训练集上进行训练;
-
将交叉验证集或者测试集通过 M a p p i n g x ( i ) → z ( i ) Mapping\quad x^{(i)}\to z^{(i)} Mappingx(i)→z(i) 降维后检验算法泛化程度。
注意事项:降维映射 M a p p i n g x ( i ) → z ( i ) Mapping\quad x^{(i)}\to z^{(i)} Mappingx(i)→z(i) 只能是在训练集 中通过PCA算法运行得到,不能在交叉验证集或者测试集一起通过PCA算法得到。在训练集中通过PCA算法得到的映射可以用于后期检验泛化程度时交叉训练集或者测试集的降维。
9.3.5. PCA的错误使用
-
使用PCA算法防止过拟合
特征数量太多是导致过拟合的一种原因。即使有时候使用PCA算法看起来可以解决过拟合的问题,但是吴恩达老师不建议这么做,最好的方式还是使用正则化,原因是:
PCA算法对于监督学习样本特征的降维是忽略掉了标签y,我们只是使用输入的 x ( i ) x^{(i)} x(i) 让算法去寻找低维数据来近似。正因如此,PCA算法会舍弃掉一些有价值的信息。
-
在算法设计阶段直接使用PCA
在训练算法的时候我们尽可能使用最原始的数据,只有这么做不能达到目的的情况下,才考虑使用PCA算法。
10. 异常检测问题/算法
异常检测问题主要用在无监督学习。
异常检测问题可以这么理解:给定一些初始的样本,将它们称为一个类C。对于一个输入的新样本,通过算法判断该新样本是否属于类C,如果不属于,则判断该新样本存在异常(也可以这么理解:通过初始的样本训练得到一个阈值,如果新样本超出这个阈值,这判断该样本为异常样本)。
异常检测问题应用的场景是:飞机引擎的异常检测、购物网站行为不寻常用户检测、数据中心监控哪台计算机出现异常。
10.1. 高斯分布/正态分布(Gaussian(Normal) distribution)
如果一个实数x的概率符合高斯分布(标准差为 σ \sigma σ ,均值为 μ \mu μ ,方差为 σ 2 \sigma^2 σ2 ),我们把它记作 x ≈ N ( μ , σ 2 ) x\approx N(\mu,\sigma^2) x≈N(μ,σ2) 。
如图10-1,高斯分布中均值 μ \mu μ 控制曲线的中心位置, σ \sigma σ 控制曲线的宽度。
高斯分布的数学公式:
p
(
x
;
μ
,
σ
2
)
=
1
2
π
σ
e
x
p
(
−
(
x
−
μ
)
2
2
σ
2
)
p(x;\mu,\sigma^2)=\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(x-\mu)^2}{2\sigma^2})
p(x;μ,σ2)=2πσ1exp(−2σ2(x−μ)2)
10.1.1. 参数估计
对于给定的数据集,假设通过观察我们认为这些数据集的分布大致符合高斯分布。那么我们可以计算该数据集所对应的高斯分布的参数:
μ
=
1
m
∑
i
=
1
m
x
(
i
)
σ
2
=
1
m
∑
i
=
1
m
(
x
(
i
)
−
μ
)
2
\mu=\frac{1}{m}\sum^m_{i=1}x^{(i)}\\ \sigma^2=\frac{1}{m}\sum^m_{i=1}(x^{(i)}-\mu)^2
μ=m1i=1∑mx(i)σ2=m1i=1∑m(x(i)−μ)2
10.2. 异常检测算法
对于训练集
{
x
(
1
)
,
.
.
.
,
x
(
m
)
}
\{x^{(1)},...,x^{(m)}\}
{x(1),...,x(m)} ,对于训练集中每一个训练样本x都是一个n维向量。我们假设训练样本每一个特征值
x
i
x_i
xi 都符合某种正态分布,有:
p
(
x
)
=
p
(
x
1
;
μ
1
,
σ
1
2
)
p
(
x
2
;
μ
2
,
σ
2
2
)
p
(
x
3
;
μ
3
,
σ
3
2
)
.
.
.
p
(
x
n
;
μ
n
,
σ
n
2
)
=
∏
j
=
1
n
p
(
x
j
;
μ
j
,
σ
j
2
)
\begin{aligned} p(x)&=p(x_1;\mu_1,\sigma_1^2)p(x_2;\mu_2,\sigma_2^2)p(x_3;\mu_3,\sigma_3^2)...p(x_n;\mu_n,\sigma_n^2)\\ &=\prod^n_{j=1}p(x_j;\mu_j,\sigma_j^2) \end{aligned}
p(x)=p(x1;μ1,σ12)p(x2;μ2,σ22)p(x3;μ3,σ32)...p(xn;μn,σn2)=j=1∏np(xj;μj,σj2)
得到异常检测算法一般步骤:
- 选择可以帮我们指出那些反常样本的特征值;
- 对所选特征值进行参数估计得到 μ \mu μ 和 σ \sigma σ ;
- 对于给定的新样本,通过上述式子计算它的正态分布概率,并与我们我设定的阈值 ε \varepsilon ε 作比较。如果 p ( x ) < ε p(x)\lt\varepsilon p(x)<ε ,则判断该样本异常。
10.3. 评估异常检测算法
对于异常检测算法,我们要有一个评估算法好坏的标准,最好是可以通过一个实数评价指标告诉我们算法的好坏。
10.3.1. 评估思路
我们在对异常检测算法进行评估时,需要用到带标签的数据,将训练后的模型对这些带标签数据的标签预测值和带标签数据的真实标签做对比,就可以帮助我们评估一个算法的好坏。
这边给出一个例子,假设我们在评估检测飞机引擎异常的算法,这个算法中带标签的样本为:
正
常
的
引
擎
样
本
:
10000
异
常
的
引
擎
样
本
:
20
正常的引擎样本:10000\\ 异常的引擎样本:20
正常的引擎样本:10000异常的引擎样本:20
我们将这些样本分为训练集、交叉验证集、测试集,分类结果如下:
训
练
集
:
6000
个
正
常
样
本
交
叉
验
证
集
:
2000
个
正
常
样
本
和
10
个
异
常
样
本
测
试
集
:
2000
个
正
常
样
本
和
10
个
异
常
样
本
训练集:6000个正常样本\\ 交叉验证集:2000个正常样本和10个异常样本\\ 测试集:2000个正常样本和10个异常样本
训练集:6000个正常样本交叉验证集:2000个正常样本和10个异常样本测试集:2000个正常样本和10个异常样本
步骤如下:
-
将训练集中的样本用高斯分布拟合,并训练出模型p(x);
-
将训练好的模型用来预测交叉验证集或者测试集中的样本;
-
对预测结果进行评估,常用的手段是第6.1.1章讲到的 F 1 F_1 F1 值;
由于异常检测问题一般异常的样本较少,因此我们不能直接用以下方法:
样 本 预 测 正 确 数 总 样 本 数 \quad\\ \frac{样本预测正确数}{总样本数} 总样本数样本预测正确数
因为这样往往得到很高的正确率。 -
我们可以在交叉验证集训练模型选择合适的参数 ε \varepsilon ε 。
10.4. 异常检测算法 vs 监督学习
如果我们拥有足够多的带标签样本,那么看起来好像异常检测算法可以用监督学习中的分类问题替代,但实际上这两种算法的应用场景有所不同。
假设某个样本集中样本分为两类,我们规定正样本为y=1的样本,负样本为y=0的样本,这时可以根据下表选择算法:
异常检测算法 | 监督学习 |
---|---|
正样本个数很少,负样本个数很多 | 正样本和负样本的个数都很多 |
经常会有很多类型的异常,并且未来的异常有很多我们未知,我们很难通过小样本的异常去学习异常是什么 | 我们有足够的正样本,并且未来出现的正样本与我们现在存在的样本类似 |
如果一个样本正样本很少(如检测飞机引擎异常,正样本数为20,负样本数为10000),那么对于监督学习,很难从这些正样本中学习到足够的知识。
10.5. 设计异常检测算法的特征
10.5.1. 特征变换
在进行异常检测时,有些特征并不服从正态分布,这时候我们可以将这些特征做一系列数学变换得到符合正态分布的新特征。这些数学特征可以是:
x
′
=
l
o
g
(
x
)
,
x
′
=
x
,
.
.
.
x'=log(x),x'=\sqrt{x},...
x′=log(x),x′=x,...
10.5.2. 增加特征
在训练异常检测算法时,我们希望对于正常样本的p(x)尽量大,异常样本的p(x)尽量小。但很多时候正常样本和异常样本的p(x)是模糊的,比如都很大,这样就导致算法很可能对样本误判。
我们可以通过对误判的样本进行分析,提取出误判样本中新的特征,增加特征的维度,从而提高检测算法的预测准确度。
10.5.3. 特征组合
这里吴恩达老师举了个例子,假设某数据中心要对计算机集群进行异常检测,假设有特征为: x 1 x_1 x1 :CPU负载、 x 2 x_2 x2 :网络流量。如果我想监测这些计算机执行代码的时候陷入了死循环的情况,根据执行代码陷入死循环时CPU负载很大但网络流量很小,这时我可以增加一个新特征 x 3 = x 1 x 2 x_3=\frac{x_1}{x_2} x3=x2x1 ,用来检测执行代码陷入死循环的异常。
10.6. 多元高斯分布/多元正态分布
正如第10.5.2章所描述的,我们可以增加特征的维度来更好地提高检测算法的预测准确度。假设某训练样本集包含两个特征,之前的做法是将两个特征的概率分别用两个正态分布拟合,这样可能会导致预测的结果是错误的,因为两个变量之间正相关或者负相关的关可能也会影响异常检测的结果。
多元高斯分布的优势是描述两个变量之间可能存在正相关或者负相关的情况。
多元高斯分布前期的输入参数构建:
- 假设样本有n个特征,则特征向量 x ∈ R n x\in R^n x∈Rn 。我们不再将这些特征的概率单独看成独立的正态分布(e.g. p ( x 1 ) , p ( x 2 ) , . . . p(x_1),p(x_2),... p(x1),p(x2),...),而是将所有特征值建立统一概率模型 p(x);
- 参数有: μ ∈ R n \mu\in R^n μ∈Rn ,协方差矩阵: Σ ∈ R n × n \Sigma\in R^{n\times n} Σ∈Rn×n 。
多元高斯分布数学公式:
p
(
x
;
μ
,
Σ
)
=
1
(
2
π
)
n
/
2
∣
Σ
∣
1
2
e
x
p
(
−
1
2
(
x
−
μ
)
T
Σ
−
1
(
x
−
μ
)
)
p(x;\mu,\Sigma)=\frac{1}{(2\pi)^{n/2}\mid\Sigma\mid^{\frac{1}{2}}}exp(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu))
p(x;μ,Σ)=(2π)n/2∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ))
多元高斯分布图像由均值
μ
\mu
μ 和协方差矩阵
Σ
\Sigma
Σ 决定,其中
μ
\mu
μ 决定多元高斯分布的中心点位置, 图像随
Σ
\Sigma
Σ 变化如下:
10.7. 使用多远高斯分布的异常检测
10.7.1. 步骤
假设我们有训练集: { x ( 1 ) , x ( 2 ) , . . . , x ( m ) } \{x^{(1)},x^{(2)},...,x^{(m)}\} {x(1),x(2),...,x(m)}
-
假设训练集特征符合多元高斯分布,则我们可以通过训练集得到多元高斯分布参数:
μ = 1 m ∑ i = 1 m x ( i ) Σ = 1 m ∑ i = 1 m ( x ( i ) − μ ) ( x ( i ) − μ ) T \mu=\frac{1}{m}\sum^m_{i=1}x^{(i)}\\ \Sigma=\frac{1}{m}\sum_{i=1}^m(x^{(i)}-\mu)(x^{(i)}-\mu)^T μ=m1i=1∑mx(i)Σ=m1i=1∑m(x(i)−μ)(x(i)−μ)T -
对于一个给定的新样本x,计算:
p ( x ) = 1 ( 2 π ) n / 2 ∣ Σ ∣ 1 2 e x p ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) ) p(x)=\frac{1}{(2\pi)^{n/2}\mid\Sigma\mid^{\frac{1}{2}}}exp(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu)) p(x)=(2π)n/2∣Σ∣211exp(−21(x−μ)TΣ−1(x−μ)) -
将 p(x) 与我们设定的阈值 ε \varepsilon ε 作比较,如果 p ( x ) < ε p(x)\lt\varepsilon p(x)<ε ,则判断该样本为异常样本。
10.7.2. 多元高斯分布与多个一元高斯分布
10.7.2.1. 区别
多个一元高斯分布其实是多元高斯分布的一种特殊情况,多个一元高斯分布的图像是轴对称的(如图10-7,对于两个特征的样本,多个一元高斯分布是关于x轴和y轴堆成,而多元高斯分布可以关于 y=x 对称)。
数学上看多个一元高斯分布的协方差矩阵是一个对角矩阵,形如:
Σ
=
(
σ
1
2
0
.
.
.
0
0
σ
2
2
⋱
⋮
⋮
⋱
⋱
0
0
…
0
σ
n
2
)
\Sigma= \begin{pmatrix} \sigma^2_1&0&...&0\\ 0&\sigma^2_2&\ddots&\vdots\\ \vdots&\ddots&\ddots&0\\ 0&\dots&0&\sigma^2_n \end{pmatrix}
Σ=⎝⎜⎜⎜⎜⎛σ120⋮00σ22⋱…...⋱⋱00⋮0σn2⎠⎟⎟⎟⎟⎞
10.7.2.2. 如何选择
原始高斯分布 | 多元高斯分布 |
---|---|
常用 | 比较少用 |
想通过异常的组合值监测样本可以使用10.5.3章方法 | 想通过异常的组合值监测样本更推荐 使用多元高斯分布,它可以捕捉这些关系 |
计算成本低,适合巨大规模的特征数量n(e.g. n=10,000/n=100,000) | 需要计算协方差矩阵,计算代价大 |
即使训练样本数量少效果也不错 | 至少需要保证 m > n m\gt n m>n ,或者保证协方差可逆(吴恩达老师表示他只有在 m ≥ 10 n m\ge 10n m≥10n 时才会使用) |
如果在使用多远高斯分布时发现 Σ \Sigma Σ 不可逆(奇异),那么最大的可能是:
- m ≤ n m\le n m≤n ;
- 存在冗余的特征(特征间线性相关),如: x 1 = x 2 , x 3 = x 4 + x 5 x_1=x_2,x_3=x_4+x_5 x1=x2,x3=x4+x5 。
11. 推荐系统
顾名思义,推荐系统根据用户的浏览网页的足迹或者对某种评价指标向用户推荐尽可能符合用户兴趣的内容。
11.1. 入门例子
推荐系统例子如下:
有一个电影推荐系统根据用户评分给用户推送用户更感兴趣的内容,评分等级为0到5分,下面是4位用户对5部电影的评分详情,?表示没有进行评分
11.1.1. 用到的符号汇总
- n u n_u nu : 表示用户的数量;
- n m n_m nm : 表示电影的数量;
- r ( i , j ) r(i,j) r(i,j) : 表示用户j是否对电影i进行评分(1表示已评分);
- y ( i , j ) y^{(i,j)} y(i,j) : 表示用户j对电影i的评分;
- m ( j ) m^{(j)} m(j) : 用户j所评价的所有电影总数;
- θ ( j ) \theta^{(j)} θ(j) : 用户j对每一类电影的喜好程度。
假设每部电影都有两个特征,一个是爱情片特征,一个是动作片特征,如图11-2:
我们首先要预测图11-2用户粉红笔圈出的用户未评分的项:
我们要加一个截距向量 x 0 = 1 x_0=1 x0=1 ,得到每部电影的特征向量 x ( i ) = ( x 0 x 1 x 2 ) x_{(i)}=\begin{pmatrix} x_0\\x_1\\x_2 \end{pmatrix} x(i)=⎝⎛x0x1x2⎠⎞ 。那么同线性回归类似,对于每一个输入样本(用户j对电影的评分),我们需要学习参数 θ ( j ) ∈ R n + 1 \theta^{(j)}\in R^{n+1} θ(j)∈Rn+1 ,得到的是用户对所有电影的偏好向量,然后再用得到的偏好向量预测用户j对新电影i的评分,具体通过 ( θ ( j ) ) T x ( i ) (\theta^{(j)})^Tx^{(i)} (θ(j))Tx(i) 。
11.1.2. 优化目标函数
min θ ( 1 ) , θ ( 2 ) , . . . , θ ( n u ) 1 2 ∑ j = 1 n u ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T ( x ( i ) ) − y ( i , j ) ) 2 + λ 2 ∑ j = 1 n u ∑ k = 1 m ( θ k ( j ) ) 2 \min_{\theta^{(1)},\theta^{(2)},...,\theta^{(n_u)}}\frac{1}{2}\sum^{n_u}_{j=1}\sum_{i:r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)^2+\frac{\lambda}{2}\sum^{n_u}_{j=1}\sum^m_{k=1}(\theta_k^{(j)})^2 θ(1),θ(2),...,θ(nu)min21j=1∑nui:r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2λj=1∑nuk=1∑m(θk(j))2
公式中 ∑ i : r ( i , j ) = 1 \sum_{i:r(i,j)=1} ∑i:r(i,j)=1 表示只对用户评价过的电影评分进行求和。
11.1.3. 梯度下降
{ θ k ( j ) : = θ k ( j ) − α ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T ( x ( i ) ) − y ( i , j ) ) x k ( i ) , k = 0 θ k ( j ) : = θ k ( j ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T ( x ( i ) ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) ) , k ≠ 0 \begin{cases} \theta_k^{(j)}:=\theta_k^{(j)}-\alpha\sum_{i:r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)x_k^{(i)},\quad k=0\\ \theta_k^{(j)}:=\theta_k^{(j)}-\alpha\Big(\sum_{i:r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)x_k^{(i)}+\lambda\theta^{(j)}_k\Big),\quad k\neq 0 \end{cases} {θk(j):=θk(j)−α∑i:r(i,j)=1((θ(j))T(x(i))−y(i,j))xk(i),k=0θk(j):=θk(j)−α(∑i:r(i,j)=1((θ(j))T(x(i))−y(i,j))xk(i)+λθk(j)),k=0
11.2. 协同过滤(Collaborative filter)入门
协同过滤指当执行算法时,要观察大量用户的实际行为来协同地得到更佳的每个人对于某种内容的评分值(每个人对电影的评分值)。协同的另一层意思是系统中每一位用户都在帮助算法更好地进行特征学习。
对于上述第11.1中的例子,我们通过每部电影的特征值x以及用户的对某些电影的具体评分训练出用户的偏好向量 θ \theta θ ,但是很多时候我们很难通过人们去观看然后告诉我们这部电影包含多少爱情,包含多少动作。
这时我们换一种思路。假设每个用户在注册系统的时候都告诉我们他们对所有类型电影的偏好程度向量 θ \theta θ ,那么结合他们对某些电影的具体评分我们可以预测每部电影的特征,比如爱情占多少,动作占多少。
11.2.1. 部分优化目标函数
假设给定
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
\theta^{(1)},...,\theta^{(n_u)}
θ(1),...,θ(nu),学习
x
(
i
)
x^{(i)}
x(i) :
min
x
(
1
)
,
.
.
.
,
x
(
n
m
)
1
2
∑
i
=
1
n
m
∑
j
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
(
x
(
i
)
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
i
)
)
2
\min_{x^{(1)},...,x^{(n_m)}}\frac{1}{2}\sum_{i=1}^{n_m}\sum_{j:r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)^2+\frac{\lambda}{2}\sum^{n_m}_{i=1}\sum^n_{k=1}(x_k^{(i)})^2
x(1),...,x(nm)min21i=1∑nmj:r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2λi=1∑nmk=1∑n(xk(i))2
11.3. 总结
第11.1章和第11.2章所描述的两种算法,主要的输入输出都是 x , θ x,\theta x,θ ,不同的是第11.1章是利用输入x推出 θ \theta θ ,协同过滤是利用 θ \theta θ 推 x 。这其实是一个鸡生蛋蛋生鸡的问题。
这不是一蹴而就,而是一个迭代过程。比如对于协同过滤,通过
θ
\theta
θ 训练生成 x,然后结合用户对电影新的点评,通过x生成
θ
\theta
θ ,如此循环往复。
第
11.1
算
法
:
x
→
θ
→
x
→
.
.
.
协
同
过
滤
:
θ
→
x
→
θ
→
.
.
.
第11.1算法:x\to\theta\to x\to...\\ 协同过滤:\theta\to x\to\theta\to...
第11.1算法:x→θ→x→...协同过滤:θ→x→θ→...
11.4. 协同过滤算法
第11.1章和11.2章分别讲述了从x 到 θ \theta θ 以及从 θ \theta θ 到x的预测算法,但是正如第11.3章所说,一个推荐系统是由 x 推出 θ \theta θ 和由 θ \theta θ 推出x的循环往复的过程。这就需要有一个算法能够同时 完成这两项工作,而不是轮流运行这两个算法。
11.4.1. 完整优化目标函数
J ( x ( 1 ) , . . . , x ( n m ) , θ ( 1 ) , . . . , θ ( n u ) ) = 1 2 ∑ ( i , j ) : r ( i , j ) = 1 ( ( θ ( j ) ) T ( x ( i ) ) − y ( i , j ) ) 2 + λ 2 ∑ i = 1 n m ∑ k = 1 n ( x k ( i ) ) 2 + λ 2 ∑ j = 1 n u ∑ k = 1 m ( θ k ( j ) ) 2 , min x ( 1 ) , . . . , x ( n m ) , θ ( 1 ) , . . . , θ ( n u ) J ( x ( 1 ) , . . . , x ( n m ) , θ ( 1 ) , . . . , θ ( n u ) ) J(x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta{(n_u)})=\frac{1}{2}\sum_{(i,j):r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)^2 \\+\frac{\lambda}{2}\sum^{n_m}_{i=1}\sum^n_{k=1}(x_k^{(i)})^2+\frac{\lambda}{2}\sum^{n_u}_{j=1}\sum^m_{k=1}(\theta_k^{(j)})^2,\\ \min_{x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta{(n_u)}}J(x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta{(n_u)}) J(x(1),...,x(nm),θ(1),...,θ(nu))=21(i,j):r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2λi=1∑nmk=1∑n(xk(i))2+2λj=1∑nuk=1∑m(θk(j))2,x(1),...,x(nm),θ(1),...,θ(nu)minJ(x(1),...,x(nm),θ(1),...,θ(nu))
在入门例子中提到的电影特征补充一个截距特征 x 0 = 1 x_0=1 x0=1,使得 x ∈ R n + 1 x\in R^{n+1} x∈Rn+1 ,如果以完整的协同过滤算法进行训练,那么我们则需要省略截距特征,此时电影的特征向量 x ∈ R n x\in R^n x∈Rn ,相应的用户偏好程度向量 θ ∈ R n \theta\in R^n θ∈Rn 。
11.4.2. 梯度下降
x k ( j ) : = x k ( j ) − α ( ∑ j : r ( i , j ) = 1 ( ( θ ( j ) ) T ( x ( i ) ) − y ( i , j ) ) θ k ( j ) + λ x k ( i ) ) θ k ( j ) : = θ k ( j ) − α ( ∑ i : r ( i , j ) = 1 ( ( θ ( j ) ) T ( x ( i ) ) − y ( i , j ) ) x k ( i ) + λ θ k ( j ) ) x_k^{(j)}:=x_k^{(j)}-\alpha\Big(\sum_{j:r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)\theta_k^{(j)}+\lambda x^{(i)}_k\Big) \\ \theta_k^{(j)}:=\theta_k^{(j)}-\alpha\Big(\sum_{i:r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)x_k^{(i)}+\lambda\theta^{(j)}_k\Big) xk(j):=xk(j)−α(j:r(i,j)=1∑((θ(j))T(x(i))−y(i,j))θk(j)+λxk(i))θk(j):=θk(j)−α(i:r(i,j)=1∑((θ(j))T(x(i))−y(i,j))xk(i)+λθk(j))
11.5. 协同过滤算法的向量化实现
协同过滤算法的向量化实现可以帮我们找到特征相似的样本。(如电影推荐系统,用户对一部电影给予高评价后我们希望找出与这部电影类似的电影推荐给用户)
如电影推荐系统,我们将算法对不同用户对不同电影的预测评价写入预测矩阵Y(假设表中的数值均为预测值):
矩阵Y所对应的含义是:
Y
=
(
(
θ
(
1
)
)
T
(
x
(
1
)
)
(
θ
(
2
)
)
T
(
x
(
1
)
)
…
(
θ
(
n
u
)
)
T
(
x
(
1
)
)
(
θ
(
1
)
)
T
(
x
(
2
)
)
(
θ
(
2
)
)
T
(
x
(
2
)
)
…
(
θ
(
n
u
)
)
T
(
x
(
2
)
)
⋮
⋮
⋮
⋮
(
θ
(
1
)
)
T
(
x
(
n
m
)
)
(
θ
(
2
)
)
T
(
x
(
n
m
)
)
…
(
θ
(
n
u
)
)
T
(
x
(
n
m
)
)
)
=
X
Θ
T
,
其
中
,
X
=
(
…
(
x
(
1
)
)
T
…
…
(
x
(
2
)
)
T
…
⋮
…
(
x
(
n
m
)
)
T
…
)
,
Θ
=
(
…
(
θ
(
1
)
)
T
…
…
(
θ
(
2
)
)
T
…
⋮
…
(
θ
(
n
u
)
)
T
…
)
Y= \begin{pmatrix} (\theta^{(1)})^T(x^{(1)})&(\theta^{(2)})^T(x^{(1)})&\dots&(\theta^{(n_u)})^T(x^{(1)})\\ (\theta^{(1)})^T(x^{(2)})&(\theta^{(2)})^T(x^{(2)})&\dots&(\theta^{(n_u)})^T(x^{(2)})\\ \vdots&\vdots&\vdots&\vdots\\ (\theta^{(1)})^T(x^{(n_m)})&(\theta^{(2)})^T(x^{(n_m)})&\dots&(\theta^{(n_u)})^T(x^{(n_m)}) \end{pmatrix} =X\Theta^T,\\\quad\\ 其中, X= \begin{pmatrix} \dots&(x^{(1)})^T&\dots\\ \dots&(x^{(2)})^T&\dots\\ &\vdots&\\ \dots&(x^{(n_m)})^T&\dots\\ \end{pmatrix},\quad \Theta= \begin{pmatrix} \dots&(\theta^{(1)})^T&\dots\\ \dots&(\theta^{(2)})^T&\dots\\ &\vdots&\\ \dots&(\theta^{(n_u)})^T&\dots\\ \end{pmatrix}
Y=⎝⎜⎜⎜⎛(θ(1))T(x(1))(θ(1))T(x(2))⋮(θ(1))T(x(nm))(θ(2))T(x(1))(θ(2))T(x(2))⋮(θ(2))T(x(nm))……⋮…(θ(nu))T(x(1))(θ(nu))T(x(2))⋮(θ(nu))T(x(nm))⎠⎟⎟⎟⎞=XΘT,其中,X=⎝⎜⎜⎜⎛………(x(1))T(x(2))T⋮(x(nm))T………⎠⎟⎟⎟⎞,Θ=⎝⎜⎜⎜⎛………(θ(1))T(θ(2))T⋮(θ(nu))T………⎠⎟⎟⎟⎞
这个协同矩阵算法有另一个名称——低秩矩阵分解 。
11.5.1. 如何找到相似的样本
这个标题举例来说就是:对于电影推荐系统,如何根据电影j找到与它相类似的电影i。具体的做法是:
- 首先我们通过协同过滤算法得到电影i和j的特征向量 x ( i ) , x ( j ) x^{(i)},x^{(j)} x(i),x(j) ;
- 如果两个向量的距离 ∥ x ( i ) − x ( j ) ∥ \parallel x^{(i)}-x^{(j)}\parallel ∥x(i)−x(j)∥ 很小,我们认为两部电影是相似的。
那么我们从我们的电影样本集中寻找相关电影只需要看那几部电影的特征向量与我们指定的电影特征向量距离最近即可。
11.6. 均值归一化
均值归一化一般作为协同过滤算法的预处理过程。
11.6.1. 为什么要进行均值归一化
对于上述电影推荐系统,假设我们根据某电影的特征向量 x 预测某一用户对该电影的评分(喜好程度) θ \theta θ ,但恰好该用户对所有电影都没有进行评分,如下:
根据协同过滤算法的优化目标函数:
J
(
x
(
1
)
,
.
.
.
,
x
(
n
m
)
,
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
)
=
1
2
∑
(
i
,
j
)
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
(
x
(
i
)
)
−
y
(
i
,
j
)
)
2
+
λ
2
∑
i
=
1
n
m
∑
k
=
1
n
(
x
k
(
i
)
)
2
+
λ
2
∑
j
=
1
n
u
∑
k
=
1
m
(
θ
k
(
j
)
)
2
,
min
x
(
1
)
,
.
.
.
,
x
(
n
m
)
,
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
J
(
x
(
1
)
,
.
.
.
,
x
(
n
m
)
,
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
)
J(x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta{(n_u)})=\frac{1}{2}\sum_{(i,j):r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)^2 \\+\frac{\lambda}{2}\sum^{n_m}_{i=1}\sum^n_{k=1}(x_k^{(i)})^2+\frac{\lambda}{2}\sum^{n_u}_{j=1}\sum^m_{k=1}(\theta_k^{(j)})^2,\\\quad\\ \min_{x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta{(n_u)}}J(x^{(1)},...,x^{(n_m)},\theta^{(1)},...,\theta{(n_u)})
J(x(1),...,x(nm),θ(1),...,θ(nu))=21(i,j):r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2+2λi=1∑nmk=1∑n(xk(i))2+2λj=1∑nuk=1∑m(θk(j))2,x(1),...,x(nm),θ(1),...,θ(nu)minJ(x(1),...,x(nm),θ(1),...,θ(nu))
从公式中可以得出由于该用户没有对任何电影做出评价,因此式中:
1
2
∑
(
i
,
j
)
:
r
(
i
,
j
)
=
1
(
(
θ
(
j
)
)
T
(
x
(
i
)
)
−
y
(
i
,
j
)
)
2
=
0
\frac{1}{2}\sum_{(i,j):r(i,j)=1}\big((\theta^{(j)})^T(x^{(i)})-y^{(i,j)}\big)^2=0
21(i,j):r(i,j)=1∑((θ(j))T(x(i))−y(i,j))2=0
又因为是由x推出
θ
\theta
θ ,最终优化目标函数为:
min
θ
(
1
)
,
.
.
.
,
θ
(
n
u
)
λ
2
∑
j
=
1
n
u
∑
k
=
1
m
(
θ
k
(
j
)
)
2
\min_{\theta^{(1)},...,\theta^{(n_u)}}\frac{\lambda}{2}\sum^{n_u}_{j=1}\sum^m_{k=1}(\theta_k^{(j)})^2
θ(1),...,θ(nu)min2λj=1∑nuk=1∑m(θk(j))2
多次迭代后的最终计算为0,那么也就是该推荐系统预测用户对所有未评价电影评分为0,这并不符合常规逻辑,而且会导致系统不知道如何为用户进行推荐。
均值归一化在这个例子的应用就是对于该用户我们采用所有用户的平均喜好程度 θ \theta θ 。
11.6.2. 具体步骤
如图11-6,我们对某部电影j所有评分(不包括未评分项)求平均值,得到矩阵
μ
\mu
μ ,然后用原始矩阵Y减去
μ
\mu
μ ,得到新的评分矩阵Y。这样做的目的是使该电影的所有评分均值为0。如果想要预测某个用户对某部电影的评分,我们使用公式:
y
(
i
,
j
)
=
(
θ
(
j
)
)
T
(
x
(
i
)
)
+
μ
i
y^{(i,j)}=(\theta^{(j)})^T(x^{(i)})+\mu_i
y(i,j)=(θ(j))T(x(i))+μi
由于该用户没有对任何电影打分,所以偏好特征向量
θ
(
j
)
=
0
\theta^{(j)}=0
θ(j)=0 ,所以该用户对某部电影的评分为
μ
\mu
μ ,即所有人的评分取平均。
12. 大规模数据的机器学习
当训练集的数据量非常大时,那么我们的机器学习的计算问题就会尤为突出,假设 m=10,000,000,这时我们需要使用一些方法来帮助我们进行机器学习。
12.1. 随机梯度下降
随机梯度下降的思想可以应用于很多算法:线性回归、逻辑回归、神经网络或者其他。接下来随机梯度下降都使用线性回归算法举例。
线性回归算法代价函数和梯度下降如下:
J
t
r
a
i
n
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
=
1
m
∑
i
=
1
m
c
o
s
t
(
θ
,
(
x
(
i
)
,
y
(
i
)
)
)
其
中
:
c
o
s
t
(
θ
,
(
x
(
i
)
,
y
(
i
)
)
)
=
1
2
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
\begin{aligned} J_{train}(\theta)&=\frac{1}{2m}\sum_{i=1}^{m}{(h_θ(x^{(i)})-y^{(i)})^2}\\ &=\frac{1}{m}\sum^m_{i=1}cost(\theta,(x^{(i)},y^{(i)}))\\ 其中:&cost(\theta,(x^{(i)},y^{(i)}))=\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)}) \end{aligned}
Jtrain(θ)其中:=2m1i=1∑m(hθ(x(i))−y(i))2=m1i=1∑mcost(θ,(x(i),y(i)))cost(θ,(x(i),y(i)))=21(hθ(x(i))−y(i))
R e p e a t { θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) , ( j = 0 , . . . , n ) } \begin{aligned} Repeat\{&\\ &\theta_j:=\theta_j-\alpha\frac{1}{m}\sum^m_{i=1}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)},\quad (j=0,...,n)\\ &\} \end{aligned} Repeat{θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i),(j=0,...,n)}
如果对一个样本数m=10,000,000的训练集进行机器学习,最费计算的是求和项 ∑ i = 1 m \sum^m_{i=1} ∑i=1m ,因此随机梯度下降是对这一项进行改变。
具体步骤如下:
-
随机扰乱数据集的顺序;
-
梯度下降梯度由原来的代价函数 J t r a i n ( θ ) J_{train(\theta)} Jtrain(θ) 的偏导变为损失函数 c o s t ( θ , ( x ( i ) , y ( i ) ) ) cost(\theta,(x^{(i)},y^{(i)})) cost(θ,(x(i),y(i))) 的偏导:
R e p e a t { f o r i : = 1 , . . . , m { θ j : = θ j − α ∂ ∂ θ j c o s t ( θ , ( x ( i ) , y ( i ) ) ) } } = R e p e a t { f o r i : = 1 , . . . , m { θ j : = θ j − α ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) } } \begin{aligned} &Repeat\{\\ &\quad for\quad i:=1,...,m\{\\ &\quad\quad \theta_j:=\theta_j-\alpha\frac{\partial}{\partial\theta_j} cost(\theta,(x^{(i)},y^{(i)}))\\ &\quad\}\\ &\} \end{aligned}\quad=\quad \begin{aligned} &Repeat\{\\ &\quad for\quad i:=1,...,m\{\\ &\quad\quad \theta_j:=\theta_j-\alpha(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}\\ &\quad\}\\ &\} \end{aligned} Repeat{fori:=1,...,m{θj:=θj−α∂θj∂cost(θ,(x(i),y(i)))}}=Repeat{fori:=1,...,m{θj:=θj−α(hθ(x(i))−y(i))xj(i)}}
之前我们学习的线性回归算法也称为批量线性回归算法,它的好处是将整个数据集整体作为梯度下降的方向度量,这样我们能保证每次梯度下降都能使假设函数往代价函数值更低的点下降。
而随机梯度下降是对每一个样本都进行一次梯度下降,虽然可能某几次梯度下降结果会跑偏,但是总体上来说是往代价函数值减小的方向迈进。
对所有样本进行遍历的重复次数(Repeat次数)需要我们自行规定,一般为样本总数m 的1到10倍。
12.1.1. 判断算法收敛&选择合适的学习速率 α \alpha α
具体步骤:
- 在每次更新 θ \theta θ 之前计算损失函数值 c o s t ( θ , ( x ( i ) , y ( i ) ) ) cost(\theta,(x^{(i)},y^{(i)})) cost(θ,(x(i),y(i))) ;
- 每1000次迭代后绘制该算法迭代的最近1000次损失函数值的图像;
- 通过观察图像判断算法收敛&选择合适的学习速率 α \alpha α 。
图像例子如下:
12.1.1.1. 判断算法收敛
图11-8四张图由左到右,由上到下我们分别称为图1,图2,图3,图4。
- 图一蓝色线表示我们的随机梯度下降已经趋于收敛,红色线是采用更小学习速率 α \alpha α 的结果。可以看到更小的学习速率有时候会运行得更好;
- 图二也表示算法趋于收敛,蓝色线表示每1000次梯度下降后绘制图像,红色线表示每5000次梯度下降后绘制图像。隔得梯度下降数越多,绘制的损失函数样本点越多,曲线更加平滑;
- 图三蓝色线表示每1000次梯度下降后绘制图像,看起来算法并没有很好地在运行;但是如果将算法改为每5000次梯度下降后绘制图像后如红色线所示,则说明随机梯度下降有在正常运行,蓝色线只是因为我们观测的样本点太少;如果将算法改为每5000次梯度下降后绘制图像后如粉红色线所示,则说明算法确实没有很好地在运行,这时需要我们调整学习速率或者调整特征或者算法的其他东西;
- 图四表示梯度下降算法发散了,这时我们应该选择更小的学习速率。
12.1.1.2. 选择合适的学习速率 α \alpha α
一般来说学习速率 α \alpha α 可以这么选择:
-
我们选定的一个常量(推荐);
-
我们也可以设定学习速率随训练时间的增加而减小,这样到训练的后期每次梯度下降的步伐会变小(e.g. α = 常 量 1 迭 代 次 数 + 常 量 2 \alpha=\frac{常量1}{迭代次数+常量2} α=迭代次数+常量2常量1 )。
吴恩达老师不推荐这种方法有两个原因:
- 用选定一个常量的方式已经足够将算法收敛到一个我们想要的程度;
- 虽然设定学习速率随训练时间的增加而减小可以使算法更好地收敛,但在计算 α \alpha α 时多出了两个常量,而这两个常量是需要我们通过多次实验结果调整的,这样会增大调参的时间。
12.2. Mini-batch 梯度下降
Mini-batch 梯度下降算法是结合了批量梯度下降算法和随机梯度下降算法特点的一种算法。在 Mini-batch 梯度下降算法中,不再使用单个样本对假设函数进行梯度下降,而是每次抽取其中的一小批样本。假设每次使用的这一小批样本的数量为 b,可得 Mini-batch 梯度下降伪代码如下:
假
设
b
=
10
,
m
=
1000
R
e
p
e
a
t
{
f
o
r
i
=
1
,
11
,
21
,
31
,
.
.
.
,
991
{
θ
j
:
=
θ
j
−
α
1
10
∑
k
=
i
i
+
9
(
h
θ
(
x
(
k
)
)
−
y
(
k
)
)
x
j
(
k
)
}
}
\begin{aligned} &假设b=10,m=1000\\\quad\\ &Repeat\{\\ &\quad for\quad i=1,11,21,31,...,991\{\\ &\quad\quad\theta_j:=\theta_j-\alpha\frac{1}{10}\sum^{i+9}_{k=i}(h_\theta(x^{(k)})-y^{(k)})x_j^{(k)}\\ &\quad\}\\ &\} \end{aligned}
假设b=10,m=1000Repeat{fori=1,11,21,31,...,991{θj:=θj−α101k=i∑i+9(hθ(x(k))−y(k))xj(k)}}
b的取值一般在2到100之间,吴恩达老师表示自己习惯的取值是b=10。
当我们选择合适的小批样本数量b以及使用一个优秀的向量化方法,Mini-batch 梯度下降会比随机梯度下降效果更好。
12.3. 在线学习机制
在线学习机制是指对于一个有着源源不断用户数据的网站来说,我们并不需要用一个固定的数据集来训练算法,而是用每次网站得到的数据对算法进行训练,训练完后接着训练下一批数据。
在线学习机制优点是如果我们有一个变化的用户群,或者我们在预测的事情在缓慢地变化,在线学习机制算法可以调试所学习到的假设,将其调节更新到最新的变化行为。
12.3.1. 例子
对于一个物流运输系统,我们需要一个算法预测用户对价格的接受程度,如果一个用户对价格不满意,那么他可能会拒绝该公司的服务。我们用变量y 表示用户对接受价格的接受程度,y=1表示用户接受该价格,y=0表示用户不接受该价格。我们通过该用户邮寄起始点和终点等特征,来学习预测用户对给出价格接受的概率 p ( y = 1 ∣ x ; θ ) p(y=1|x;\theta) p(y=1∣x;θ) ,这个分类问题可以用逻辑回归来求解。
但是训练数据不再是之前的一个固定的数据集,而是每一次用户选择接受或者不接受价格的样本。比如某次得到训练集 (x,y) ,我们将它用于算法的训练,训练一次后则丢弃,接着训练下一个数据集。
12.4. Map-reduce
在之前的大规模机器学习算法中,都可以在单机器很好地运行,但有时候由于数据量过大,我们希望用多台机器并行训练数据集,这时候就可以使用 Map-reduce。Map-reduce同样可以用于同一台电脑不同CPU核心并行计算。
12.4.1. 例子
假设某数据集样本数m=400,有批量梯度下降如下:
θ
j
=
θ
j
−
α
1
400
∑
i
=
1
400
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta_j=\theta_j-\alpha\frac{1}{400}\sum^{400}_{i=1}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}
θj=θj−α4001i=1∑400(hθ(x(i))−y(i))xj(i)
其实在运行这些公式的时候,消耗算力最大的是算法中的求和项,那么Map-reduce算法其实就是让多台计算机并行计算这些求和项,计算完成之后再发送给一台主服务器(主机器),主机器再将这些求和项汇总在一起求梯度下降。
假设现在有四台机器,对于这400个样本我们将它们平均分为四份。机器一使用前100个样本,得到求和结果:
t
e
m
p
j
(
1
)
=
∑
i
=
1
100
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
temp_j^{(1)}=\sum_{i=1}^{100}\big(h_\theta(x^{(i)})-y^{(i)}\big)x_j^{(i)}
tempj(1)=i=1∑100(hθ(x(i))−y(i))xj(i)
以此类推,求得四个求和结果之后,计算梯度下降如下:
θ
j
=
θ
j
−
α
1
400
∑
i
=
1
400
(
t
e
m
p
j
(
1
)
+
t
e
m
p
j
(
2
)
+
t
e
m
p
j
(
3
)
+
t
e
m
p
j
(
4
)
)
\theta_j=\theta_j-\alpha\frac{1}{400}\sum^{400}_{i=1}(temp_j^{(1)}+temp_j^{(2)}+temp_j^{(3)}+temp_j^{(4)})
θj=θj−α4001i=1∑400(tempj(1)+tempj(2)+tempj(3)+tempj(4))
其他算法也可进行类似优化,只需要将计算求和的算数步骤分给多个计算机,最后再在同一个计算机进行汇总计算即可。
参考视频: [中英字幕]吴恩达机器学习系列课程