【通俗易懂说模型】非线性回归和逻辑回归(附神经网络图详细解释)

发布于:2025-02-10 ⋅ 阅读:(27) ⋅ 点赞:(0)

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 

目录

1. 前言

2. 非线性回归

2.1 非线性回归与线性回归转化

2.2 几种常见的非线性回归函数

2.3 非线性回归代码知识点

2.3.1 激活函数

2.3.2 人工神经网络

3. 逻辑回归(sigmoid激活函数)

3.1 sigmoid函数

3.2 伯努利概型

3.3 为什么MSE损失函数失效了?

3.4 最大概似法与交叉熵

4. 总结


1. 前言

        进入这篇文章之前,想必大家已经阅读过前面的系列文章:【通俗易懂说模型】线性回归(附深度学习、机器学习发展史)-CSDN博客

        通过前面的文章, 猫猫希望友友们对机器学习、深度学习等基础概念,以及发展历史有一个宏观的理解。同时对线性回归有一个深入的认识。然后接下来,就让我们收拾收拾行囊,准备出发!下一站——非线性回归和逻辑回归~

2. 非线性回归

        非线性回归是线性回归的延伸,线性就是每个变量的指数都是 1,而非线性就是至少有一个变量的指数不是 1。生活中,很多现象之间的关系往往不是线性关系。选择合适的曲线类型不是一件轻而易举的工作,主要依靠专业知识和经验。常用的曲线类型有 幂函数,指数函数,抛物线函数,对数函数

2.1 非线性回归与线性回归转化

        通过变量代换,可以将很多的非线性回归转化为线性回归。比如目标函数假设是 y = b0 + b1x + b2x^2。那么另 z1 = x, z2 = x^2 。目标函数就变为 y = b0 + b1z1 + b2z2。就可以用线性回归来解方程了

2.2 几种常见的非线性回归函数

 非线性回归模型可以采用多种形式,例如:

2.3 非线性回归代码知识点

        之前我们学习并实战了线性回归,但是在实际中,大多数现象都不是线性的,而是非线性的。非线性就是说我们的拟合函数并非直线或者平面,而是更加复杂的曲线或曲面。在处理非线性回归问题时,人工神经网络模型可以发挥重大的作用。

2.3.1 激活函数

        通过前面的非线性函数的学习,我们很自然就能意识到一个问题:

仅仅靠Linear这一个线性函数去拟合是完全不够的

        这么美丽复杂的世界仅仅靠指数为1的线性函数去拟合怎么可以。因此,我们就想要给原本的线性模型加入非线性元素,这个元素就是激活函数。(当然,激活函数还有其他作用)

        在前一篇文章:【项目1】手把手带你实战机器学习中的线性回归-CSDN博客

        我们讨论线性回归模型,忽略了激活函数。即使我们用多层线性回归函数去叠加变为多层模型,如下图。如果没有引入激活函数。我们的模型就仍然是线性模型,依靠线性模型其拟合能力始终是有限的。

        因此,我们必须要引入激活函数,在原有模型中加入非线性部分,如下图:

        激活函数的出现是为了让神经网络可以拟合复杂的非线性函数。激活函数f实际上是一个非常简单的非线性函数,但只要多个带有激活函数的神经元组合在一起,就具有拟合复杂非线性函数的强大能力!我们常用的激活函数有sigmoid、tanh、ReLU和Maxout等。在这里我们一般使用ReLU函数作为激活函数:

每一个激活函数都非常简单——非线性成分不多,但是只要多个叠加则非线性程度将很强。

        其图像如下图所示,当自变量小于等于0时,函数值为0: 

 因此,整个人工神经元的数据计算过程如下:

$y=f(\vec{x}\cdot\vec{w})$

        f就是激活函数。如果全部用手写激活函数,虽然每一个ReLU都很简单,但是每次手写加上叠加多层仍然比较麻烦。幸运的是,PyTorch中已经预编写ReLU激活函数:torch.nn.functional.relu()。接下来,在非线性拟合的任务中,我们将会用到这个函数。

