Скажем, что мы хотим разместить прямую линию на плоскости через начало координат и точку (1, 2).Мы можем рассматривать это как линейную регрессию с выборкой размера 1 и без перехвата.Это, с другой стороны, может быть представлено как довольно тривиальная нейронная сеть без скрытых слоев и без активации.В Керасе это будет выглядеть следующим образом:
model = keras.Sequential([
keras.layers.Dense(1, input_shape=(1,), use_bias=False,
kernel_initializer=keras.initializers.Zeros()),
])
model.compile(loss='mse', optimizer=keras.optimizers.Adam(lr=.1))
Запустив
model.fit([[1]], [[2]], epochs=50)
мы получим желаемый результат.А именно, model.predict([[1]])
производит число, близкое к 2.
Теперь, включите второй слой в модель:
model2 = keras.Sequential([
keras.layers.Dense(1, input_shape=(1,), use_bias=False,
kernel_initializer=keras.initializers.Zeros()),
keras.layers.Dense(1, use_bias=False,
kernel_initializer=keras.initializers.Zeros())
])
model2.compile(loss='mse',
optimizer=keras.optimizers.Adam(lr=.1))
На этот раз, независимо от того, что мы бросаем после model2.fit
, мы обнаружим, что model2.predict
постоянно равно нулю.Более того, это происходит независимо от того, какой из алгоритмов градиентного спуска Кераса используется.
Это удивительно, поскольку две модели эквивалентны в том смысле, что параметр первой модели может быть реализован как произведениедва параметра во втором.То есть мы подгоняем прямую линию y = abx , пытаясь найти значения a и b .Взяв, например, a = 2 и b = 1, можно получить идеальное соответствие.
Итак, в чем разница?