页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

警告:此实现不适用于大规模应用程序。特别是scikit-learning不支持GPU。要快得多,基于GPU的实现以及为构建深度学习架构提供更多灵活性的框架,请参阅 相关项目

多层感知器

多层感知器(MLP)是一种受监督的学习算法,通过在数据集上进行训练来学习功能米,输入的维数在哪里,是Ø输出的维数。给定一组特征 和目标ÿ,它可以学习用于分类或回归的非线性函数近似。与逻辑回归不同,在输入和输出层之间,可以有一个或多个非线性层,称为隐藏层。图1显示了一个具有标量输出的隐层MLP。

图1:一个隐层MLP。

称为输入层的最左层由一组表示输入特征的神经元 组成。隐藏层中的每个神经元都用加权线性求和函数将前一层的值转换为非线性激活函数,如双曲线函数。输出层接收最后一个隐藏层的值,并将其转换为输出值。

该模块包含公共属性coefs_intercepts_。 coefs_是权重矩阵的列表,其中索引处一世的权重矩阵 表示层一世和层 之间的权重intercepts_是偏移向量的列表,其中索引处的向量一世表示添加到层的偏移值

多层感知器的优点是:

  • 学习非线性模型的能力。
  • 能够实时学习模型(在线学习)partial_fit

多层感知器(MLP)的缺点包括:

  • 具有隐层的MLP具有非凸失去函数,其中存在多于一个局部最小值。因此,不同的随机权重初始化可能导致不同的验证精度。
  • MLP需要调整许多超参数,例如隐藏的神经元,层和迭代的数量。
  • MLP对特征缩放很敏感。

请参阅解决一些这些缺点的实用使用小节部分。

 

分类

Class MLPClassifier实现了使用Backpropagation进行训练的多层感知器(MLP)算法。

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)                         
MLPClassifier(activation='relu', alpha=1e-05, batch_size='auto',
       beta_1=0.9, beta_2=0.999, early_stopping=False,
       epsilon=1e-08, hidden_layer_sizes=(5, 2), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)

拟合(训练)后,该模型可以预测新样本的标签:

>>> clf.predict([[2., 2.], [-1., -2.]])
array([1, 0])

MLP可以将非线性模型适用于训练数据。clf.coefs_ 包含构成模型参数的权重矩阵:

>>> [coef.shape for coef in clf.coefs_]
[(2, 5), (5, 2), (2, 1)]

目前,MLPClassifier只支持交叉熵损失函数,通过运行该predict_proba方法可以进行概率估计 。

使用反向传播的MLP列车。更准确地说,它使用某种形式的梯度下降训练,并且使用反向传播计算梯度。对于分类,它最小化交叉熵损失函数,给出每个样本的概率估计向量X

>>> clf.predict_proba([[2., 2.], [1., 2.]])  
array([[  1.967...e-04,   9.998...-01],
       [  1.967...e-04,   9.998...-01]])

MLPClassifier通过应用Softmax 作为输出功能支持多类分类。

此外,该模型支持多标签分类 ,其中样本可以属于多个类。对于每个类,原始输出通过逻辑函数。大于或等于0.5的值 将舍入为1,否则为0。对于样本的预测输出,值为1的索引表示该样本的分配类别:

>>> X = [[0., 0.], [1., 1.]]
>>> y = [[0, 1], [1, 1]]
>>> clf = MLPClassifier(solver='lbfgs', alpha=1e-5,
...                     hidden_layer_sizes=(15,), random_state=1)
...
>>> clf.fit(X, y)                         
MLPClassifier(activation='relu', alpha=1e-05, batch_size='auto',
       beta_1=0.9, beta_2=0.999, early_stopping=False,
       epsilon=1e-08, hidden_layer_sizes=(15,), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
       solver='lbfgs', tol=0.0001, validation_fraction=0.1, verbose=False,
       warm_start=False)
>>> clf.predict([[1., 2.]])
array([[1, 1]])
>>> clf.predict([[0., 0.]])
array([[0, 1]])

有关MLPClassifier.fit更多信息,请参阅下面的示例和文档字符串 。

回归

MLPRegressor实现了一个多层感知器(MLP),它在输出层中使用反向传播,没有激活功能进行训练,也可以看作是使用身份函数作为激活函数。因此,它使用平方误差作为损失函数,输出是一组连续值。

MLPRegressor 还支持多输出回归,其中样本可以有多个目标。

 

正则化

两者MLPRegressor和类:MLPClassifier使用参数alpha 进行正则化(L2正则化)术语,有助于通过惩罚具有大幅度的权重来避免过度拟合。以下图表显示了具有α值的决策函数。

