目录html
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
在求解机器学习算法模型参数的时候,梯度降低法(gradient descent)和最小二乘法(least squares)是最常用的方法,因为梯度降低法衍生出的分支较多,因此在这里对梯度降低法单独作一个总结。算法
梯度是在微积分中对多元函数的各个参数求偏导数,而且把求得的各个参数的偏导数用向量的形式表达出来。数据结构
例如函数\(L(\omega,b)\),分别对\(\omega\)和\(b\)求偏导数,梯度向量就是\(({\frac{\partial{L}}{\partial{\omega}}},{\frac{\partial{L}}{\partial{b}}})^T\),简称\(grad{L(\omega,b)}\)或者\(\nabla{L(\omega,b)}\)。对于某个具体的点\((\omega_i,b_i)\)的具体梯度向量就是\(({\frac{\partial{L}}{\partial{\omega_i}}},{\frac{\partial{L}}{\partial{b_i}}})^T\)或者\(\nabla{L(\omega_i,b_i)}\),若是是多参数的函数则是\(({\frac{\partial{L}}{\partial{x}}},{\frac{\partial{L}}{\partial{y}}},{\frac{\partial{L}}{\partial{z}}})^T\)。机器学习
在机器学习算法中,若是须要最小化目标函数时,则能够经过梯度降低法一步一步的迭代求解,获得最小化的目标函数和模型参数值;若是要最大化目标函数时,则能够经过梯度上升法迭代求解。函数
梯度降低算法和梯度上升法之间也能够互相转化,能够经过梯度降低迭代最小化目标函数,同时也能够反向梯度上升迭代最小化目标函数;同理也能够反向梯度降低迭代最大化目标函数。性能
假设咱们处在某座不知名的大山上的某处位置,因为咱们不知道该怎么下山,因而决定走一步算一步,即每走到一个位置的时候便求解当前位置的梯度,沿着梯度的负方向即当前最陡峭的位置向下走一步,而后继续求解当前位置的梯度……直到咱们认为咱们已经到了山脚才停下来。从下图能够看出,经过该方法咱们有可能走到了这座大山的某一个局部的最低处(山腰处),而没有走到真正的山脚。学习
从下山这个实例中能够得出:梯度降低不必定可以找到全局的最优解,有可能会找到局部最优解。网站
可是若是代价函数为凸函数的时候梯度降低获得的则必定是全局最优解。人工智能
步长决定了梯度降低迭代的时候每一步沿梯度负方向前进的长度,下山实例中则表示每一步的长度。
若是步长过长,则可能会错过最优解;若是步长太小,迭代速度会变慢,很长时间算法都不会结束。所以能够从大到小的尝试步长的大小,若是目标函数值在变小,说明取值有效,不然须要增大步长。
以线性模型举例,线性模型的假设函数为预测值的预测函数,即经过输入特征\((x_1,x_2,\ldots,x_n)\)输出一个对应的预测值\(\hat{y}\),线性模型的假设函数为
\[ \hat{y} = f(x) = \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b \]
目标函数经常使用来度量模型拟合的程度,以线性模型举例,线性模型通常使用均方偏差度量模型性能,线性模型的目标函数为
\[ J(\omega,b) = \sum_{i=1}^m (y_i - \hat{y_{i}})^2 \]
假设现有一个目标函数\(J(\omega_0,\omega_1,\ldots,\omega_n)\)。
这一部分主要用到了矩阵的基本计算和求导,首先对假设函数和目标函数矩阵化。
假设现有一个假设函数
\[ \hat{y} = \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b = X^T\omega \]
其中\(X^T\omega\)是假设函数的矩阵表达(把\(b\)看作\(\omega_0x_0, \quad x_0=1\)),其中\(X^T\)是\(m*(n+1)\)维的特征矩阵(\(m\)为样本数,\(n\)为特征数),\(\omega\)是\((n+1)*1\)维的向量,则经过矩阵的计算得知\(X^T\omega\)是一个\(m*1\)维的向量。
假设函数的转换便可得矩阵表达的目标函数,即
\[ J(\theta)={\frac{1}{2}}(X\omega-Y)^T(X\omega-Y) \]
其中\(Y\)是\(m*1\)维的样本向量。
三种不一样形式的梯度降低法步骤都是相同的,只是在更新参数的时候选择的样本数量不一样,若是不关心样本数量,梯度降低法的更新公式为
\[ \omega_i = \omega_i - \alpha{\frac{\partial}{\partial{\omega_i}}J(\omega_0,\omega_1,\ldots,\omega_n)} \]
接下来的参数更新公式以均方偏差线性回归模型举例,均方偏差线性回归模型的目标函数对参数\(\omega\)的求偏导公式为
\[ \nabla{L(\omega_i)}=\sum_{j=0}^m(\hat{y_j}-y_j){x_i}^{(j)} \]
其中\(m\)是样本数,\({x_j}^{i}\)是第\(j\)个样本的第\(i\)个特征。
批量梯度降低法(batch gradient descent)是最经常使用的作法,它使用全部的样本更新参数,它的参数更新公式为
\[ \omega_i = \omega_i - \alpha\sum_{j=0}^m(\hat{y_j}-y_j){x_i}^{(j)} \]
随机梯度降低法(stochastic gradient descent)相似于批量梯度降低法,可是它随机的使用第\(j\)个样本更新参数,它的参数更新公式为
\[ \omega_i = \omega_i - \alpha(\hat{y_j}-y_j){x_i}^{(j)} \]
小批量梯度降低法(mini-batch gradient descent)属于批量降低法和随机梯度降低法的折中方法,即对于\(m\)样本,随机选定\(x\)个样本更新参数,通常\(x=10\)。假设这\(x\)样本的集合为\(D\),它的参数更新公式为
\[ \omega_i = \omega_i - \alpha\sum_{j\in{D}} (\hat{y_j}-y_j){x_i}^{(j)} \]
批量梯度降低法使用全部的样本更新参数,计算量大,准确度高,可是更新速度慢。
随机梯度降低法随机使用一个样本更新参数,计算量小,更新速度快,可是准确度不高,而且因为使用一个样本更新参数,算法收敛速度慢。
小批量梯度降低法属于批量梯度降低法和随机梯度降低法的折中方法,可是采用的错误样本数须要具体问题去分析,不然采用错误的样本数量容易致使更新速度慢并且准确度也不高。