网站建设与服务费是什么服务,软件的开发定制,关键词推广方案,怎么查域名备案信息上一篇#xff1a;PyTorch官网demo解读——第一个神经网络#xff08;2#xff09;-CSDN博客
上一篇文章我们讲解了第一个神经网络的模型#xff0c;这一篇我们来聊聊梯度下降。
大佬说梯度下降是深度学习的灵魂#xff1b;梯度是损失函数#xff08;代价函数#xff…上一篇PyTorch官网demo解读——第一个神经网络2-CSDN博客
上一篇文章我们讲解了第一个神经网络的模型这一篇我们来聊聊梯度下降。
大佬说梯度下降是深度学习的灵魂梯度是损失函数代价函数的导数而下降的目的是让我们的损失不断减少达到模型收敛的效果最终拟合出最优的参数w。
所以我们要先从损失函数代价函数说起。 损失函数
从上一篇我们知道这个神经网络的模型是y wx b
对于单一个样本x, y它的损失值就是loss wx b - y
为了简单好理解我们先把b去掉那么 loss wx - y这个误差值可能是负数而我们衡量一个误差值使用负数好像有点奇怪于是我们使用均方差那么单个样本的损失就变成这样
loss (wx - y) ^2
假定我们有n个样本【(x1, y1), (x2, y2) …… (xn, yn)】那么我们的损失函数就是 这个损失函数实际上是一个开口向上的抛物线我随机取了5个样本值手搓了一下画出来如下图 梯度下降
梯度实际上就是损失函数的导数即抛物线上某个点的变化率 所以梯度函数是
t 2aw b
下降就是每次迭代将当前的权重减去 梯度值乘以学习率即
w w - t * lr
其中 lr 表示学习率学习率可以理解为我们每次迈的步伐大小如果迈的步伐太大会导致在逼近最优参数时难以收敛步伐太大跨过去了在最优参数左右摇摆。所以通常学习率会设置比较小的值。 代码
上面我们万般无奈地使用了一堆数学公式...但有时候数学是最好的抽象方式就像程序员喜欢说 read the f**king source code 一样。语言是对事物的抽象而数学是对语言的进一步抽象吧语言无法表达某些自然的规律所以需要通过数学来表达哈哈
好啦回顾第一篇的demo代码关于损失函数pytorch demo的代码极为精简
# 丢失函数 loss function
def nll(input, target):return -input[range(target.shape[0]), target].mean()
loss_func nll
而梯度下降就更为精简了梯度是自动推导的只需设置一个标志
weights.requires_grad_()
没错只需上面这行代码在每次训练迭代后调用 loss.backward()梯度就被计算出来啦而我们只需在每次迭代中减去梯度值就好如下
pred model(xb) # 通过模型预测
loss loss_func(pred, yb) # 通过与实际结果比对计算丢失值loss.backward() # 反向传播
with torch.no_grad():weights - weights.grad * lr # 调整权重值bias - bias.grad * lr # 调整偏差值weights.grad.zero_()bias.grad.zero_()
weights.grad.zero_()的作用是将每次迭代的梯度清零不然下次计算梯度的时候会进行叠加。 关于梯度下降就聊到这里吧有问题可以留言探讨共同学习 未有知而不行者知而不行只是未知