MLP算法及其实现

一、多层感知机简介

Softmax回归可以算是多分类问题logistic回归,它和神经网络的最大区别是没有隐含层。理论上只要隐含节点足够多,即时只有一个隐含层的神经网络也可以拟合任意函数,同时隐含层越多,越容易拟合复杂结构。为了拟合复杂函数需要的隐含节点的数目,基本上随着隐含层的数量增多呈指数下降的趋势,也就是说层数越多,神经网络所需要的隐含节点可以越少。层数越深,概念越抽象,需要背诵的知识点就越少。在实际应用中,深层神经网络会遇到许多困难,如过拟合、参数调试、梯度弥散等。

过拟合是机器学习中的一个常见问题,是指模型预测准确率在训练集上升高,但是在测试集上的准确率反而下降,这通常意味着模型的泛化能力不好,过度拟合了训练集。针对这个问题,Hinton教授团队提出了Dropout的解决办法,在使用CNN训练图像数据时效果尤其有效,其大体思路是在训练时将神经网络某一层的输出节点数据随机丢失一部分。这种做法实质上等于创造出了许多新的随机样本,通过增大样本量、减少特征数量来防止过拟合。

参数调试问题尤其是SGD(Stochastic Gradient Descent)的参数,对SGD设置不同的学习率learning rate,最后得到的结果可能差异巨大。神经网络的优化通常不是一个简单的凸优化问题,它处处充满了局部最优。有理论表示,神经网络可能有很多个局部最优解都可以达到比较好的分类效果,而全局最优很可能造成过拟合。对SGD,我们希望一开始学习率大一些,加速收敛,在训练的后期又希望学习率小一些,这样可以低速进入一个局部最优解。不同的机器学习问题的学习率设置也需要针对性的调试,像Adagrad、Adam、Adadelta等自适应的方法可以减轻调试参数的负担。对于这些优化算法,通常我们使用其默认的参数设置就可以得到比较好的效果。

梯度弥散(Gradient Vanishment)是另一个影响深层神经网络训练的问题,在ReLU激活函数出现之前,神经网络训练是使用Sigmoid作为激活函数。非线性的Sigmoid函数在信号的特征空间映射上,对中央区的信号增益较大,对两侧区的信号增益小。当神经网络层数较多时,Sigmoid函数在反向传播中梯度值会逐渐减小,到达前面几层的梯度值就变得非常小了,在神经网络训练的时候,前面几层的神经网络参数几乎得不到训练更新。指导ReLU,y = max(0, x),的出现才比较完美的解决了梯度弥散的问题。信号在超过某个阈值时,神经元才会进入兴奋和激活的状态,否则会处于抑制状态。ReLU可以很好的反向传递梯度,经过多层的梯度反向传播,梯度依旧不会大幅减小,因此非常适合深层神经网络的训练。ReLU对比于Sigmoid的主要特点有以下几点:(1)单侧抑制;(2)相对宽阔的兴奋边界;(3)稀疏激活性。目前,ReLU及其变种EIU、PReLU、RReLU已经成为最主流的激活函数。实践中大部分情况下(包括MLP、CNN、RNN)将隐含层的激活函数从Sigmoid替换为ReLU都可以带来训练速度和模型准确率的提升。当然神经网络的输出层一般都是Sigmoid函数,因为它最接近概率输出分布。

二、TensorFlow实现过程

完整代码:

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

  

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

in_units = 784 #输入节点数

h1_units = 300 #隐含层节点数

W1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1)) #初始化隐含层权重W1,服从默认均值为0,标准差为0.1的截断正态分布

b1 = tf.Variable(tf.zeros([h1_units])) #隐含层偏置b1全部初始化为0

W2 = tf.Variable(tf.zeros([h1_units, 10])) 

b2 = tf.Variable(tf.zeros([10]))

x = tf.placeholder(tf.float32, [None, in_units])

keep_prob = tf.placeholder(tf.float32) #Dropout失活率

  

#定义模型结构

hidden1 = tf.nn.relu(tf.matmul(x, W1) + b1)

hidden1_drop = tf.nn.dropout(hidden1, keep_prob)

y = tf.nn.softmax(tf.matmul(hidden1_drop, W2) + b2)

  

#训练部分

y_ = tf.placeholder(tf.float32, [None, 10])

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

train_step = tf.train.AdagradOptimizer(0.3).minimize(cross_entropy)

  

#定义一个InteractiveSession会话并初始化全部变量

sess = tf.InteractiveSession()

tf.global_variables_initializer().run()

