我正在读一本关于深度学习的书,对作者提到的其中一种想法感到有些困惑。摘自Francois Chollet的《 Python深度学习》 :
梯度是张量运算的导数。这是 导数概念到函数的泛化 多维输入:即采用张量的函数 作为输入。
考虑输入向量x,矩阵W,目标y和a 损失函数损失。您可以使用W来计算目标候选人 y_pred,并计算目标之间的损失或失配 候选y_pred和目标y:
y_pred =点(W,x)
损失值=损失(y_pred,y)
如果数据输入x和y被冻结,则可以是 解释为将W的值映射到损失的函数 值:
loss_value = f(W)
假设W的当前值为W0。然后 f在点W0的导数是张量梯度(f)(W0) 与W相同的形状,其中每个系数 梯度(f)(W0)[i,j]指示方向和大小 修改W0 [i,j]时观察到的loss_value的变化。那 张量梯度(f] [W0)是函数的梯度 f(W)= W0中的损失值。
您之前已经看到a的导数 单个系数的函数f(x)可解释为 f曲线的斜率。同样,gradient(f)(W0)可以是 解释为张量,描述围绕W0的f(W)的曲率。
基于这个原因,对于函数f(x),您几乎可以 可以通过在x中稍微移动x来减小f(x)的值 与导数相反的方向,函数f(W)为 一个张量,可以通过将W移到 与梯度相反的方向:例如, W1 = W0-step * gradient(f)(W0)(其中step是很小的比例因子)。 这意味着与曲率相反,这在直觉上 应该使您处于曲线下方。注意比例因子步长 因为gradient(f)(W0)仅近似曲率,所以需要 当您接近W0时,就不想离W0太远。
我不明白为什么我们要从权重中减去-step *梯度(f)(W0)而不仅仅是-step,因为-step *梯度(f)(W0)表示损失,而-step是参数(即x值,即重量的微小变化)
答案 0 :(得分:1)
您需要稍微改变与梯度相反的参数,以确保损耗降低。仅使用Get-ADComputer -Filter 'Name -like "BTS-ONE-LAP-*"' | FT Name
不能保证损失减少。在优化中这称为梯度下降,并且有收敛证明。您可以查看有关该主题的在线教程,例如this。
答案 1 :(得分:1)
该梯度告诉您要移动哪个方向,该步长将有助于控制您移动的幅度,从而使序列收敛。
我们不能只减去step
。回想一下step
只是一个标量数字。 W0
是张量。我们不能用张量减去标量。梯度是张量,其大小与W0
相同,因此可以很好地定义减法。
在gradient descent上阅读可能有助于您的理解。