无隐藏层神经网络不等于逻辑回归



理论上,无隐藏层神经网络应该与逻辑回归相同,然而,我们收集了各种各样的结果。更令人困惑的是,测试用例非常基本,但神经网络却无法学习。

sklearn逻辑回归

tensorflow无隐藏层神经网络

我们试图选择两个模型的参数尽可能相似(相同的epoch数,没有L2惩罚,相同的损失函数,没有额外的优化,如动量,等等…)。sklearn逻辑回归正确地一致地找到决策边界,变化最小。tensorflow神经网络是高度可变的,看起来偏差在"努力"训练。

下面包含的代码用于重新创建此问题。理想的解决方案将具有与逻辑回归决策边界非常相似的tensorflow决策边界。

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Conv1D, Dense, Flatten, Input, Concatenate, Dropout
from tensorflow.keras import Sequential, Model
from tensorflow.keras.optimizers import SGD
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.linear_model import LogisticRegression

X = np.array([[1, 1],
[2, 2]])
y = np.array([0, 1])
model = LogisticRegression(penalty = 'none',
solver='sag',
max_iter = 300,
tol = 1e-100)
model.fit(X, y)
model.score(X, y)
model.coef_.flatten()[1]
model.intercept_
w_1 = model.coef_.flatten()[0]
w_2 = model.coef_.flatten()[1]
b = model.intercept_
n = np.linspace(0, 3, 10000, endpoint=False)
x_n = -w_1 / w_2 * n - b / w_2
plt.scatter(X[:, 0], X[:, 1], c = y)
plt.plot(n, x_n)
plt.gca().set_aspect('equal')
plt.show()
X = np.array([[1, 1],
[2, 2]])
y = np.array([0, 1])
optimizer = SGD(learning_rate=0.01,
momentum = 0.0,
nesterov = False,
name = 'SGD')
inputs = Input(shape = (2,), name='inputs')
outputs = Dense(1, activation = 'sigmoid', name = 'outputs')(inputs)
model = Model(inputs = inputs, outputs = outputs, name = 'model')
model.compile(loss = 'bce', optimizer = optimizer, metrics = ['AUC', 'accuracy'])
model.fit(X, y, epochs = 100, verbose=False)
print(model.evaluate(X, y))
weights, bias = model.layers[1].get_weights()
weights = weights.flatten()
w_1 = weights[0]
w_2 = weights[1]
b = bias
n = np.linspace(0, 3, 10000, endpoint=False)
x_n = -w_1 / w_2 * n - b / w_2
plt.scatter(X[:, 0], X[:, 1], c = y)
plt.plot(n, x_n)
plt.grid()
plt.gca().set_aspect('equal')
plt.show()

判断这是否真的是一个bug的简单方法是让感知器中的epoch数量变为任意大的数字(例如5000)。您将注意到决策边界接近逻辑回归模型的边界。

自然的问题是为什么LR需要更少的迭代来实现接近最优的决策边界。对于强凸函数(如您的示例),SAG的收敛速度比SGD快得多。因此,SGD需要更长的时间才能收敛为"全球商品"。

最新更新