Python 为什么这些模型不同?keras是否标准化渐变?

Python 为什么这些模型不同?keras是否标准化渐变?,python,tensorflow,keras,backpropagation,Python,Tensorflow,Keras,Backpropagation,我在模型中测试了一些假设的标准化,我发现了一些非常奇怪的东西 对于输出完全相同的结果,但使用技术来获得更大权重的模型,训练速度是难以置信的不同 为什么会发生这种情况?如果重量更大,梯度应该更大,最后的结果应该是相同的训练速度。keras或tensorflow所做的导致这种变化的隐藏魔法在哪里 详情: 模型 在这里,我定义了3个模型,其中2个模型的中间张量除以一个值,作为补偿,它们的权重乘以相同的值 考虑到每个神经元的输出是w1*i1+w2*i2+w3*i3…的变化,如果我将所有权重乘以一个值,并

我在模型中测试了一些假设的标准化,我发现了一些非常奇怪的东西

对于输出完全相同的结果,但使用技术来获得更大权重的模型,训练速度是难以置信的不同


为什么会发生这种情况?如果重量更大,梯度应该更大,最后的结果应该是相同的训练速度。keras或tensorflow所做的导致这种变化的隐藏魔法在哪里

详情:

模型 在这里,我定义了3个模型,其中2个模型的中间张量除以一个值,作为补偿,它们的权重乘以相同的值

考虑到每个神经元的输出是w1*i1+w2*i2+w3*i3…的变化,如果我将所有权重乘以一个值,并将所有输入除以相同的值,结果是完全相同的<代码>(其中:w=重量;i=输入)

我删除了所有层的偏差,这样它们就不会影响结果

模式1-未更改的模式 模型2-激活前,将输出除以输入数量 型号3(应与型号2相同,顺序不同) 编制和调整权重 编译,所有型号的配置相同:

model1.compile(optimizer='adam', loss='binary_crossentropy')
model2.compile(optimizer='adam', loss='binary_crossentropy')
model3.compile(optimizer='adam', loss='binary_crossentropy')
这里,我将权重从模型1转移到其他模型,应用正确的乘法因子来补偿分割的输出:

model2.get_layer('conv1a').set_weights([3 * model1.get_layer('conv1').get_weights()[0]])
model2.get_layer('conv2a').set_weights([200 * model1.get_layer('conv2').get_weights()[0]])

model3.get_layer('conv1b').set_weights([3 * model1.get_layer('conv1').get_weights()[0]])
model3.get_layer('conv2b').set_weights([200 * model1.get_layer('conv2').get_weights()[0]])
确保平等 在这里,我测试每个模型的输出,看看它们是否相等:

y1 = model1.predict(X[:10])
y2 = model2.predict(X[:10])
y3 = model3.predict(X[:10])

inspectValues(y1-y2) #this is a custom function that prints min, max and mean
inspectValues(y1-y3)
inspectValues(y2-y3)
这些产出是:

inspecting values:
    shape: (10, 64, 96, 1)
    min: -1.19209e-07
    max: 1.19209e-07
    mean: -2.00477e-09
inspecting values:
    shape: (10, 64, 96, 1)
    min: -1.19209e-07
    max: 5.96046e-08
    mean: -2.35159e-09
inspecting values:
    shape: (10, 64, 96, 1)
    min: -1.19209e-07
    max: 1.19209e-07
    mean: -3.46821e-10
考虑到输出范围为0到1,我们可以看到这些值实际上是相同的

训练差异 在这里,我快速地训练了这三个模型,并且有一个显著的可复制性差异,
model1
总是远远领先于其他模型。为什么会发生这种情况

for epoch in range(20):
    print("\n\n\nfitting model 3")
    model3.fit(X,Y,epochs=2)
    print("\n\n\nfitting model 1")
    model1.fit(X,Y,epochs=2)
    print("\n\n\nfitting model 2")
    model2.fit(X,Y,epochs=2)
产出:

fitting model 3
Epoch 1/2
5088/5088 [==============================] - 302s 59ms/step - loss: 0.1057
Epoch 2/2
5088/5088 [==============================] - 300s 59ms/step - loss: 0.0260

