李宏毅 - 机器学习课程笔记
课程目录
Weak1
一、一些准备、线性回归
Machine Learning ≈ Looking for a function
机器学习本质上约等于找到一个拟合的函数
机器学习解决两种不同类型的方程
1. 回归(Regression): The function output a scalar
2. 分类(Classification): Given options, the function outputs the currect one.
1.How to find the function? —建模三部曲
例子:预测播放量
1.找到一个符合实际问题的函数,但是我们不知道他的参数
比如,我们随便选择一个函数: y = b + w x y=b+wx y=b+wx, b b b refers to b i a s bias bias and w w w refers to w e i g h t weight weight.
那么我们如何根据问题就能确定我们的模型是这样一个线性形式的呢?- 基于当前问题的经验。
我们假设今天的播放量和昨天有关系,并且仅仅是个非常简单的线性关系
y
=
b
+
w
x
y=b+wx
y=b+wx
2.定义损失函数(Loss Function)
L ( b , w ) L(b,w) L(b,w)称为损失函数 (Loss Function),即我们选择一组 b b b和 w w w带入到之前定义的function(也就是我们的model)里面,然后根据将真实值与计算得出的预测值计算差距。
计算差距的方法:
1. Mean Absolute Error(MAE):
e
=
∣
y
−
y
^
∣
e=|y - \hat{y}|
e=∣y−y^∣
2. Mean Square Error(MSE):
e
=
(
y
−
y
^
)
2
e=(y-\hat{y})^2
e=(y−y^)2
3.Optimization(优化)
优化方法:梯度下降法 (Gradient Descent)
假设我们的损失函数还是刚才的例子 L ( b , w ) L(b,w) L(b,w)。
- 我们先不管参数
b
b
b,只看参数
w
w
w。那么根据
w
w
w的变化,我们可能会得到以下的Error Surface:
- 我们随便选取一个初始点 w 0 w^0 w0
- 然后我们计算当前点的微分,根据公式: w 1 = w 0 − η ∂ L ∂ w w^1=w^0-\eta \frac{\partial L}{\partial w} w1=w0−η∂w∂L 计算出下一个点 w 1 w^1 w1的值。 η \eta η称为learning rate,用以控制学习的速率。这种在模型中需要自己设置的参数称为hyperparameter。
- 重复迭代以上步骤,直到达到给定的步骤限制或者收敛为止。
4. 一些补充
我们在上面的例子中,只考虑了一个feature,即我们仅仅考虑了前一天的播放量
x
1
x_1
x1。但实际上,影响今天播放量,或者说对预测今天播放量有参考价值的数据不仅仅是前一天的播放量,还可能是前一周、前一个月的所有数据,考虑到这一点,我们的式子就变成了:
y
=
b
+
∑
i
w
i
x
i
y=b+\sum_i w_ix_i
y=b+i∑wixi
比如说,我们考虑前三天的播放量,那么预测的式子就变成了
y
=
b
+
w
1
x
1
+
w
2
x
2
+
w
3
x
3
y=b+w_1x_1+w_2x_2+w_3x_3
y=b+w1x1+w2x2+w3x3
w
i
w_i
wi表示权值,
x
i
x_i
xi表示前
i
i
i天的播放量数据。
在本例中,我们使用了线性模型去拟合一个播放量随天数变化的曲线,以进行播放量的预测,这种使用线性模型去拟合曲线的方式成为线性回归(Linear Regression)。其中,仅考虑一天的情况(即变量只有一个)称为单变量线性回归,考虑多个天数的情况(即变量有多个)称为多变量线性回归。
二. 逻辑回归
仅仅是用一个线性模型(Linear Model)去表达实际问题往往是不可能的,所以我们需要一个更复杂的模型。
我们可以用一组函数叠加的方式,制造出一个更为复杂的图像
那么,我们如何得到那样的蓝色function呢?
-使用 sigmoid function 进行逼近
y
=
c
1
1
+
e
−
(
b
+
w
x
1
)
y=c\frac{1}{1+e^{-(b+wx_1)}}
y=c1+e−(b+wx1)1
使用不同的 sigmoid function :
所以,对于上面多组蓝色functions的例子而言(现在我们应该知道这个蓝色functions被称为Hard Sigmoid Function),我们需要寻找相应的 Sigmoid Function 去逼近他们,然后把他们加起来,形成我们真正需要的目标曲线。
即:
y
=
b
+
∑
i
c
i
s
i
g
m
o
i
d
(
b
i
+
w
i
x
1
)
y=b+\sum_i c_i sigmoid(b_i+w_ix_1)
y=b+i∑cisigmoid(bi+wix1)
好了,我们刚才式子讨论的就只有一个feature而已,即只有一个变量,套在咱们一脉相承的例子里就是今天的播放量只和昨天有关系,表现在公式中就是我们只有一个
x
1
x_1
x1。但是今天的播放量可能和之前
n
n
n天都有关系,那么我们往往需要很多 features,考虑到这点之后我们的式子变成了这样:
y
=
b
+
∑
i
c
i
s
i
g
m
o
i
d
(
b
i
+
∑
j
w
i
j
x
j
)
y=b+\sum_i c_i sigmoid(b_{i}+\sum_jw_{ij}x_j)
y=b+i∑cisigmoid(bi+j∑wijxj)
啊?这是什么鬼啊?为什么外面有个求和,里面还有个求和?
要解释这样一个复杂式子,我们不妨类比以下来看看:
1.单个特征的线性表示
正如之前而言,如果我们仅仅考虑一个feature,那么我们的简单线性表达式可以写成这样:
y
=
b
+
w
x
1
y=b+wx_1
y=b+wx1
2.单个特征,引入多个sigmoid functions后的表示
那么我们引入多个 sigmoid functions,把这个曲线变得复杂后,上面的式子就变成了:
y
=
b
+
∑
i
c
i
s
i
g
m
o
i
d
(
b
i
+
w
i
x
1
)
y=b+\sum_i c_isigmoid(b_i+w_ix_1)
y=b+i∑cisigmoid(bi+wix1)
b是个常数,我们可以先不看他。由于我们引入了多个 sigmoid functions,所以我们理所当然的应该把这些函数加起来,变成一个新的复杂的曲线,这样我的求和符号解释清楚了。那么求和符号里面的,就是一个sigmoid function,复习一下sigmoid function长啥样:
c
1
s
i
g
m
o
i
d
(
b
1
+
w
1
x
1
)
c_1sigmoid(b_1+w_1x_1)
c1sigmoid(b1+w1x1)
就是里面那样嘛~所以这个式子解释清楚了,表示的是:一个常数+一堆sigmoid functions
3.多个特征的线性表示
正如我们之前讲解的,我们考虑前三天播放量对今天播放量的影响,引入了前三天的播放量特征,于是我们的式子变成了这样:
y
=
b
+
∑
i
w
i
x
i
y=b+\sum_i w_ix_i
y=b+i∑wixi
对比只考虑一个特征的情况,仅仅是多了一次求和。
那么类比单个特征线性表示到单个特征引入多个sigmoid functions后的表示过程,最终我们的式子将变成什么样呢?
4.多个特征,引入多个sigmoid functions后的表示
首先,我们引入了多个特征,我们需要首先计算一下加入权值后我们得到的数值,即:
∑
i
w
i
x
i
\sum_iw_ix_i
i∑wixi
计算出来后,我们需要把这个结果输入到sigmoid function中,我们先考虑一个sigmoid function。所以这个式子就变成了这样:
c
1
s
i
g
m
o
i
d
(
b
1
+
w
s
i
g
m
o
i
d
_
p
a
r
a
m
e
t
e
r
1
∑
i
w
i
x
i
)
c_1sigmoid(b_1+w_{sigmoid\_parameter1}\sum_iw_ix_i)
c1sigmoid(b1+wsigmoid_parameter1i∑wixi)
前后两个
w
w
w明显是不一样的,一个是不同features的加权,一个是sigmoid表达式的参数,我做出了明显区分。
我们发现,上面式子的
w
s
i
g
m
o
i
d
_
p
a
r
a
m
e
t
e
r
1
∑
i
w
i
x
i
w_{sigmoid\_parameter1}\sum_iw_ix_i
wsigmoid_parameter1∑iwixi部分明显可以化简一下,把外面的
w
w
w乘进去和里面的
w
w
w合并一下,表示就方便多了:
c
1
s
i
g
m
o
i
d
(
b
1
+
∑
i
w
1
i
x
i
)
c_1sigmoid(b_1+\sum_iw_{1i}x_i)
c1sigmoid(b1+i∑w1ixi)
即我们用
w
1
i
w_{1i}
w1i表示了
w
s
i
g
m
o
i
d
_
p
a
r
a
m
e
t
e
r
1
∗
w
i
w_{sigmoid\_parameter1}*w_i
wsigmoid_parameter1∗wi的结果。
好了,我们计算多个sigmoid function,有了上面的分析,我们就能轻松写出来最终的表达式:
y
=
b
+
∑
j
c
j
s
i
g
m
o
i
d
(
b
j
+
∑
i
w
j
i
x
i
)
y=b+\sum_j c_j sigmoid(b_j+\sum_i w_{ji}x_i)
y=b+j∑cjsigmoid(bj+i∑wjixi)
我们最后用图再来巩固一下这个过程:
先解决多个特征(例子中是三个特征)的线性表示:
我们用
r
1
,
r
2
,
r
3
r_1, r_2, r_3
r1,r2,r3来表示结果,这个过程用线性代数表示为:
[
r
1
r
2
r
3
]
=
[
b
1
b
2
b
3
]
+
[
w
11
w
12
w
13
w
21
w
22
w
23
w
31
w
32
w
33
]
[
x
1
x
2
x
3
]
\begin{bmatrix} r1\\ r2\\ r3\\ \end{bmatrix}=\begin{bmatrix} b1\\ b2\\ b3\\ \end{bmatrix}+\begin{bmatrix} w_{11}&w_{12}&w_{13}\\ w_{21}&w_{22}&w_{23}\\ w_{31}&w_{32}&w_{33}\\ \end{bmatrix}\begin{bmatrix} x_1\\ x_2\\ x_3\\ \end{bmatrix}
r1r2r3
=
b1b2b3
+
w11w21w31w12w22w32w13w23w33
x1x2x3
然后,我们将
r
1
,
r
2
,
r
3
r1,r2,r3
r1,r2,r3分别带入到相应sigmoid function中
最后,我们乘上相应的
c
i
c_i
ci,加上常数
b
b
b,就能得到最后结果
其中,
σ
\sigma
σ代表
s
i
g
m
o
i
d
(
)
sigmoid()
sigmoid()。下面的那些方块代表的是该过程的线性代数表示。
我们不知不觉的做到了一件事,那就是将一个简单的线性边界,变成了一个复杂的、弯曲的边界,这种方式称为逻辑回归
3. 加入了Activation Function之后的建模三部曲
之前讲的Sigmoid函数就是一种激活函数(Activation Function)。
1. 定义了一个有未知参数的函数形式
即
y
=
b
+
c
T
a
y=b+c^Ta
y=b+cTa
2. 定义Loss函数
这一部分没什么特别的,Loss函数我们用 L ( θ ) L(\theta) L(θ)来表示。 θ \theta θ表示之前提到的所有未知参数,包括上图中的矩阵 W , b , c W,b,c W,b,c等等。
3. Optimization
仍然是梯度下降的方法。先选择一个初始值
θ
0
\theta_0
θ0,计算所有参数的微分,形成一个向量。实际上这个向量就是我们在高等数学中学习的梯度,记为
∇
L
(
θ
0
)
\nabla L(\theta _0)
∇L(θ0)。
η
\eta
η是我们之前提到的学习速率(Learning Rate)
与之前不同的是,我们不是一次性用所有的训练数据进行optimization算Gradient更新参数等等,我们是把数据分成
n
n
n个batch。我们先用第一个batch中的数据算一个Loss
L
1
L_1
L1,使用
L
1
L_1
L1来更新参数。然后用下一个batch计算
L
2
L_2
L2,以此类推,直到计算完所有的batch。每更新一次参数,我们称为一次update。我们称计算完所有的batch为一个epoch。
4. ReLU激活函数
之前讲的Sigmoid函数是一种曲线,我们之前是用这样的曲线去逼近一个由直线段组成的曲线(我也不知道专业的怎么描述了!)。然而我们的ReLU激活函数是实打实的折线,具体就长这样:
这条曲线又是怎么生成的呢?ReLU曲线是由两个函数拼接而成,具体表示为:
所以,我们使用ReLU时要比使用Sigmoid函数要多两倍的函数数量。
Sigmoid函数我们在公式中用这样的形式来表示:
∑
i
c
i
s
i
g
m
o
i
d
(
b
i
+
∑
j
w
i
j
x
i
)
\sum_ic_isigmoid(b_i+\sum_j w_{ij}x_i)
∑icisigmoid(bi+∑jwijxi),那么ReLU我们在公式中如此表示:
∑
2
i
c
i
m
a
x
(
0
,
b
i
+
∑
j
w
i
j
x
i
)
\sum_{2i}c_imax(0, b_i+\sum_j w_{ij}x_i)
∑2icimax(0,bi+∑jwijxi)