为什么要有神经网络
通过之前的学习,我们知道了,对于特征-标签呈现线性关系的建模需求,可以利用线性模型搭配梯度下降算法,模型可以在学习的过程中找到接近最优的参数搭配:
但是,对于特征-标签呈现非线性关系的建模需求,我们只接触了构建特征组合等合成特征的方法进行建模,但是,构建特征组合往往需要数据科学家手动进行尝试,可能花费大量时间。
如果模型能在学习中,自动帮我们构建最优特征组合,该多好?
神经网络- 节点和隐藏层
通过构建神经网络,可以使模型学习非线性的关系。
然而,神经网络也是基于线性模型构建的,如何将线性模型改造,以达到非线性的学习效果呢?
先从线形模型开始讲起。
按照预先设定好的权重 W,偏差 b,根据三个输入值,可以计算得到输出值。
下一步,在输入层与输出层之间添加另一个层。在神经网络术语中, 输入层和输出层之间的层被称为隐藏层(Hidden layer)
,隐藏层的节点被称为神经元(Neuron)
。
隐藏层中每个神经元值的计算方式与 线性模型一致:上一层的所有输出*唯一权重+偏差得到下一层的输入, 以及偏差。
如下图所示,每个隐藏层节点会依据具有唯一性的 4 个参数计算;输出层会依据具有唯一性的 5 个参数计算
因此,该神经网络中,总计有 16 +5 = 21 个参数。
神经网络- 激活函数(Activation Function)
从上一节中可以发现,向网络添加隐藏层还不足以表示非线性关系–对线性运算执行的线性运算后,仍然是线性的。
我们需要找到一种将非线性数学运算插入模型的方法。
如果这看起来有点熟悉,那是因为我们在本课程的早些部分实际上就对线性模型的输出应用了非线性数学运算。在逻辑回归模块中,我们通过将模型的输出通过 S 型函数传递,使线性回归模型输出介于 0 到 1 之间的连续值(表示概率)。
我们可以将同样的函数应用于神经网络。
在下图中,在输出每个节点的值之前,我们先应用 S 型函数(也即整个计算公式的最外层嵌套一个 S 型函数):
在这里,S 型函数用作神经网络的激活函数,用于对神经元的输出值进行非线性转换,然后将该值作为输入传递给神经网络下一层的计算。
添加了激活函数之后,隐藏层会产生更大的影响。通过将非线性叠加到非线性上,我们可以对输入和预测输出之间的非常复杂的关系进行建模。简而言之,每一层都会针对原始输入有效地学习更复杂、更高级别的函数。
常用激活函数
广义上,Sigmoid 函数通常指代任何图像近似 S 型的函数,对于上述例子中的函数,称其为逻辑函数更为合适。
修正线性单元(Rectified Linear Unit/ReLU
使用以下算法转换输出:
- 如果输入值 小于 0,则返回 0。
- 如果输入值 大于或等于 0,则返回输入值。
神经网络- 反向传播(Back Propagation)
想象你是一个老师,分配你的学生一个小组项目课,你说我希望你们一起确定照片上树的种类
学生开始互相分享他们的猜测,从最后一排开始,每一排将他们的想法传递给前一排的学生,直到坐在最前排的唯一一名学生,由这种学生说出答案
然而结果不尽人意,给出的七颗树木中,学生只正确识别了一棵树
于是你从第一排的开始向后走,逐一告诉每个学生他们的想法存在什么问题,于是每个学生调整他们对最终答案的贡献强度
在下一轮的尝试中,学生正确识别了三棵树,那是很大的进步
梯度消失 Vanishing Gradients
反向传播训练算法利用梯度的微积分概念来调整模型权重,从而最大限度地降低损失。
神经网络的训练目标是通过梯度下降调整参数(权重 W 和偏置 b),而梯度需要通过反向传播从输出层逐层传递到输入层。
在深度网络(包含多个隐藏层的网络)中,计算这些梯度可能涉及对许多小项进行乘法,经过许多小项的相承,较低神经网络层(更接近输入层)的梯度可能会变得很小。
当较低层的梯度值接近 0 时,梯度会被称为“消失”。具有消失梯度的层训练速度非常慢,或者根本无法训练。
ReLU 激活函数有助于防止梯度消失。
梯度爆炸 Exploding Gradients
如果网络中的权重非常大,则较低层的梯度涉及许多大项的乘积。在这种情况下,可能会出现梯度爆炸:梯度太大而无法收敛。
批处理归一化、降低学习率有助于防止梯度爆炸。
多分类模型
已经接触过二分类模型可以在两个可能的选项之间进行选择,例如:
- 某封电子邮件是垃圾邮件还是非垃圾邮件?
- 某个肿瘤是恶性还是良性?
在本节中,我们将探讨多类别分类模型,它们可以从多个可能性中进行选择。例如:
- 这架飞机是波音747、空客A320、波音777还是巴航工业190?
- 这张图片是苹果、熊、糖果、狗还是鸡蛋?
某些现实世界的多类别分类问题甚至涉及数百万个不同的类别,一个多类别分类模型可能需要识别几乎任何物体的图像。
多类别分类的两种主要变体:
-
一对多(One-vs-All)
一对一(One-vs-One)
,通常也称为Softmax
一对多
一对多方法提供了一种利用二分类来对多个可能的标签进行是/否预测的方式。
对于一个具有 N 种可能结果的分类问题,一对多的解决方案包含 N 个独立的二分类器——每个分类器对应一个可能的结果。在训练过程中,模型会遍历这些二分类器,每个分类器负责回答一个独立的分类问题。
例如,给定一张水果的图片,可以训练四个不同的识别器,每个回答一个不同的是/否问题:
这张图片是苹果吗?
这张图片是橙子吗?
这张图片是香蕉吗?
这张图片是葡萄吗?
简单粗暴,效率极低
一对一分类(Softmax)
可能已经注意到,上图中中输出层的概率值总和不为 1.0(100%)。(实际上它们的总和是 1.43。)
这是因为,在一对多方法中,每个二元结果的概率是独立于其他结果集确定的。也就是说,我们在不考虑其他水果选项(“橙子”、“梨"或"葡萄”)可能性的情况下,单独确定"苹果"与"非苹果"的概率。
但如果我们需要预测每种水果的相对概率呢?在这种情况下,我们不再预测"苹果"与"非苹果",而是预测"苹果"与"橙子"与"梨"与"葡萄"。这种多类别分类称为一对一分类。
我们可以使用与一对多分类相同的神经网络架构来实现一对一分类,但有一个关键改变:需要对输出层应用不同的转换函数。
- 在一对多分类中,我们对每个输出节点独立应用 Sigmoid 激活函数,这使得每个节点的输出值在 0 到 1 之间,但不能保证这些值的总和正好等于1。
- 在一对一中,我们可以改用 softmax 激活函数,它为多类别问题中的每个类别分配小数概率,确保所有概率之和为 1.0。这个额外的约束条件有助于模型更快地收敛。
需要注意的是,为了执行 softmax,紧接输出层之前的隐藏层(称为 softmax 层)的节点数必须与输出层相同。
下图展示了一个具有所称架构的神经网络:包含 1 个节点的输入层,包含 3 个节点的隐藏层,包含 4 个节点的隐藏层,以及包含 4 个节点的输出层。输入节点接收一张梨的图片。输出层应用了 softmax 激活函数。每个输出节点代表图片是某种特定水果的概率,且这些概率之和正好为 1.
Softmax 不适用于单样本多标签分类
Softmax 假设每个样本只属于一个类别。然而有些样本可能同时属于多个类别。对于这类样本:不能使用softmax,而必须依赖多个逻辑回归
例如,上图中的一对一模型假设每张输入图片只显示一种水果:苹果、橙子、梨或葡萄。但如果输入图片可能包含多种水果(比如一碗苹果和橙子),就必须改用多个逻辑回归模型。
编码嵌入 Embeddings
原始数据如用户 ID、商品 ID、文本词汇通常采用 one-hot 编码,会导致几个问题:
- 特征维度极高且大部分值为 0。例如,100 万商品的 ID 用 one-hot 编码会产生 100 万维的稀疏向量,其中仅 1 个位置为 1,其余全 0。这种表示方式不仅浪费存储和计算资源,还会让模型难以学习有效模式。
- 无法表达特征之间的相似性。例如,“苹果”和“橙子”都是水果,但它们的 one-hot 编码在数学上毫无关联。
- 高维稀疏数据容易导致模型过拟合(记忆噪声而非学习通用规律)。
- 高维稀疏矩阵的运算(如矩阵乘法)效率极低
- 较大的输入向量意味着神经网络需要大量的权重。在独热编码中,如果有 M 个条目,并且在网络输入层后的第一层中有 N 个节点,那么模型必须为该层训练 MxN 个权重。
嵌入的作用:将高维稀疏数据压缩成低维稠密向量(如100万维→128维),所有维度均为非零值,大幅提升计算效率,并减少噪声干扰。
什么时候才用嵌入编码
嵌入行为本身会消耗计算资源,因此,仅当数据量比较大导致向量维数高的时候,才适合采用嵌入。
从数据向量到嵌入 在神经网络中训练嵌入
一个数据向量转换到嵌入空间(Embedding Space
中后,称其为一个嵌入(Embedding)
可以在为目标任务训练神经网络时创建嵌入。通过这个方法,可以为特定系统量身定制嵌入,不过耗费的时间可能要比单独训练嵌入的时间长。
一般来说,可以在神经网络中创建一个大小为 d 的隐藏层,并将其指定为嵌入层,其中 d 既表示隐藏层中的节点数,也表示嵌入空间中的维度数。此嵌入层可与任何其他特征和隐藏层组合。与任何深度神经网络一样,这些参数将在训练期间进行优化,以最大限度地减少网络输出层中的节点损失。