【李宏毅ML/DL】机器学习笔记,pytorch tutorials

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是未知量,称为 weightbias,之后再解释。

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=yy^=2.1k,就这样,可以将每天的误差算出:

Loss: L = 1 N ∑ n e n L = \frac{1}{N}\sum\limits_ne_n L=N1nen

e = ∣ y − y ^ ∣ e=|y-\hat{y}| e=yy^这种计算误差的方法叫做mean absolute error(MAE,平均绝对误差)

当然也可以相减再取平方: e = ( y − y ^ ) 2 e=(y-\hat{y})^2 e=(yy^)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} wLw=w0 ∂ L ∂ b ∣ b = b 0 \frac{\partial L}{\partial b}|_{b=b^0} bLb=b0梯度为正,反向前进,否则正向前进,这就是下降
  • 前进步伐为: η ∂ L ∂ w ∣ w = w 0 \color{red}\eta \color{black} \frac{\partial L}{\partial w}|_{w=w^0} ηwLw=w0 η ∂ L ∂ b ∣ b = b 0 \color{red}\eta \color{black} \frac{\partial L}{\partial b}|_{b=b^0} ηbLb=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ηwLw=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ηbLb=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=17wjxj

在训练资料上得到 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=128wjxj

y = b + ∑ j = 1 56 w j x j y=b+\sum\limits_{j=1}^{56}w_jx_j y=b+j=156wjxj

结果会更好一些,但是已经达到了极限。

非线性的模型

之前的预测函数都是线性的,但是有可能今天播放量高,第二天就不会那么高。线性模型会出现 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+ex1

将整个实数域映射到 ( − 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 xlimsigmoid(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+ex)2ex=S(x)(1S(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+icisigmoid(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+icisigmoid(bi+wixi)

y = b + ∑ j w j x j y=b+\sum\limits_jw_jx_j y=b+jwjxj

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+icisigmoid(bi+jwijxj)相当于先将前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+icisigmoid(bi+jwijxj) 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+w11w21w31w12w22w32w13w23w33x1x2x3
从而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=θ1Lθ=θ0θ2Lθ=θ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ηθ1Lθ=θ0ηθ2Lθ=θ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+2icimax(0,bi+jwijxj)
每一个圆圈就是一个神经元(neuron)每一层神经元就是一层(layer)

Pytorch tutorial

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明光桥北修狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值