Линейная однослойная двухслойная ИНС с постоянными предсказаниями - PullRequest
0 голосов
/ 28 ноября 2018

Скажем, что мы хотим разместить прямую линию на плоскости через начало координат и точку (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, можно получить идеальное соответствие.

Итак, в чем разница?

1 Ответ

0 голосов
/ 28 ноября 2018

Это оказывается довольно неудачным побочным эффектом выбранных начальных значений.Легко видеть, что для данной выборки градиент среднеквадратичной ошибки оптимизации составляет

( a , b ) ↦ 2 (b ( ab - 2), a ( ab - 2))

, что равно нулю, когда ( a , b ) = (0, 0).Выбор любых других начальных значений для параметров, и все проходит как ожидалось.В частности, использование

kernel_initializer=keras.initializers.Constant(.1)

в обоих слоях даст желаемый результат.

Та же проблема не возникает в однослойном случае, поскольку здесь градиент составляет

* 1027.* a ↦ 2 ( a - 2)

, который равен нулю только тогда, когда a = 2.

...