本专栏将推出一系列深度学习与图像处理相关的教程文章。注重原理精讲和代码实现。实现框架将重点选择Tensorflow或Pytorch。本讲从逻辑斯第回归入手,然后讲解softmax分类器,最后讲解多层感知器。文末提供注释详尽的Tensorflow代码实现。


逻辑斯第函数

逻辑斯第回归(Logistic Regression)起源于对生物学中种群数量的演变的建模。设种群数量为 P P P,环境能承载的最大人口数量为 K K K,单个生物的繁殖率为常数 r r r,则种群的增长率

\begin{equation}
\frac{\partial P}{\partial t} = r P (1 - \frac{P}{K})
\tag{1}
\end{equation}

这个微分方程的解为

\begin{equation}
P(t) = \frac{P(0) \exp{( rt)}}{1 + P(0) (\exp( rt) - 1) / K}
\tag{2}
\end{equation}

上式也就是逻辑斯第函数的来源,它对生物种群数量变化拟合效果较好。这个公式可以形式化为

\begin{equation}
F(t) = \frac{1}{1 + \exp( -(t - \mu) / s )}
\tag{3}
\end{equation}
其中 μ , s \mu, s μ,s为常数参数。下图展示了逻辑斯第函数的形态:


逻辑斯第函数的形态 (图片来自维基百科)

二分类——逻辑斯第回归

逻辑斯第回归本是用于解决二分类问题,之所以称之为回归,是因为它解决问题的方法是对样本对应的概率值直接建模,而这又是一个回归问题。

如果向量样本 x ∈ R m x \in R^m x∈Rm只可能属于两个类别 y ∈ { 0 , 1 } y \in \{0, 1\} y∈{0,1}。逻辑斯第回归假设样本 ( x , y ) (x, y) (x,y)满足这样的概率分布:
\begin{equation}
P(y=1 | x) = \frac{\exp(w^T x + b)}{1 + \exp(w^T x + b)}
\tag{4}
\end{equation}
从而

\begin{equation}
P(y=0 | x) = \frac{1}{1 + \exp(w^T x + b)}
\tag{5}
\end{equation}

其中 w ∈ R m w \in R^m w∈Rm为待定参数向量。不难发现,式(5)与式(3)具有一致的形式。从某种程度上说,逻辑斯第回归是把样本向量 x x x通过与向量参数 w w w的内积服从的概率分布,映射到自然界中生物种群数量增长的分布上。

建好了概率模型之后,我们还需要建立目标函数求解模型参数 w , b w, b w,b。记 h w ( x ) = P ( Y = 1 ∣ x ) h_w(x)=P(Y=1|x) hw​(x)=P(Y=1∣x),训练样本数据为 ( x i , y i ) (x_i, y_i) (xi​,yi​),根据极大似然思想,似然函数为
\begin{equation}
\max_{w,b} \prod_i h_w(x_i)^{y_i} (1-h_w(x_i))^{1- y_i}
\tag{6}
\end{equation}
从而对数似然函数为
\begin{equation}
\max_{w, b} \sum_i y_i \ln(h_w(x_i)) + (1 - y_i) \ln(1 - h_w(x_i))
\tag{7}
\end{equation}
而对对数似然函数的相反数求最小,就是交叉熵损失函数(Cross Entropy Loss)

关于逻辑斯第回归的更多细节,请参考博文:浅析Logistic Regression

多分类——Softmax分类

逻辑斯第回归用于解决二分类问题,一个自然的问题是多分类问题怎么解决?

Softmax分类就是逻辑斯蒂回归到多分类问题的推广,其概率预测模型定义为
\begin{equation}
\hat{y}=\textbf{softmax}(W x + b)
\tag{8}
\end{equation}
其中 y ^ \hat{y} y^​的第 c c c个元素 [ y ^ ] c [\hat{y}]_c [y^​]c​表示数据 x x x属于第 c c c个类别的概率。而 softmax ( z ) \textbf{softmax}(z) softmax(z)的第 c c c个元素定义为
(9) [ softmax ( z ) ] c = exp ⁡ ( [ z ] c ) ∑ k = 1 p exp ⁡ ( [ z ] k ) [\textbf{softmax}(z)]_c = \frac{\exp({[z]_c})}{\sum_{k=1}^p \exp({[z]_k})} \tag{9} [softmax(z)]c​=∑k=1p​exp([z]k​)exp([z]c​)​(9)

