在上一篇博文中,我们讨论了利用损失函数来判断一个权重矩阵的好坏,在这节中我们将讨论如何去找到最优的权重矩阵
想象我们要下到一个峡谷的底部,我们自然会选择下降最快的斜坡,换成我们这个问题就是要求权重矩阵相对于损失函数的梯度函数,最简单的方法就是使用定义法:
我们也可以使用解析梯度,这里需要用到矩阵对向量,矩阵对标量求导的一些知识,在后面我们也会采用反向传播的方法,因为自己手算微积分毕竟比较容易出错,尤其是涉及到很多层神经网络的时候。
在作业assignment2 的第一个线性分类器的实现中,我们会使用两张种损失函数,分别是svm与softmax函数,需要我们使用解析梯度来计算,这里推荐两篇博文的推导过程,因为我这边基础也不是很好,需要再深入学习一下😭
svm:http://giantpandacv.com/academic/算法科普/深度学习基础/SVM Loss以及梯度推导/
softmax:https://blog.csdn.net/qq_27261889/article/details/82915598
计算得到梯度函数之后,我们就可以让loss沿着梯度的方向下降:
这里有三个超参数,是我们自己手动设置的,分别是权重矩阵初始化的策略,迭代步骤与学习率
但是对所有的样本都进行梯度下降,显然是非常耗时的一件事,所以我们一般采用sgd方法,也就是随机梯度下降:
这里又多了batch size与抽样方法两个超参数
但是SGD的缺点在于会导致梯度剧烈波动,有的地方下降很快有的地方下降很慢,同时也面临着陷入局部最优解的困境,所以出现了SGD + Momentum
加入一个速度变量这样在下降快的时候可以抑制梯度的下降,起到一个平衡作用
Momentum也有变体 Nesterov Momentum,与Momentum唯一区别就是,计算梯度的不同。Nesterov动量中,先用当前的速 v临时更新一遍参数,在用更新的临时参数计算梯度,就是一种向前看的思想:
另一类进行优化的方法采用dw的平方
Adagrad 与 Rmsprop
由于adagrad会导致下降的过快,因为有平方的存在,所以又提出了RMSProp,加入decay_rate来放缓下降速度
最常用的优化方法就是adam
注意这里要加入偏差修正项防止起始的时候误差太大
这里有一篇知乎的回答可供参考:https://www.zhihu.com/question/323747423
上面的方法都是采用一阶导数:
有时候我们也可以采用二阶导数
但是二阶导的计算可想而知的复杂,所以我们一般很少采用二阶导进行优化
最后是一些二阶导的讨论:
本次assignment A2 的第一个线性分类器 主要内容就是分别采用svm与softmax损失函数进行优化计算,也没有用到后面复杂的优化方法,就是最简单的学习率乘以dw,比较复杂的就是解析梯度的推导,可参考上面的两篇博文