1/ 异或问题(XOR Problem)

异或问题便是当两个输入的布尔值共一起,输出为 True(可以用 1 代表),假定两个输入的布尔值不共同的时分,输出为 False(可以用 0 代表)。

据说多层感知机(MLP)是很难矩阵乘法处理异或问题的,就好比下面的问题。

首先由一个问题引入,来自邱锡鹏教师的书《神经网络与深度学习》第四章的习题 4矩阵的逆-2:

习题 4-2 试规划一个前馈神经网络来处理 XOR 问题,要求该前馈神经网络具有矩阵类似两个躲藏神经元和一个输出神经元,并运用 ReLU 作为激活函数。

一个可行的作用如下,

W(1)=[1111],b(1)=[0−1]w(2)=[1−2],b(2)=[0](1)boldsymbol{W}^{(1)}=left[begin{array}{ll}1 & 1矩阵的乘法运算 1 & 1end{array}right], boldsymbol{b}^{矩阵的逆(1)}=left[begin{array}{c矩阵}0 -1end{a矩阵乘法rray}right] boldsymbol{矩阵相乘怎样算w}^{(2)}=left[begin{array}{c}1 -2end{array}right], b^{(2)}=left[0right] tag{1}

故整个网络的计算为:

y=(w(2))T(ReLU⁡((W(1))TX+b(1)))+b(2)boldsymbol{y}=left(bo矩阵ldsymbol{w}^{(2)}right)^{mathrm{T}}left(operatorname{ReLU}left(left(boldsymbol{W}^{(1)}right)^{m矩阵的秩athrm{T}} boldsymbol{X}+boldsymbol{b}^{(1)}right)right)+b^{(2)}

代入:

X=[00110101]bold矩阵类似symbol{X}矩阵的逆=left[矩阵等价b矩阵类似egin{array}{llll}0 & 0 & 1 &a矩阵乘法mp; 1 0 & 1 & 0 & 1end{array}right]

可以算得:y=[0110]boldsymbol{y}=left[begin{array}{llll}0 & 1 & 1 & 0end{array}r深度学习ight]

2/ 运用 Flux 练习

2.1/ 两个隐含神经元

实际上这样的一个网络结构,假定运用随机初始化的方法去练习,是练习欠好的,原因在于中心要求的是一个 ReLU 激活函数,假定换成其他的激活函数就可以练习好矩阵类似

运用如下代码:

usi矩阵相乘怎样算ng Flux
function loss()
 = mlp(data)
Flux.mse(, y)
end
cb = function ()
println(loss())
end
data = Array([[0 1 0 1];
[0 0 1 1]]);
y = Array([[0 1 1 0];]);
mlp = Chain(De矩阵的逆nse(2, 2, relu), Dense(2, 1));
ps = Flux.params(mlp);
opt = ADAM(0.01)
@深度学习time Flux.train!(loss, ps, Iterators.rep矩阵类似eated((), 1000), opt, cb=cb)

练习完之后会发现,损失仍然很高,输出的作用会是全部都很挨近 0.50.5.

假定咱们将隐含层的参数设置为 (1矩阵) 式的作用,然后只练习输出层的深度学习权重 w(2)boldsym矩阵的逆bol{w}^{(2)},那么会得到相同的作用:矩阵乘法

# 自定义权重,将权重都初始化为深度学习全 1 的矩阵
mlp = Chain(Dense(2, 2, relu, bias=[0; -1], init=ones),
Dense(2, 1, bias=zeros(1矩阵计算器), init矩阵的秩=ones))
# 只拿出第三个参数,即输出层的权重练习
ps = Flux.params(Flux.params(mlp)[3])
opt = ADAM(0.1)
@time Flux.train!(loss, ps, Iterators.repeated((), 1000), opt, cb=cb)

作用会得到 w(2)=[0.9999…−1.9矩阵的迹999…]boldsymbol{w}^{(2)}=深度学习[0.9999… -1.9999…],与标题规划的是相同的。

2矩阵类似.矩阵计算器2/ 三个隐含神经元

但实际上,假定咱们在隐含层上运用三个神经元,就可以处理这个问题。这矩阵等价证明只运用两个隐含神经元,模型的才华并不可,加多了一个就可以处理了:

mlp = Chain(Dense(2, 3, relu), Dense(3, 1));
ps = Flux.params(mlp)
opt = ADAM(0.01)
@time Flux.train矩阵!(loss, ps, Iterators.repeated((), 1000), opt, cb=cb)
# loss = 0.22230548
# loss = 0.21818444
# ...
#矩阵乘法 l矩阵类似oss = 0.0
 = mlp(data)

最终的解是对的,查看各层的参数矩阵类似可以知道

W(1)=[矩阵天王0.574309−0.5743090.92754−0.96621矩阵天王21.12378−1.12138],b(1)=[0.5743128−0.00046141824−矩阵类似0.0034916808]w(2)=[−1.741220.6005深度学习31.2883],矩阵的秩b(2)=[1.0000067]boldsymbol{矩阵等价W}^{(1)}=left[begin{array}{ll} 0.574309 & -0.574309 0.92754 & -0.966212 1.12378 & -1.12138end{array}ri矩阵的乘法运算ght], boldsymbol{b}^{(1)}=left[begin{array}{c} 0.5743128 -0.00046141824 -0.0034916808end{array}right] boldsymbol{w}^{(2)}=le矩阵等价ft[begin{array}{c} -1.741矩阵等价22 0.60053 1.2883end{array}right], b^{(2)}=left[1.0000067right]

当运矩阵类似用两个隐含神经元的时分,运用随机初始化权重的方法去练习,会十分难以求解,可是假定运用三个隐含神矩阵的乘法运算矩阵计算器元,那么其才华就足以处理异或问题了。

不过实际上,在运矩阵天王用两个隐含神经元的时分,不运用 ReLU 作为激活函数,而深度学习是在隐含层运用 Sigmoid 函数,那么只要两个隐含神经矩阵乘法元的情况下,也可以处理异或问题。

首要的问题应该仍是在 ReLU 会把小于零的部分直接堵截,相当于这个神经元没有被激活,会简单构成神经元深度学习「去世」无法再持续练习。