设样本数据为 ( x i , y i ) (x_i, y_i) (xi​,yi​),其中 x i ∈ R p x_i \in R^p xi​∈Rp为特征向量, y i ∈ R C y_i \in R^C yi​∈RC的第c个维度为1,其他维度为0,则表示样本类别为第c类。为了求解模型参数 W , b W,b W,b,记 h W ( x ) = softmax ( W x + b ) h_W(x) = \textbf{softmax}(Wx+b) hW​(x)=softmax(Wx+b)同样利用极大似然的思路,建立似然函数为
(10) max ⁡ W , b ∏ i ∏ c [ h W ( x i ) ] c [ y i ] c \max_{W,b} \prod_i \prod_c {[h_W(x_i)]}_c^{[y_i]_c} \tag{10} W,bmax​i∏​c∏​[hW​(xi​)]c[yi​]c​​(10)
其中 [ h W ( x i ) ] c [h_W(x_i)]_c [hW​(xi​)]c​表示向量 h W ( x i ) h_W(x_i) hW​(xi​)的第c个元素, [ y i ] c [y_i]_c [yi​]c​表示向量 y i y_i yi​的第c个元素。从而对数似然函数为
(11) max ⁡ W , b ∑ i ∑ c [ y i ] c ln ⁡ ( [ h W ( x i ) ] c ) \max_{W,b} \sum_i \sum_c [y_i]_c \ln( [h_W(x_i)]_c ) \tag{11} W,bmax​i∑​c∑​[yi​]c​ln([hW​(xi​)]c​)(11)

与逻辑斯第回归一样,对对数似然函数的相反数求最小,就是多分类问题的交叉熵损失函数(Cross Entropy Loss)

在实现过程中,目标函数的求解由Tensorflow、Pytorch等计算框架完成,故这里不再分析。

多层感知器

