Machine Learning and Deep Learning
ML的目标
寻找一个函数,一个解决问题的函数
函数的类别
Regression:函数的输出是一个标量。比如预测明天的PM2.5指数。
Classificatin:给出类别,函数输出是定位的类别。比如预测邮件是否是骚扰邮件。图像识别。
举例:以老师Youtube每天的播放量为数据集进行学习,预测以后每天的播放量。
1.定义函数
比如今天是2月25号,那么这个函数要解决的问题就是预测2月26号的播放量(日期不关键):
y=f(no. of views on 2/25)
y = f(no.\ of\ views\ on\ 2/25)
y=f(no. of views on 2/25)
先猜一个:
Model y=b+wx1y = b + wx_1y=b+wx1
当然这里只是从简单的开始,做这些猜测是需要一定的背景知识的,你可以不知道确切的是什么,但你一定得知道不是什么,比如这里平闰年2月的日子不一样,过节的时候可能播放量会下降。
参数解释:
yyy: no. of views on 2/26
x1x_1x1: no of views on 2/25
www and bbb are unknown parameters (learned from data)
www: weight
bbb: bias
其中x1x_1x1是已知量,成为 feature
而www和bbb是未知量,称为 weight和bias,之后再解释。
2.定义Loss Function
Loss Function 是参数的函数:L(b,w)L(b,w)L(b,w)简称LBW,用来反应参数的质量
比如:L(0.5k,1)=0.5k+1x1L(0.5k,1) = 0.5k+1x_1L(0.5k,1)=0.5k+1x1: 5.4k,而真正在这一点的值如果是y^\hat{y}y^: 7.5k,这个y^\hat{y}y^称为 Label。
那么误差:e2=∣y−y^∣=2.1ke_2=|y-\hat{y}|=2.1ke2=∣y−y^∣=2.1k,就这样,可以将每天的误差算出:
Loss: L=1N∑nenL = \frac{1}{N}\sum\limits_ne_nL=N1n∑en
e=∣y−y^∣e=|y-\hat{y}|e=∣y−y^∣这种计算误差的方法叫做mean absolute error(MAE,平均绝对误差)
当然也可以相减再取平方:e=(y−y^)2e=(y-\hat{y})^2e=(y−y^)2,这种方法叫做mean square error(MSE,均方差)
根据需求和理解来选取。
经过穷举计算很多的www和bbb之后形成的图像称为 Error Surface:
红色表示Loss大,蓝色表示Loss小
3.优化
找到一组w∗w^*w∗和b∗b^*b∗=arg minw,bLarg\ \mathop{min}\limits_{w,b}Larg w,bminL。
方法叫做 Gradient Descent (GD)
- 初始时随机找一个点w0w^0w0,b0b^0b0
- 计算微分:∂L∂w∣w=w0\frac{\partial L}{\partial w}|_{w=w^0}∂w∂L∣w=w0,∂L∂b∣b=b0\frac{\partial L}{\partial b}|_{b=b^0}∂b∂L∣b=b0梯度为正,反向前进,否则正向前进,这就是下降
- 前进步伐为: η∂L∂w∣w=w0\color{red}\eta \color{black} \frac{\partial L}{\partial w}|_{w=w^0}η∂w∂L∣w=w0 ,η∂L∂b∣b=b0\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是自己定义的,可以定义为负。
- w1=w0−η∂L∂w∣w=w0w^1=w^0-\color{red}\eta\color{black}\frac{\partial L}{\partial w}|_{w=w^0}w1=w0−η∂w∂L∣w=w0,b1=b0−η∂L∂b∣b=b0b^1=b^0-\color{red}\eta\color{black}\frac{\partial L}{\partial b}|_{b=b^0}b1=b0−η∂b∂L∣b=b0,w1w^1w1,b1b^1b1就是下一次下降的www和bbb,进行迭代
- 可以设定更新多少次停止,次数就是一个hyperparamter,也有可能梯度为0,停止迭代。
GD的问题?
如果随机一个位置开始梯度下降,有可能遇到local mininma,没有到达global minima。
但这只是个小问题,因为还有更难的问题。
选函数,定义损失函数和优化叫做训练。
训练结果函数,与训练集的误差是L=0.48kL=0.48kL=0.48k,真正用于预测2021年的误差是L′=0.58kL^{'}=0.58kL′=0.58k
预测的并不是很准阿,因为我们对问题的理解不好,对预测的结果进行分析发现,只用前一天的数据进行分析并不够,每一周的结果相差比较多,那我们把一周的数据拿来进行建模:
y=b+∑j=17wjxjy=b+\sum\limits_{j=1}^7w_jx_jy=b+j=1∑7wjxj
在训练资料上得到L=0.38kL=0.38kL=0.38k,在预测上L′=0.49kL^{'}=0.49kL′=0.49k
按照这个思路,那么前28天,前56天
y=b+∑j=128wjxjy=b+\sum\limits_{j=1}^{28}w_jx_jy=b+j=1∑28wjxj
y=b+∑j=156wjxjy=b+\sum\limits_{j=1}^{56}w_jx_jy=b+j=1∑56wjxj
结果会更好一些,但是已经达到了极限。
非线性的模型
之前的预测函数都是线性的,但是有可能今天播放量高,第二天就不会那么高。线性模型会出现 Model Bias。我们需要一个更复杂的函数:
拟合这个红色的复杂曲线,只需要一族这样的蓝色曲线。
如果是平滑曲线,可以采样连接成为红色曲线再进行操作。
那么这些蓝色的函数该如何实现:使用激活函数sigmoid
y=sigmoid(x)=11+e−xy = sigmoid(x)=\frac{1}{1+e^{-x}}y=sigmoid(x)=1+e−x1
将整个实数域映射到(−1,1)(-1,1)(−1,1)
求极限limx→−∞sigmoid(x)=0\lim\limits_{x\to-\infty}sigmoid(x)=0x→−∞limsigmoid(x)=0,limx→+∞sigmoid(x)=1\lim\limits_{x\to+\infty}sigmoid(x)=1x→+∞limsigmoid(x)=1,所以该函数有两条水平渐进线y=0,y=1y=0,y=1y=0,y=1
y′=e−x(1+e−x)2=S(x)(1−S(x))>0y^{'}=\frac{e^{-x}}{(1+e^{-x})^2}=S(x)(1-S(x))>0y′=(1+e−x)2e−x=S(x)(1−S(x))>0单调递增
对于上面的带参数sigmoid:
y′=cw sigmoid′(b+wx1)y^{'}=cw\ sigmoid^{'}(b+wx_1)y′=cw sigmoid′(b+wx1)
那么原来的红色曲线就可以这样表示:
y=b+∑icisigmoid(bi+wixi)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+wxiy=b+wx_iy=b+wxi
y=b+∑icisigmoid(bi+wixi)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+∑jwjxjy=b+\sum\limits_jw_jx_jy=b+j∑wjxj
y=b+∑icisigmoid(bi+∑jwijxj)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+∑icisigmoid(bi+∑jwijxj)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,3j:1,2,3i:1,2,3\\j:1,2,3i:1,2,3j:1,2,3
r1=b1+w11x1+w12x2+w13x3r2=b2+w21x1+w22x2+w23x3r3=b3+w31x1+w32x2+w33x3r1=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_3r1=b1+w11x1+w12x2+w13x3r2=b2+w21x1+w22x2+w23x3r3=b3+w31x1+w32x2+w33x3
[r1r2r3]=[b1b2b3]+[w11w12w13w21w22w23w31w32w33][x1x2x3]
\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)就是sigmoid(r)sigmoid(r)sigmoid(r)函数族构成的列向量
上面的圆圈圈着的sigmoid就是一个神经元 neuron
所有未知参数通过将其行(列)向量取出拼接为一个叫做θ\boldsymbol{\theta}θ的列向量:
这时的优化就是对θ\thetaθ的优化:
θ∗=arg minθ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
-
计算梯度ggradients=[∂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⋮⎦⎥⎤ ,[θ11θ21⋮]←[θ10θ20⋮]−[η∂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+∑2icimax(0,bi+∑jwijxj)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)