机器学习笔记(1):深度学习基本概念简介
注:下文的多数图片和所有数据均来自李弘毅老师的PPT。
在李宏毅老师最新的机器学习课程中,以一种极为精彩的方式从机器学习引入了深度学习,并且相当生动地解释了神经网络可以拟合任意曲线的原因,让我受益良多。于是,就有了这篇博客。
机器学习模型训练的大致流程如下图所示,总共分为三个步骤:
- 选择一个合适的带有未知参数的函数(或模型);
- 定义一个损失函数,如MSE,若输出是概率,那么也可能是Cross-Entropy;
- 选择一种优化器,通过训练数据来优化函数的参数。
关于后两步的内容,从机器学习到深度学习,事实上并没有什么本质的变化。因此,本文主要会聚焦在模型的变化上。下面会通过一个例子来介绍选择模型的变化过程,这个例子也是李老师在课上讲的例子,即YouTube上的每日流量预测。
1.线性模型
假设我们没有什么先验知识,对流量预测没什么了解,我们选择了一个最简单的只有一个输入的线性模型来预测下一天的流量。模型如下:
y
=
b
+
w
x
(1)
y=b+wx \tag1
y=b+wx(1)
其中,x表示上一天的流量,y表示下一天的预测流量。通过这个模型,我们就可以简单的预测未来一天的每日流量,当然预测结果不会很精确。
上图是模型(1)训练后得到的最佳模型的预测结果(红线表示真实数据,蓝线表示预测数据),可以发现模型基本上就是把上一天的数据当作了下一天的预测数据了。
根据真实数据,我们可以发现数据具有很强的周期性,大致是7天一循环,那么如果我们把前7天的数据当作输入,预测结果会不会更好呢?更近一步,也许可以选择更多的天数作为输入,如此预测的精度会不会更好呢?新的线性模型如下:
y
=
b
+
∑
j
=
1
n
w
j
x
j
(2)
y=b+\sum_{j=1}^n w_jx_j \tag2
y=b+j=1∑nwjxj(2)
输入变量个数(n) | 2017-2020(训练数据) | 2021(测试数据) |
---|---|---|
n=1 | 0.48k | 0.58k |
n=7 | 0.38k | 0.49k |
n=28 | 0.33k | 0.46k |
n=56 | 0.32k | 0.46k |
上表就是分别选择前1天、前7天、前28天和前56天作为输入的模型的预测损失。可以发现前3个模型在随着输入变量的增加,损失值越来越小。但当预测天数增加到56天后,损失值就不再变化了,这说明已经很难再通过这种方式提升预测精度了。
2.神经网络和深度学习
为什么线性模型不能再提升预测精度呢?原因很简单,这是因为线性模型太过简单。因为无论如何修改权重w和偏置b,线性模型都只是一条直线。对于那些不是直线的数据,线性模型的预测必然会存在 “model bias”,如下图的折线图。
那么该如何拟合这种曲线呢?是否存在一种可以拟合任意曲线的模型呢?
答案当然是存在的。存在一种函数,我们只需要对其进行简单的组合,就可以拟合任意的曲线。这个函数就是hard-sigmoid函数,如下图的橙色曲线所示。其通用公式可以表示为:
h
−
s
i
g
m
o
i
d
(
x
)
=
c
max
(
0
,
min
(
1
,
b
+
w
x
)
)
(3)
h-sigmoid(x)=c\max(0,\min(1,b+wx)) \tag3
h−sigmoid(x)=cmax(0,min(1,b+wx))(3)
顺便一提,下图的蓝色曲线表示的是sigmoid函数,可以视为hard-sigmoid函数的一种近似。其通用公式可以表示为:
s
i
g
m
o
i
d
(
x
)
=
c
1
1
+
e
−
(
b
+
w
x
)
=
c
σ
(
b
+
w
x
)
(4)
sigmoid(x)=c\frac{1}{1+e^{-(b+wx)}}=c \; \sigma(b+wx) \tag4
sigmoid(x)=c1+e−(b+wx)1=cσ(b+wx)(4)
如下图所示,我们只需要把4条具有不同参数的hard-sigmoid函数进行相加,就可以完全拟合下图的红色折线。
当折线变为曲线时,也可以通过上述方式进行拟合,只不过会需要更多的hard-sigmoid函数而已,如下图所示。
需要注意的是,由于hard-sigmoid函数的表示形式比较复杂,通常我们会使用sigmoid函数来近似。因此,下文使用的都是sigmoid函数。
由此,我们就有了一个具有强大拟合能力的函数,只要用的sigmoid函数足够多,理论上就可以拟合任意的曲线。其表达形式如下:
y
=
b
+
∑
i
m
c
i
σ
(
b
i
+
∑
j
=
1
n
w
i
j
x
j
)
(5)
y=b+\sum_i^m c_i \; \sigma(b_i+\sum_{j=1}^n w_{ij}x_j) \tag5
y=b+i∑mciσ(bi+j=1∑nwijxj)(5)
其中,
σ
\sigma
σ表示sigmoid函数。
上式本质上就是多个sigmoid函数的组合相加,而这也正是神经网络的数学形式。接下来,我们就来谈谈如何将上述公式转换为一个单层神经网络(one layer)。
假设有三个输入变量
(
x
1
,
x
2
,
x
3
)
(x_1,x_2,x_3)
(x1,x2,x3),我们需要3个sigmoid函数去拟合一条曲线。那么根据公式(5),我们可以得到下式:
y
=
b
+
∑
i
3
c
i
σ
(
b
i
+
∑
j
=
1
3
w
i
j
x
j
)
(5)
y=b+\sum_i^3 c_i \; \sigma(b_i+\sum_{j=1}^3 w_{ij}x_j) \tag5
y=b+i∑3ciσ(bi+j=1∑3wijxj)(5)
对于公式(5),将其转换为一个单层神经网络就是如上图的结构。观察上图,我们可以发现:
- sigmoid函数的个数就是隐藏层的神经元的个数;
- c i c_i ci就是从隐藏层到输出层的权重,b就是从隐藏层到输出层的偏置。
接下来,我们就用神经网络模型来预测每日流量,看看预测精度是否有提升。预测网络使用的激活函数是ReLU函数,其功能与sigmoid函数相同。
ReLU个数(n) | 2017-2020(训练数据) | 2021(测试数据) |
---|---|---|
线性模型 | 0.32k | 0.46k |
n=10 | 0.32k | 0.45k |
n=100 | 0.28k | 0.43k |
n=1000 | 0.27k | 0.43k |
可以发现,随着ReLU个数的提升,模型的预测精度也在提高。但同样当个数达到一定数量后,提升也会逐渐减少甚至停止。
除了增加隐藏层神经元个数外,我们还可以通过增加网络层数的方式进一步提升模型的预测精度。而这种具有多层的神经网络,也就是所谓的深度学习(deep learning)。
网络层数 | 2017-2020(训练数据) | 2021(测试数据) |
---|---|---|
1 layer | 0.28k | 0.43k |
2 layer | 0.18k | 0.39k |
3 layer | 0.14k | 0.38k |
4 layer | 0.10k | 0.44k |
可以发现,随着网络层数的增加,模型预测精度也会增加。但当层数增加到4层后,可以发现模型对于未知数据的预测精度反而下降了,这说明此时模型已经出现过拟合(Overfitting)。
3.问题
上文我们知道了通过增加神经元个数和网络层数,可以提高模型的预测精度。关于前者,上文做出了解释,本质上增加神经元个数就是在增加sigmoid函数的个数,而组合任意个sigmoid函数就可以逼近任意曲线,这也就是神经网络可以拟合任意曲线的根本原因。
数,可以提高模型的预测精度。关于前者,上文做出了解释,本质上增加神经元个数就是在增加sigmoid函数的个数,而组合任意个sigmoid函数就可以逼近任意曲线,这也就是神经网络可以拟合任意曲线的根本原因。
但是后者该如何解释呢?既然组合任意多个sigmoid函数就可以逼近任意曲线,那么理论上我们只需要一层网络就可以实现,只需要根据情况增加神经元个数即可。那么为什么不去增加神经元个数,反而要增加网络层数呢?为什么增加网络层数也可以提高模型的预测能力呢?