【问题标题】:Gradient Descent in PythonPython中的梯度下降
【发布时间】:2017-06-23 05:46:20
【问题描述】:

我想创建一个简单的神经网络,在我的研究中,我遇到了一个名为 Gradient Descent 的概念。那就是:

想象你在一个圆形桶里有一个红球。想象 进一步说红球试图找到桶底。 这是优化。

我使用这个教程:

http://iamtrask.github.io/2015/07/27/python-network-part2/

但我无法理解优化何时发生。当梯度下降发生时,最重要的是,与圆桶示例有什么关系?

本站还有一个教程(基本方法):

http://iamtrask.github.io/2015/07/12/basic-python-network/

根据这个网站,这个不是梯度下降,但第二个教程和第一个一样,它被称为梯度下降法。我无法理解这两个区别。

【问题讨论】:

  • 请阅读机器学习教程或维基的梯度下降文章。优化步骤与-= aka 下降一致。示例:synapse_0 -= synapse_0_derivative。之前的行计算梯度。大多数 NN 优化器都基于梯度下降的思想,其中使用反向传播来计算梯度,并且几乎在所有情况下都使用随机梯度下降来进行优化,这与纯梯度下降有点不同。这些是基础知识,而 ML 课程比这类博客文章更有帮助。
  • 我读了很多书,但还是看不懂。我使用 Sigmoid 激活函数,我无法将它与该存储桶示例相关联。在本教程中,我的优化是什么?在 Sigmoid 中,我们必须最小化一些并最大化其他一些......但在梯度下降中,我们只需要最小化......我很困惑......
  • 从基础开始的更多理由!损失就是损失......它始终是一个最小化问题。
  • 我同意你需要先了解基础知识,你有严重的误解,sigmoid 与最小化/最大化无关。而且这些教程非常简单,学不到什么。
  • 第一个链接中的 sigmaoid 函数是 1/(1+exp(-x)),它具有派生的 x(1-x)。您可以在代码中找到这两个表达式,并填写x

标签: python machine-learning neural-network artificial-intelligence deep-learning


【解决方案1】:

对于经典神经网络,您有两个步骤:

  • 通过网络提供输入
  • 错误的反向传播和权重的校正(突触) 第二个是使用梯度下降的地方。

这是来自您的链接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))(激活函数)应用于神经元状态的输入(点积,也就是标量积的简称)的加权和。

梯度下降隐藏在您计算所在行的反向传播中。 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),以避免过度校正。

我希望你能从这个答案中得到一些东西!

【讨论】:

  • 有人可以帮助我如何以一种很好的方式格式化代码块吗? ^^
  • 我编辑了代码,我正在阅读它。希望它对我有帮助。还是谢谢你
【解决方案2】:

梯度下降是一种优化技术,用于寻找成本最低的参数。

现在假设圆形桶是成本函数,现在把它放在一个图表中(如果你在 2D 中看到它,它将是一条抛物线,而桶的底部是抛物线的底部,如果你在 3D 中看到它它将是圆形的桶。),桶的底部将对应于可能的最低成本。 (我们希望成本最低,因为这对应于更好的预测)

现在梯度下降总是会给出最陡峭的上升,并且总是会在成本函数是凹的时将我们引导到最小值,因为只有一个最优值(即,局部和全局最小值将相同,因为它在这种情况下) 它使用成本成本函数相对于其构建的参数的偏导数,以选择最佳移动方向,从而达到最小成本值并提供可能的最佳参数。 当梯度下降决定向哪个方向移动时(一次完整的数据集运行),它将更新参数值,这就是优化发生的时候,因为参数被更新以减少误差。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    梯度下降用于最小化给定模型中的误差函数。误差是预期输出和生成输出之间的给定差异。 Gradient 计算图的“梯度”,然后“下降”梯度,从而将“成本函数”降到最低

    【讨论】:

      【解决方案4】:

      但我无法理解优化何时发生。当梯度下降发生时,最重要的是,与圆桶示例有什么关系?

      对于所有机器学习问题,您都有一个损失函数。离理想解决方案越远,损失越大。例如,在分类问题中,您可以计算当前分类器的误差。您可以将错误视为简单的损失函数。您的分类器犯的错误越多,情况就越糟糕。

      现在您的模型有了参数。让我们称这些“权重”w。如果你有 n 个,你可以写 w \in R^n。

      对于每组权重 w,您可以为其分配一个错误。如果 n=2,您可以为该误差函数绘制图表。它可能看起来像这样:

      x-y-平面上的每个位置都是一组参数。 z 方向上的点就是误差。你想最小化错误。因此,您的优化问题是一个最小化问题。你想掉进那个碗里。你不知道它是一个碗,这只是一个想象。但是通过查看梯度,可以计算出哪个方向会减少误差。因此梯度下降。通过优化权重来减少误差。

      通常,您没有 n=2,而是 n=100 * 10^6 或类似的东西。

      Alec Redford 为这个过程针对不同种类的梯度下降做了几个很好的可视化:

      Source

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-08
        • 2017-07-17
        • 1970-01-01
        • 2016-09-25
        • 2017-04-30
        • 1970-01-01
        • 2019-11-15
        相关资源
        最近更新 更多