【问题标题】:Using a single weight matrix for Back-Propagation in Neural Networks在神经网络中使用单个权重矩阵进行反向传播
【发布时间】:2014-03-10 18:59:04
【问题描述】:

在我的神经网络中,我将所有权重矩阵组合成一个大矩阵: 例如,一个 3 层矩阵通常有 3 个权重矩阵 W1、W2、W3,每层一个。我创建了一个名为 W 的大型权重矩阵,其中 W2 和 W3 附加到 W1 的末尾。如果 W1 有 3 列,W2 有 3 列,W3 有 2 列,我的矩阵 W 将有 8 列。

层数/输入/输出数存储为全局变量。

这意味着我可以使用只有 2 个输入参数的前馈代码,因为前馈代码在函数内部将 W 拆分为 W1、W2、W3...等。

Output_of_Neural_Net = feedforward(Input_to_Neural_Net,W)

我还将训练数据存储为全局变量。这意味着我可以只使用一个输入参数来使用成本函数。

cost = costfn(W)

这样做的目的是让我可以使用内置的 MATLAB 函数来最小化成本函数,从而获得最接近我的训练数据的网络的 W。

我试过fminsearch(@costfn,W)fminunc(@costfn,W)。尽管fminunc 稍微好一点,但两者都给出了我试图近似的函数的平庸结果。

我现在想尝试反向传播来训练这个网络,看看它是否做得更好,但是大多数实现都是针对具有多个权重矩阵的网络,这使得它更加复杂。

我的问题是:我能否用我的单个附加权重矩阵实现反向传播,我该怎么做?

我觉得使用单个权重矩阵应该会使代码更简单,但我不知道如何实现它,因为我看到的所有其他示例都是针对多个权重矩阵的。

其他信息

网络将是一个具有 8 到 30 个输入和 3 个输出的函数逼近器。它逼近的函数非常复杂,涉及椭圆积分的逆(因此没有解析解)。网络的输入和输出将被归一化,使其介于 0 和 1 之间。

【问题讨论】:

    标签: matlab machine-learning neural-network mathematical-optimization backpropagation


    【解决方案1】:

    您所描述的方法存在几个问题。

    首先,根据您的描述,前馈代码或反向传播代码确实没有简化。您只是将三个权重矩阵组合为一个,这允许feedforwardcostfn 函数采用更少的参数,但您仍然必须在这些函数中解压缩W 以实现前向和反向传播逻辑。前馈和反向传播逻辑需要评估激活函数及其在每一层中的导数,因此您不能将其表示为简单的矩阵乘法。

    第二个问题是您通过附加列将三个权重矩阵打包成一个来限制神经网络的结构。权重矩阵中的行数和列数分别对应于层中神经元和输入的数量。假设您的网络有M 输入,第一层有N 神经元。然后W1 将具有形状(N, M)。通常,对于全连接网络,第二层权重 (W2) 的形状为(K, N),其中N 是输入的数量(受第一层的输出数量限制),@ 987654332@是第二层的神经元个数。

    问题在于,由于您通过附加列来创建一个组合权重矩阵,K(第二个权重矩阵中的行数)必须与第一层的行数/神经元数相同,依此类推,用于连续层。换句话说,您的网络将具有M x N x N x N 形状(M 输入,然后是每一层中的N 神经元)。这对您的网络来说是一个不好的约束,因为您通常不希望隐藏层中的神经元数量与输出层中的神经元数量相同。

    请注意,为简化起见,我忽略了偏差输入,但即使包含它们也存在相同的问题。

    【讨论】:

    • 感谢您的回答。是的,我必须解压缩W yo 实现feedforward 函数,并且costfn 里面有feedforward 函数,这样做可以。然而,这是使用 fminsearchfminunc 函数的唯一方法,因为它们只能优化单个矩阵。我想我明白为什么我不能为 back-prop 算法做到这一点。是的,我正在限制我的网络的结构,但唯一的限制是每层中隐藏神经元的数量与输入的数量相同。我可以在输出层有不同数量的神经元...
    • ...因为矩阵 W 可以在前馈代码中解压缩成不同大小的矩阵。全局变量定义了矩阵的分割方式。我听说拥有与输入相同数量的隐藏神经元通常是一个很好的起点,这不是真的吗?
    • 例如W1可以是(5 x 4)矩阵(4个输入+1个偏置节点,连接到下一层的4个隐藏神经元)。W2同理,然后@987654346 @ 一个(5 x 2) 矩阵(4 个先前的神经元 + 1 个偏置节点,连接到 2 个输出)。然后将它们附加到单个 (5 x 10) 矩阵中,以供优化。
    • 好的,那么您的行/列相对于我的响应进行了交换。但这意味着你的网络被限制为像N x N x N x M 这样的形状,其中第一个N 是输入的数量,M(输出的数量)是 2。每层使用多少个神经元取决于问题的性质、类的数量等。在某些情况下,您希望第一层中有更多的神经元,以便为后续层提供许多决策边界。在其他情况下(或层),您可能需要更少的神经元来降低数据空间的维度。
    • 这不是很难。您可以根据激活函数的输入/输出范围随机化权重。如果您还将输入扩展到该范围,这是最简单的。如果您可以编写一个隐藏层,那么您可以轻松编写 1,000 个隐藏层,因此使其具有通用性。只有输出层是特殊的(关于反向传播)。前馈部分很简单:矩阵乘法,然后应用激活函数。您的问题被标记为matlab,但here 是python 中的一个示例。
    猜你喜欢
    • 2013-01-22
    • 2018-06-10
    • 1970-01-01
    • 2015-03-03
    • 2012-02-21
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多