V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cralison
V2EX  ›  TensorFlow

学习笔记 TF026:多层感知机

  •  1
     
  •   cralison · 2017-07-22 14:19:43 +08:00 · 2720 次点击
    这是一个创建于 2716 天前的主题,其中的信息可能已经有所发展或是发生改变。

    隐含层,指除输入、输出层外,的中间层。输入、输出层对外可见。隐含层对外不可见。理论上,只要隐含层节点足够多,只有一个隐含层,神经网络可以拟合任意函数。隐含层越多,越容易拟合复杂函数。拟合复杂函数,所需隐含节点数,随隐含层数量增多指数下降。

    过拟合,模型预测准确率在训练集上升,在测试集下降。泛化性不好,模型记忆当前数据特征,不具备推广能力。参数太多。Hinton 教授团队,Dropout。随便丢弃部分输出数据节点。创造新随机样本,增大样本量,减少特征数量,防止过拟合。bagging 方法,对特征新种采样。

    SGD 参数难调试,SGD 设置不同学习速率,结果可能差异巨大。神经网络很多局部最优解可以达到比较好分类效果,全局最优反而容易过拟合。Adagrad、Adam、Adadelta 自适应方法,减轻调试参数负担。SGD 需要调试学习速率、Momentum、Nesterov 参数。

    梯度弥散(Gradient Vanishment)。Sigmoid 函数具有限制性,输出数值在 0 〜 1,最符合概率输出定义。非线性 Sigmoid 函数,信号特征空间映射,中央区信号增益大,两侧区信息增益小。中央区像神经元兴奋态,两侧区像神经元抑制态。训练时,重要特征放中央区,非重要特征放两侧区。Sigmoid 比最初期线性激活函数 y=x,阶梯激活函数 y=-1(x<0)|y=1(x>=0)、y=0(x<0)|y=1(x>=0)好。Sigmoid 函数反向传播梯度值在多层传递指级急剧减小,根据训练数据反馈更新神经网络参数非常缓慢,不起训练作用。

    ReLU,非线性函数 y=max(0,x),坐标轴上折线,当 x<=0,y=0,x>0,y=x。人脑阈值响应机制,信号超过某个阈值,神经元兴奋激活状态,平时抑制状态。ReLU 很好传递梯度,多层反向传播,梯度不会大幅缩小,适合很深神经网络,不需要无监督逐层初始化权重。ReLU 变化,单侧抑制,相对宽阁兴奋边界,稀疏激活性。神经元同时激活 1~4%,选择性响应很少部分输入信号,屏蔽大量不相关信号,更高效提取重要特征。传统 Sigmoid 函数接近一半神经元被激活。Softplus,单侧抑制,没有稀疏激活性。ReLU 及变种(EIU,PReLU,RReLU)为最注流激活函数。输出层一般用 Sigmoid 函数,最接近概率输出分布。

    隐含层可以解决 XOR 问题,用曲线划分两类样本。隐含层越多,原有特征越抽象变换。是多层神经网络(多层感知机 MLP)功能。

    网络神经加上隐含层,使用 Dropout、自适应学习速率 Adagrad,解决梯度弥散激活函数 ReLU。

    载入 TensorFlow,加载 MNIST 数据集,创建 Interactive Session。

    隐含层参数设置 Variable 初始化。in_units 输入节点数,h1_units 隐含层输出节点数设 300(200 〜 1000 区别不大)。W1 隐含层权重初始化截断正态分布标准差 0.1,b1 偏置设 0。模型激活函数 ReLU,正态分布给参数加噪声,打破完全对称避免 0 梯度。偏置赋小非零值避免 dead neuron(死亡神经元)。最后输出层 Softmax,权重 W2 偏置 b2 初始化 0。Sigmoid,0 附近最敏感,梯度最大。

    训练和预测,Dropout 比率 keep_prob(保留节点概率)不同。训练小于 1。预测等于 1。Dropout 比率为计算图输入,定义 placeholder。

    定义模型结构。tf.nn.relu(tf.matmul(x,W1+b1)),实现激活函数为 ReLU 的 hidden1 隐含层,y=relu(W1x+b1)。tf.nn.dropout 实现 Dropout,随机置 0 分部节点。keep_prob 参数,保留数据不置为 0 比例,训练应小于 1,制造随机性,防止过拟合,预测等于 1,用全部特征预测样本类别。输出层 Softmax。

    定义算法公式,神经网络 forward 计算。定义损失函数(交叉信息熵)和选择优化器(自适应优化器 Adagrad),优化 loss,学习速率 0.3,使用 tf.train.AdagradOptimizer。Adadelta、Adam 优化器。

    训练,keep_prob 计算图输入,训练时设 0.75,保留 75%节点,其余 25%置 0。越复杂越大规模神经网络,Dropout 效果越显著。隐含层,需要更多训练迭代优化模型参数。3000 个 bacth,每个 bacth100 条样本,30 万样本。相当全数据集 5 轮 epoch 迭代。增大循环次数,准确率略有提高。

    准确率评测,加入 keep_prob 输入,等于 1。

    没有隐含层 Softmax Regression,直接从图像像素推断是哪个数字,没有特征抽象过程。多层神经网络隐含层,组合高阶特征或组件,再组合成数字,实现精准匹配分类。隐含层输出高阶特征组件可以复用,每一类判别、概率输出共享。

    全连接神经网络(Fully Connected Network,FCN,MLP 的另一种说法)局限,很深网络,很多隐藏节点,很大迭代轮数,也难达到 99%以上准确率。

    # Create the model
    from tensorflow.examples.tutorials.mnist import input_data
    import tensorflow as tf
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    sess = tf.InteractiveSession()
    in_units = 784
    h1_units = 300
    W1 = tf.Variable(tf.truncated_normal([in_units, h1_units], stddev=0.1))
    b1 = tf.Variable(tf.zeros([h1_units]))
    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)
    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)
    # Define loss and optimizer
    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)
    # Train
    tf.global_variables_initializer().run()
    for i in range(3000):
      batch_xs, batch_ys = mnist.train.next_batch(100)
      train_step.run({x: batch_xs, y_: batch_ys, keep_prob: 0.75})
    # Test trained model
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
    

    参考资料: 《 TensorFlow 实践》

    欢迎付费咨询(150 元每小时),我的微信:qingxingfengzi

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:32 · PVG 01:32 · LAX 09:32 · JFK 12:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.