有关详细信息,请参阅下面的示例。

算法

MLP火车使用随机梯度下降, 亚当或 L-BFGS。随机梯度下降(SGD)使用相对于需要适应的参数的损失函数的梯度更新参数,即

参数空间搜索中控制步长的学习率在哪里。 失利是用于网络的丢失功能。

更多细节请见SGD的文件

Adam与SGD类似,在某种意义上说它是随机优化器,但它可以根据低阶矩的自适应估计自动调整更新参数的量。

使用SGD或Adam,培训支持在线和小批量学习。

L-BFGS是近似表示函数的二阶偏导数的Hessian矩阵的求解器。此外,它近似于Hessian矩阵的逆来执行参数更新。实施使用Scipy版本的L-BFGS

如果所选择的求解器是“L-BFGS”,培训不支持在线或小批量学习。

 

复杂性

假设有ñ训练样本,米特征,ķ 隐藏层,每个包含H神经元 - 为了简单和Ø 输出神经元。反向传播的时间复杂度为,其中一世是迭代的次数。由于反向传播具有较高的时间复杂度,因此建议从较少数量的隐藏神经元开始,并且隐藏的层数较少。

 

数学公式

给定一组训练示例 ,并且隐藏的一层隐藏神经元MLP学习功能 在哪里是模型参数。代表输入层和隐层的权重; 并分别表示添加到隐层和输出层的偏置。 是激活功能,默认设置为双曲线。它被赋予,

对于二进制分类,通过逻辑函数 获得0和1之间的输出值。设置为0.5的阈值将分配大于或等于0.5的输出样本到正类,其余的分配给负类。

如果有两个以上的类,本身将是一个大小的向量(n_classes,)。而不是通过逻辑函数,它通过softmax函数,它被写为,

其中z_i表示一世对于softmax的输入的第th个元素,它对应于类一世,并且ķ是类的数量。结果是包含样本X 属于每个类的概率的向量。输出是具有最高概率的类。

在回归,输出保持为; 因此,输出激活功能只是身份功能。

MLP根据问题类型使用不同的丢失功能。分类的损失函数是交叉熵,在二进制的情况下,

哪里是L2-正则化术语(又称惩罚),惩罚复杂的模型; 并且是一个非负的超参数,用于控制惩罚的大小。

为了回归,MLP使用平方误差损失函数; 写成,

从初始随机权重开始,多层感知器(MLP)通过重复更新这些权重来最小化损失函数。在计算丢失之后,反向传递将其从输出层传播到先前的层,为每个权重参数提供旨在减少损失的更新值。

在梯度下降中,计算相对于权重的损失梯度,并从中扣除。更正式地,这表示为,

一世迭代步骤在哪里,并且是值大于0的学习速率。

算法在达到预设的最大迭代次数时停止; 或者当损失的改善低于一定数量的时候。

 

实用窍门

  • 多层感知器对特征缩放很敏感,因此强烈建议您扩展数据。例如,将输入向量X上的每个属性缩放为[0,1]或[-1,+1],或将其标准化为平均值0和方差1.请注意,必须将相同的 缩放应用于测试集有意义的结果。您可以使用StandardScaler标准化。

    >>> from sklearn.preprocessing import StandardScaler  
    >>> scaler = StandardScaler()  
    >>> # Don't cheat - fit only on training data
    >>> scaler.fit(X_train)  
    >>> X_train = scaler.transform(X_train)  
    >>> # apply same transformation to test data
    >>> X_test = scaler.transform(X_test)  

    一种替代和推荐的方法是StandardScaler 在a中使用Pipeline

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

  • 经验上,我们观察到L-BFGS收敛速度更快,并且对小数据集有更好的解决方案。然而,对于相对较大的数据集,Adam非常强大。它通常会快速收敛并给出相当不错的表现。另一方面,如果学习率正确调整,SGD具有动量或nesterov的动量,可以比这两种算法表现更好。

 

更多控制与warm_start 

如果你想在停止准则或新加坡元学习率更多的控制,或者想要做额外的监控,使用warm_start=True和 max_iter=1和迭代自己可以帮助:

>>> X = [[0., 0.], [1., 1.]]
>>> y = [0, 1]
>>> clf = MLPClassifier(hidden_layer_sizes=(15,), random_state=1, max_iter=1, warm_start=True)
>>> for i in range(10):
...     clf.fit(X, y)
...     # additional monitoring / inspection 
MLPClassifier(...

 

参考文献:

 

  • 无标签