2.3.2 人工神经网络

        人工神经网络是由多层人工神经元组成的网络结构。它是一种通过模仿人脑神经网络行为进行分布式并行信息处理的算法。人工神经网络中节点之间有着复杂的连接关系,可以通过机器学习训练调整各节点之间连接的权重关系,从而模拟出复杂的非线性函数。

  • 区分神经元和神经网络:神经元组成神经网络。
  • 区分人工神经网络和神经网络:人工神经网络模拟人类大脑的神经网络。
  • 区分神经网络和深度神经网络:隐含层大于2的神经网络都可以称为深度神经网络。

        如下图所示,为了方便研究,我们将人工神经网络分成三层:

  • 作为输入的神经元节点,我们称之为输入层;
  • 中间经过的神经元,无论多少层,我们都将它们称为隐含层;
  • 最后的一层作为输出的神经元节点,我们称为输出层。

  • 回归:就是函数拟合数据
  • 神经网络框架实现回归:就是用神经网络搭建出复杂的函数,来实现回归
  • PyTorch神经网络:就是用PyTorch这个语言提供的框架实现神经网络模型
  • 线性/非线性回归:拟合函数是否含有非线性成分

3. 逻辑回归(sigmoid激活函数)

完整的思考一个模型包括如下部分:

  1. 模型函数(线性Linear层的组织):现在很固定都是深度神经网络
  2. 激活函数:ReLU函数、sigmoid函数等。
  3. 损失函数:均方误差损失函数、交叉熵损失函数等

        在前文中,我们介绍了线性回归和非线性回归,它们的输出都是连续的。逻辑回归和上述两种回归问题的区别在于其输出是二元离散的,即输出y只有两种结果。因此,逻辑回归也常常被当作二元分类问题,也就是将一堆数据样本分为两类。为方便数学表达和计算,我们把这两种分类结果分别记作0和1。

逻辑回归:

  • 回归本质就是函数拟合。
  • 逻辑表示这个函数的输出只能是0或1。
  • 逻辑回归用于二元分类问题。
  • 逻辑回归的核心在于Sigmoid激活函数
  • Sigmoid激活函数适用于逻辑回归的关键在于:限制在(0,1)且连续

3.1 sigmoid函数

        线性神经元的输出为\overrightarrow{x}*\overrightarrow{w},随后经过一个非线性的sigmoid函数(公式中常把它简写作sign),此函数的图像如下图所示。sigmoid函数的定义域为(-\infty,+\infty),值域为(0,1),表达式为:

\operatorname{sigm}(x)=\frac{1}{1+\mathrm{e}^{-x}}

        这样一来,输入x经过神经网络,最后通过sigm(\overrightarrow{x}·\overrightarrow{w})映射为集合(0,1)中的一个实数,即我们可以将最终的输出当作y=1的概率:

P(y=1,\overrightarrow{w},\overrightarrow{x})

        在线性的二元分类问题中,我们的目标是找到一条直线将数据样本分成两类。如图3-21所示,上述问题可以简化成求P(y=1,\overrightarrow{w},\overrightarrow{x})=\frac{1}{2}时的权重w。

3.2 伯努利概型

        伯努利概型最典型的例子就是抛硬币。我们假设硬币的正面为1,反面为0。一般情况下,抛一次硬币得到正面或者反面的概率各占一半,即0.5。假设我们的硬币形状不太规则,抛一次得到正面或反面的概率并非各占一半,假设正面的概率是a,则反面的概率是1-a。这样,我们得到了伯努利概型的通用公式:

即:

3.3 为什么MSE损失函数失效了?

线性回归和非线性回归损失函数选择的是MSE,那为什么这里的逻辑回归要选择交叉熵呢?

        观察上面两张图片,前者是分类后者是回归。两者的区别是什么?只有我们明白两者的区别才能明白为什么分类中选择交叉熵作为损失函数,而回归中选择MSE作为损失函数。

        一句话:回归训练目标是函数拟合数据,分类训练目标是尽可能减少KL散度。前者追求数据上无限接近标签数,后者追求概率分布上整体接近,两者的目标是不同的。

        举个例子🌰:对于一个样本集y1...y100,假如其中有5各类别定义为0、1、2、3、4。一个数据x1,其标签值是4,那么回归可能会过分追求数据的输出无限接近4,但是分类仅仅要求模型输出4的概率最高,不要求标签值无限接近4。前者无限接近4缺陷是什么呢?就是会导致其他类别的分类不准确,有可能这个无限接近4是以其他类别的标签不准确为代价的。而且这个精准到4本质上是没有用的,我们只要4的概率最高就行,不需要这个概率达到100%。因为追求的是整体综合分类的准确度(正确分类总数高),而不是个体分类概率值的高。

        当然,还有另外一个角度去理解这个问题,具体见下面这篇文章:交叉熵损失(Cross-entropy)和平方损失(MSE)究竟有何区别? - 知乎

        简单来说,上面文章就是证明了加入Sigmoid激活函数后,MSE损失函数的梯度下降法不一定能找到loss的最小值,可能向相反的反向走。如下图:  

       在ReLu作为激活函数中,由于其梯度稳定是0反向最小,因此loss的更新始终向0的方向。如下图:    