correct_prediction = tf.equal(tf.arg_max(y, 1), tf.arg_max(y_, 1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

for i in range(3001):

  batch_xs, batch_ys = mnist.train.next_batch(100)

  train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75})

  if i % 200 ==0:

    #训练过程每200步在测试集上验证一下准确率,动态显示训练过程

    print(i, 'training_arruracy:', accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, 

               keep_prob: 1.0}))

print('final_accuracy:', accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})) 

在TensorFlow上实现的Softmax回归模型对MNIST数据集取得了92%的正确率,现在我们给神经网络加上一层隐含层,并使用减轻过拟合的Dropout、自适应学习率的Adagrad以及解决梯度弥散问题激活函数ReLU。

首先,载入TensorFlow的并加载MNIST、数据集。指定输入节点数in_units和隐含层节点数h1_units。初始化隐含层的全中W1和偏置b1,因为模型使用的激活函数是ReLU,需要使用正态分布对W1进行初始化,给权重参数增加一些噪声来打破完全对称并避免0梯度。在其它一些模型中,有时还需要给偏置初始化一些非零初始值来避免dead neuron(死亡神经元)。对于输出层Softmax,直接将全中W2和偏置b2全部初始化为0即可。接下来为输入x设置placeholder,并为不同的Dropout设置一个输入placeholder,通常在训练时小于1,预测时等于1。

下面定义模型结构,首先定义一个隐含层hidden1,通过tf.nn.relu(tf.matmul(x,W1) + b1)实现一个激活函数为ReLU的隐含层,这个隐含层的计算公式就是y = relu(W1x + b1)。接下来调用tf.nn.dropout实现Dropout功能,随机将一部分神经元节点置为0,这里的keep_prob参数是保留的数据比例而不是置为0的比例。在训练的时候应该是小于1用以制造随机性,防止过拟合;在预测的时候应该等于1,即全部特征用来预测样本的类别。

在优化器选择上,我们选择Adagrad并把学习率设置为0.3,这里我们直接使用tf.train.AdagradOptimizer(0.3)就可以了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 机器人“快递小哥”上岗,但被AI淘汰的却是程序员?

    2016年AlphaGo以总比分4:1轻松战胜围棋世界冠军李世石,这是AI第一次震惊世界。

    1480
  • 《机器学习》周志华西瓜书 笔记/习题答案

    机器学习是计算机科学与人工智能的重要分支领域。西瓜书作为该领域的入门教材,在内容上尽可能涵盖机器学习基础知识的各方面。为了使尽可能多的读者通过本书对机器学习有所...

    统计学家
  • 独家社招信息-微博Feed流推荐算法工程师

    3. 熟悉特征工程,召回算法,推荐算法,CTR预估模型(LR,FM,GBDT,Wide&deep等)

    石晓文
  • 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结

    决策树是一个有监督分类模型,本质是选择一个最大信息增益的特征值进行输的分割,直到达到结束条件或叶子节点纯度达到阈值。下图是决策树的一个示例图:

    1480
  • 有了这款神器,人人都是作曲家!

    摘要:人工智能作曲APP Amper Music的简单介绍和测评,以及人工智能和机器学习的小科普

    生信宝典
  • 【干货】关于机器学习的知识点,全在这篇文章里了

    导读:作者用超过1.2万字的篇幅,总结了自己学习机器学习过程中遇到知识点。“入门后,才知道机器学习的魅力与可怕。”希望正在阅读本文的你,也能在机器学习上学有所成...

    zenRRan
  • 我要这金牌有何用:Kaggle 竞赛成绩真能「保送」谷歌、FB 吗?

    对于初入机器学习领域的人来说,你肯定已经从学长口中、博客文章中、社区帖子里听说过 Kaggle 的大名。除了大量竞赛以外,Kaggle 上也有很多公开的数据集。...

    CDA数据分析师
  • 网红AI教师Siraj Raval彻底栽了!剽窃论文遭Jeff Dean等大牛抵制

    网红AI研究员、号称拥有 100 万学生的 Siraj Raval,这次彻底栽了。

    CDA数据分析师
  • 【PySpark入门】手把手实现PySpark机器学习项目-回归算法

    PySpark作为工业界常用于处理大数据以及分布式计算的工具,特别是在算法建模时起到了非常大的作用。PySpark如何建模呢?这篇文章手把手带你入门PySpa...

    小小詹同学
  • 网红AI教师Siraj Raval彻底栽了!剽窃论文遭Jeff Dean等大牛抵制

    网红AI研究员、号称拥有 100 万学生的 Siraj Raval,这次彻底栽了。

    昱良

扫码关注云+社区

领取腾讯云代金券