赞
踩
【参考资料】
【1】《深度学习》 花书 6.1
由于单层感知机相当于在一个空间增加了一个超平面进行分类,那么对于像亦或问题这样的情况则无法完成。
因此在多层感知机中增加了一个隐藏层,即一个激活函数。现代神经网络最常用的激活函数是整流线性单元,ReLU函数,如下:
我们推导如下:
第一步:亦或数据的输入表示为:
X
=
[
0
0
0
1
1
0
1
1
]
X=[0amp;00amp;11amp;01amp;1]
第二步:乘以权值
W
=
[
1
1
1
1
]
W=[1amp;11amp;1]
以及偏差
C
=
[
1
−
2
]
C=[1−2]
第三步: 得到新的输入矩阵为:
X
1
=
[
0
−
1
1
0
1
0
2
1
]
X^1=[0amp;−11amp;01amp;02amp;1]
将其用ReLU激活函数处理得到:
Y
=
[
0
0
1
0
1
0
2
1
]
Y=[0amp;01amp;01amp;02amp;1]
第四步: 由上图可以直观的看到,原来的[0,1],[1,0]被映射到了新空间的[0,1],因此亦或问题变的可以分类。最后的权重向量为:
w
=
[
0
1
1
0
]
w=[0110]
万能近似定理: 一个前馈神经网络如果具有线性输出层和至少一层具有任何一种挤压性质的激活函数的隐藏层,只要给予网络足够数量的隐藏单元,它可以任意精度来尽速任何从一个有限维空间到另一个有限维空间的Borel可测函数。前馈网络的导数也可以任意好的来近似函数的导数。
知乎上的这个回答,是采用分段函数的思想解释多层感知器的。也就是说sigmoid函数相当于把原来的线性函数拆分成两个线性函数,如下链接。
https://www.zhihu.com/question/268384579
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。