资讯详情

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

Machine Learning and Deep Learning

ML的目标

找到解决问题的函数

函数的类别

:函数的输出是一个标量。例如,预测明天PM2.5指数。

:函数输出是给出类别的定位类别。例如,预测邮件是否是骚扰邮件。图像识别。

以老师为例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.ofviewson2/25) 先猜一个:

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​是已知量,成为

而 w w w和 b b b是未知量,称为 ,之后再解释。

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^​称为

那么误差: e 2 = ∣ y − y ^ ∣ = 2.1 k e_2=|y-\hat{y}|=2.1k e2​=∣y−y^​∣=2.1k,就这样,可以将每天的误差算出:

: L = 1 N ∑ n e n L = \frac{1}{N}\sum\limits_ne_n L=N1​n∑​en​

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

当然也可以相减再取平方: e = ( y − y ^ ) 2 e=(y-\hat{y})^2 e=(y−y^​)2,这种方法叫做(MSE,均方差)

根据需求和理解来选取。

经过穷举计算很多的 w w w和 b b b之后形成的图像称为

红色表示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,bmin​L。

方法叫做 (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 η称为 学习率,是一个参数,而这种在ML中要人为设定的参数称为 超参数。在这个例图中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∑7​wj​xj​

在训练资料上得到 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∑28​wj​xj​

y = b + ∑ j = 1 56 w j x j y=b+\sum\limits_{j=1}^{56}w_jx_j y=b+j=1∑56​wj​xj​

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

非线性的模型

之前的预测函数都是线性的,但是有可能今天播放量高,第二天就不会那么高。线性模型会出现 。我们需要一个更复杂的函数:

拟合这个红色的复杂曲线,只需要一族这样的蓝色曲线。

如果是平滑曲线,可以采样连接成为红色曲线再进行操作。

那么这些蓝色的函数该如何实现:使用激活函数

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→−∞lim​sigmoid(x)=0, lim ⁡ x → + ∞ s i g m o i d ( x ) = 1 \lim\limits_{x\to+\infty}sigmoid(x)=1 x→+∞lim​sigmoid(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∑​ci​sigmoid(bi​+wi​xi​)这样的模型更有弹性,减少了

还可以再继续拟合,整个的发展过程:

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∑​ci​sigmoid(bi​+wi​xi​)

y = b + ∑ j w j x j y=b+\sum\limits_jw_jx_j y=b+j∑​wj​xj​

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∑​ci​sigmoid(bi​+j∑​wij​xj​)相当于先将前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∑​ci​sigmoid(bi​+j∑​wij​xj​) 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​+w11​x1​+w12​x2​+w13​x3​r2=b2​+w21​x1​+w22​x2​+w23​x3​r3=b3​+w31​x1​+w32​x2​+w33​x3​ [ 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} ⎣⎡​r1​r2​r3​​⎦⎤​=⎣⎡​b1​b2​b3​​⎦⎤​+⎣⎡​w11​w21​w31​​w12​w22​w32​​w13​w23​w33​​⎦⎤​⎣⎡​x1​x2​x3​​⎦⎤​ 从而r = b+ Wx

简化成这样:

σ ( r ) \sigma(r) σ(r)就是 s i g m o i d ( r ) sigmoid(r) sigmoid(r)函数族构成的列向量

上面的圆圈圈着的sigmoid就是一个神经元

所有未知参数通过将其行(列)向量取出拼接为一个叫做 θ \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 θmin​L   θ=⎣⎢⎢⎢⎡​θ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都计算过一遍叫做一个

也是一个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∑​ci​max(0,bi​+j∑​wij​xj​) 每一个圆圈就是一个神经元(neuron)每一层神经元就是一层(layer)

Pytorch tutorial

标签: 5w33kr电阻5w33r精密电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台