多层感知器(Multi-layer Perceptron, MLP)的第一个隐层的神经元 k k k(节点)是线性变换复合一个非线性变换:
\begin{equation}
y_k = a_k(x) = \textbf{hardlim}(w_k^T x + b)
\tag{12}
\end{equation}
其中 hardlim \textbf{hardlim} hardlim是硬极限函数
(13) hardlim ( x ) = { 1 , x > 0 0 , x ≤ 0 \textbf{hardlim}(x) = \left\{ \begin{aligned} 1, \quad & x > 0 \\ 0, \quad & x \le 0 \end{aligned} \right. \tag{13} hardlim(x)={1,0,​x>0x≤0​(13)
它是一种非线性激活函数。它的输入输出都是标量。硬极限函数导数为0(原点处无导数),无法反向传播。因此改进形式有simgoid,tanh或者ReLU:
Sigomid函数
\begin{equation}
\sigma(t) = \frac{1}{1 + e^{-t}}
\tag{14}
\end{equation}
tanh函数
\begin{equation}
tanh(t) = 2\sigma(2t) - 1 = \frac{1 - e^{-2t}}{1 + e^{-2t}}
\tag{15}
\end{equation}
ReLU函数
(16) r e l u ( t ) = max ⁡ ( t , 0 ) = { t , t > 0 0 , t ≤ 0 relu(t) = \max(t, 0) = \left\{ \begin{aligned} t, \quad & t > 0 \\ 0, \quad & t \le 0 \end{aligned} \right. \tag{16} relu(t)=max(t,0)={t,0,​t>0t≤0​(16)
不同激活函数的优劣请参考知乎专栏:https://zhuanlan.zhihu.com/p/21462488?refer=intelligentunit。

如果我们定义向量输入的硬极限函数输出是对元素逐个进行相应的标量操作,多层感知器的第一个隐层可以写为
\begin{equation}
y = a(x) = \textbf{hardlim}(W x + b)
\tag{17}
\end{equation}
这一层的输入是向量 x x x,而输出是向量 y y y。

多层感知器的隐层的向量输出作为softmax回归的输入,形成一个完整的多层感知器:
\begin{equation}
y = \textbf{softmax}(a(x) )
\tag{18}
\end{equation}

一般多层感知器的最后一个隐层输出是多个隐层的复合函数。一个 k k k层感知器(包含 k − 1 k-1 k−1个隐层和一个输出层)的函数表达如下:
\begin{equation}
y = mlp(x) = \textbf{softmax}( a_{k - 1} ( \cdots a_1(x) \cdots ) )
\tag{19}
\end{equation}

多层感知器的训练目标函数与softmax分类器完全相同,仅仅是对分类概率建模不同。

Tensorflow实现

程序的目标是分别训练一个softmax和mlp模型,对MNIST手写数字数据集进行分类。输入为 28 × 28 = 784 28\times28=784 28×28=784维向量,输出为10维向量,标记输入灰度图像属于 0 − 9 0-9 0−9哪个类别。

# coding=utf8
from __future__ import print_function
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
# 指定运算设备
device = "/gpu:0"
# 设置训练轮次
train_epoch_num = 100
# 设置随机梯度下降的批大小
batch_size= 50
# 设置训练总迭代数
train_iter_num = 55000 / batch_size * train_epoch_num
# 加载训练数据
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
trX, trY = mnist.train.images, mnist.train.labels
print('len trX : ', len(trX))
# 开启Tensorflow的会话
sess = tf.InteractiveSession()
# 定义模型输入
x = tf.placeholder(tf.float32, shape=[None, 784], name="x")
# 定义模型输出
y_ = tf.placeholder(tf.float32, shape=[None, 10], name="y")
# 训练
def train(train_model, y):# 标记模型在测试样本上正确的样本correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))# 计算模型在测试样本上的正确率accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))# 初始化tf的计算图中所有变量sess.run(tf.global_variables_initializer())# 指定运算设备with tf.device(device):# 随机梯度下降法:迭代优化for i in range(train_iter_num):# 从训练样本中随机抽取一个批batch = mnist.train.next_batch(batch_size)# 用批数据优化模型参数train_model.run(feed_dict={x:batch[0], y_: batch[1]})# 打印第i次迭代的正确率if i % 1000 == 0:print(i, accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
def train2(train_model, y):# 标记模型在测试样本上正确的样本predict_y = tf.argmax(y, 1)# 初始化tf的计算图中所有变量sess.run(tf.global_variables_initializer())# 开始训练轮次for i in range(train_epoch_num):# 将所有训练样本依次分割成批for start, end in zip(range(0, len(trX), batch_size), range(batch_size, len(trX) + 1, batch_size)):# 用批数据优化模型参数sess.run(train_model, feed_dict={x: trX[start:end], y_: trY[start:end]})# 计算模型在测试样本上的正确率acc = np.mean(np.argmax(mnist.test.labels, axis=1) == sess.run(predict_y, feed_dict={x: mnist.test.images}))# 打印第i个轮次的正确率print(i, acc)
# 用正态分布随机数初始化权重
def init_weights(shape):return tf.Variable(tf.random_normal(shape, stddev=0.01))
# 建立softmax分类器
def softmax_model():# 定义权重变量W = tf.Variable(tf.zeros([784, 10]))b = tf.Variable(tf.zeros([10]))# 初始化权重变量W = init_weights(W.get_shape())b = init_weights(b.get_shape())# softmax模型的线性部分y = tf.matmul(x, W) + b# 定义softmax和交叉熵目标函数cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_))# 定义优化算子为梯度下降算子,步长0.1train_model = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy)return train_model, y
# 建立多层感知器
def mlp_model():# 定义第一层权重变量W = tf.Variable(tf.zeros([784, 625]))# 定义第二次权重变量W2 = tf.Variable(tf.zeros([625, 10]))# 初始化权重非常重要,否则GradientDescent收敛非常慢W = init_weights(W.get_shape())W2 = init_weights(W2.get_shape())# 定义第一层h = tf.sigmoid( tf.matmul(x,W))# 定义第二层y = tf.matmul(h, W2)# 定义最后一层softmax和交叉熵目标函数cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=y, labels=y_))# 定义优化算子为梯度下降算子,步长0.1train_model = tf.train.GradientDescentOptimizer(0.1).minimize(cost)return train_model, y
###############################
# 建模和训练
def softmax():train_model, y = softmax_model()#train(train_model, y)train2(train_model, y)
def mlp():train_model, y = mlp_model()#train(train_model, y)train2(train_model, y)
# 开始执行
print('softmax regression')
softmax()
print('mlp')
mlp()

代码中提供了两种训练方法。函数train从训练样本中随机抽取批(batch),优化模型参数。函数train2则是将全部训练数据分成批遍历一遍,进行多个轮次(Epoch)。当随机函数设计得当,两种训练方法在相同训练次数下的得到的模型性能相近。

运行结果:

softmax regression
0 0.9069
1 0.9125
2 0.9146
...
98 0.9223
99 0.9223
mlp
0 0.8743
1 0.8991
2 0.9079
...
98 0.9787
99 0.9786

可以看出多层感知器的学习能力显著强于softmax分类器。

微信公众号同步更新

![微信公众号](https://img-blog.csdn.net/20180226131119877?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG9taGVhdmVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) TomHeaven的博客,欢迎关注 :)

逻辑斯第回归、softmax分类与多层感知器相关推荐

  1. 单层感知器线性分类、多层感知器非线性分类样例 调用matlab神经网络工具箱实现

    %给定样本输入向量P,目标输出向量T %net = newp(PR,S,TF,LF) %PR为输入矢量的取值范围的最大值和最小值 S为神经元的个数 TF为网络的传递函数 默认为hardlim LF为网 ...

  2. 从感知机到逻辑斯蒂回归到支持向量机

    机器学习的一个重要任务是进行分类,以二分类来说,如果数据是线性可分的,我们往往会找到一个超平面WX+B对数据有良好的分类能力,二维空间便是直线kx+b,二维及以上我们称之为超平面,下面从最基本的感知机 ...

  3. 【机器学习】逻辑斯蒂回归原理

    逻辑斯蒂函数 引入: 在线性感知器算法中,我们使用了一个f(x)=x函数,作为激励函数,而在逻辑斯蒂回归中,我们将会采用sigmoid函数作为激励函数,所以它被称为sigmoid回归也叫对数几率回归( ...

  4. Lecture6 逻辑斯蒂回归(Logistic Regression)

    目录 1 常用数据集 1.1 MNIST数据集 1.2 CIFAR-10数据集 2 课堂内容 2.1 回归任务和分类任务的区别 2.2 为什么使用逻辑斯蒂回归 2.3 什么是逻辑斯蒂回归 2.4 Si ...

  5. 对逻辑斯蒂回归的一些细节剖析

    首先声明:本博客的写作思路是对机器学习的一些基本算法做一些通俗性的灵活理解,以及对一些细节的进行简单剖析,还有记录本人在使用算法时的一些小经验小感想.本人一般不会对基本公式做大量推导,也不会写的太正式 ...

  6. PyTorch深度学习实践(b站刘二大人)P6讲 逻辑斯蒂回归 Logistic Regression

    1.分类任务的数据集 ① The MNIST Dataset:handwritten digits Training set: 60,000 examples, Test set: 10,000 ex ...

  7. 用二项逻辑斯蒂回归解决二分类问题

    逻辑斯蒂回归: 逻辑斯蒂回归是统计学习中的经典分类方法,属于对数线性模型.logistic回归的因变量可以是二分类的, 也可以是多分类的 基本原理 logistic 分布 折X是连续的随机变量,X服从 ...

  8. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    ML之NB&LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+TfidfVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结果 ...

  9. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测

    ML之NB&LoR:利用NB(朴素贝叶斯).LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析-五分类预测 目录 输出结果 ...

最新文章

  1. linux中普通文件和块设备文件的区别
  2. python tkinter库、添加gui界面_使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)...
  3. 二分类神经网络的特征光谱---2-3至2-9
  4. Java通过ftp上传文件
  5. 用户空间与内核空间,进程上下文与中断上下文[总结]【转】
  6. ListView 搜索函数
  7. python subprocess.Popen简明总结
  8. 做自己的软件的Gallery(一)
  9. 借助Haproxy_exporter实现对MarathonLb的流量和负载实例业务的可用状态监控-续
  10. 高德地图导航onInitNaviSuccess只调用一次
  11. 正点原子阿波罗STM32F7-红外遥控原理及代码
  12. 计算机编码骂人,问吧骂人专用代码
  13. android 6.0自启动管理器,安卓6.0技巧:系统自带文件管理器
  14. 微信小程序开发实战(12):滑杆组件(slider)和form组件
  15. 磁盘存储DiskStore
  16. 对于html转jsp乱码问题
  17. 东北大学计算机辽宁分数线,辽宁排名多少能上东北大学?附东北大学近三年录取分数线...
  18. java闪光灯_手电筒项目开发一闪光灯
  19. wps js宏合并相同列的单元格
  20. 全国产化V7-690T PCIe3.0/千兆/万兆信号处理卡

热门文章

  1. 【良心】C语言零基础学习,C语言初学者入门基础知识讲解
  2. 【tio-core】1、tio-study是学习t-io的第一步
  3. 前端导出word实现方法
  4. java 发 腾讯企业邮_(更新)Java + 腾讯企业邮箱 + javamail + SSL 发送邮件
  5. markdown文件的常用编写语法(图文并茂)
  6. 《人工智能与放射科学的未来》学习笔记
  7. 五年级英语短文计算机,五年级英语阅读短文大全
  8. 流利说:通过数据分析评估获客效率
  9. 测试服务器并发量和承载力(压力测试)
  10. 上海人工智能产业生态圈逐渐形成,产业发展进入“快车道”