在我的神经网络中,我将所有的权重矩阵合并成了一个大的矩阵:例如,一个三层矩阵通常有三个权重矩阵W1、W2、W3,每层一个。我创建了一个大的权重矩阵W,将W2和W3附加到W1的末尾。如果W1有3列,W2有3列,W3有2列,我的矩阵W将有8列。
层数/输入/输出的数量被存储为全局变量。
这意味着我可以使用只有两个输入参数的前馈代码,因为前馈代码会在函数内部将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之间。
回答:
您描述的方法存在几个问题。
首先,从您描述的情况来看,前馈代码或反向传播代码并没有真正简化。您只是将三个权重矩阵合并成一个,这使得feedforward
和costfn
函数可以接受更少的参数,但您仍然需要在这些函数内部解包W
来实现前向和反向传播逻辑。前馈和反向传播逻辑需要在每一层评估激活函数及其导数,因此不能简单地表示为矩阵乘法。
第二个问题是,您通过附加列将三个权重矩阵打包成一个,从而限制了您的神经网络结构。权重矩阵中的行数和列数分别对应于层中的神经元数和输入数。假设您的网络有M
个输入和第一层有N
个神经元。那么W1
的形状将是(N, M)
。一般来说,对于全连接网络,第二层的权重(W2
)将具有形状(K, N)
,其中N
是输入的数量(由第一层的输出数量限制),K
是第二层的神经元数量。
问题在于,由于您通过附加列创建了一个组合权重矩阵,K
(第二权重矩阵的行数)必须与第一层的神经元/行数相同,依此类推。对于后续层也是如此。换句话说,您的网络将具有形状M x N x N x N
(M
个输入,然后每层N
个神经元)。这对您的网络来说是一个不好的限制,因为您通常不希望隐藏层中的神经元数量与输出层相同。
请注意,为了简化,我忽略了偏置输入,但即使包含它们,同样问题仍然存在。