我发现this在Tensorflow中实现的CNN示例。
在CNN的此示例中,偏置是恒定的(从第59行开始)。
58 W1 = tf.Variable(tf.truncated_normal([6, 6, 1, K], stddev=0.1))
59 B1 = tf.Variable(tf.constant(0.1, tf.float32, [K]))
60 W2 = tf.Variable(tf.truncated_normal([5, 5, K, L], stddev=0.1))
61 B2 = tf.Variable(tf.constant(0.1, tf.float32, [L]))
62 W3 = tf.Variable(tf.truncated_normal([4, 4, L, M], stddev=0.1))
63 B3 = tf.Variable(tf.constant(0.1, tf.float32, [M]))
这是否意味着优化器不会调整偏差?如果是,持续偏见的原因是什么?为什么甚至在网络的完全连接部分中的偏差也恒定?
答案 0 :(得分:1)
B1 = tf.Variable(tf.constant(0.1,tf.float32,[K]))
在此创建B1(变量),并使用常量对其进行初始化。 优化器在训练期间更改变量B1,B2,B3。只是它们是用常量初始化的。你看到区别了吗?
在C / C ++中,这类似于:
const float c = 0.1;
float B1 = c;
float W1 = 0.2; // initialized weights
float X= 10;
float out = X*W1 + B1;
std::cout << "ouput =, " << out << " B1 =" <<B1 <<"\n";
// now update bias, weight
B1 = B1 + B1/10;
W1 = W1 + W1/10;
out = X*W1 + B1;
std::cout << "ouput =, " << out << " B1 =" <<B1 <<"\n";
这正是正在发生的事情。 使用常数C初始化变量B1不会改变B1仍然是变量的事实。您引用的example只是作者的决定。
答案 1 :(得分:0)
随着网络的训练,偏见也会改变。只是在这种价值上令人鼓舞。偏置在完全连接的网络中非常重要,它是一个永远不会降低输入值的值,网络可以更好地利用它。
答案 2 :(得分:0)
神经网络中的偏差与线性方程中的偏差完全相同:
y = mx + c
将输出移位一个值。由于该示例使用ReLU作为激活,因此任何负梯度都不会通过它传播。添加偏差可以使更多的渐变值传播通过。
通常,偏差会初始化为零,并且可以设置为可训练或不可训练。但是在此示例中,他们将其初始化为常数0.1,这是不可训练的。
与权重初始化相比,偏置初始化在训练中并不十分重要。