开心实习之 深度学习之多层感知机
(一)感知机的起源与基本原理
感知机是由美国学者 Frank Rosenblatt 在 1957 年提出的,它是一种最简单的人工神经网络模型,就像一个简单的 “信息处理器”。
它的工作原理很直观:接收输入信号,通过权重和偏差对信号进行处理后,输出结果。具体来说,给定输入x(可以是多个,比如x1、x2)、权重w(对应每个输入,如w1、w2)和偏差b,感知机的输出规则如下:
当b+w1x1+w2x2≤0时,输出0;当b+w1x1+w2x2>0时,输出1。
这里的权重w和偏差b是感知机的关键参数,它们各自有着重要作用:
- 权重w:控制输入信号的重要性。比如,在判断 “是否去郊游” 这个问题中,如果 “天气好坏” 这个输入的权重很大,就说明感知机更看重天气这个因素。
- 偏差b:调整神经元被激活的容易程度。如果偏差值较大,那么即使输入信号的总和不是特别大,感知机也容易输出1(被激活);反之,偏差值小,感知机就不容易被激活。
(二)感知机的任务类型:二分类
感知机主要用于二分类任务,也就是输出结果只有0或1两种情况。它和另外两种常见的任务类型有明显区别:
- 与回归任务相比:回归任务的输出是实数(比如预测房价,可能是 50 万、80 万等任意实数),而感知机只能输出0或1。
- 与 Softmax 分类相比:Softmax 分类能输出多个类别的概率(比如判断一张图片是猫、狗、鸟的概率分别是 0.6、0.3、0.1),感知机则只能进行二分类。
(三)感知机的实际应用:简单逻辑电路
感知机可以很好地实现与门、与非门、或门这些简单的逻辑电路,通过设置合适的权重w和偏差b就能满足逻辑关系。
1. 与门
与门的逻辑规则是:只有当两个输入x1和x2都为1时,输出y才为1,否则输出0,其真值表如下:
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
要实现与门,我们可以设置多个符合条件的(w1,w2,b)组合,比如(0.5,0.5,-0.7)、(0.5,0.5,-0.8)、(1.0,1.0,-1.0)。以(1.0,1.0,-1.0)为例,我们来验证一下:
- 当x1=0,x2=0时,b+w1x1+w2x2=−1.0+0+0=−1.0≤0,输出0,符合与门规则。
- 当x1=1,x2=0时,b+w1x1+w2x2=−1.0+1.0+0=0≤0,输出0,符合规则。
- 当x1=0,x2=1时,计算结果也是0,输出0,符合规则。
- 当x1=1,x2=1时,b+w1x1+w2x2=−1.0+1.0+1.0=1.0>0,输出1,符合规则。
2. 与非门
与非门和与门的逻辑相反,只要两个输入不同时为1,输出就为1;当两个输入都为1时,输出为0,真值表如下:
x1 | x2 | y |
---|---|---|
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
实现与非门的一个(w1,w2,b)组合是(-0.5,-0.5,0.7)。同样验证一下:
- 当x1=0,x2=0时,b+w1x1+w2x2=0.7+0+0=0.7>0,输出1,符合与非门规则。
- 当x1=1,x2=0时,b+w1x1+w2x2=0.7−0.5+0=0.2>0,输出1,符合规则。
- 当x1=0,x2=1时,计算结果也是0.2,输出1,符合规则。
- 当x1=1,x2=1时,b+w1x1+w2x2=0.7−0.5−0.5=−0.3≤0,输出0,符合规则。
3. 或门
或门的逻辑规则是:只要两个输入中有一个为1,输出就为1;只有当两个输入都为0时,输出才为0,真值表如下:
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
实现或门的一个(w1,w2,b)组合是(0.5,0.5,-0.3)。验证如下:
- 当x1=0,x2=0时,b+w1x1+w2x2=−0.3+0+0=−0.3≤0,输出0,符合或门规则。
- 当x1=1,x2=0时,b+w1x1+w2x2=−0.3+0.5+0=0.2>0,输出1,符合规则。
- 当x1=0,x2=1时,计算结果也是0.2,输出1,符合规则。
- 当x1=1,x2=1时,b+w1x1+w2x2=−0.3+0.5+0.5=0.7>0,输出1,符合规则。
(四)感知机的 “短板”:无法解决异或问题
异或门的逻辑规则是:当两个输入不同时,输出为1;当两个输入相同时,输出为0,真值表如下:
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
无论我们怎么调整感知机的权重w和偏差b,都无法实现异或门的功能。这就暴露了感知机的局限性 ——只能表示由一条直线分割的空间,而异或问题需要用非线性的曲线来划分空间,感知机无法处理这种 “线性不可分” 的情况。
二、多层感知机:突破感知机局限的 “进阶模型”
为了解决感知机无法处理线性不可分问题的局限,多层感知机应运而生。它就像在感知机的基础上增加了 “中间处理环节”,让模型拥有了处理更复杂问题的能力,是最简单的深度神经网络。
(一)多层感知机的结构:多了 “隐藏层”
多层感知机在输入层和输出层之间增加了一个或多个 “隐藏层”。我们可以把它想象成一个工厂的生产流程:输入层是 “原材料入口”,隐藏层是 “中间加工车间”,输出层是 “成品出口”。
以单隐藏层的多层感知机为例,它的结构包括:
- 输入层:接收外部数据,比如处理图片时,输入层接收图片的像素数据;处理文本时,接收文本的编码数据。
- 隐藏层:对输入层传来的数据进行复杂的加工处理,隐藏层中的每个神经元都像一个小的感知机,会对输入数据进行计算和转换。隐藏层的大小(神经元个数)是超参数,需要我们根据具体问题来调整。
- 输出层:将隐藏层处理后的结果输出,根据任务类型输出不同形式的结果。比如二分类任务输出0或1,多分类任务输出各个类别的概率。
如果是多个隐藏层的多层感知机,就相当于有多个 “中间加工车间”,数据会在多个车间里经过多轮加工,能处理更复杂的问题。
(二)多层感知机的 “核心引擎”:激活函数
激活函数在多层感知机中起着至关重要的作用,它就像 “催化剂”,能将输入信号的总和转换为输出信号,决定如何激活输入信号的总和。如果没有激活函数,多层感知机就会退化成感知机,无法处理非线性问题。
激活函数需要具备一些关键性质,才能让多层感知机更好地工作:
- 是连续并可导(允许少数点上不可导)的非线性函数,这样才能让模型处理非线性问题,并且方便后续的参数更新。
- 激活函数及其导函数要尽可能简单,这样能提高网络的计算效率,避免模型运行过慢。
- 激活函数的导函数的值域要在合适区间内,不能太大也不能太小,否则会影响模型训练的效率和稳定性。
常见的激活函数有以下几种:
1. 阶跃函数
阶跃函数是最简单的激活函数,它的规则很直接:以0为界,输入超过0,就输出1;否则输出0,可以表示为h(x)={0,1,(x≤0)(x>0)。其实感知机使用的就是阶跃函数作为激活函数,但它只能处理线性问题,在多层感知机中很少单独使用。
2. tanh 激活函数(双曲正切)
tanh 激活函数能将输入映射到(−1,1)这个区间内。它的曲线呈 “S” 形,当输入为正数时,输出接近1;当输入为负数时,输出接近−1;当输入为0时,输出为0。相比于阶跃函数,它的非线性更强,在一些场景中能让模型更好地学习数据规律。
3. ReLU 函数(线性修正函数)
ReLU 函数的规则很简单:当输入大于0时,输出等于输入;当输入小于等于0时,输出为0。它的计算速度非常快,而且能有效缓解 “梯度消失” 问题(在模型训练中,梯度越来越小,导致模型难以更新参数的问题),是目前多层感知机中最常用的激活函数之一。
(三)多层感知机的任务拓展:多分类
多层感知机不仅能处理二分类任务,还能通过 Softmax 函数处理多分类任务。Softmax 函数会将输出层的每个神经元的输出值转换为概率值,这些概率值的总和为1,我们可以根据概率值的大小来判断样本属于哪个类别。比如在识别手写数字的任务中,输出层有10个神经元(对应0−9这10个数字),Softmax 函数会输出每个数字的概率,概率最大的那个数字就是模型预测的结果。
三、模型训练:让多层感知机 “学会” 知识
(一)学习的本质:调整参数
多层感知机的学习过程,其实就是在外界输入样本的刺激下,不断改变网络的连接权值(还有偏差),甚至调整网络拓扑结构,让网络的输出不断接近期望的输出。简单来说,就是通过一次次的 “练习”(输入样本),调整模型的 “解题思路”(参数),直到模型能准确 “答题”(输出正确结果)。
(二)参数更新的关键步骤:前向传播与反向传播
1. 前向传播(正向传播)
前向传播就像 “顺着流程计算结果”:输入样本从输入层进入,经过隐藏层的一步步加工处理,最终到达输出层,得到模型的预测输出。在这个过程中,每个神经元都会根据输入数据、权重和激活函数计算出输出,将数据 “向前传递”。
2. 反向传播(误差反传)
反向传播则是 “根据结果找问题、改参数”:首先计算输出层的预测结果与实际期望结果之间的误差,然后将这个误差从输出层反向传递到各个隐藏层,根据误差的大小来调整每一层的权重和偏差。这样一来,模型就能知道哪些参数需要调整、调整多少,从而让下一次的预测结果更准确。反向传播是计算神经网络参数梯度的主要方法,为参数更新提供了依据。
(三)评估模型性能:关注两种误差
要判断一个多层感知机模型好不好,我们需要关注两种误差:
1. 训练误差
训练误差是模型在训练数据集上的误差,就像学生在平时的练习题(训练数据)上的错题率。如果训练误差很大,说明模型在 “练习题” 上都做得不好,还没有掌握基本的知识。
2. 泛化误差
泛化误差是模型在新数据集(之前没见过的数据)上的误差,相当于学生在考试(新数据)中的错题率。有时候,学生可能在练习题上表现很好(训练误差小),但考试时却考不好(泛化误差大),这说明学生可能只是死记硬背了练习题,没有真正理解知识。模型也是如此,我们更希望模型的泛化误差小,这样它才能在实际应用中处理新的数据。
比如用历年考试真题(训练数据)准备考试,在真题上取得好成绩(训练误差小),不代表在未来的考试(新数据)中也能取得好成绩(泛化误差小