多层感知机MLP的理解及代码实现
1、MLP模型
多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构。
多层感知器(multilayer Perceptron,MLP)是指可以是感知器的人工神经元组成的多个层次。MPL的层次结构是一个有向无环图。通常,每一层都全连接到下一层,某一层上的每个人工神经元的输出成为下一层若干人工神经元的输入。MLP至少有三层人工神经元,如下图所示。
输入层(input layer)由简单的输入人工神经元构成。每个输入神经元至少连接一个隐藏层(hidden layer)的人工神经元。隐藏层表示潜在的变量;层的输入和输出都不会出现在训练集中。隐藏层后面连接的是输出层(output layer)。
隐藏层中的人工神经元,也称单元(units)通常用非线性激励函数,如relu函数和sigmond函数,sigmond函数公式如下所示:
tanh读作Hyperbolic Tangent,如上图所示,它解决了zero-centered的输出问题,然而,gradient vanishing的问题和幂运算的问题仍然存在,函数公式如下:
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如下图所示:
Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
Leaky ReLU函数如下所示:
2、MLP的训练方法
反向传播(backpropagation)算法经常用来连接优化算法求解成本函数最小化问题,比如梯度下降法。这个算法名称是反向(back)和传播(propagation)的合成词,是指误差在网络层的流向。理论上,反向传播可以用于训练具有任意层、任意数量隐藏单元的前馈人工神经网络,但是计算能力的实际限制会约束反向传播的能力。
反向传播的过程主要利用了链式法则,而网络神经元结点的导数更新根据最小均方误差函数或者平均绝对误差等函数也行。上面绿色的数字代表前向计算时的数值,下面红色的字代表了各个结点的导数,即对最终结果的影响程度。
3、MLP的代码实验
- MLP 拟合线性函数 y=x+1
结果如图所示:
从上图可见,对于简单的线性函数,简单的三层MLP网络的拟合效果还是可以的。
代码如下:
import torch
import numpy
import random
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x+1
x,y = Variable(x),Variable(y)
plt.ion()
class Net(torch.nn.Module):
def __init__(self,n_feature,n_hidden,n_output):
super(Net,self).__init__()
#两层感知机
self.hidden = torch.nn.Linear(n_feature,n_hidden)
self.predict = torch.nn.Linear(n_hidden,n_output)
def forward(self,x):
x = F.relu(self.hidden(x))
x = self.predict(x)
return x
net = Net(1,8,1) #输入节点1个,隐层节点8个,输出节点1个
optimizer = torch.optim.SGD(net.parameters(),lr = 0.2)
loss_func = torch.nn.MSELoss()
for t in range(200):
prediction = net(x)
loss = loss_func(prediction,y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if t%5==0:
plt.cla()
plt.scatter(x.data.numpy(),y.data.numpy())
plt.plot(x.data.numpy(),prediction.data.numpy(),'r-',lw=5)
plt.pause(0.1)
plt.ioff()
plt.show()
- MLP 拟合非线性函数
y
=
x
2
y=x^2
y=x2
效果如下所示:
可见,对于普通的非线性也是可以拟合的。 - MLP拟合SIN函数
结果也是可以的。
更多推荐
所有评论(0)