机器学习心得(三)——softmax回归

xiaoxiao2021-02-28  7

机器学习心得(三)——softmax回归

在上一篇文章中,主要以二分类为例,讲解了logistic回归模型原理。那么对于多分类问题,我们应该如何处理呢?当然,选择构建许多二分类器进行概率输出自然是一个不错的思路,但是softmax函数为我们解决多分类问题提供了一个更好的方法。记得上周看一篇讲RNN的博客时,看示意图一时没有想明白softmax层的意义所在,于是傻逼兮兮的请教了五道口某机器学习大佬,大佬一语道破天机,让我意识到了softmax层作为全连接层对隐层输出进行分类的功能所在(如下图, 博主地址)。

softmax回归

如同logistic回归原理一样,均可以视为一种映射关系:x->z->y,只不过softmax回归是进行多分类的而已。下面给出softmax回归的假设函数。

我们的目的很简单,就是对于每一个输入的x,假设函数都能输出x属于每一个类别的概率。如图所示,右侧的函数构造即可满足我们的要求。其中,分母项是为了归一化,使得概率之和为1.

代价函数

值得一提的是,1{y(i) = j}的意思是指,当yi等于j时,值取1.

然而,这个代价函数通常会加入惩罚项,使其变成一个严格凸函数,易于迭代进行优化:

求导之后:

值得一提的是,在实际应用中经常使用最大似然与交叉熵作为其代价函数。

softmax函数于logistic函数的关系

logistic回归可以视为softmax进行二分类时的特例,即当类别数为2时,softmax 回归退化为 logistic 回归,由于数学学的不好,所以就不多推导了。

代码实现

好了,东西都已经讲完了,那么可以上代码了,当然,这次还是用tensorflow来做的。记得昨天老师居然很吃惊我的机器能跑tf,为了证明我的电脑真的很可以,所以这次我要用我的副电脑苏菲pro跑一波mnist数据。

# -*- coding: utf-8 -*- """ Created on Sun Apr 1 17:19:07 2018 @author: DZF_zuishuai """ import tensorflow as tf import numpy as np from tensorflow.examples.tutorials.mnist import input_data #导入mnist mnist = input_data.read_data_sets("MNIST_data/", one_hot = True) x = tf.placeholder("float", [None, 784]) # w = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) y = tf.nn.softmax(tf.matmul(x,w) + b) # loss y_ = tf.placeholder("float", [None, 10]) #定义交叉熵 cross_entropy = -tf.reduce_sum(y_*tf.log(y)) # 随机梯度下降 train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) # 初始化 init = tf.initialize_all_variables() # Session sess = tf.Session() sess.run(init) # 迭代 for i in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) if i % 50 == 0: correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) print ("Setp: ", i, "Accuracy: ",sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

转载请注明原文地址: https://www.6miu.com/read-2050006.html

最新回复(0)