当前位置:   article > 正文

多层感知机(MLP)——简介

mlp

一、MLP原理

多层感知机MLP(Multilayer Perceptron),也是人工神经网络(ANN,Artificial Neural Network),是一种全连接(全连接:MLP由多个神经元按照层次结构组成,每个神经元都与上一层的所有神经元相连)的前馈神经网络模型

输入层—>隐藏层—>输出层

神经元:包含一个带有权重和偏置的线性变换,以及一个激活函数(通常,输入层不使用激活函数,隐藏层和输出层使用激活函数)用来引入非线性,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以利用到更多的非线性模型中

隐藏层神经元:假设输入层用向量X表示,则隐藏层的输出就是f(w1*X+b1),函数f可以是sigmoid函数或者tanh函数,w1是权重(连接系数),b1是偏置

输出层的输出:softmax(w2*X1+b2),X1是隐藏层的输出

MLP训练过程:数据从输入层经过多个隐藏层的非线性变换,最后到达输出层进行分类或回归操作。通常使用反向传播算法,该算法通过计算损失函数对网络参数的梯度,并根据梯度更新参数,以最小化损失函数。常见的优化算法:随机梯度下降(SGD)、动量法、Adam等

二、MLP代码详解

2.1定义MLP模型

2.1.1HiddenLayer

输入层—>隐藏层

  1. class HiddenLayer(object):
  2. def __init__(self, rng, input, n_in, n_out, W=None, b=None,
  3. activation=T.tanh):
  4. """
  5. 注释:
  6. 这是定义隐藏层的类,首先明确:隐藏层的输入即input,输出即隐藏层的神经元个数。输入层与隐藏层是全连接的。
  7. 假设输入是n_in维的向量(也可以说时n_in个神经元),隐藏层有n_out个神经元,则因为是全连接,
  8. 一共有n_in*n_out个权重,故W大小时(n_in,n_out),n_in行n_out列,每一列对应隐藏层的每一个神经元的连接权重。
  9. b是偏置,隐藏层有n_out个神经元,故b时n_out维向量。
  10. rng即随机数生成器,numpy.random.RandomState,用于初始化W。
  11. input训练模型所用到的所有输入,并不是MLP的输入层,MLP的输入层的神经元个数时n_in,而这里的参数input大小是(n_example,n_in),每一行一个样本,即每一行作为MLP的输入层。
  12. activation:激活函数,这里定义为函数tanh
  13. """
  14. self.input = input #类HiddenLayer的input即所传递进来的input
  15. """
  16. 注释:
  17. 代码要兼容GPU,则W、b必须使用 dtype=theano.config.floatX,并且定义为theano.shared
  18. 另外,W的初始化有个规则:如果使用tanh函数,则在-sqrt(6./(n_in+n_hidden))到sqrt(6./(n_in+n_hidden))之间均匀
  19. 抽取数值来初始化W,若时sigmoid函数,则以上再乘4倍。
  20. """
  21. #如果W未初始化,则根据上述方法初始化。
  22. #加入这个判断的原因是:有时候我们可以用训练好的参数来初始化W
  23. if W is None:
  24. W_values = numpy.asarray(
  25. rng.uniform(
  26. low=-numpy.sqrt(6. / (n_in + n_out)),
  27. high=numpy.sqrt(6. / (n_in + n_out)),
  28. size=(n_in, n_out)
  29. ),
  30. dtype=theano.config.floatX
  31. )
  32. if activation == theano.tensor.nnet.sigmoid:
  33. W_values *= 4
  34. W = theano.shared(value=W_values, name='W', borrow=True)
  35. if b is None:
  36. b_values = numpy.zeros((n_out,), dtype=theano.config.floatX)
  37. b = theano.shared(value=b_values, name='b', borrow=True)
  38. #用上面定义的W、b来初始化类HiddenLayer的W、b
  39. self.W = W
  40. self.b = b
  41. #隐含层的输出
  42. lin_output = T.dot(input, self.W) + self.b
  43. self.output = (
  44. lin_output if activation is None
  45. else activation(lin_output)
  46. )
  47. #隐含层的参数
  48. self.params = [self.W, self.b]

