随机梯度下降
梯度
基本概念
梯度是方向导数最大的地方
利用SGD深度学习的一般步骤
影响优化器的因素
每个都是一个研究方向,这里只是简单列出,只有有机会会分专题详细学习
梯度问题
局部最小值
鞍点
权重初始值
不仅仅课程中所提到的问题:由于之后网络层次比较深刻,所以会出现梯度消失或者梯度爆炸的问题
常见的初始化方法:[还没有彻底的理解,先学习一个框架]
https://zhuanlan.zhihu.com/p/62850258
learning rate
逐步衰减;过大,可能会出现震荡,不会达到局部最优解;过小,优化的速度会很慢
momentum
动量:用来逃出局部最优解
激活函数与loss的梯度计算
注意!!!:梯度是向量,这是我之前一致都不大注意的点,将它与导数混淆
激活函数的概念
灵感来自 青蛙的神经元的结构–一个阈值函数:神经元并不是各个输入的加权求和而是只有大于某个阈值之后才会输出,输出值是固定的值
早期的激活函数
课程里所提到的几个简单的激活函数,以及对应的导数
在pytorch相对应的函数
1 | torch.sigmoid() |
常见的loss函数
mean-square-error
Cross-Entropy-loss
Softmax
相关导数推导
mse
softmax
pytorch中的自动求导
torch.autograd.grad()
1 | import torch.nn.functional as F |
loss.backword()
1 | import torch.nn.functional as F |
两种方法对比
1 | torch.autograd.grad( |
1 | torch.autograd.backward( |
官方文档建议使用第一种,因为第二种存在内存泄漏问题(也不是很清楚
遇到的bug和解决问题
代码背景
1 | import torch.nn.functional as F |
RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time.
修改方案: retain_graph
pytorch: grad can be implicitly created only for scalar outputs