美文网首页
MNIST练习——Softmax&卷积网络

MNIST练习——Softmax&卷积网络

作者: for123 | 来源:发表于2018-05-22 21:19 被阅读0次

    学习目标

    • Softmax

    • 卷积网络

    Softmax

    简介

    Softmax回归模型应用在多分类问题中,通过样本的特征,给样本进行评分,从而对样本进行分类。

    Softmax

    假设训练集有m个样本构成: {(x(1),y(1)),...,(x(m),y(m))}
    其中x(m)表示样本的特征,y(m)表示样本的类别。
    对于输入的x(m),都用一个函数评估出它在每一个类别j的概率值p(y=j|x)。具体函数hθ(x)形式如下(上标i漏括括号):


    其中w1,...,wk与b1,...,bk为模型的参数。

    主要用于归一化(上标i漏括括号)。

    代价函数

    方差代价函数

    方差代价函数是常用的代价函数,其定义为:


    其中y是标签,a是神经元的实际输出:



    在模型的更新中,我们通常采用梯度下降来更新参数w和b,首先先计算偏导:


    更新w、b:


    因为sigmoid函数的性质,导致σ(z)在z取大部分值时会很小,这样导致w和b更新非常慢。

    为了克服这个缺点,因此引入了交叉函数。下面先介绍几个相关的概念。

    信息量

    假设X是一个离散型随机变量,其取值集合为X,概率分布函数为p(xi)=P(X=xi),xi∈X,我们定义事件X=xi的信息量为:
    I(xi)=−log(p(xi)),可以理解为,一个事件发生的概率越大,则它所携带的信息量就越小,而当p(x0)=1时,熵将等于0,也就是说该事件的发生不会导致任何信息量的增加。
    举个例子,小明平时不爱学习,考试经常不及格,而小王是个勤奋学习的好学生,经常得满分,所以我们可以做如下假设:
    事件A:小明考试及格,对应的概率P(xA)=0.1,信息量为I(xA)=−log(0.1)=3.3219
    事件B:小王考试及格,对应的概率P(xB)=0.999,信息量为I(xB)=−log(0.999)=0.0014
    可以看出,结果非常符合直观:小明及格的可能性很低(十次考试只有一次及格),因此如果某次考试及格了(大家都会说:XXX竟然及格了!),必然会引入较大的信息量,对应的I值也较高。而对于小王而言,考试及格是大概率事件,在事件B发生前,大家普遍认为事件B的发生几乎是确定的,因此当某次考试小王及格这个事件发生时并不会引入太多的信息量,相应的I值也非常的低。

    那么什么又是熵呢?还是通过上边的例子来说明,假设小明的考试结果是一个0-1分布A只有两个取值{0:不及格,1:及格},在某次考试结果公布前,小明的考试结果有多大的不确定度呢?你肯定会说:十有八九不及格!因为根据先验知识,小明及格的概率仅有0.1,90%的可能都是不及格的。怎么来度量这个不确定度?求期望!不错,我们对所有可能结果带来的额外信息量求取均值(期望),其结果不就能够衡量出小明考试成绩的不确定度了吗?
    即:
    HA(x)=−[p(xA)log(p(xA))+(1−p(xA))log(1−p(xA))]=0.4690
    对应小王的熵:
    HB(x)=−[p(xB)log(p(xB))+(1−p(xB))log(1−p(xB))]=0.0114
    虽然小明考试结果的不确定性较低,毕竟十次有9次都不及格,但是也比不上小王(1000次考试只有一次才可能不及格,结果相当的确定)
    我们再假设一个成绩相对普通的学生小东,他及格的概率是P(xC)=0.5,即及格与否的概率是一样的,对应的熵:
    HC(x)=−[p(xC)log(p(xC))+(1−p(xC))log(1−p(xC))]=1
    其熵为1,他的不确定性比前边两位同学要高很多,在成绩公布之前,很难准确猜测出他的考试结果。
    可以看出,熵其实是信息量的期望值,它是一个随机变量的确定性的度量。熵越大,变量的取值越不确定,反之就越确定。
    对于一个随机变量X而言,它的所有可能取值的信息量的期望(E[I(x)])就称为熵。
    X的熵定义为:


    如果p(x)是连续型随机变量的pdf,则熵定义为:

    为了保证有效性,这里约定当p(x)→0时,有p(x)logp(x)→0
    当X为0-1分布时,熵与概率p的关系如下图:

    可以看出,当两种取值的可能性相等时,不确定度最大(此时没有任何先验知识),这个结论可以推广到多种取值的情况。在图中也可以看出,当p=0或1时,熵为0,即此时X完全确定。
    熵的单位随着公式中log运算的底数而变化,当底数为2时,单位为“比特”(bit),底数为e时,单位为“奈特”。
    相对熵

    相对熵(relative entropy)又称为KL散度(Kullback-Leibler divergence),KL距离,是两个随机分布间距离的度量。记为DKL(p||q)。它度量当真实分布为p时,假设分布q的无效性。


    并且为了保证连续性,做如下约定:

    显然,当p=q时,两者之间的相对熵DKL(p||q)=0
    上式最后的Hp(q)表示在p分布下,使用q进行编码需要的bit数,而H(p)表示对真实分布p所需要的最小编码bit数。基于此,相对熵的意义就很明确了:DKL(p||q)表示在真实分布为p的前提下,使用q分布进行编码相对于使用真实分布p进行编码(即最优编码)所多出来的bit数。
    交叉熵

    交叉熵容易跟相对熵搞混,二者联系紧密,但又有所区别。假设有两个分布p,q,则它们在给定样本集上的交叉熵定义如下:


    可以看出,交叉熵与上一节定义的相对熵仅相差了H(p),当p已知时,可以把H(p)看做一个常数,此时交叉熵与KL距离在行为上是等价的,都反映了分布p,q的相似程度。最小化交叉熵等于最小化KL距离。它们都将在p=q时取得最小值H(p)(p=q时KL距离为0),因此有的工程文献中将最小化KL距离的方法称为Principle of Minimum Cross-Entropy (MCE)或Minxent方法。
    特别的,在logistic regression中,
    p:真实样本分布,服从参数为p的0-1分布,即X∼B(1,p)
    q:待估计的模型,服从参数为q的0-1分布,即X∼B(1,q)
    两者的交叉熵为:

    对所有样本取均值得:

    我们可以看看它的导数


    可以看到没有h'θ(x)这一项,权重的更新受hθ(x(i)) - y(i)的影响,即受误差的影响。所以当误差大的时候,权重更新就快。
    Softmax回归模型参数化的特点

    Softmax 回归有一个不寻常的特点:它有一个“冗余”的参数集。

    权重衰减
    代码实现
    # coding:utf-8
    # 导入tensorflow。
    # 这句import tensorflow as tf是导入TensorFlow约定俗成的做法,请大家记住。
    import tensorflow as tf
    # 导入MNIST教学的模块
    from tensorflow.examples.tutorials.mnist import input_data
    # 与之前一样,读入MNIST数据
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    
    # 创建x,x是一个占位符(placeholder),代表待识别的图片
    x = tf.placeholder(tf.float32, [None, 784])
    
    # W是Softmax模型的参数,将一个784维的输入转换为一个10维的输出
    # 在TensorFlow中,变量的参数用tf.Variable表示
    W = tf.Variable(tf.zeros([784, 10]))
    # b是又一个Softmax模型的参数,我们一般叫做“偏置项”(bias)。
    b = tf.Variable(tf.zeros([10]))
    
    # y=softmax(Wx + b),y表示模型的输出
    y = tf.nn.softmax(tf.matmul(x, W) + b)
    
    # y_是实际的图像标签,同样以占位符表示。
    y_ = tf.placeholder(tf.float32, [None, 10])
    
    # 至此,我们得到了两个重要的Tensor:y和y_。
    # y是模型的输出,y_是实际的图像标签,不要忘了y_是独热表示的
    # 下面我们就会根据y和y_构造损失
    
    # 根据y, y_构造交叉熵损失
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y)))
    
    # 有了损失,我们就可以用随机梯度下降针对模型的参数(W和b)进行优化
    train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
    
    # 创建一个Session。只有在Session中才能运行优化步骤train_step。
    sess = tf.InteractiveSession()
    # 运行之前必须要初始化所有变量,分配内存。
    tf.global_variables_initializer().run()
    print('start training...')
    
    # 进行1000步梯度下降
    for _ in range(1000):
        # 在mnist.train中取100个训练数据
        # batch_xs是形状为(100, 784)的图像数据,batch_ys是形如(100, 10)的实际标签
        # batch_xs, batch_ys对应着两个占位符x和y_
        batch_xs, batch_ys = mnist.train.next_batch(100)
        # 在Session中运行train_step,运行时要传入占位符的值
        sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
    
    # 正确的预测结果
    correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
    # 计算预测准确率,它们都是Tensor
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    # 在Session中运行Tensor可以得到Tensor的值
    # 这里是获取最终模型的正确率
    print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))  # 0.9185
    
    

    卷积网络

    相关文章

      网友评论

          本文标题:MNIST练习——Softmax&卷积网络

          本文链接:https://www.haomeiwen.com/subject/xatkjftx.html