BP神经网络学习笔记

时间:2024-03-20 19:55:35

sklearn中的BP神经网络就是MLP包

scikit-learn模块包括公开的属性coefs_ and intercepts_. coefs_是一个权矩阵列表,矩阵里的索引 ii 代表第 ii 层与 i+1i+1 层之间的权。intercepts_是一个偏差向量列表,索引 ii 的向量代表增加到第 i+1i+1 层的偏差值。

多层感知器的优势是:

学习非线性模型的能力

使用partial_fit在线学习的能力

多层感知器的不足包括:

MLP有一个非凸损失函数,它存在多个局部最小值。因此,不同的随机权初始化能导致不同的验证准确率。

MLP需要调整很多超参数,诸如隐层神经元的数量、层数、迭代次数等。

MLP对于特征缩放(feature scaling)是敏感的。

分类
类MLPClassifier执行一个多层感知器算法,该算法使用向后传播训练。MLP训练两个数组:(n_samples, n_features)数组X, 装载表示浮点特征向量的样本。(n_samples,)数组y, 装载训练样本的目标变量,即类标签。

from sklearn.neural_network import MLPClassifier
X = [[0., 0.], [1., 1.]]
y = [0, 1]
clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
                     hidden_layer_sizes=(5, 2), random_state=1)
clf.fit(X, y)

在拟合后,模型就能预测新样本的标签了。

clf.predict([[2., 2.], [-1., -2.]])

MLP能在训练数据上拟合一个非线性模型,clf.coefs_属性包括由模型参数组成的权矩阵。

[coef.shape for coef in clf.coefs_]

当前,MLPClassifier仅支持交叉熵损失函数,通过执行predict_proba方法,可以估计概率。 
MLP使用向后传播法训练,更确切地说,它使用经向后传播计算的梯度下降训练模型。对于分类问题,它最小化交叉熵损失,给出每个样本的概率估计向量 P(y|x)

print(clf.predict_proba([[2., 2.], [1., 2.]]))

通过应用Softmax作为输出函数,MLPClassifier支持多类别分类。进一步,模型支持多标签分类,即,一个样本能够属于多个类。对于每一个类,原始输出经历logistic函数。大于等于0.5的值,记为1;否则,记为0. 对于一个样本的预测输出,值是1的索引代表分派给那个样本的类。 

BP神经网络学习笔记
回归
类MLPRegressor执行一个多层感知器,使用向后传播法训练,在输出层无**函数。它使用平方误差作为损失函数,输出是一个连续值集。MLPRegressor也支持多输出回归,即,一个样本可以有多个目标值。

正则化
MLPRegressor and MLPClassifier使用参数 αα 作为正则项(L2正则),通过惩罚数量级大的权,避免过度拟合。下图显示了 αα 取不同值的决策函数。 

BP神经网络学习笔记
实际使用提示
多层感知器对特征缩放是敏感的,因此强烈建议scale数据。例如,scale输入向量X的每个属性到[0, 1]或[-1, 1], 或者归一化成0均值、1方差。注意,为了得到有意义的结果,你必须在训练集上采用相同的缩放标准。你可以使用StandardScaler标准化,我们建议在一个Pipeline里使用它。

BP神经网络学习笔记

注意:可以看到,x_test用的也是经过x_train 训练的scalar,而不是自己训练一个


最好使用GridSearchCV找到一个合理的正则参数 αα, 通常在10.0 ** -np.arange(1, 7)范围内。