从线性回归到逻辑回归再到人工神经网络 2019-04-24 12:01 No Comment >深度学习现在很火热,但是关于深度神经网络应该怎么理解,现在没有什么权威的说法。这里是我自己从线性回归到深度学习的一些思考,供探讨。 ![deeplearning.jpg](http://lijinglin.cn/usr/uploads/2020/02/1996465450.jpg) # 目录 [TOC] # 1 回归问题 回归问题就是在给定多个自变量,一个因变量以及代表它们之间关系的一些训练样本的情况下,确定它们的关系。 从数学角度讲,就是求这个因变量关于这多个自变量的函数。而这个函数能够比较精确的表示这个因变量和这多个自变量之间的关系。 ## 1.1 线性回归 线性回归是对样本集做线性函数“拟合”,即求解输出值(因变量)与输入参数(自变量)的关系(假设因变量是自变量的线性函数)。 一元线性回归是一条直线,二元线性回归是一个曲面,多元线性回归是一个超平面。 线性回归的训练使用预测值和真值之间的平方损失计算,通常的评价指标包括回归评价指标包括均方误差(MSE:Mean Squared Error)、均方根误差(RMSE:Root Mean Squard Error)、平均绝对误差(MAE)、R-Squared(R方)。 **通过计算预测值和真值之间的误差,根据误差最小原则,寻找最优的参数,拟合自变量与因变量之间的线性函数。** 关于误差可以参考[【回归分析的五个基本假设】](https://blog.csdn.net/Noob_daniel/article/details/76087829) 关于其他的回归方法可以参考[【七种回归方法】](https://blog.csdn.net/FnqTyr45/article/details/80416243) 关于回归的评价指标可以参考[【回归评价指标】](https://blog.csdn.net/skullFang/article/details/79107127),[【机器学习必备的五种损失函数】](http://wemedia.ifeng.com/64591767/wemedia.shtml) 一般情况下,线性回归可用于根据自变量预测因变量,比如,在时间序列中,根据拟合出的线性函数,由已经发生的序列预测还未发生的序列。 **线性回归的求解方法:** * 求解系数:最小二乘法和梯度下降法。 * 变量选择:逐步回归、最优子集法、正则化方法(包括岭回归、lasso回归)、降维(主成分回归、偏最小二乘回归)。 ## 1.2 逻辑回归 逻辑回归可以看做是在线性回归的模型假设上,再作用一个sigmoid函数([算法推导](https://blog.csdn.net/Stephen_DC/article/details/79626034)) 与传统线性回归的差别在于,**传统线性回归是想获得一个样本集的拟合线/面,逻辑回归中的线性回归是想获得一个样本集的二分类线/面。** ([【逻辑回归的理解】](https://blog.csdn.net/t46414704152abc/article/details/79574003)), ![685d04ba5234e2ebea07623eb6c08fc2.png][1] ![827bf1970b6d097af1803b66b52e28f1.png][2] * 在逻辑回归中,第一步线性回归拟合的是输入参数(自变量)与输出分类的关系,即拟合的是线性可分的这条线/面。 * 拟合出线性可分的线/面之后遇到的另一个问题是,原始的线性回归中,y的取值是(−∞,+∞),用于预测取值没问题,但是如果用于预测分类就不合适了,0 ~ +∞ 可以表达是正分类,但不能表达属于正分类的概率。一个直观的想法是,能不能加一个映射函数,将y的取值压缩到 0,1 之间,越大代表属于正分类的概率越高。线性函数做不到这一点,必须使用非线性函数。例如,Logistic函数,这个函数具有很好的可微分性,y → −∞ 的时候,实际取值为0,y → +∞ 的时候,实际取值为1。这时,逻辑回归的输入值 x 是自变量,y是根据拟合的分类线/面计算的预测值,z 是 y 经过Logistic函数后的输出,是 y 落在不同分类区间的概率。([【究竟什么是逻辑回归】](https://www.cnblogs.com/JZ-Ser/articles/8474723.html)) ![b4cd0e4e56674e3faf59d5449a9b323d.png][3] ![392dc8761b4a475151ed704135644f9e.png][4] ![ad2904620ef6b8b77367931762f97bec.png][5] * 直观的理解线性回归和逻辑回归,逻辑回归实际就是线性回归基础上,加了条件概率 ![e23f60a2a9da21aab8cf6158c0d10217.png][6] 因此,逻辑回归的目的是使用线性回归的方法对目标数据属于正例还是负例的对数几率进行预测。即使用一个线性函数和一个Logistic函数(对数几率,Sigmoid)串接,来拟合**目标数据归属类别的对数几率取值**,并基于对数几率的二分性(对数几率越高,正例可能性越高),实现目标数据的二分类。 想看公式的话,看这个帖子:[【从逻辑回归到深度学习】](https://www.cnblogs.com/sunruina2/p/8284248.html) ***思考:*** * “拟合目标数据的对数几率”意味着逻辑回归可以拟合一个概率(因变量)与输入参数(自变量)的函数关系,即自变量输入后预测值(线性回归)与期望真值(分类点/面)的误差的分布(预测值接近分类点/面,输出对数几率接近0.5;预测值与分类点正偏差越大,输出的对数几率越接近1) * 逻辑回归可以用这样一个对数几率,去计算了线性回归的结果是不是接近分类点/面,并用 0-1 的概率值,屏蔽了 −∞~+∞ 的绝对值 * 逻辑回归并不是将线性回归变成了非线性,也不是在线性回归基础上增加了非线性因素,而仅仅是将线性回归的结果进行了变换,使之更容易使用(如 Sigmoid对应二分类) ## 1.3 线性回归+逻辑回归实现函数拟合 线性回归的函数拟合能力是有限的,只能解决线性可分问题,如果是非线性问题怎么办? 思路: * 两个线性函数的线性组合,是不是可以变成非线性函数? * 如果使用多个线性分类器组合,是不是就可以拟合非线性分类器了? * 线性回归,再串接线性回归,就相当于拟合了一个非线性函数 参考: * 逻辑回归可以完成二分类,通过一个逻辑回归组合多个输入完成“与”“或”操作 * 单层线性回归——决策区域是超平面分割的两个; * 两层线性回归——决策区域是开凸区域或闭凸区域; * 三层线性回归——任意形状; ![4c87914eab45f96301b0a817bcd47cf0.png][7] ![df53771305d36083569250f192dee9e8.png][8] ——[【人工神经网络及BP算法】](https://blog.csdn.net/leiting_imecas/article/details/60463897) 但是其中有个观点有问题: * 并不是逻辑回归完成了“与”/“或”操作,而是两个串接的线性回归完成了非线性函数拟合,这个非线性函数是个“凸”函数,其结果经过Sigmoid函数后形成了不同的分类结果,体现出来是“与”、“或”。 用线性代数来解释: * 线性回归的假设 y=wx+b ,x是输入,w是权值,b是偏置。这个从代数上讲是仿射变换。即一个变形+坐标变换 [【何为仿射变换】](https://www.cnblogs.com/bnuvincent/p/6691189.html)。 ![f2de05174bcc4b6122837b0e9df026bc.png][9] ![1aeaa9b65106d29ac2722c7a81bdd685.png][10] * 单层线性回归是做了一次线性变换,即拟合线性可分的线或面 * 双层线性回归,第一层是做了一次线性变换,将线性不可分的数据从原始空间映射到另一个空间上,使之在新的空间中线性可分;这样第二层就可以拟合线性可分的线/面。[参见这两个图,【神经网络浅讲:从神经元到深度学习】](https://www.cnblogs.com/subconscious/p/5058741.html): ![a87ee471454282d8e8f3840db8e6b952.png][11] ![b308b143d52f9c3d390c03178519d011.png][12] 需要理解: * 逻辑回归实现逻辑与、或操作,实际就是调整 x1、x2 的权重,使得逻辑回归的最终输出,部分受 x1 分类线/面的影响,另一部分受 x2 分类线/面的影响。这样,如果x1是线性回归1的输出,x2是线性回归2的输出,则实际相当于实现了 x1 线/面,与 x2 线/面的交叉,即实现了一个非线性的分类线/面。 * 有足够多的线性回归,通过多个线性回归组合,理论上能够组合出各种非线性的分类线/面,最后再经过Sigmoid等对数几率函数处理,就能形成多种不同的分类器。 * 理论上,双隐层+一层输出(相当于三层线性回归),能拟合任意形状。 * 传统机器学习中,对线性回归的线性拟合能力有各种各样的疑问,因此提出各种非线性的方法,去做更好的拟合,比如非线性的核回归(SVM非线性核),数学概念很清晰,但效果并不一定很好,本质原因是“组合还不够多,变换还不够复杂”。根本上还是人没有办法去清晰的理解应该如何组合,应该如何调整参数进行映射。 # 2 人工神经网络 为什么要使用人工神经网络?设想一下: * 线性回归要求具有明确的模型假设(自变量是什么,自变量之间是什么关系),如果假设错误,则线性回归可能根本训练不出来。因此线性回归需要花费大量的工作去求解系数,去选择变量。 * 如果线性回归训练不出来,逻辑回归的分类概率也自然是错误的,用逻辑回归的对数几率去看,其分布应该不收敛。 * 如果线性可分,则用线性回归或SVM等,是可以拟合出来的。但如果线性不可分怎么办?想当然的思路是:用多个线性回归,用拟合出来的多个超平面交叉,是不是就可以拟合出来很复杂的形状了?是不是想到了Gradient boosting? ——GB模型:Gradient boosting的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型Fm+1(x)基于前面学习模型的Fm(x)的效果生成。 ——GB模型的本质是不是做了多个线性回归模型的人为的组合? * 我不想自己找线性规划模型了,可不可以自动训练出一个,进一步自动化怎么办?用多个线性规划的输出,再次进行线性规划,去训练多个超平面的组合,是不是就可以了? ## 2.1 人工神经网络结构 人工神经元节点: ![0b0a8109d3e7eb3d58939777a2e028bf.png][13] * 如果将其形式化,这个人工神经元节点实际就是“逻辑回归” * x0 是偏置,理论上应该是负值,也就是全部神经元输入的线性加权和之后,再加一个阈值,不超过阈值的不输出结果 * f 是激活函数,如果这个激活函数是 Logistic函数的话,就是逻辑回归,如果是逻辑回归,则这个神经元节点就是用来做二分类判断 * 从逻辑回归的理解我们可以看到,神经元节点的输出,并不一定需要“激活函数”做“非线性”变换。因此,神经元节点有大量的部分线性的激活函数 [【人工神经元模型及常见激活函数】](https://blog.csdn.net/dcrmg/article/details/73743742) 人工神经网络结构:**输入层 → 隐层 → 输出层** ![9c7731765bc314ae7e396850e06562d3.png][14] 输入层:多个输入(x1、x2、...... xn),x0=偏置 隐 层:多个神经元节点,全连接到所有输入 输出层:一个神经元节点,全连接到所有隐层节点 * **输入层→隐层**: 第一层线性规划 一个输入参数,一个隐层节点,训练的是一条直线; 一个输入参数,多个隐层节点,训练的是多条不同输出目标的直线; 多个输入参数,一个隐层节点,训练的是一个平面/超平面; 多个输入参数,多个隐层节点,训练的是多个不同输出目标的平面/超平面; * **隐层→输出层**:第二层线性规划 多个隐层节点(输入参数),一个输出层节点,训练的是多个直线/平面/超平面的一种线性组合(平面/超平面); 多个隐层节点(输入参数),多个输出层节点,训练的是多个直线/平面/超平面的多种线性组合(平面/超平面); 因此: * **理论上单隐层神经网络可以逼近任何连续函数(只要隐层的神经元个数足够,就可以用足够多个超平面的线性组合去表达连续函数)** * 虽然从数学上看多隐层和单隐层表达能力一致,但多隐层的神经网络比单隐层神经网络工程效果好很多。是不是可以这样认为:非常多个超平面的一种线性组合,比不过多个超平面多种线性组合的结果再多次线性组合。也就是函数拟合能力,多层的拟合应该是比单层的拟合要更好。 ## 2.2 为什么一个隐层就可以拟合任意函数 理论上,在非线性函数的某一个点上可以用泰勒公式展开成线性函数。 将一个非线性函数 y=f(x) 在指定点 (x0, y0) 展开成泰勒级数: $$y=y(x_0)+\dot y(x_0)(x-x_0)+\ddot y(x_0)(x-x_0)^2+\ldots$$ 忽略二次以上高阶项得到线性方程: $$y\approx y(x_0)+\dot y(x_0)(x-x_0)$$ $$y-y_0 = K(x-x_0)$$ $$y_0=y(x_0), K=\dot y(x_0)$$ 非线性函数的每一个小段,都可以用一个近似的线性函数拟合,因此一个非线性函数,可以用多个线性函数的组合拟合。 由于隐层中的每一个神经元可以认为是一个线性回归,即每一个神经元节点都逼近了一个非线性函数的片段;输出层的线性回归则可以认为是通过对多个隐层输出的线性函数的组合,通过不同的权重和偏执的调整,使得仅保留线性函数中能够拟合非线性函数的片段,从而用多个线性函数拟合出了一个非线性函数。 **直观理解就是:一条曲线在多个采样点画曲线的切线,多个采样点的切线相交,拟合出了最终的曲线。** ## 2.3 所谓激活函数是什么? 从逻辑回归的角度理解: * **激活函数实际就是将隐层或输出层中的线性回归改成“逻辑回归”** 逻辑回归是在线性回归后面串接一个sigmoid函数,将线性回归的输出归一化到一个 -1~1 的区间内,从而方便计算,也就是所谓的对数几率。也就是用分布的概率代替了线性回归的实际数据真值。从这个本质上看,这个所谓的“激活函数”实际是不是sigmoid是无所谓的,只要能更好的实现“归一化”或“概率化”就可以。 * **人工神经网络中的隐层不一定非得需要激活函数,** 实现“归一化”的最大价值,实际上是让第一层不同神经元节点的线性回归的输出有相同的取值范围。这样,才能在第二层的线性回归中进行加权计算,否则,没有相同的取值范围,虽然线性函数的意义还在,但是各个输入的权值调整就有点困难啦。 * **线性变换结果经过非线性的激活函数确实使得多层神经网络能够更好的拟合非线性函数** 从多层线性规划的数学解释大致可以理解,也许多次线性变换的变形、投影的结果与一次非线性变换的结果一致,但是应该使用什么非线性变换,却是无解的。因此,激活函数到底是用什么形式的,基本是没有数学的支撑。 因此,原来的一些说法,激活函数是在线性变换过程中引入非线性因素就不是最根本的意义了。这也从另一个侧面说明,为什么部分线性的 relu 反而比非线性的 sigmoid 更好用。因为理论上单隐层神经网络已经能够拟合任何函数了,多隐层也只是从多超平面的组合角度进一步拟合函数。因此,**激活函数在这里最重要的应该不是“非线性”化,而是权值调整是不是好调。** ## 2.4 多层感知机为什么用sigmoid 多层感知机(Multi-Layer Perception)的结构:**输入层 → 多个隐层(带sigmoid) → 输出层(带sigmoid)** 为什么多层感知机的每一层都希望用sigmoid输出? * 原来的多层感知机的主要目的是“分类”,这就意味着其希望每一层的输出中,“正”与“负”能够具有更大的区分度。由于sigmoid是一个S函数,这意味着即便是输出值均匀分布在取值区间内,经过sigmoid之后,其分布也会被尽可能向 1 和 -1 聚集,二分类的话区分度更好。 * 而所谓MLP 容易受到局部极小值与梯度弥散的困扰,本质上也是因为sigmoid函数对输出的“压缩”,导致训练越好,输出离 1 或 -1 越近,其差(梯度)越小,就难以训练了。 * 而改用ReLu这类的“激活函数”,输出的结果就不会被人为“压缩”,而是变成越接近负样本的全部取 0,越接近正样本的可以维持原有的线性输出。这样“梯度”就不消失了。 ## 2.5 进一步思考 * 全连接神经网络也好,卷积神经网络也好,实际并没有改变从 ”线性规划 → 逻辑规划 → 人工神经网络“ 的这种”**函数拟合**“的目的和目标。 * 从函数拟合角度理解,线性规划串接逻辑规划,两层就能拟合几乎全部连续函数的本质没变,也就是有足够神经元数量的单隐层人工神经网络能够拟合几乎全部连续函数的本质没变。 * 同样,隐层中是不是携带”激活函数“并不是数学问题,而应该是工程问题,线性规划串接逻辑规划的时候,也没有串接”激活函数“,而且逻辑规划最后的 sigmoid 函数的目的并不是为了”激活“,而是为了”二分类“。 * 神经元节点为什么要更类似线性规划/逻辑规划?而不用非线性规划?本质就是非线性规划实在没法调整,太依赖经验和预先的设计,没有很好的反馈机制。既然能够使用多层线性规划结果去拟合函数,就笨一点,但让机器可以做呗。 * 深度人工神经网络能够比简单的逻辑回归、Boost等方法更好的原因在于,其采用多层叠加进行函数拟合,拟合的更准确。 * 数据量少、分类相对简单的条件下,传统机器学习模型反而比深度学习模型好,原因就是简单的分类已经很好了,多层神经网络去拟合也许会因为调参不好导致过拟合等,效果反而就差了。 * 卷积神经网络中,每一个卷积核本质上是一个隐层,卷积核中的每一个节点是一个”神经元“,卷积核的计算结果是对隐层中的各个神经元节点输出进行的线性组合。之所以说是线性组合而不说是神经网络的”输出层“,是因为卷积核在计算结果的时候,用的不是线性规划,而是简单的确定的线性组合。即便是在卷积层后面增加一层激活,也只不过是对神经元节点的线性组合的输出进行了一次非线性计算。即将卷积层从线性规划改成了“逻辑规划”。 * 卷积神经网络的多个卷积核就是多个隐层,每个隐层用于提取输入的一种超平面组合关系。从这个角度看,卷积神经网络只是人工神经网络的工程解决方案。 # 3 简单总结 * 线性回归是对数据的主体特征进行函数拟合,多输入参数的线性回归(多元回归)拟合的是个超平面。 * 逻辑回归是线性回归串接对数几率函数,其中的线性回归是对数据的分类边界进行函数拟合,拟合后的超平面将训练数据进行了二分类,逻辑回归最后串接的对数几率函数是计算预测数据落在拟合的分类边界超平面左右不同分类区域的概率,距离超平面越远,准确分类的概率越大;距离超平面越近,准确分类的概率越小。 * 人工神经元节点是多元线性回归串接激活函数,多元线性回归中至少有一个输入是神经元的抑制阈值(人工神经元节点至少有两个输入,一个抑制输入加多个激励输入)。人工神经元节点的本质也是函数拟合,如果人工神经元节点的目的是分类,则激活函数使用Sigmoid类函数,人工神经元节点本质就是一个逻辑回归;如果人工神经元节点的目的不是分类,而是预测,则后继串接的激活函数就不一定是Sigmoid类函数了。 * 人工神经网络使用输入+隐层+输出层,因为隐层的线性回归+输出层的线性回归,拟合了更复杂的函数。理论上,单隐层的人工神经网络已经可以拟合很复杂的函数了。这里需要注意的是,复杂函数的拟合并不一定需要激活函数,多线性回归的组合已经可以完成了。 * 在深度学习中,每一个人工神经网络的隐层,或者认为是一个线性函数的拟合(非线性特征曲线的切线/切面),或者认为是一个线性关系变换(某一分类的线性变换),下一个隐层则完成非线性函数的拟合(多切线/切面的组合),或者完成线性变换后的坐标的分界(不同分类间的线性分割拟合)。这就意味着,深度学习中,每一个层次的激活函数的作用并不一定是“非线性化”。在分类问题中,一个线性回归对输入参数进行了坐标变换,如果串接一个非线性的激活函数,则可以认为是对坐标变换后的结果进一步进行了坐标系变换(如从时域变成了频域)。这样也许能更好的支持后继线性回归的线性分类线/面的计算。 [1]: http://lijinglin.cn/usr/uploads/2019/04/1372094628.png [2]: http://lijinglin.cn/usr/uploads/2019/04/607993724.png [3]: http://lijinglin.cn/usr/uploads/2019/04/3768629583.png [4]: http://lijinglin.cn/usr/uploads/2019/04/2050029802.png [5]: http://lijinglin.cn/usr/uploads/2019/04/3616133318.png [6]: http://lijinglin.cn/usr/uploads/2019/04/2090205265.png [7]: http://lijinglin.cn/usr/uploads/2019/04/3223796638.png [8]: http://lijinglin.cn/usr/uploads/2019/04/3448524029.png [9]: http://lijinglin.cn/usr/uploads/2019/04/1632043805.png [10]: http://lijinglin.cn/usr/uploads/2019/04/1644058312.png [11]: http://lijinglin.cn/usr/uploads/2019/04/444155013.png [12]: http://lijinglin.cn/usr/uploads/2019/04/3206327366.png [13]: http://lijinglin.cn/usr/uploads/2019/04/351488439.png [14]: http://lijinglin.cn/usr/uploads/2019/04/2052296170.png