Logistic迴歸、softmax迴歸以及tensorflow實現MNIST識別

universe_ant發表於2016-10-06

一、Logistic迴歸

Logistic迴歸為概率型非線性迴歸模型,是研究二分類結果與一些影響因素之間關係的一種多變數分析方法。通常是用來研究某些因素條件下某個結果是否發生。

在講解Logistic迴歸理論之前,我們先從LR分類器說起。LR分類器,即Logistic Regression Classifier。在分類情形下,經過學習後的LR分類器是一組權值,當測試樣本的資料輸入時,這組權值與測試資料按照線性加和得到:

這裡是每個樣本的個特徵。之後按照Sigmoid函式的形式求出:

由於Sigmoid函式的定義域為,值域,因此最基本的LR分類器適合對兩類目標進行分類。綜上,Logistic迴歸最關鍵的問題就是研究如何求得這組權值。

下面正式講Logistic迴歸模型。

考慮具有個獨立變數的向量,設條件概率為根據觀測量相對於某事件發生的概率。那麼Logistic迴歸模型可以表示為:

其中,那麼在條件下不發生的概率為

所以事件發生與不發生的概率之比為:

這個比值稱為事件的發生比(the odds of experiencing an event),簡記為odds。

可以看出Logistic迴歸都是圍繞一個Sigmoid函式來展開的。接下來就講如何用極大似然估計求分類器的引數。

假設有個觀測樣本,觀測值分別為,設為給定條件下得到的概率,同樣地,的概率為,所以得到一個觀測值的概率為

因為各個觀測樣本之間相互獨立,那麼它們的聯合分佈為各邊緣分佈的乘積。得到似然函式為

然後我們的目標是求出是這一似然函式的值最大的引數估計,最大似然估計就是求出引數,使得取得最大值,對函式取對數得到

現在求向量,使得最大,其中

這裡介紹一種方法,叫做梯度下降法(求區域性極小值),當然相對還有梯度上升法(求區域性極大值)。對上述的似然函式求偏導後得到

由於是求區域性極大值,所以跟據梯度上升法,有

根據上述公式,只需初始化向量全為零或者隨機值,迭代到指定精度為止。


二、softmax迴歸

softmax迴歸可以看成是Logistic迴歸的擴充套件。我們知道Logistic迴歸用於二分類,那麼如果我們面對多分類問題怎麼辦?最常見的例子就是MNIST手寫數字分類,今天要講的softmax迴歸能用於解決這類問題。

在Logistic迴歸中,樣本資料的值,而在softmax迴歸中,其中是類別種數,比如在MNIST手寫識別中,表示要識別10個數字。設

那麼

而且有

為了將多項式模型表述成指數分佈族,先引入,它是一個維的向量,那麼

應用於一般線性模型,必然是屬於個類中的一種。用表示為真,同樣當為假時,有,那麼進一步得到聯合分佈的概率密度函式為

對比一下,可以得到

由於

那麼最終得到

可以得到期望值為

接下來得到對數似然函式為

其中是一個的矩陣,代表這個類的所有訓練引數,每個類的引數是一個維的向量。所以在softmax迴歸中將分類為類別的概率為

跟Logistic迴歸一樣,softmax也可以用梯度下降法或者牛頓迭代法求解,對對數似然函式求偏導數,得到

然後我們可以通過梯度上升法來更新引數

注意這裡是第個類的所有引數,它是一個向量。

在softmax迴歸中直接用上述對數似然函式是不能更新引數的,因為它存在冗餘的引數,通常用牛頓方法中的Hessian矩陣也不可逆,是一個非凸函式,那麼可以通過新增一個權重衰減項來修改代價函式,使得代價函式是凸函式,並且得到的Hessian矩陣可逆。


三、TensorFlow實現MNIST手寫數字識別(利用到softmax迴歸)

#!/usr/bin/env python

import tensorflow as tf
import numpy as np
import tensorflow.examples.tutorials.mnist.input_data as input_data

# read MNIST data set
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#trX, trY, teX, teY = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels

# create symbolic variables
X = tf.placeholder(tf.float32, [None, 784])
Y = tf.placeholder(tf.float32, [None, 10])

# create variables: weights and biases
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

# define model
y = tf.nn.softmax(tf.matmul(X, W) + b)

# cross entropy
cross_entropy = -tf.reduce_sum(Y * tf.log(y))

# train step
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

# init step
init = tf.initialize_all_variables()

with tf.Session() as sess:
	# run the init op
	sess.run(init)
	# then train
	for i in range(1000):
		batch_trX, batch_trY = mnist.train.next_batch(128)
		sess.run(train_step, feed_dict={X: batch_trX, Y: batch_trY})

	# test and evaluate our model
	correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(Y, 1))
	accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
	print sess.run(accuracy, feed_dict={X: mnist.test.images, Y: mnist.test.labels})

參考:



相關文章