从表面上看,这听起来像是一个非常愚蠢的问题。但是,我花了一天的时间在各种来源戳戳,找不到答案。

让我更清楚这个问题。

拍摄这个经典图像:

enter image description here

显然,输入层是一个具有3个组件的向量。三个组件中的每一个都传播到隐藏层。每个神经元在隐藏层中看到具有3个组件的相同矢量 - 所有神经元都看到相同的数据。

因此,我们现在处于隐藏层。从我阅读的内容来看,该层通常只是relus或Sigmoids。

如果我错了,请纠正我,但是relu是一个恢复。为什么您需要4个完全相同的功能,都看到完全相同的数据?

是什么使隐藏层中的红色神经元彼此不同?他们应该与众不同吗?我没有阅读有关调整或设置参数或扰动不同神经元的任何内容,以使它们与众不同。但是,如果他们没有什么不同...那有什么意义呢?

上图下的文字 说:“神经网络实际上只是以不同方式连接的感知构成。”它们看起来都以与我完全相同的方式连接。

有帮助吗?

解决方案

使用您提供的样本神经网络解释:

  1. 多个输入的目的:每个输入代表输入数据集的功能。
  2. 隐藏层的目的:每个神经元都学会一组不同的权重,以表示输入数据的不同功能。
  3. 输出层的目的:每个神经元代表给定类别的输出类(标签/预测变量)。

如果您仅使用一个神经元,没有隐藏的层,则该网络只能学习线性决策边界。要在分类输出时学习非线性决策边界,需要多个神经元。通过学习近似输出数据集的不同功能,隐藏的层能够降低数据的维度以及识别输入数据的模式复杂表示。如果他们都学会了相同的权重,那么它们将是多余的,无用。

他们将学习不同的“权重”的方式,因此在给出相同数据时的功能不同的是,当使用反向传播来训练网络时,每个神经元的输出代表的错误都是不同的。这些错误是向后处理到隐藏层的,然后转到输入层,以确定将这些错误最小化的权重的最佳值。

这就是为什么在实施反向传播算法时,最重要的步骤之一是在开始学习之前随机初始化权重。如果没有这样做,那么您会观察到一个大号。神经元学习完全相同的权重,并给出亚最佳结果。


编辑以回答其他问题:

  • 神经元之所以没有多余的唯一原因是因为它们都经过了不同的权重“训练”,因此,在使用相同的数据显示时会产生不同的输出。这是通过随机初始化和错误的后传播来实现的。
  • 来自橙色神经元的输出(以您的图为例),通过将Sigmoid或Relu功能与受过训练的重量和橙色神经元的输出施加sigmoid或relu功能,将每个蓝色神经元“压扁”。

其他提示

我认为这里的关键是,在训练中,具有相同的权重(以及隐藏层中相同的神经元)不会导致最佳解决方案,正是不同的权重导致实际值和预测值之间的差异较低。

我编码了这个真正愚蠢的神经网络(作为学习练习)。也许可能有所帮助。

import numpy as np

class NeuralNetwork(object):
    def __init__(self, X, Y, hidden_layer_dim):
        self.X = X / np.max(X)
        self.Y = Y / np.max(Y) # Used for training
        self.hidden_layer_dim = hidden_layer_dim

    def initialize_weights(self):
        self.w1 = np.random.normal(0,1, (self.X.shape[1], self.hidden_layer_dim))
        self.w2 = np.random.normal(0,1, self.hidden_layer_dim)

    def forward(self, xi):
        """
        x1 is 2d array
        """
        # This method is also used for training 
        xi = xi / np.max(xi)
        z2 = np.dot(xi, self.w1)
        a2 = sigmoid(z2)
        z3 = np.dot(a2, self.w2)
        y_hat = sigmoid(z3)
        return y_hat

    def dump_train(self, n_iterations):
        min_mse = np.inf
        for i in range(n_iterations):
            w1 = np.random.normal(0,1, (self.X.shape[1], self.hidden_layer_dim))
            w2 = np.random.normal(0,1, self.hidden_layer_dim)

            z2 = np.dot(self.X, w1)
            a2 = sigmoid(z2)
            z3 = np.dot(a2, w2)
            y_hat = sigmoid(z3)

            diff = self.Y - y_hat
            mse = np.dot(diff, diff)

            if mse < min_mse:
                min_mse = mse
                print("min_mse: {}, iteration: {}".format(mse, i))
                self.w1 = w1
                self.w2 = w2

def sigmoid(a):
    return 1 / (1 + np.e ** (-a))

if __name__ == "__main__":
    my_x = np.array([[8,5], [7,5], [8,4],[8,1], [4, 3], [5,2], [4,2]], dtype=np.float)
    my_y = np.array([100, 90, 88, 60, 50, 45, 40], dtype=np.float)

    NN = NeuralNetwork(my_x, my_y, hidden_layer_dim=3)
    NN.initialize_weights()
    NN.dump_train(100000)

    new_x = [[8,4], [7,1], [3,3]]

    y_hat = NN.forward(new_x)

    print("prediction: {}".format(y_hat))
    print("weight 1: {}".format(NN.w1))
    print("weight 2: {}".format(NN.w2)) 

结果:

weight 1: [[-0.13787113 -1.30913914  0.64624687]
 [-1.76733779  0.77449265  1.61122177]]
weight 2: [-1.42489674 -1.94360005  2.56365303]

权重不同。

许可以下: CC-BY-SA归因
scroll top