3.4 最大概似法与交叉熵

        前面的学习,我们证明了引入Sigmoid后,MSE在梯度下降法中不一定能求解到最佳参数w。相反,可能因为sigmoid的激活,梯度下降朝着极大值方向移动。梯度下降法本质是找凸函数,而非极小值。由于这个特性,我们必须要修改Loss函数,于是交叉熵损失函数横空出世。

        最大概似法(MaximumLikelihood)是统计学中的一个方法,该方法的核心原理很简单。假如抛一枚形状不太规则的硬币,得到正面的概率是0,反面的概率是1一0,即我们上一节说的伯努利概型,分布如下图所示。

        我们将每次抛硬币都看作独立的事件,相互不受影响,则每次抛硬币大自然都会给出概率尽可能高的结果,那么将每次抛出的样本结果出现的概率累计起来,应该会趋向最大,这就是最大概似法的核心原理。假设我们抛硬币100次,得到包含有100个样本的样本集{y,y²,,y100},定义似然度Likelihood,即每个样本结果概率的乘积:

P(\vec{y})=P(y^{1})P(y^{2})\cdots P(y^{100})=\prod_{i=1}^{100}P(y^{i})

最大概似法:大规模试验后的概率分布,就是实际概率分布(大数定律)。

根据伯努利的概率公式得:

P(\vec{y})=\prod_{i=1}^{100}\theta^{y^i}(1-\theta)^{1-y^i}

接着按照世界的运作规律,似然度必然会趋向最大。因此,0需要进行调整以达到最大的似然度:

\theta=\max_{\theta}P(\vec{y})=\max_{\theta}\prod_{i=1}^{100}\theta^{y^i}(1-\theta)^{1-y^i}

由上一节,我们知道:

P(y^{i})=\mathrm{sigm}(\vec{x}^{i}\cdot\vec{w})=\frac{1}{1+\mathrm{e}^{-\vec{x}^{i}\cdot\vec{w}}}=\theta

那么似然度可以写成:

P(\vec{y}|X,\vec{w})=\prod_{i=1}^{100}\mathrm{sigm}(\vec{x}^{i}\cdot\vec{w})^{y^{i}}(1-\mathrm{sigm}(\vec{x}^{i}\cdot\vec{w}))^{1-y^{i}}

        我们的目的是得到一种新的损失函数,帮助我们训练神经网络。因为我们优化的过程实际上就是最小化损失函数的过程。因此,我们需要将上面的似然度公式进行改造。添加一个负号,让最大预设化似然度的过程变成最小化。为了更容易计算,我们在似然度的等式两边同时取对数,将乘法变成了加法

-\log P(\vec{y}|X,\vec{w})=-\sum_{i=1}^{100}[\gamma^{i}\mathrm{log}\mathrm{sigm}(\vec{x}^{i}\cdot\vec{w})+(1-y^{i})\mathrm{log}(1-\mathrm{sigm}(\vec{x}^{i}\cdot\vec{w}))]

        令L(\overrightarrow{w})=-\log P(\vec{y}|X,\overrightarrow{w}),则L(w)就是我们的损失函数。实际上,我们让似然度P(\vec{y}|X,\vec{w})最大就是让损失函数L(W)最小。这样一来,通过梯度下降法,我们就能训练出合适的W。像这样利用最大概似法得到的损失函数,我们称为交叉熵。交叉熵损失函数是分类问题中常用的损失函数。幸运的是,我们不需要自己去编写复杂的交叉损失函数,因为PyTorch已经为我们预置了交叉熵损失函数nn.CrossEntropyLoss()

4. 总结

如果想要学习更多深度学习知识,大家可以点个关注并订阅,持续学习、天天进步

你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦友友点个赞,收个藏呀~~~


网站公告

今日签到

点亮在社区的每一天
去签到