Machine Learning and Deep Learning
ML的目标
寻找一个函数,一个解决问题的函数
函数的类别
Regression:函数的输出是一个标量。比如预测明天的PM2.5指数。
Classificatin:给出类别,函数输出是定位的类别。比如预测邮件是否是骚扰邮件。图像识别。
举例:以老师Youtube每天的播放量为数据集进行学习,预测以后每天的播放量。
1.定义函数
比如今天是2月25号,那么这个函数要解决的问题就是预测2月26号的播放量(日期不关键):
y
=
f
(
n
o
.
o
f
v
i
e
w
s
o
n
2
/
25
)
y = f(no.\ of\ views\ on\ 2/25)
y=f(no. of views on 2/25)
先猜一个:
Model y = b + w x 1 y = b + wx_1 y=b+wx1
当然这里只是从简单的开始,做这些猜测是需要一定的背景知识的,你可以不知道确切的是什么,但你一定得知道不是什么,比如这里平闰年2月的日子不一样,过节的时候可能播放量会下降。
参数解释:
y y y: no. of views on 2/26
x 1 x_1 x1: no of views on 2/25
w w w and b b b are unknown parameters (learned from data)
w w w: weight
b b b: bias
其中 x 1 x_1 x1是已知量,成为 feature
而 w w w和 b b b是未知量,称为 weight和bias,之后再解释。
2.定义Loss Function
Loss Function 是参数的函数: L ( b , w ) L(b,w) L(b,w)简称LBW,用来反应参数的质量
比如: L ( 0.5 k , 1 ) = 0.5 k + 1 x 1 L(0.5k,1) = 0.5k+1x_1 L(0.5k,1)=0.5k+1x1: 5.4k,而真正在这一点的值如果是 y ^ \hat{y} y^: 7.5k,这个 y ^ \hat{y} y^称为 Label。
那么误差: e 2 = ∣ y − y ^ ∣ = 2.1 k e_2=|y-\hat{y}|=2.1k e2=∣y−y^∣=2.1k,就这样,可以将每天的误差算出:
Loss: L = 1 N ∑ n e n L = \frac{1}{N}\sum\limits_ne_n L=N1n∑en
e = ∣ y − y ^ ∣ e=|y-\hat{y}| e=∣y−y^∣这种计算误差的方法叫做mean absolute error(MAE,平均绝对误差)
当然也可以相减再取平方: e = ( y − y ^ ) 2 e=(y-\hat{y})^2 e=(y−y^)2,这种方法叫做mean square error(MSE,均方差)
根据需求和理解来选取。
经过穷举计算很多的
w
w
w和
b
b
b之后形成的图像称为 Error Surface:
红色表示Loss大,蓝色表示Loss小
3.优化
找到一组 w ∗ w^* w∗和 b ∗ b^* b∗= a r g m i n w , b L arg\ \mathop{min}\limits_{w,b}L arg w,bminL。
方法叫做 Gradient Descent (GD)
- 初始时随机找一个点 w 0 w^0 w0, b 0 b^0 b0
- 计算微分: ∂ L ∂ w ∣ w = w 0 \frac{\partial L}{\partial w}|_{w=w^0} ∂w∂L∣w=w0, ∂ L ∂ b ∣ b = b 0 \frac{\partial L}{\partial b}|_{b=b^0} ∂b∂L∣b=b0梯度为正,反向前进,否则正向前进,这就是下降
- 前进步伐为: η ∂ L ∂ w ∣ w = w 0 \color{red}\eta \color{black} \frac{\partial L}{\partial w}|_{w=w^0} η∂w∂L∣w=w0 , η ∂ L ∂ b ∣ b = b 0 \color{red}\eta \color{black} \frac{\partial L}{\partial b}|_{b=b^0} η∂b∂L∣b=b0其中 η \color{red}\eta η称为 learning rate学习率,是一个参数,而这种在ML中要人为设定的参数称为 hyperparameters超参数。在这个例图中Loss出现负值,Loss是自己定义的,可以定义为负。
- w 1 = w 0 − η ∂ L ∂ w ∣ w = w 0 w^1=w^0-\color{red}\eta\color{black}\frac{\partial L}{\partial w}|_{w=w^0} w1=w0−η∂w∂L∣w=w0, b 1 = b 0 − η ∂ L ∂ b ∣ b = b 0 b^1=b^0-\color{red}\eta\color{black}\frac{\partial L}{\partial b}|_{b=b^0} b1=b0−η∂b∂L∣b=b0, w 1 w^1 w1, b 1 b^1 b1就是下一次下降的 w w w和 b b b,进行迭代
- 可以设定更新多少次停止,次数就是一个hyperparamter,也有可能梯度为0,停止迭代。
GD的问题?
如果随机一个位置开始梯度下降,有可能遇到local mininma,没有到达global minima。
但这只是个小问题,因为还有更难的问题。
选函数,定义损失函数和优化叫做训练。
训练结果函数,与训练集的误差是 L = 0.48 k L=0.48k L=0.48k,真正用于预测2021年的误差是 L ′ = 0.58 k L^{'}=0.58k L′=0.58k
预测的并不是很准阿,因为我们对问题的理解不好,对预测的结果进行分析发现,只用前一天的数据进行分析并不够,每一周的结果相差比较多,那我们把一周的数据拿来进行建模:
y = b + ∑ j = 1 7 w j x j y=b+\sum\limits_{j=1}^7w_jx_j y=b+j=1∑7wjxj
在训练资料上得到 L = 0.38 k L=0.38k L=0.38k,在预测上 L ′ = 0.49 k L^{'}=0.49k L′=0.49k
按照这个思路,那么前28天,前56天
y = b + ∑ j = 1 28 w j x j y=b+\sum\limits_{j=1}^{28}w_jx_j y=b+j=1∑28wjxj
y = b + ∑ j = 1 56 w j x j y=b+\sum\limits_{j=1}^{56}w_jx_j y=b+j=1∑56wjxj
结果会更好一些,但是已经达到了极限。
非线性的模型
之前的预测函数都是线性的,但是有可能今天播放量高,第二天就不会那么高。线性模型会出现 Model Bias。我们需要一个更复杂的函数:
拟合这个红色的复杂曲线,只需要一族这样的蓝色曲线。
如果是平滑曲线,可以采样连接成为红色曲线再进行操作。
那么这些蓝色的函数该如何实现:使用激活函数sigmoid
y = s i g m o i d ( x ) = 1 1 + e − x y = sigmoid(x)=\frac{1}{1+e^{-x}} y=sigmoid(x)=1+e−x1
将整个实数域映射到 ( − 1 , 1 ) (-1,1) (−1,1)
求极限 lim x → − ∞ s i g m o i d ( x ) = 0 \lim\limits_{x\to-\infty}sigmoid(x)=0 x→−∞limsigmoid(x)=0, lim x → + ∞ s i g m o i d ( x ) = 1 \lim\limits_{x\to+\infty}sigmoid(x)=1 x→+∞limsigmoid(x)=1,所以该函数有两条水平渐进线 y = 0 , y = 1 y=0,y=1 y=0,y=1
y ′ = e − x ( 1 + e − x ) 2 = S ( x ) ( 1 − S ( x ) ) > 0 y^{'}=\frac{e^{-x}}{(1+e^{-x})^2}=S(x)(1-S(x))>0 y′=(1+e−x)2e−x=S(x)(1−S(x))>0单调递增
对于上面的带参数sigmoid:
y
′
=
c
w
s
i
g
m
o
i
d
′
(
b
+
w
x
1
)
y^{'}=cw\ sigmoid^{'}(b+wx_1)
y′=cw sigmoid′(b+wx1)
那么原来的红色曲线就可以这样表示:
y = b + ∑ i c i s i g m o i d ( b i + w i x i ) y=b+\sum\limits_i\color{red}c_i\color{black}sigmoid(\color{green}b_i+\color{blue}w_i\color{black}x_i) y=b+i∑cisigmoid(bi+wixi)这样的模型更有弹性,减少了 Model Bias
还可以再继续拟合,整个的发展过程:
y = b + w x i y=b+wx_i y=b+wxi
y = b + ∑ i c i s i g m o i d ( b i + w i x i ) y=b+\sum\limits_i\color{red}c_i\color{black}sigmoid(\color{green}b_i+\color{blue}w_i\color{black}x_i) y=b+i∑cisigmoid(bi+wixi)
y = b + ∑ j w j x j y=b+\sum\limits_jw_jx_j y=b+j∑wjxj
y = b + ∑ i c i s i g m o i d ( b i + ∑ j w i j x j ) y=b+\sum\limits_i\color{red}c_i\color{black}sigmoid(\color{green}b_i\color{black}+\sum\limits_j\color{blue}w_{ij}\color{black}x_j) y=b+i∑cisigmoid(bi+j∑wijxj)相当于先将前j天拟合再通过i段sigmoid拟合,相关性更强,更合理
用线代知识简化一下表达式:
y = b + ∑ i c i s i g m o i d ( b i + ∑ j w i j x j ) y=b+\sum\limits_i\color{red}c_i\color{black}sigmoid(\color{green}b_i\color{black}+\sum\limits_j\color{blue}w_{ij}\color{black}x_j) y=b+i∑cisigmoid(bi+j∑wijxj) i : 1 , 2 , 3 j : 1 , 2 , 3 i:1,2,3\\j:1,2,3 i:1,2,3j:1,2,3
r
1
=
b
1
+
w
11
x
1
+
w
12
x
2
+
w
13
x
3
r
2
=
b
2
+
w
21
x
1
+
w
22
x
2
+
w
23
x
3
r
3
=
b
3
+
w
31
x
1
+
w
32
x
2
+
w
33
x
3
r1=b_1+w_{11}x_1+w_{12}x_2+w_{13}x_3\\r2=b_2+w_{21}x_1+w_{22}x_2+w_{23}x_3\\r3=b_3+w_{31}x_1+w_{32}x_2+w_{33}x_3
r1=b1+w11x1+w12x2+w13x3r2=b2+w21x1+w22x2+w23x3r3=b3+w31x1+w32x2+w33x3
[
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} r_1\\ r_2 \\ r_3 \end{bmatrix}= \begin{bmatrix} b_1 \\ b_2\\ b_3 \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 = b+ Wx
简化成这样:
σ ( r ) \sigma(r) σ(r)就是 s i g m o i d ( r ) sigmoid(r) sigmoid(r)函数族构成的列向量
上面的圆圈圈着的sigmoid就是一个神经元 neuron
所有未知参数通过将其行(列)向量取出拼接为一个叫做 θ \boldsymbol{\theta} θ的列向量:
这时的优化就是对 θ \theta θ的优化:
θ ∗ = a r g m i n θ L θ = [ θ 0 θ 1 θ 3 ⋮ ] \boldsymbol{\theta^*}=arg\ \mathop{min}\limits_{\boldsymbol{\theta}}L\ \ \ \boldsymbol{\theta}=\begin{bmatrix}\theta_0\\\theta_1\\\theta_3\\\vdots\end{bmatrix} θ∗=arg θminL θ=⎣⎢⎢⎢⎡θ0θ1θ3⋮⎦⎥⎥⎥⎤
-
随机挑选一个初值 θ 0 \boldsymbol{\theta^0} θ0
-
计算梯度 g g r a d i e n t s = [ ∂ L ∂ θ 1 ∣ θ = θ 0 ∂ L ∂ θ 2 ∣ θ = θ 0 ⋮ ] \mathop{\boldsymbol{g}}\limits_{\boldsymbol{gradients}}=\begin{bmatrix}\frac{\partial L}{\partial {\theta_1}}|_{\theta=\theta_0}\\\frac{\partial L}{\partial {\theta_2}}|_{\theta=\theta_0}\\\vdots\end{bmatrix} gradientsg=⎣⎢⎡∂θ1∂L∣θ=θ0∂θ2∂L∣θ=θ0⋮⎦⎥⎤ , [ θ 1 1 θ 2 1 ⋮ ] ← [ θ 1 0 θ 2 0 ⋮ ] − [ η ∂ L ∂ θ 1 ∣ θ = θ 0 η ∂ L ∂ θ 2 ∣ θ = θ 0 ⋮ ] \begin{bmatrix}\theta^1_1\\\theta_2^1\\\vdots\end{bmatrix}\gets\begin{bmatrix}\theta_1^0\\\theta_2^0\\\vdots\end{bmatrix}-\begin{bmatrix}\color{red}\eta\color{black}\frac{\partial L}{\partial \theta_1}|_{\theta=\theta^0}\\\color{red}\eta\color{black}\frac{\partial L}{\partial \theta_2}|_{\theta=\theta^0}\\\vdots\end{bmatrix} ⎣⎢⎡θ11θ21⋮⎦⎥⎤←⎣⎢⎡θ10θ20⋮⎦⎥⎤−⎣⎢⎡η∂θ1∂L∣θ=θ0η∂θ2∂L∣θ=θ0⋮⎦⎥⎤
g = ∇ L ( θ 0 ) \boldsymbol g=\nabla L(\theta^0) g=∇L(θ0)
梯度下降
θ 1 ← θ 0 − η g \boldsymbol \theta^1\gets\boldsymbol \theta^0-\color{red}\eta\color{black}\boldsymbol g θ1←θ0−ηg
-
重复计算梯度和梯度下降
而实际上如果使用全部资料进行训练,电脑的硬件是跟不上的,一般是选用其中的一部分,这个工作是在进行训练前就完成的,你会在pytorch中看到加载数据函数参数中有batch,每次训练就是用batch这么多的数据进行梯度的计算。计算一个batch后叫一个update将所有batch都计算过一遍叫做一个epoch
batchsize也是一个hyperparameter。在一个epoch中更新次数由batchsize决定。
Sigmoid → \to → ReLU
ReLU:Rectified Linear Unit修正先行单元,线性整流函数,也是一个激活函数。
在这里用的是带系数的带之前的几天的拟合形式:
y
=
b
+
∑
2
i
c
i
m
a
x
(
0
,
b
i
+
∑
j
w
i
j
x
j
)
y=b+\sum\limits_{2i}c_imax(0,b_i+\sum\limits_jw_{ij}x_j)
y=b+2i∑cimax(0,bi+j∑wijxj)
每一个圆圈就是一个神经元(neuron)每一层神经元就是一层(layer)