学术上softmax回归 详解和逻辑回归一样吗

逻辑回归算法学习与思考 | 绿盟科技博客
绿盟科技博客近期热门 486
绿盟科技博客被dmoz收录softmax function是一个怎样的函数? - 知乎5被浏览1522分享邀请回答10添加评论分享收藏感谢收起我们已经知道,普通的logistic回归只能针对二分类(Binary Classification)问题,要想实现多个类别的分类,我们必须要改进logistic回归,让其适应多分类问题。
关于这种改进,有两种方式可以做到。
第一种方式是直接根据每个类别,都建立一个二分类器,带有这个类别的样本标记为1,带有其他类别的样本标记为0。假如我们有个类别,最后我们就得到了个针对不同标记的普通的logistic分类器。
第二种方式是修改logistic回归的损失函数,让其适应多分类问题。这个损失函数不再笼统地只考虑二分类非1就0的损失,而是具体考虑每个样本标记的损失。这种方法叫做softmax回归,即logistic回归的多分类版本。
我们首先简单介绍第一种方式。
对于二分类问题,我们只需要一个分类器即可,但是对于多分类问题,我们需要多个分类器才行。假如给定数据集,它们的标记,即这些样本有个不同的类别。
我们挑选出标记为的样本,将挑选出来的带有标记的样本的标记置为1,将剩下的不带有标记的样本的标记置为0。然后就用这些数据训练出一个分类器,我们得到(表示针对标记的logistic分类函数)。
按照上面的步骤,我们可以得到个不同的分类器。针对一个测试样本,我们需要找到这个分类函数输出值最大的那一个,即为测试样本的标记:
下面我们介绍softmax回归。
对于有个标记的分类问题,分类函数是下面这样:
在这里,我们将上式的所有的组合起来,用矩阵来表示,即:
这时候,softmax回归算法的代价函数如下所示(其中):
很明显,上述公式是logistic回归损失函数的推广。
我们可以把logistic回归的损失函数改为如下形式:
但是,需要特别注意的是,对于,softmax回归和logistic回归的计算方式是不同的。
对于选择softmax分类器还是个logistic分类器,取决于所有类别之间是否互斥。所有类别之间明显互斥用softmax分类器,所有类别之间不互斥有交叉的情况下最好用个logistic分类器。
参考资料:
阅读(...) 评论()DeepLearning(171)
FROM:&http://blog.csdn.net/u/article/details/
DeepLearning tutorial(1)Softmax回归原理简介+代码详解
@author:wepon
本文介绍Softmax回归算法,特别是详细解读其代码实现,基于python theano,代码来自:,参考。
一、Softmax回归简介
关于算法的详细教程本文没必要多说,可以参考UFLDL。下面只简单地总结一下,以便更好地理解代码。
Softmax回归其实就相当于多类别情况下的逻辑回归,对比如下:
逻辑回归的假设函数(hypothesis):
整个逻辑回归模型的参数就是theta,h(*)是sigmoid函数,输出在0~1之间,一般作为二分类算法。对于具体的问题,找出最合适的theta便是最重要的步骤,这是最优化问题,一般通过定义代价函数,然后最小化代价函数来求解,逻辑回归的代价函数为:
最小化J(theta),一般采用梯度下降算法,迭代计算梯度并更新theta。
Softmax的假设函数:
逻辑回归里将-theta*x作为sigmoid函数的输入,得到的是0或者1,两个类别。而softmax有有k个类别,并且将-theta*x作为指数的系数,所以就有e^(-theta_1*x)至e^( -theta_k*x)共k项,然后除以它们的累加和,这样做就实现了归一化,使得输出的k个数的和为1,而每一个数就代表那个类别出现的概率。因此:softmax的假设函数输出的是一个k维列向量,每一个维度的数就代表那个类别出现的概率。
Softmax的代价函数:
本质上跟逻辑回归是一样的,采用NLL,如果加上权重衰减项(正则化项),则为:
最小化代价函数,同样可以采用简单而有效的梯度下降,需要提到的是,在程序实现中,我们一般采用批量随机梯度下降,即MSGD,minibatch&Stochastic Gradient Descent,简单来说,就是每遍历完一个batch的样本才计算梯度和更新参数,一个batch一般有几十到几百的单个样本。PS:随机梯度下降则是一个样本更新一次。
二、Softmax代码详细解读
首先说明一点,下面的程序采用的是MSGD算法,代价函数是不带权重衰减项的,整个程序实现用Softmax回归来classfy MINST数据集(识别手写数字0~9)。代码解读是个人理解,仅供参考,不一定正确,如有错误请不吝指出。
原始代码和经过我注释的代码:
参数说明:上面第一部分我们的参数用theta表示,在下面的程序中,用的是W,权重,这两者是一样的。还有一点需要注意,上面的假设函数中是-theta*x,而在程序中,用的是W*X+b,本质也是一样的,因为可以将b看成W0,增加一个x0=1,则W*X+b=WX=-theta*x。
(1)导入一些必要的模块
import&cPickle&&import&gzip&&import&os&&import&sys&&import&time&&&&import&numpy&&&&import&theano&&import&theano.tensor&as&T&&
(2)定义Softmax回归模型
在deeplearning tutorial中,直接将LogisticRegression视为Softmax,而我们所认识的二类别的逻辑回归就是当n_out=2时的LogisticRegression,因此下面代码定义的LogisticRegression就是Softmax。
代码解读见注释:
&&&&&&&&class&LogisticRegression(object):&&&&&&def&__init__(self,&input,&n_in,&n_out):&&&&&&&&&&&&&&&&self.W&=&theano.shared(&&&&&&&&&&&&&&value=numpy.zeros(&&&&&&&&&&&&&&&&&&(n_in,&n_out),&&&&&&&&&&&&&&&&&&dtype=theano.config.floatX&&&&&&&&&&&&&&),&&&&&&&&&&&&&&name='W',&&&&&&&&&&&&&&borrow=True&&&&&&&&&&)&&&&&&&&&&&&self.b&=&theano.shared(&&&&&&&&&&&&&&value=numpy.zeros(&&&&&&&&&&&&&&&&&&(n_out,),&&&&&&&&&&&&&&&&&&dtype=theano.config.floatX&&&&&&&&&&&&&&),&&&&&&&&&&&&&&name='b',&&&&&&&&&&&&&&borrow=True&&&&&&&&&&)&&&&&&&&&&&&&&&&&&&&&&self.p_y_given_x&=&T.nnet.softmax(T.dot(input,&self.W)&+&self.b)&&&&&&&&&&&&&&self.y_pred&=&T.argmax(self.p_y_given_x,&axis=1)&&&&&&&&&&&&&&self.params&=&[self.W,&self.b]&&&&&&&&&&&&&&&&&&def&negative_log_likelihood(self,&y):&&&&&&&&&&&&return&-T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]),&y])&&&&&&&&&&def&errors(self,&y):&&&&&&&&&&&&&&&&&&&&if&y.ndim&!=&self.y_pred.ndim:&&&&&&&&&&&&&&raise&TypeError(&&&&&&&&&&&&&&&&&&'y&should&have&the&same&shape&as&self.y_pred',&&&&&&&&&&&&&&&&&&('y',&y.type,&'y_pred',&self.y_pred.type)&&&&&&&&&&&&&&)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&y.dtype.startswith('int'):&&&&&&&&&&&&&&return&T.mean(T.neq(self.y_pred,&y))&&&&&&&&&&else:&&&&&&&&&&&&&&raise&NotImplementedError()&&
上面已经定义好了softmax模型,包括输入的batch :input,每个样本的大小n_in,输出的类别n_out,模型的参数W、b,模型预测的输出y_pred,代价函数NLL,以及误差率errors。
(3)加载MNIST数据集
def&load_data(dataset):&&&&&&&&&&&&&&&&&&data_dir,&data_file&=&os.path.split(dataset)&&&&&&if&data_dir&==&&&&and&not&os.path.isfile(dataset):&&&&&&&&&&&&&&&&&&&&new_path&=&os.path.join(&&&&&&&&&&&&&&os.path.split(__file__)[0],&&&&&&&&&&&&&&&..&,&&&&&&&&&&&&&&&data&,&&&&&&&&&&&&&&dataset&&&&&&&&&&)&&&&&&&&&&if&os.path.isfile(new_path)&or&data_file&==&'mnist.pkl.gz':&&&&&&&&&&&&&&dataset&=&new_path&&&&&&&&if&(not&os.path.isfile(dataset))&and&data_file&==&'mnist.pkl.gz':&&&&&&&&&&import&urllib&&&&&&&&&&origin&=&(&&&&&&&&&&&&&&'http://www.iro.umontreal.ca/~lisa/deep/data/mnist/mnist.pkl.gz'&&&&&&&&&&)&&&&&&&&&&print&'Downloading&data&from&%s'&%&origin&&&&&&&&&&urllib.urlretrieve(origin,&dataset)&&&&&&&&print&'...&loading&data'&&&&&&&&&&&&&&&&&&&&f&=&gzip.open(dataset,&'rb')&&&&&&train_set,&valid_set,&test_set&=&cPickle.load(f)&&&&&&f.close()&&&&&&&&&&&&&&&&&def&shared_dataset(data_xy,&borrow=True):&&&&&&&&&&data_x,&data_y&=&data_xy&&&&&&&&&&shared_x&=&theano.shared(numpy.asarray(data_x,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&dtype=theano.config.floatX),&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&borrow=borrow)&&&&&&&&&&shared_y&=&theano.shared(numpy.asarray(data_y,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&dtype=theano.config.floatX),&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&borrow=borrow)&&&&&&&&&&return&shared_x,&T.cast(shared_y,&'int32')&&&&&&&&&&test_set_x,&test_set_y&=&shared_dataset(test_set)&&&&&&valid_set_x,&valid_set_y&=&shared_dataset(valid_set)&&&&&&train_set_x,&train_set_y&=&shared_dataset(train_set)&&&&&&&&rval&=&[(train_set_x,&train_set_y),&(valid_set_x,&valid_set_y),&&&&&&&&&&&&&&(test_set_x,&test_set_y)]&&&&&&return&rval&&
(4)将模型应用于MNIST数据集
def&sgd_optimization_mnist(learning_rate=0.13,&n_epochs=1000,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&dataset='mnist.pkl.gz',&&&&&&&&&&&&&&&&&&&&&&&&&&&&&batch_size=600):&&&&&&&&datasets&=&load_data(dataset)&&&&&&train_set_x,&train_set_y&=&datasets[0]&&&&&&valid_set_x,&valid_set_y&=&datasets[1]&&&&&&test_set_x,&test_set_y&=&datasets[2]&&&&&&&&n_train_batches&=&train_set_x.get_value(borrow=True).shape[0]&/&batch_size&&&&&&n_valid_batches&=&valid_set_x.get_value(borrow=True).shape[0]&/&batch_size&&&&&&n_test_batches&=&test_set_x.get_value(borrow=True).shape[0]&/&batch_size&&&&&&&&&&&&&&&&&&&&&&&&&&print&'...&building&the&model'&&&&&&&&&&&&index&=&T.lscalar()&&&&&&&&x&=&T.matrix('x')&&&&&&&y&=&T.ivector('y')&&&&&&&&&&&&&&&&&&&&&classifier&=&LogisticRegression(input=x,&n_in=28&*&28,&n_out=10)&&&&&&&&&&&&&&cost&=&classifier.negative_log_likelihood(y)&&&&&&&&&&&&&&&&&&&&&&test_model&=&theano.function(&&&&&&&&&&inputs=[index],&&&&&&&&&&outputs=classifier.errors(y),&&&&&&&&&&givens={&&&&&&&&&&&&&&x:&test_set_x[index&*&batch_size:&(index&+&1)&*&batch_size],&&&&&&&&&&&&&&y:&test_set_y[index&*&batch_size:&(index&+&1)&*&batch_size]&&&&&&&&&&}&&&&&&)&&&&&&&&&&validate_model&=&theano.function(&&&&&&&&&&inputs=[index],&&&&&&&&&&outputs=classifier.errors(y),&&&&&&&&&&givens={&&&&&&&&&&&&&&x:&valid_set_x[index&*&batch_size:&(index&+&1)&*&batch_size],&&&&&&&&&&&&&&y:&valid_set_y[index&*&batch_size:&(index&+&1)&*&batch_size]&&&&&&&&&&}&&&&&&&&&&g_W&=&T.grad(cost=cost,&wrt=classifier.W)&&&&&&g_b&=&T.grad(cost=cost,&wrt=classifier.b)&&&&&&&&&&updates&=&[(classifier.W,&classifier.W&-&learning_rate&*&g_W),&&&&&&&&&&&&&&&&&(classifier.b,&classifier.b&-&learning_rate&*&g_b)]&&&&&&&&&&train_model&=&theano.function(&&&&&&&&&&inputs=[index],&&&&&&&&&&outputs=cost,&&&&&&&&&&updates=updates,&&&&&&&&&&givens={&&&&&&&&&&&&&&x:&train_set_x[index&*&batch_size:&(index&+&1)&*&batch_size],&&&&&&&&&&&&&&y:&train_set_y[index&*&batch_size:&(index&+&1)&*&batch_size]&&&&&&&&&&}&&&&&&)&&&&&&&&&&&&&&&&&&&&&&&&&&print&'...&training&the&model'&&&&&&&&&&&patience&=&5000&&&&&&&&patience_increase&=&2&&&&&&&&&improvement_threshold&=&0.995&&&&&&&&&validation_frequency&=&min(n_train_batches,&patience&/&2)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&best_validation_loss&=&numpy.inf&&&&&&&&&test_score&=&0.&&&&&&start_time&=&time.clock()&&&&&&&&done_looping&=&False&&&&&&epoch&=&0&&&&&&&&&&&&&&&&&&&&&&&&&&&&while&(epoch&&&n_epochs)&and&(not&done_looping):&&&&&&&&&&epoch&=&epoch&+&1&&&&&&&&&&for&minibatch_index&in&xrange(n_train_batches):&&&&&&&&&&&&&&&&minibatch_avg_cost&=&train_model(minibatch_index)&&&&&&&&&&&&&&&&&&&&&&&&&&&&iter&=&(epoch&-&1)&*&n_train_batches&+&minibatch_index&&&&&&&&&&&&&&&&if&(iter&+&1)&%&validation_frequency&==&0:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&validation_losses&=&[validate_model(i)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&for&i&in&xrange(n_valid_batches)]&&&&&&&&&&&&&&&&&&this_validation_loss&=&numpy.mean(validation_losses)&&&&&&&&&&&&&&&&&&&&print(&&&&&&&&&&&&&&&&&&&&&&'epoch&%i,&minibatch&%i/%i,&validation&error&%f&%%'&%&&&&&&&&&&&&&&&&&&&&&&(&&&&&&&&&&&&&&&&&&&&&&&&&&epoch,&&&&&&&&&&&&&&&&&&&&&&&&&&minibatch_index&+&1,&&&&&&&&&&&&&&&&&&&&&&&&&&n_train_batches,&&&&&&&&&&&&&&&&&&&&&&&&&&this_validation_loss&*&100.&&&&&&&&&&&&&&&&&&&&&&)&&&&&&&&&&&&&&&&&&)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&this_validation_loss&&&best_validation_loss:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&this_validation_loss&&&best_validation_loss&*&&\&&&&&&&&&&&&&&&&&&&&&&&&&improvement_threshold:&&&&&&&&&&&&&&&&&&&&&&&&&&patience&=&max(patience,&iter&*&patience_increase)&&&&&&&&&&&&&&&&&&&&&&&&best_validation_loss&=&this_validation_loss&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&test_losses&=&[test_model(i)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&for&i&in&xrange(n_test_batches)]&&&&&&&&&&&&&&&&&&&&&&test_score&=&numpy.mean(test_losses)&&&&&&&&&&&&&&&&&&&&&&&&print(&&&&&&&&&&&&&&&&&&&&&&&&&&(&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'&&&&&epoch&%i,&minibatch&%i/%i,&test&error&of'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'&best&model&%f&%%'&&&&&&&&&&&&&&&&&&&&&&&&&&)&%&&&&&&&&&&&&&&&&&&&&&&&&&&(&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&epoch,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&minibatch_index&+&1,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&n_train_batches,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&test_score&*&100.&&&&&&&&&&&&&&&&&&&&&&&&&&)&&&&&&&&&&&&&&&&&&&&&&)&&&&&&&&&&&&&&&&if&patience&&=&iter:&&&&&&&&&&&&&&&&&&done_looping&=&True&&&&&&&&&&&&&&&&&&break&&&&&&&&&&end_time&=&time.clock()&&&&&&print(&&&&&&&&&&(&&&&&&&&&&&&&&'Optimization&complete&with&best&validation&score&of&%f&%%,'&&&&&&&&&&&&&&'with&test&performance&%f&%%'&&&&&&&&&&)&&&&&&&&&&%&(best_validation_loss&*&100.,&test_score&*&100.)&&&&&&)&&&&&&print&'The&code&run&for&%d&epochs,&with&%f&epochs/sec'&%&(&&&&&&&&&&epoch,&1.&*&epoch&/&(end_time&-&start_time))&&&&&&print&&&&sys.stderr,&('The&code&for&file&'&+&&&&&&&&&&&&&&&&&&&&&&&&&&&&os.path.split(__file__)[1]&+&&&&&&&&&&&&&&&&&&&&&&&&&&&&'&ran&for&%.1fs'&%&((end_time&-&start_time)))&&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1132201次
积分:14203
积分:14203
排名:第858名
原创:102篇
转载:1345篇
评论:180条
1)OpenCV俱乐部
2) 视频/音频/图像/算法/ML
备注:加群需要回答问题,避免广告党。
如果你是博客看到后加的,请注明“博客”并回答问题,只注明”博客“不回答问题的恕不加入。答案为和群相关的任何技术名词,不能出现1)和2)中的任何字眼
阅读:6162
文章:16篇
阅读:10663
阅读:5492
文章:32篇
阅读:37642
(15)(46)(6)(9)(8)(8)(31)(20)(18)(42)(70)(118)(143)(56)(68)(107)(226)(78)(3)(9)(37)(46)(50)(19)(15)(13)(27)(12)(12)(103)(18)(18)6956人阅读
Deep Learning(7)
逻辑回归和Softmax回归是两个基础的分类模型,虽然听名字以为是回归模型,但实际我觉得他们也有一定的关系。逻辑回归,Softmax回归以及线性回归都是基于线性模型,它们固定的非线性的基函数(basis function) 的线性组合,形式如下:
2.逻辑回归谈谈逻辑回归,Softmax回归,前者主要处理二分类问题,而后者处理多分类问题,但事实上Softmax回归就是逻辑回归的一般形式。
其中,如果f(.)是非线性的激活函数(activation function),这就是一个分类模型;如果f(.)是恒等函数(identity),则是回归模型,现在可以发现它们三者的联系了吧。
下面主要谈谈逻辑回归,Softmax回归,前者主要处理二分类问题,而后者处理多分类问题,但事实上Softmax回归就是逻辑回归的一般形式。
2. 逻辑回归
定义逻辑回归hypothesis为
其中,为sigmoid函数,其性质可参考。
逻辑回归的理激活函数是sigmoid函数,可理解成一个被sigmoid函数归一化后的线性回归。因为sigmoid函数把实数映射到了[0,1]区间,可以认为为x属于类别1的概率,反正1-为x属于类别1的概率。给定有一个训练数据,构造它的似然函数(likelihood
function)为:
这里的y_n就是上面的 (由于参考了多本书,所以符号有一定的区别),一般会使用最大释然求解参数,这时取一个负的log对数(negative logarithm),得到:
上式被称为交叉熵(cross entropy) loss函数,因为取了一个负对数,之前的最大化就变成了最小化,所以只需求解是交叉熵loss函数最小的参数。
对loss函数求导得到:
到现在为止,我们已经得到了loss函数以及关于参数的偏导数,只需要通过梯度下降就可以得到参数的解,OK,大功告成。
如果需要预测一个为止数据x,属于那个类,只需要带入 。最简单的决策方法,如果 大于等于0.5属于类别1,反之属于类别0,当然也可以属于其他的决策方法。
3. Softmax回归
Softmax回归处理多分类问题,我们假设函数 形式如下:
和逻辑回归一样,得到loss函数为:
其中的1{.}是一个指示性函数,即当大括号中的值为真时,该函数的结果就为1,否则其结果就为0。
然后计算损失函数的偏导函数,得到:
之后就可以用如果要用梯度下降法,或者L-BFGS法求得未知参数。
看上面的推到我们可以发现,对每一个参数减去一个参数,最后的结果没有影响。其实softmax 回归中对参数的最优化解不只一个,每当求得一个优化参数时,如果将这个参数的每一项都减掉同一个数,其得到的损失函数值也是一样的,这说明解不是唯一的。
之所以会出现这样的现象,因为损失函数不是严格非凸的,也就是说在局部最小值点附近是一个”平坦”的,所以在这个参数附近的值都是一样的了。
为避免出现这样的情况,加入正则项(比如说,用牛顿法求解时,hession矩阵如果没有加入规则项,就有可能不是可逆的从而导致了刚才的情况,如果加入了规则项后该hession矩阵就不会不可逆了),加入正则项后的loss函数表达式为:
此时loss函数的偏导函数为:
同样的,我们在逻辑回归中,也可以加上正则项。
4. 逻辑回归与Softmax回归的联系
我们在刚开始的时候说softmax 回归是逻辑回归的一般形式,现在我们看看两者之间的联系。当类别数k = 2 时,softmax 回归退化为逻辑回归,softmax 回归的假设函数为:
利用softmax回归参数冗余的特点,我们令&,并且从两个参数向量中都减去向量,得到:
因此,用来表示,我们就会发现 softmax 回归器预测其中一个类别的概率为,另一个类别概率的为,这与
逻辑回归是一致的。
5. 与神经网络的关系
神经网络是一个多层次的分类模型,其实logistic回归和softmax回归可以看出最简单的神经网络,结构如下图所示:
一般的神经网络有输入层,隐含层以及输出层构成,而上图中只有输入层和输出层,而没有隐含层。神经网络处理二分类时,输出层为一个节点,但处理K(K&2)分类问题时,数据节点为K个,这个logistic回归和softmax回归保持一致。值得注意的,在神经网络中的最后一层隐含层和输出层就可以看成是logistic回归或softmax回归模型,之前的层只是从原始输入数据从学习特征,然后把学习得到的特征交给logistic回归或softmax回归处理。
因此,可以把处理分类问题的神经网络分成两部分,特征学习和logistic回归或softmax回归。
6. 参考:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:128221次
积分:1180
积分:1180
排名:千里之外
原创:24篇
转载:10篇
评论:11条
(1)(1)(2)(10)(17)(3)

我要回帖

更多关于 softmax回归 的文章

 

随机推荐