深度学习——线性单元和梯度下降

Posted lxp-never

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习——线性单元和梯度下降相关的知识,希望对你有一定的参考价值。

机器学习的一些基本概念,模型、目标函数、优化算法等等,这些概念对于机器学习算法来说都是通用的套路。

线性单元

  当我们面对的数据不是线性可分的时候,感知器规则就无法收敛,为了解决这个问题,我们使用一个可导的线性函数来替代感知器的阶跃函数,这种感知器就叫做线性单元。线性单元在面对线性不可分的数据集的时候,会收敛到一个最佳的近似上。

  线性单元将返回一个实数值而不是0,1分类,因此线性单元用来解决回归问题而不是分类问题。

线性模型

  模型:实际上就是根据输入x预测输出y的算法。$y=h(x)=w*x_i+b$,$h(x)$函数叫做假设,w和b叫做参数。$x_i$称为特征。

$y=h(x)=mathrm{w}^Tmathrm{x}qquadqquad(式1)$称为线性模型,

监督学习和无监督学习

有监督学习:为了训练一个模型,我们要提供一堆训练样本:每个训练样本既包括输入特征x,也包括对应的输出y(标记),让模型既看到输入特征x,也看到对应标记y。当模型看到足够多的样本之后,它就能总结出其中的一些规律。然后,就可以预测那些它没看过的输入所对应的答案了。

无监督学习:这种方法的训练样本只知道输入特征x,没有输出标记。

梯度下降算法

梯度是一个向量:指向函数上升最快的方向。梯度的反方向就是梯度下降的最快的方向。

梯度下降算法的公式$$mathrm{x}_{new}=mathrm{x}_{old}-eta abla{f(x)}$$

其中,$ abla$是梯度算子,$ abla{f(x)}$就是指$f(x)$的梯度。$eta$是步长,也称作学习速率

我们拿线性模型的目标函数来说:$$E(mathrm{w})=frac{1}{2}sum_{i=1}^{n}(mathrm{y^{(i)}-ar{y}^{(i)}})^2$$

梯度下降算法可以完成$$mathrm{w}_{new}=mathrm{w}_{old}-eta abla{E(mathrm{w})}$$

如果我们要求目标函数的最大值,我们可以使用梯度上升算法,$$mathrm{w}_{new}=mathrm{w}_{old}+eta abla{E(mathrm{w})}$$

我们通过求$ abla{E}(mathrm{w})$带入上式,就能得到线性单元的参数修改规则。

$ abla{E}(mathrm{w})$的推导

关于w的偏导数

$$egin{align}
abla{E(mathrm{w})}&=frac{partial}{partialmathrm{w}}E(mathrm{w})\
&=frac{partial}{partialmathrm{w}}frac{1}{2}sum_{i=1}^{n}(y^{(i)}-ar{y}^{(i)})^2\
&=frac{1}{2}sum_{i=1}^{n}frac{partial}{partialmathrm{w}}(y^{(i)}-ar{y}^{(i)})^2\
end{align}$$

$$egin{align}
&frac{partial}{partialmathrm{w}}(y^{(i)}-ar{y}^{(i)})^2\
=&frac{partial}{partialmathrm{w}}(y^{(i)2}-2ar{y}^{(i)}y^{(i)}+ar{y}^{(i)2})\
end{align}$$

$y$是与$w$无关的参数,而$ar{y}=mathrm{w}^Tmathrm{x}$,下面我们用复合函数求导法

$$frac{partial{E(mathrm{w})}}{partialmathrm{w}}=frac{partial{E(ar{y})}}{partialar{y}}frac{partial{ar{y}}}{partialmathrm{w}}$$

分别计算上式等号右边的两个偏导数

$$egin{align}
frac{partial{E(mathrm{w})}}{partialar{y}}=
&frac{partial}{partialar{y}}(y^{(i)2}-2ar{y}^{(i)}y^{(i)}+ar{y}^{(i)2})\
=&-2y^{(i)}+2ar{y}^{(i)}\\
frac{partial{ar{y}}}{partialmathrm{w}}=
&frac{partial}{partialmathrm{w}}mathrm{w}^Tmathrm{x}\
=&mathrm{x}
end{align}$$

代入,我们求得$sum$里面的偏导数是

$$egin{align}
&frac{partial}{partialmathrm{w}}(y^{(i)}-ar{y}^{(i)})^2\
=&2(-y^{(i)}+ar{y}^{(i)})mathrm{x}
end{align}$$

最后代入$ abla{E}(mathrm{w})$,求得

$$egin{align}
abla{E(mathrm{w})}&=frac{1}{2}sum_{i=1}^{n}frac{partial}{partialmathrm{w}}(y^{(i)}-ar{y}^{(i)})^2\
&=frac{1}{2}sum_{i=1}^{n}2(-y^{(i)}+ar{y}^{(i)})mathrm{x}\
&=-sum_{i=1}^{n}(y^{(i)}-ar{y}^{(i)})mathrm{x}
end{align}$$

经过推导,目标函数$E(w)$的梯度是$$ abla{E(mathrm{w})}=-sum_{i=1}^{n}(y^{(i)}-ar{y}^{(i)})mathrm{x}^{(i)}$$

所以线性单元的参数修改规则最后是这个样子

$$ abla{E(mathrm{w})}=-sum_{i=1}^{n}(y^{(i)}-ar{y}^{(i)})mathrm{x}^{(i)}$$

有了上面的式子,我们就能写出训练线性单元的代码

$$egin{bmatrix}
w_0 \
w_1 \
w_2 \
... \
w_m \
end{bmatrix}_{new}=
egin{bmatrix}
w_0 \
w_1 \
w_2 \
... \
w_m \
end{bmatrix}_{old}+etasum_{i=1}^{n}(y^{(i)}-ar{y}^{(i)})
egin{bmatrix}
1 \
x_1^{(i)} \
x_2^{(i)} \
... \
x_m^{(i)} \
end{bmatrix}$$

随机梯度下降算法(Stochastic Gradient Descent,SGD)

如果我们每次更新w的迭代,要遍历训练数据中所有的样本进行计算,我们称这种算法叫做批梯度下降(Batch Gradient Descent),如果我们数据样本非常大达到了上百万亿,就需要用SGD算法,在SGD算法中,每次更新w的迭代,只计算一个样本,这样对于一个具有数百万样本的训练数据,完成一次遍历就会对更新数百万次,效率大大提升。由于样本的噪音和随机性,每次更新$w$并不一定按照$E$减少的方向。然而,虽然存在一定随机性,大量的更新总体上沿着$E$减少的方向前进的,因此最后也能收敛到最小值附近。

$mathrm{w}_{new}=mathrm{w}_{old}+etasum_{i=1}^{n}(y^{(i)}-ar{y}^{(i)})mathrm{x}^{(i)}qquadqquad(式3)$

 

以上是关于深度学习——线性单元和梯度下降的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch学习2B站刘二大人《PyTorch深度学习实践》——梯度下降算法(Gradient Descent)

PyTorch学习2B站刘二大人《PyTorch深度学习实践》——梯度下降算法(Gradient Descent)

深度学习课程笔记神经网络基础

转载零基础入门深度学习-参考文献

转载零基础入门深度学习-参考文献

深度学习入门 2022 最新版 深度学习简介