Python 中的梯度下降
Gradient Descent in Python
我想创建一个简单的神经网络,在我的研究中,我达到了一个叫做 Gradient Descent
的概念。那就是:
Imagine that you had a red ball inside of a rounded bucket. Imagine
further that the red ball is trying to find the bottom of the bucket.
This is optimization.
我使用这个教程:
http://iamtrask.github.io/2015/07/27/python-network-part2/
但我无法理解优化何时发生。当梯度下降发生时,最重要的是,与圆桶示例有什么关系?
本站还有教程(基本方法):
http://iamtrask.github.io/2015/07/12/basic-python-network/
根据这个网站,这个不是梯度下降,但第二个教程是相同的第一个,它称为梯度下降法。我无法理解这两个区别。
对于经典神经网络,您有两个步骤:
- 通过网络提供输入
- 错误的反向传播和权重的修正(突触)
第二个是使用梯度下降的地方。
这是您的示例 link http://iamtrask.github.io/2015/07/27/python-network-part2/
import numpy as np
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
alpha,hidden_dim = (0.5,4)
synapse_0 = 2*np.random.random((3,hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,1)) - 1
for j in xrange(60000):
layer_1 = 1/(1+np.exp(-(np.dot(X,synapse_0))))
layer_2 = 1/(1+np.exp(-(np.dot(layer_1,synapse_1))))
layer_2_delta = (layer_2 - y)*(layer_2*(1-layer_2))
layer_1_delta = layer_2_delta.dot(synapse_1.T) * (layer_1 * (1-layer_1))
synapse_1 -= (alpha * layer_1.T.dot(layer_2_delta))
synapse_0 -= (alpha * X.T.dot(layer_1_delta))
在向前的步骤中,您将 f(x)=1/(1+exp(-x))
(激活函数)应用于神经元状态的输入加权和(dot-product 又名标量积是其缩写形式)。
梯度下降隐藏在你计算的行的反向传播中。 layer_x_delta
:
layer_2*(1-layer_2)
是上面f
在位置layer_2
的推导(也称为梯度)。所以学习三角洲本质上是在正确的方向上跟随这个梯度。
- 在
layer_1_delta
中,你从第二层获取计算出的增量,用np.dot
(同样只是加权和)以线性方式将其向后拉,然后将梯度的方向作为以上 x(1-x)
- 然后根据目标神经元中的增量(误差)和源神经元的激活来改变权重。 (
np.dot(layer_1, delta_layer_2)
)。 alpha 只是一个学习率(通常是0 < alpha < 1
)以避免过度校正。
希望您能从这个回答中有所收获!
But I can't understand when optimization happens. When gradient descent happens and most importantly, What is the relation with the rounded bucket example?
对于所有机器学习问题,您都有一个损失函数。您离理想的解决方案越远,损失就越高。例如,在分类问题中,您可以计算当前分类器的误差。您可以将错误视为简单的损失函数。你的分类器犯的错误越多,它就越糟糕。
现在你的模型有了参数。让我们称这些为 "weights" w。如果你有 n 个,你可以写 w \in R^n.
对于每组权重 w,您可以为其分配一个错误。如果 n=2,您可以绘制此误差函数的图形。它可能看起来像这样:
x-y-平面的每个位置都是一组参数。 z 方向上的点是误差。你想最小化错误。因此,您的优化问题是一个最小化问题。你想掉进那个碗里。你不知道这是一个碗,这只是一个想象。但是通过观察梯度,你可以计算出哪个方向会减少误差。因此梯度下降。通过优化权重减少误差。
通常,您没有 n=2,而是 n=100 * 10^6 或类似的东西。
Alec Redford 针对不同类型的梯度下降为这个过程做了几个很棒的可视化:
梯度下降用于最小化给定模型中的误差函数。错误是预期输出和生成输出之间的给定差异。梯度计算图的'gradient',然后计算'descends'梯度,从而将'Cost function'减少到最小值
梯度下降是一种优化技术,用于查找成本最低的参数。
现在假设圆桶是成本函数,现在把它放在图表中(如果你在 2D 中看到它,它将是一条抛物线,桶的底部是抛物线的底部,如果你看到它在 3D 中,它将是圆形桶。),桶的底部将对应于尽可能少的成本。
(我们希望成本最低,因为这对应于更好的预测)
现在梯度下降总是会给出最陡的上升,并且当成本函数是凹的时总是会引导我们达到最小值,因为只有一个最优值(即,局部和全局最小值相同,就像在这种情况下一样)
它使用成本函数相对于其构建参数的偏导数来选择最佳移动方向,从而达到最小成本值并提供可能的最佳参数。
当梯度下降决定移动哪个方向(一个完整的 运行 通过数据集)时,它将更新参数值,这是当优化发生时,因为参数被更新以减少误差。
希望对您有所帮助!
我想创建一个简单的神经网络,在我的研究中,我达到了一个叫做 Gradient Descent
的概念。那就是:
Imagine that you had a red ball inside of a rounded bucket. Imagine further that the red ball is trying to find the bottom of the bucket. This is optimization.
我使用这个教程:
http://iamtrask.github.io/2015/07/27/python-network-part2/
但我无法理解优化何时发生。当梯度下降发生时,最重要的是,与圆桶示例有什么关系?
本站还有教程(基本方法):
http://iamtrask.github.io/2015/07/12/basic-python-network/
根据这个网站,这个不是梯度下降,但第二个教程是相同的第一个,它称为梯度下降法。我无法理解这两个区别。
对于经典神经网络,您有两个步骤:
- 通过网络提供输入
- 错误的反向传播和权重的修正(突触) 第二个是使用梯度下降的地方。
这是您的示例 link http://iamtrask.github.io/2015/07/27/python-network-part2/
import numpy as np
X = np.array([ [0,0,1],[0,1,1],[1,0,1],[1,1,1] ])
y = np.array([[0,1,1,0]]).T
alpha,hidden_dim = (0.5,4)
synapse_0 = 2*np.random.random((3,hidden_dim)) - 1
synapse_1 = 2*np.random.random((hidden_dim,1)) - 1
for j in xrange(60000):
layer_1 = 1/(1+np.exp(-(np.dot(X,synapse_0))))
layer_2 = 1/(1+np.exp(-(np.dot(layer_1,synapse_1))))
layer_2_delta = (layer_2 - y)*(layer_2*(1-layer_2))
layer_1_delta = layer_2_delta.dot(synapse_1.T) * (layer_1 * (1-layer_1))
synapse_1 -= (alpha * layer_1.T.dot(layer_2_delta))
synapse_0 -= (alpha * X.T.dot(layer_1_delta))
在向前的步骤中,您将 f(x)=1/(1+exp(-x))
(激活函数)应用于神经元状态的输入加权和(dot-product 又名标量积是其缩写形式)。
梯度下降隐藏在你计算的行的反向传播中。 layer_x_delta
:
layer_2*(1-layer_2)
是上面f
在位置layer_2
的推导(也称为梯度)。所以学习三角洲本质上是在正确的方向上跟随这个梯度。- 在
layer_1_delta
中,你从第二层获取计算出的增量,用np.dot
(同样只是加权和)以线性方式将其向后拉,然后将梯度的方向作为以上x(1-x)
- 然后根据目标神经元中的增量(误差)和源神经元的激活来改变权重。 (
np.dot(layer_1, delta_layer_2)
)。 alpha 只是一个学习率(通常是0 < alpha < 1
)以避免过度校正。
希望您能从这个回答中有所收获!
But I can't understand when optimization happens. When gradient descent happens and most importantly, What is the relation with the rounded bucket example?
对于所有机器学习问题,您都有一个损失函数。您离理想的解决方案越远,损失就越高。例如,在分类问题中,您可以计算当前分类器的误差。您可以将错误视为简单的损失函数。你的分类器犯的错误越多,它就越糟糕。
现在你的模型有了参数。让我们称这些为 "weights" w。如果你有 n 个,你可以写 w \in R^n.
对于每组权重 w,您可以为其分配一个错误。如果 n=2,您可以绘制此误差函数的图形。它可能看起来像这样:
x-y-平面的每个位置都是一组参数。 z 方向上的点是误差。你想最小化错误。因此,您的优化问题是一个最小化问题。你想掉进那个碗里。你不知道这是一个碗,这只是一个想象。但是通过观察梯度,你可以计算出哪个方向会减少误差。因此梯度下降。通过优化权重减少误差。
通常,您没有 n=2,而是 n=100 * 10^6 或类似的东西。
Alec Redford 针对不同类型的梯度下降为这个过程做了几个很棒的可视化:
梯度下降用于最小化给定模型中的误差函数。错误是预期输出和生成输出之间的给定差异。梯度计算图的'gradient',然后计算'descends'梯度,从而将'Cost function'减少到最小值
梯度下降是一种优化技术,用于查找成本最低的参数。
现在假设圆桶是成本函数,现在把它放在图表中(如果你在 2D 中看到它,它将是一条抛物线,桶的底部是抛物线的底部,如果你看到它在 3D 中,它将是圆形桶。),桶的底部将对应于尽可能少的成本。 (我们希望成本最低,因为这对应于更好的预测)
现在梯度下降总是会给出最陡的上升,并且当成本函数是凹的时总是会引导我们达到最小值,因为只有一个最优值(即,局部和全局最小值相同,就像在这种情况下一样) 它使用成本函数相对于其构建参数的偏导数来选择最佳移动方向,从而达到最小成本值并提供可能的最佳参数。 当梯度下降决定移动哪个方向(一个完整的 运行 通过数据集)时,它将更新参数值,这是当优化发生时,因为参数被更新以减少误差。
希望对您有所帮助!