机器学习的一些基本概念,模型、目标函数、优化算法等等,这些概念对于机器学习算法来说都是通用的套路。
线性单元
当我们面对的数据不是线性可分的时候,感知器规则就无法收敛,为了解决这个问题,我们使用一个可导的线性函数来替代感知器的阶跃函数,这种感知器就叫做线性单元。线性单元在面对线性不可分的数据集的时候,会收敛到一个最佳的近似上。
线性单元将返回一个实数值而不是0,1分类,因此线性单元用来解决回归问题而不是分类问题。
线性模型
模型:实际上就是根据输入x预测输出y的算法。$y=h(x)=w*x_i+b$,$h(x)$函数叫做假设,w和b叫做参数。$x_i$称为特征。
$y=h(x)=\mathrm{w}^T\mathrm{x}\qquad\qquad(式1)$称为线性模型,
监督学习和无监督学习
有监督学习:为了训练一个模型,我们要提供一堆训练样本:每个训练样本既包括输入特征x,也包括对应的输出y(标记),让模型既看到输入特征x,也看到对应标记y。当模型看到足够多的样本之后,它就能总结出其中的一些规律。然后,就可以预测那些它没看过的输入所对应的答案了。
无监督学习:这种方法的训练样本只知道输入特征x,没有输出标记。
梯度下降算法
梯度是一个向量:指向函数上升最快的方向。梯度的反方向就是梯度下降的最快的方向。
梯度下降算法的公式$$\mathrm{x}_{new}=\mathrm{x}_{old}-\eta\nabla{f(x)}$$
其中,$\nabla$是梯度算子,$\nabla{f(x)}$就是指$f(x)$的梯度。$\eta$是步长,也称作学习速率。
我们拿线性模型的目标函数来说:$$E(\mathrm{w})=\frac{1}{2}\sum_{i=1}^{n}(\mathrm{y^{(i)}-\bar{y}^{(i)}})^2$$
梯度下降算法可以完成$$\mathrm{w}_{new}=\mathrm{w}_{old}-\eta\nabla{E(\mathrm{w})}$$
如果我们要求目标函数的最大值,我们可以使用梯度上升算法,$$\mathrm{w}_{new}=\mathrm{w}_{old}+\eta\nabla{E(\mathrm{w})}$$
我们通过求$\nabla{E}(\mathrm{w})$带入上式,就能得到线性单元的参数修改规则。
$\nabla{E}(\mathrm{w})$的推导
关于w的偏导数
$$\begin{align}
\nabla{E(\mathrm{w})}&=\frac{\partial}{\partial\mathrm{w}}E(\mathrm{w})\\
&=\frac{\partial}{\partial\mathrm{w}}\frac{1}{2}\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})^2\\
&=\frac{1}{2}\sum_{i=1}^{n}\frac{\partial}{\partial\mathrm{w}}(y^{(i)}-\bar{y}^{(i)})^2\\
\end{align}$$
$$\begin{align}
&\frac{\partial}{\partial\mathrm{w}}(y^{(i)}-\bar{y}^{(i)})^2\\
=&\frac{\partial}{\partial\mathrm{w}}(y^{(i)2}-2\bar{y}^{(i)}y^{(i)}+\bar{y}^{(i)2})\\
\end{align}$$
$y$是与$w$无关的参数,而$\bar{y}=\mathrm{w}^T\mathrm{x}$,下面我们用复合函数求导法
$$\frac{\partial{E(\mathrm{w})}}{\partial\mathrm{w}}=\frac{\partial{E(\bar{y})}}{\partial\bar{y}}\frac{\partial{\bar{y}}}{\partial\mathrm{w}}$$
分别计算上式等号右边的两个偏导数
$$\begin{align}
\frac{\partial{E(\mathrm{w})}}{\partial\bar{y}}=
&\frac{\partial}{\partial\bar{y}}(y^{(i)2}-2\bar{y}^{(i)}y^{(i)}+\bar{y}^{(i)2})\\
=&-2y^{(i)}+2\bar{y}^{(i)}\\\\
\frac{\partial{\bar{y}}}{\partial\mathrm{w}}=
&\frac{\partial}{\partial\mathrm{w}}\mathrm{w}^T\mathrm{x}\\
=&\mathrm{x}
\end{align}$$
代入,我们求得$\sum$里面的偏导数是
$$\begin{align}
&\frac{\partial}{\partial\mathrm{w}}(y^{(i)}-\bar{y}^{(i)})^2\\
=&2(-y^{(i)}+\bar{y}^{(i)})\mathrm{x}
\end{align}$$
最后代入$\nabla{E}(\mathrm{w})$,求得
$$\begin{align}
\nabla{E(\mathrm{w})}&=\frac{1}{2}\sum_{i=1}^{n}\frac{\partial}{\partial\mathrm{w}}(y^{(i)}-\bar{y}^{(i)})^2\\
&=\frac{1}{2}\sum_{i=1}^{n}2(-y^{(i)}+\bar{y}^{(i)})\mathrm{x}\\
&=-\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})\mathrm{x}
\end{align}$$
经过推导,目标函数$E(w)$的梯度是$$\nabla{E(\mathrm{w})}=-\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})\mathrm{x}^{(i)}$$
所以线性单元的参数修改规则最后是这个样子
$$\nabla{E(\mathrm{w})}=-\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})\mathrm{x}^{(i)}$$
有了上面的式子,我们就能写出训练线性单元的代码
$$\begin{bmatrix}
w_0 \\
w_1 \\
w_2 \\
... \\
w_m \\
\end{bmatrix}_{new}=
\begin{bmatrix}
w_0 \\
w_1 \\
w_2 \\
... \\
w_m \\
\end{bmatrix}_{old}+\eta\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})
\begin{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}+\eta\sum_{i=1}^{n}(y^{(i)}-\bar{y}^{(i)})\mathrm{x}^{(i)}\qquad\qquad(式3)$
原文地址:https://www.cnblogs.com/LXP-Never/p/9785547.html