fitting model 1
Epoch 1/2
5088/5088 [==============================] - 284s 56ms/step - loss: 0.0280
Epoch 2/2
5088/5088 [==============================] - 282s 55ms/step - loss: 0.0111

fitting model 2
Epoch 1/2
5088/5088 [==============================] - 296s 58ms/step - loss: 0.1059
Epoch 2/2
5088/5088 [==============================] - 296s 58ms/step - loss: 0.0260

fitting model 3
Epoch 1/2
5088/5088 [==============================] - 300s 59ms/step - loss: 0.0187
Epoch 2/2
5088/5088 [==============================] - 301s 59ms/step - loss: 0.0155

fitting model 1
Epoch 1/2
5088/5088 [==============================] - 281s 55ms/step - loss: 0.0110
Epoch 2/2
5088/5088 [==============================] - 283s 56ms/step - loss: 0.0105

fitting model 2
Epoch 1/2
5088/5088 [==============================] - 294s 58ms/step - loss: 0.0187
Epoch 2/2

你错误地认为梯度不会改变

假设最后一层为简化模型:单神经元,无激活。在第一种情况下,输出是

y = w.h
其中,
h
是前一层的输出。我们有
dy/dw=h

现在让我们介绍一个比例因子
λ

y = λ.w.h
现在输出的导数是dy/dw=λ.h。
w
本身的值按
1/λ
缩放并不重要


要获得相同的梯度大小,实际上需要将前一层的输出按系数
1/λ
缩放。但是,由于您保持了输出的比例,因此不会发生这种情况。

您错误地认为梯度不会改变

假设最后一层为简化模型:单神经元,无激活。在第一种情况下,输出是

y = w.h
其中,
h
是前一层的输出。我们有
dy/dw=h

现在让我们介绍一个比例因子
λ

y = λ.w.h
现在输出的导数是dy/dw=λ.h。
w
本身的值按
1/λ
缩放并不重要


要获得相同的梯度大小,实际上需要将前一层的输出按系数
1/λ
缩放。但由于您保持了输出的比例,因此不会发生这种情况。

“如果权重更大,梯度应该更大,最终结果应该是相同的训练速度。”我不确定是否会在这一点上跟随您。和什么一样的训练速度?改变权重会影响优化过程,从而影响训练速度(与调整学习速率或动量的方式相同)。由于mod 2和mod 3看起来非常相似,我想说你的lambda负责训练速度的变化,但可能不是为了一个深刻的数学问题,而是为了实现效果。哪一个,我不知道“和什么一样的训练速度?”——就像所有其他具有相同输出的模型一样。“如果权重更大,梯度应该更大,最终结果应该是相同的训练速度。”我不确定这一个是否会跟随你。和什么一样的训练速度?改变权重会影响优化过程,从而影响训练速度(与调整学习速率或动量的方式相同)。由于mod 2和mod 3看起来非常相似,我想说你的lambda负责训练速度的变化,但可能不是为了一个深刻的数学问题,而是为了实现效果。哪一个,我不知道“和什么一样的训练速度?”-和所有其他输出相同的模型一样。当然。。。。“缩放
w
本身的值并不重要……”——我假设我也会通过更改权重来缩放渐变,但没有。因此我得到了“更大的权重”(预期)和“更小的渐变”(与天真的预期相反)。两倍的误差---我过去常常认为自己擅长数学…用普通SGD再次测试,自然地,我必须加倍学习率才能得到类似的结果。在您的示例中,
lr/λ²
。一个lambda表示梯度,另一个表示权重。当然。。。。“缩放
w
本身的值并不重要……”——我假设我也会通过更改权重来缩放渐变,但没有。因此我得到了“更大的权重”(预期)和“更小的渐变”(与天真的预期相反)。两倍的误差---我过去常常认为自己擅长数学…用普通SGD再次测试,自然地,我必须加倍学习率才能得到类似的结果。在您的示例中,
lr/λ²
。一个lambda表示渐变,另一个表示权重。
y = λ.w.h