Deep Learning的学习实践 2 -- 逻辑回归和人工神经网络

xiaoxiao2021-02-28  114

学习DeepLearning,必须要先学习逻辑回归模型(LR)和传统的人工神经网络模型(ANN),这个是基础。

 

简单说一下逻辑回归模型(LogisticRegression这里翻译成逻辑回归可能不太准确,但是沿用目前大家常用的名称),这个模型是非常实用的,在工业界的机器学习应用中很多场景都会使用,这个模型简单有效,而且,可以处理非常高维的输入特征。其核心是逻辑回归函数,一般化的形式如下(这个函数也叫S形函数或Sigmoid函数):

这里面的核心是自然对数的底数e2.718281828459),他的作用是把正无穷到负无穷的所有数通过上述Sigmoid函数的输出压缩的01之间,(这个底数e是个神奇的数字,它能反应很多自然界的基本规律,它是大数学家欧拉发现的,所以定义为e(这里其实做了一个假设,自然界里,大多数自变量X和因变量Y的关系是S形的,事实上的确如此。另一个假设是各个自变量X之间是相互独立的。所以,在满足以上两个假设的条件下,使用逻辑回归方法比较好。)。所以你看到图中,X轴可以是负无穷到正无穷,而Y轴在01之间,这里的曲线拟合的就是自变量X与因变量Y的关系。不过,逻辑回归是一个广义线性模型(generalized linear model),那是因为,逻辑回归一般做二分类,我们把回归的曲线设定一个阀值,设因变量F(Z)Y=0.5为分界点(此时Z=0Y=1/(1+e^0)=0.5),小于0.5的是类别A,大于0.5的是类别B,然后通过逻辑回归模型的求解,即求解公式中的Z,常见的具体形式是a+bX1+cX2+…+wXn(就是N维特征的线性累加),这里X1~Xnn维特征,a,b,c...w是对应的参数,而分类器的分割线就是这个线性函数a+bX1+cX2+…+wXn=0,如果是2维特征,得到分割线函数a+bX1+cX2=0,即X2 =-(a+bX1)/c那条直线,他的效果如下图所示,是一条直线区分平面上两种颜色的点:

该模型的详细求解过程和开源代码,网上有很多材料。我对求解方法的简单总结:1,梯度下降法:迭代计算全量数据的梯度(即曲线的导数,斜率)。2:随机梯度下降法:每次迭代只取一个样本计算梯度,避免过大的计算量,每次梯度不一定是最大梯度,经过多伦迭代后可以逐步接近最优方向。3Mini Batch梯度下降:介于方法1和方法2之间,每次选取小批量样本计算梯度。4online 梯度下降:每次选取一个样本计算梯度,计算后丢弃样本,可以反应数据的实时变化。5:牛顿法:计算梯度的二阶方法,即求解梯度的梯度(不光考虑当前迭代是最大梯度,还要考虑下一次迭代的梯度也是最大)。该方法收敛很快,梯度下降法需要迭代5000轮以上,牛顿法只需要迭代10几轮就可以达到差不多的效果,但是该方法求解复杂,常用的是拟牛顿法。后面基于Theano来测试,使用的是MiniBatch梯度下降法。台湾大学的LibLinear用的是拟牛顿法。

Softmax Regression的原理与逻辑回归(LR)类似,只是把分类的公式泛化了,可以用于多分类问题(如果是二分类,SoftmaxLR是一致的)。不过,LR也可以用于多分类问题(对每个类别做二分类判断是否),对于多分类的问题,softmaxLR的区别是,softmax要求每个分类互斥,而LR可以让多分类共存(一个数据可以归属多个类别)。

 

简单说一下人工神经网络(ANN),ANN的基本单位是神经元,即感知器,它的激活函数,一般是S函数(与逻辑回归一致)或者Tanh函数(双曲正切函数),它们的主要区别是,S函数的输出在0~之间,平滑一些,Tanh函数的输出在-1~1之间,陡峭一些,实际应用中的差异,要看具体场景。传统的人工神经网络是3层,一般使用BP(反向传播)算法进行训练,如果网络层数多了,用BP这种训练方法,会遇到“导数消亡”(vanishing gradient)问题(就是求解梯度的导数趋近于0,梯度很小了,进入“饱和区”或“平坦区”),如果层数多,在反向传播梯度的时候,会越来越小,就会使得靠近输入端的隐藏层参数不能得到有效的训练,结果容易陷入局部最小点,而不是全局最小点。Deep Learning的训练方法对这个问题有很好的改善和突破,所以可以把网络增加到Deep的深度,一般是5~10层的网络,其关键原因也在Pretraining里面,我理解其核心是一层层的逐层优化,逐层单独训练,每一层的输入是上一层的输出,这一点很重要,这样做实际上是把多层网络的训练分解为N个部分分别训练,也就规避了多层传导梯度导致“导数消亡”的问题,从而达到更好的训练效果,然后的Fineturning,与以前的BP算法基本一致,使用标注数据做整个网络权值的微调。这个问题的原理在上一篇文章介绍的材料里面有详细介绍。

对基本的人工神经网络的介绍,有很多书和学习资料,如《BP神经网络详解与实例》,是我觉得最详细和清楚的材料,建议先阅读这个入门材料。

另外,网上一片对神经网络的描述文章,挺好的,也很直接,地址:http://songshuhui.net/archives/45893

另一篇文章,讲解人工神经网络的入门级原理,讲的很好,通过11行的Python代码进行详细讲解,如下:http://python.jobbole.com/82758/ 

 

 

什么是Theano?这是以大牛Bengio主导的一个开源项目,基于Python,完整实现DeepLearning3种核心模型,你看过“RepresentationLearning: A Review and New Perspectives” 这篇文章,你就明白,这个开源项目绝对权威。而且这个开源项目,有很详细的文档说明,有很好的代码注释,这个项目的本意就是让你去学习Deep Learning技术的,所以,讲解的非常详细,具体内容,请参考文章《Deep Learning Tutoria》。而且这个开源项目,支持基于GPU训练Deep Learning模型,这也是非常重要的功能。不过,整个项目是基于函数式编程的,其编程思路,与面向对象的编程方法有很大差异。目前,在机器学习领域,函数式编程比较火,比如SparkScala就是函数式编程。总的来说,函数式编程不能修改函数内部的变量,一切以声明好的函数基础,只能控制函数的输入和输出,函数式编程主要的优势是并发性能很好,理论上不会死锁。而且,编写递归和迭代类的算法,非常简洁,所以机器学习的算法用函数式编程比普通面向对象的编程,代码量少一个数量级。但是,他是怎么work的,对我这样的传统开发人员有些难以理解,入门需要花些时间,不过,值得学习一下。

Theano的首页:http://deeplearning.net/software/theano/

学习Theano的基础编程方法,先从这里开始:http://deeplearning.net/software/theano/library/tensor/basic.html#libdoc-basic-tensor

Theano是个代码框架,里面还有很多自定义类型,这里面的一些基础编程方法要先熟悉和练习一下,不然,后面的模型代码没法修改和测试。

依据《DeepLearning Tutorial》的指导,下载DeepLearningTutorials-master.zip,里面有全部样例代码,可以下载MNIST数据集(手写数字0~9的图片识别数据集)进行测试。

安装:

https://github.com/Theano/Theano下载Theanozip.

本地安装: python setup.py install

 

一些编程要点:

MNIST数据集的下载地址:

origin ='http://www.iro.umontreal.ca/~lisa/deep/data/mnist/mnist.pkl.gz'

 

本地数据文件的路径要设置一下,建议设置绝对路径:

__file__ ="D:\\workspace\\DeepLearning\\Data\\"  # set local dataset path

 

下面这个引用,会默认使用tensor.max()函数,数据会被造型成tensor类型,在计算样本数据max最大值时会比较麻烦,建议注释掉:

from theano.tensor import*  

 

初始权值(参数)为随机数:

rng =numpy.random.RandomState(1234)

rng = np.random

w = theano.shared(rng.randn(feats),name="w") 

 

如果要指定初始权值,设为01,如下:

init_w = [0]*feats

w =theano.shared(value=np.asarray(init_w, dtype=theano.config.floatX), name='w',borrow=True)   # 这里需要把Python的矩阵(array)转成Theano的类型

 

如果要打印每个数据的具体概率(0~1之间),需要增加输出变量:

predict_Test, probability_Test = predict_probability(D_test[0])

print "probability ofprediction D on test data:", probability_Test  #每个数据预测值的概率

 

评价预测结果,可以用AUC(这种方式同时评价正例预测准确率和负例预测准确率,是一个全面的评价指标),(这里使用scikit的库来计算,添加引用from sklearn import metrics):

fpr, tpr, thresholds =metrics.roc_curve(D_test[1], probability_Test)  #计算AUC

AUC = metrics.auc(fpr, tpr)

 

神经网络MLP的输出,可以这样修改(注意outputs部分):

    train_model =theano.function(inputs=[index],

           outputs=[cost, classifier.hiddenLayer.W,classifier.hiddenLayer.b,classifier.logRegressionLayer.W,classifier.logRegressionLayer.b],

           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]})

 

神经网络的输出,使用的是SoftMax多分类模型,也可以用于2分类,与逻辑回归一致,n_out设置为2即可:

classifier = MLP(rng=rng, input=x,n_in=147,   #n_in是特征维数,第一层神经元数

                    n_hidden=10, n_out=2)   #n_hidden隐层神经元默认是500

 

先基于DeepLearningTutorials-master中的代码和MNIST数据测试一下logistic_sgd.pymlp.py。然后使用自己的数据,修改一下代码去详细测试分析一下,对Theano的代码框架就可以熟悉了,并且,这些代码以后可以复用。

 

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

最新回复(0)