网站建设机构,seo工程师招聘,电子商务网站经营性icp,买源码做网站目录 1 问题背景
2 批量梯度下降 (Batch Gradient Descent)
3 鞍点(Saddle Point)
3 随机梯度下降 (Stochastic Gradient Descent)
4 小批量梯度下降 (Mini-batch Gradient Descent) 1 问题背景 图1 上节课讲述的穷举法求最优权重值在Lecture2中#xff0c;介绍了使用穷举…目录 1 问题背景
2 批量梯度下降 (Batch Gradient Descent)
3 鞍点(Saddle Point)
3 随机梯度下降 (Stochastic Gradient Descent)
4 小批量梯度下降 (Mini-batch Gradient Descent) 1 问题背景 图1 上节课讲述的穷举法求最优权重值在Lecture2中介绍了使用穷举法来确定最优值然而当遇到范围较大或者数量过多等情况时穷举法的时间复杂度过大。因此我们需要优化该算法。 2 批量梯度下降 (Batch Gradient Descent) 在这次课中介绍了一种寻找最优值的算法——批量梯度下降 (Batch Gradient Descent, BGD)
简单介绍下该算法。首先对于下图 图2 训练过程中权重初始值与最优值的位置假设我们目前的起始位于上图红色点为了找到最优点(位于绿点)那么我们需要向左边移动这样才能到达最优点。 图3 我们需要计算梯度以向左移动权值点如何让权值点向左还是向右移动呢此时我们需要计算当前点的梯度(Gradient)也就是用成本函数对权重进行求导如果梯度0则向函数值递减方向移动梯度0则向函数值递增方向移动。 因为要移动起来所以我们每移动一步就要更新一下值。更新函数如下图Update处 图4 更新权重值的函数公式在这个更新函数中 α代表学习率(Learning Rate)学习率是机器学习中常用的一个超参数它定义了每次更新参数时步长的大小即每次更新参数时参数值变化的幅度。如果学习率设置得过大所求结果可能会在最优解的附近来回震荡而无法找到全局最优解。如果学习率设置得过小那么模型的训练将会非常缓慢甚至找不到最优解。 这个式子中梯度前面用了减号是为了朝函数值递减方向也就是往最优所在的点移动所以在梯度前面加负号。 就这样持续一步步地更新直到找到最优。 下面我们来具体讲讲如何去计算更新函数中的 图5 更新函数计算过程中需要用到上节课总结的两个公式 图6 均方误差MSE图7 预测值y_hat接着把上述两个公式代入原式 图8 求导过程蓝色处因为costMSE所以直接代入上一节课的MSE公式然后对求导。 绿色处由有理运算法则和的导数等于导数的和所以这里可以把移入求和式子中对里面先进行求导后再求和相加。 黄色处根据复合导数的链式求导法进行求导。 代码实现
from matplotlib import pyplot as pltx_data [1.0, 2.0, 3.0]
y_data [2.0, 4.0, 6.0]
w 1.0 # 初始权重由这个权重开始迭代线性模型算出预测值y_hat
def forward(x):return x * w均方误差MSE
def cost(xs, ys):cost 0for x, y in zip(xs, ys):y_pred forward(x) # 算出y_hatcost (y_pred - y) ** 2 # (y_hat - y)²return cost / len(xs) # 除以样本总数求均值梯度下降公式
def gradient(xs, ys):grad 0for x, y in zip(xs, ys):grad 2 * x * (x * w - y)return grad / len(xs)print(Predict (before training), 4, forward(4)) # 训练前模型对输入的4的最终预测结果cost_list [] # 保存每轮迭代后的cost值
epoch_list [] # 保存每轮的迭代后的epoch值
for epoch in range(100): # 进行100轮训练cost_val cost(x_data, y_data)grad_val gradient(x_data, y_data)w - 0.01 * grad_val # 使用梯度下降法更新权重,0.01表示学习率print(Epoch:, epoch, w%.2f % w, loss%.2f % cost_val)cost_list.append(cost_val)epoch_list.append(epoch)
print(Predict (after training), 4, forward(4)) # 训练后模型对输入的4的最终预测结果绘图
plt.plot(epoch_list, cost_list)
plt.ylabel(Cost)
plt.xlabel(Epoch)
plt.grid()
plt.show()图9 输出结果图像将MSE公式和Linear Model公式代入整合的最终更新函数 图10 最终的更新函数补充
训练后的结果一般来说cost会趋于收敛情况 图11 通常训练后cost图像会趋于收敛如果发生如下情况说明训练失败原因有很多其中之一可能是学习率取得太大 图12 训练失败这就是批量梯度下降算法本质上是一个贪心算法(Greedy Algorithm)。不过该算法有局限性比如当前的预测值正好位于下图绿线处因为再往右移动会梯度会发生变化使得程序直接终止于是误将红的点作为最优值而忽略了处于蓝色点的最优值 图13 局部最优和全局最优示意图我们把上图中的红点称为局部最优点(Local Optimum)蓝色点称为全局最优点(Global Optimum)。因此对于该梯度下降算法很可能会找到局部最优点而忽略了全局最优点。不过这种现象不必担心因为在实际训练中往往很难陷入局部最优点。 3 鞍点(Saddle Point) 在实际训练中往往很难陷入局部最优点而最需要解决的问题是鞍点(Saddle Point)鞍点是机器学习和数学中的一个概念它指的是一个特殊的局部极小值在某些方向上是极小值但在其他方向上是极大值。在一元函数中梯度0的点就是鞍点。比如下图中红色小球所处的位置就在鞍点此时梯度为零会导致更新函数无法更新(因为梯度0-α*0相当于没有发生更新) 图14 鞍点示意图从多维角度来分析比如下图红球处于马鞍面(Saddle Surface)从一个切面看可以处于最小值从另一个切面看又处于最大值 图15 位于马鞍面的鞍点在优化问题中鞍点是一种特殊的局部最优解是一个难以优化的点因为优化算法可能很难从鞍点附近找到全局最优解。这是因为如果优化算法在鞍点附近搜索它可能会被误导到其他附近的局部最优解而不是真正的全局最优解。所以在深度学习中需要克服的最大问题就是鞍点而非局部最优问题。 3 随机梯度下降 (Stochastic Gradient Descent) 随机梯度下降 (Stochastic Gradient Descent, SGD)在深度学习中很常用和BGD算法的区别是BGD使用所有的样本的均值的平均损失来作为的更新依据而SGD是从所有样本中随机选择单个样本的损失值来对进行更新。 随机梯度下降的优点是每次仅使用一个数据点的梯度因此在每次迭代时都有可能沿着非0梯度的方向更新参数这样就避免陷入到鞍点导致无法更新参数。 图16 BGD到SGD公式上的改变代码实现
import randomx_data [1.0, 2.0, 3.0]
y_data [2.0, 4.0, 6.0]
w 1.0def forward(x):return x * wdef loss(x, y):y_pred forward(x)return (y_pred - y) ** 2def gradient(x, y):return 2 * x * (x * w - y)print(Predict (before training), 4, forward(4))
for epoch in range(100):t random.randrange(0, 3) # 随机得到一个样本x x_data[t]y y_data[t]grad gradient(x, y)w w - 0.01 * gradprint(\tgrad: , x, y, %.2f % grad)l loss(x, y)print(progress:, epoch, w%.2f % w, loss%.2f % l)
print(Predict (after training), 4, forward(4))部分输出结果 Predict (before training) 4 4.0 grad: 3.0 6.0 -18.00 progress: 0 w1.18 loss6.05 grad: 2.0 4.0 -6.56 progress: 1 w1.25 loss2.28 grad: 3.0 6.0 -13.58 progress: 2 w1.38 loss3.44 grad: 1.0 2.0 -1.24 progress: 3 w1.39 loss0.37 grad: 2.0 4.0 -4.85 progress: 4 w1.44 loss1.24 ··· grad: 1.0 2.0 -0.00 progress: 97 w2.00 loss0.00 grad: 1.0 2.0 -0.00 progress: 98 w2.00 loss0.00 grad: 2.0 4.0 -0.00 progress: 99 w2.00 loss0.00 Predict (after training) 4 7.999910864525451 4 小批量梯度下降 (Mini-batch Gradient Descent) SGD算法虽然可以在一定程度上避免陷入局部最优以及鞍点问题但是运算所需时间复杂度过高每次仅使用一个数据点的梯度因此它的收敛速度通常比较慢。 因此有一个折中的办法就是使用小批量梯度下降 (Mini-batch Gradient Descent) 算法。简单来说小批量梯度下降是一种介于批量梯度下降和随机梯度下降之间的优化算法。结合了这两种方法通过使用小的随机选择的训练数据子集称为mini-batch计算损失函数关于参数的梯度的平均值来更新模型参数。 总之小批量梯度下降算法实现了BGD的高计算效率和SGD的良好收敛性之间的平衡。