当前位置:   article > 正文

【机器学习笔记21】神经网络(多层感知机)_多层感知机表达分段线性函数

多层感知机表达分段线性函数

【参考资料】
【1】《深度学习》 花书 6.1

亦或问题

由于单层感知机相当于在一个空间增加了一个超平面进行分类,那么对于像亦或问题这样的情况则无法完成。
在这里插入图片描述

因此在多层感知机中增加了一个隐藏层,即一个激活函数。现代神经网络最常用的激活函数是整流线性单元,ReLU函数,如下:
在这里插入图片描述

我们推导如下:

第一步:亦或数据的输入表示为:
X = [ 0 0 0 1 1 0 1 1 ] X=[0amp;00amp;11amp;01amp;1]

0011amp;0amp;1amp;0amp;1
X=00110101

第二步:乘以权值
W = [ 1 1 1 1 ] W=[1amp;11amp;1]

W=[1111]
以及偏差
C = [ 1 − 2 ] C=[12]
C=[12]

第三步: 得到新的输入矩阵为:
X 1 = [ 0 − 1 1 0 1 0 2 1 ] X^1=[0amp;11amp;01amp;02amp;1]

X1=01121001
将其用ReLU激活函数处理得到:
Y = [ 0 0 1 0 1 0 2 1 ] Y=[0amp;01amp;01amp;02amp;1]
Y=01120001
如图所示:

在这里插入图片描述

第四步: 由上图可以直观的看到,原来的[0,1],[1,0]被映射到了新空间的[0,1],因此亦或问题变的可以分类。最后的权重向量为:
w = [ 0 1 1 0 ] w=[0110]

w=0110

多层感知机的理论结论

万能近似定理: 一个前馈神经网络如果具有线性输出层和至少一层具有任何一种挤压性质的激活函数的隐藏层,只要给予网络足够数量的隐藏单元,它可以任意精度来尽速任何从一个有限维空间到另一个有限维空间的Borel可测函数。前馈网络的导数也可以任意好的来近似函数的导数。

知乎上的这个回答,是采用分段函数的思想解释多层感知器的。也就是说sigmoid函数相当于把原来的线性函数拆分成两个线性函数,如下链接。

https://www.zhihu.com/question/268384579

多层感知机程序(基于Keras)

import numpy as np
from keras.models import Sequential
from keras.layers import Dense,Dropout
from keras import optimizers



def _test_multi_perceptron_01():


    x_train = np.array([[0, 0],[1, 0],[0, 1],[1, 1]], dtype=int);
    y_train = np.array([[1], [0], [0], [1]], dtype=int)

    model = Sequential()

    model.add(Dense(units=1, input_dim=2, activation='linear', use_bias=False, init="glorot_uniform"))

    sgd = optimizers.SGD(lr=0.05, decay=1e-6, momentum=0.11, nesterov=True)

    model.compile(loss='mean_absolute_error',
              optimizer='sgd',
              metrics=['accuracy'])

    model.fit(x_train, y_train,
          epochs=2000,
          batch_size=4)


    score = model.evaluate(x_train, y_train, verbose=0)

    print('_test_multi_perceptron_01 Test loss:', score[0])
    print('_test_multi_perceptron_01 Test accuracy:', score[1])

    pass

"""
增加了一个隐含层,隐含层的激活函数采用非线性整流relu
"""
def _test_multi_perceptron_02():

    x_train = np.array([[0, 0],[1, 0],[0, 1],[1, 1]], dtype=int);
    y_train = np.array([[1], [0], [0], [1]], dtype=int)

    model = Sequential()

    """
    relu 是一个折线
    """
    model.add(Dense(input_dim=2,output_dim=4,  activation='relu', init="glorot_uniform"))
    model.add(Dense(input_dim=4,output_dim=1,  activation='linear', init="glorot_uniform"))

    model.summary()

    sgd = optimizers.SGD(lr=0.05, decay=1e-6, momentum=0.11, nesterov=True)

    model.compile(loss='mean_absolute_error',
              optimizer='sgd',
              metrics=['accuracy'])

    model.fit(x_train, y_train,
          epochs=1000,
          batch_size=4)


    score = model.evaluate(x_train, y_train, verbose=0)

    print('_test_multi_perceptron_02 Test loss:', score[0])
    print('_test_multi_perceptron_02 Test accuracy:', score[1])

    pass


"""
说明:

多层感知器,增加一层隐含层,解决异或问题,对应笔记《16.神经网络(多层感知机 - 亦或问题)》

作者:fredric

日期:2018-8-18

"""
if __name__ == "__main__":

    print("multiple perceptron test >>>>>>>>")

    #_test_multi_perceptron_01()

    _test_multi_perceptron_02()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/347990
推荐阅读
相关标签
  

闽ICP备14008679号