梯度下降法和牛顿法是最常见的两个模型训练算法了,现在对这两个算法做一个比较:
梯度下降法 | 牛顿法 | |
迭代公式 | [{w^{(k + 1)}} = {w^{(k)}} - alpha abla J({w^{(k)}})] | [{w^{(k + 1)}} = {w^{(k)}} - {H^{ - 1}}({w^{(k)}}) abla J({w^{(k)}})] |
物理意义 |
1. 搜寻函数的最低点 2.搜索方向是损失函数一阶导数的方向 3. 每次迭代步长有参数(alpha )决定 |
1. 搜索损失函数一阶导数=0的点 2. 搜索方向是损失函数二阶导数(一阶导数在当前点的切线) 3.每次迭代都在搜索方向上找与y=0平面的交点,无步长参数 |
单次迭代时间复杂度 | 只需计算1阶导数,时间复杂度低,为(O(n)) | 需要计算Hessian矩阵及其逆矩阵,时间复杂度高,为(O(n^3)) |
收敛速度 | 收敛慢,迭代次数大 | 收敛快,迭代次数小 |
参数选择 | 需要选择步长[alpha ] | 无需选择参数 |
适用范围 | 适用feature维度较大的场景,如feature数>1000 | 使用feature数较小的场景 |
牛顿法的物理意义可以从下面两个方面理解:
1. 损失函数在当前搜索点泰勒展开,丢弃二阶以上的函数项,下一个搜索点为展开后的最小值
2. 搜寻损失函数一阶导数与y=0平面的交点,搜索方式类似与梯度下降,即计算一阶导数的导数为搜索方向,下一个搜索点是当前点切线与y=0平面的交点。