2.1.2LogisticRegression

隐藏层—>输出层:分类器softmax回归

  1. """
  2. 定义分类层,Softmax回归
  3. 在deeplearning tutorial中,直接将LogisticRegression视为Softmax,
  4. 而我们所认识的二类别的逻辑回归就是当n_out=2时的LogisticRegression
  5. """
  6. #参数说明:
  7. #input,大小就是(n_example,n_in),其中n_example是一个batch的大小,
  8. #因为我们训练时用的是Minibatch SGD,因此input这样定义
  9. #n_in,即上一层(隐含层)的输出
  10. #n_out,输出的类别数
  11. class LogisticRegression(object):
  12. def __init__(self, input, n_in, n_out):
  13. #W大小是n_in行n_out列,b为n_out维向量。即:每个输出对应W的一列以及b的一个元素。
  14. self.W = theano.shared(
  15. value=numpy.zeros(
  16. (n_in, n_out),
  17. dtype=theano.config.floatX
  18. ),
  19. name='W',
  20. borrow=True
  21. )
  22. self.b = theano.shared(
  23. value=numpy.zeros(
  24. (n_out,),
  25. dtype=theano.config.floatX
  26. ),
  27. name='b',
  28. borrow=True
  29. )
  30. #input是(n_example,n_in),W是(n_in,n_out),点乘得到(n_example,n_out),加上偏置b,
  31. #再作为T.nnet.softmax的输入,得到p_y_given_x
  32. #故p_y_given_x每一行代表每一个样本被估计为各类别的概率
  33. #PS:b是n_out维向量,与(n_example,n_out)矩阵相加,内部其实是先复制n_example个b,
  34. #然后(n_example,n_out)矩阵的每一行都加b
  35. self.p_y_given_x = T.nnet.softmax(T.dot(input, self.W) + self.b)
  36. #argmax返回最大值下标,因为本例数据集是MNIST,下标刚好就是类别。axis=1表示按行操作。
  37. self.y_pred = T.argmax(self.p_y_given_x, axis=1)
  38. #params,LogisticRegression的参数
  39. self.params = [self.W, self.b]

2.2三层MLP

  1. class MLP(object):
  2. def __init__(self, rng, input, n_in, n_hidden, n_out):
  3. self.hiddenLayer = HiddenLayer(
  4. rng=rng,
  5. input=input,
  6. n_in=n_in,
  7. n_out=n_hidden,
  8. activation=T.tanh
  9. )
  10. #将隐含层hiddenLayer的输出作为分类层logRegressionLayer的输入,这样就把它们连接了
  11. self.logRegressionLayer = LogisticRegression(
  12. input=self.hiddenLayer.output,
  13. n_in=n_hidden,
  14. n_out=n_out
  15. )
  16. #以上已经定义好MLP的基本结构,下面是MLP模型的其他参数或者函数
  17. #规则化项:常见的L1、L2_sqr
  18. self.L1 = (
  19. abs(self.hiddenLayer.W).sum()
  20. + abs(self.logRegressionLayer.W).sum()
  21. )
  22. self.L2_sqr = (
  23. (self.hiddenLayer.W ** 2).sum()
  24. + (self.logRegressionLayer.W ** 2).sum()
  25. )
  26. #损失函数Nll(也叫代价函数)
  27. self.negative_log_likelihood = (
  28. self.logRegressionLayer.negative_log_likelihood
  29. )
  30. #误差
  31. self.errors = self.logRegressionLayer.errors
  32. #MLP的参数
  33. self.params = self.hiddenLayer.params + self.logRegressionLayer.params
  34. # end-snippet-3

三、MLP应用

应用:各种机器学习任务,例如图像分类、语音识别、自然语言处理等

优点:非线性映射能力和适应性,使其能处理各种复杂的模式识别问题

参考链接:多层感知机(MLP)简介-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/483215
推荐阅读
相关标签
  

闽ICP备14008679号