01 摘要
深度学习可以看作是机器学习领域中的一个前沿分支。现如今,深度学习在图像处理、自然语言处理、搜索技术、数据挖掘等领域都取得了不菲的成果。
简单来说,目前几乎所有的深度学习模型都可以用下图的模式总结。模型的最前面一层是输入层,代表了模型的输入(自变量)数据。模式的最后是一个输出层,代表了模型的输出(因变量)数据。中间包含一个或多个隐藏层,代表了模型中间训练过程的每一步的逐步结果。
笔者根据实用案例,粗略的将深度学习分为五类:
前馈网络:最简单,也是目前应用最广泛的一种人工神经网络,常见于面部识别案例;
RBF网络:一种三层的神经网络,常用于电力恢复系统领域;
多层感知器:前馈网络的一种,隐藏层可包含多层网络,常用于多种机器学习案例;
卷积网络:常用于图像处理和模式识别;
循环网络:常用于自然语言处理。
本篇我们将主要讨论多层感知器的相关细节。后续我们也会陆续推出卷积网络,循环网络等相关文章,欢迎持续关注Altair微信公众号(AltairChina)。
02 必要的前情介绍
2.1深度学习伊始
深度学习的模型框架其实要归结到人脑的决策过程。
人在做决策的时候,从外界接收到的影像,声音或触感等信息,通常会被转换成生物电的形式,流入不同的神经元,经过不同神经元的处理后,会有相应的生物电产生并流出当前的神经元,然后再准备流入下一个神经元。经过若干次处理后,最后的生物电会抵达大脑皮层,人也在那个时候做出相应的决策。
通过模拟人脑的运作机制,研究人员探索出了现如今这套深度学习的模型架构。
2.2什么是感知机
多层感知器中最重要的组成元素就是单层感知机。简单来说,单层感知机就是一次线性权重相加和一次非线性分类。
如下图所示,我们将输入自变量数据x1, x2,…,xn 通过一定的权重相加,随后将对应的计算值带入一个非线性分类的计算中,最终我们可以得到一个因变量的相应取值。这里的非线性分类计算有个专有称呼,叫做激活函数。
读到这里,大家是不是回想到了上两篇文章。没错,线性权重相加其实就很类似于线性回归,而非线性分类则相似于逻辑回归。
简单来说,多层感知器就是多个单层感知机叠加在一起的深度学习模型,每一层运算的输出值都会作为下一层运算的输入值。而训练多层感知器的实质其实就是找到每一层最适当的权重占比,激活函数和神经元个数的过程。
2.3随机梯度下降
当我们需要优化一个函数时,或者说我们需要找到某个函数的最大/小值时,我们通常会用到随机梯度下降这个方法。
在机器学习领域中,待优化的函数我们称为损失函数。损失函数是用来估量模型预测值和真实值之间不一样程度的非负值函数。该函数通常与模型的参数息息相关。
如下图例子所示,我们假设模型的只包含两个参数θ=(θ1,θ2)。在一个三维空间中,模型的损失函数L(θ)可以视为随θ值变化而变化的曲面。我们的目标是一步步调整参数θ的取值,使得我们的损失函数达到最小值。
为达到最优值,随机梯度下降方法遵循了下面的步骤:
随机初始化或自定义初始参数值,得出起始模型
进入循环:
随机抽取若干输入值样本,基于损失函数计算梯度
根据下图迭代规则更新参数值
重复步骤,直至停止条件满足
这里的α,也叫做学习率。它调控着每一次参数更新中的步长。能否找到一个合适的学习率决定了当前神经网络收敛速度的快慢以及该模型能否收敛到局部最小值。
03 多层感知器
3.1预设模型
接下来,我们将通过一个三层感知器的案例来详细了解多层感知器的建模过程。如下图所示:
输入层是模型的输入数据,用x来表示;
中间是四层隐藏层,其中的:
线性权重相加分别由g1,g2,w1,w2表示其权重;
激活函数用f来表示;这里需要注意的是,每一层的激活函数都可以是不相同的,但是为了演示,这个例子中的激活函数都是一样的;
中间的三层步骤结果由a1,a2,a3来分别表示;
输出层则为模型的预测结果,由ŷ来表示。
模型的最后是真实结果,由y来表示。整个模型训练的过程就是,我们通过调节各个权重g1,g2,w1,w2以及各个激活函数f,来使得模型的预测结果ŷ能够尽可能的接近真实结果y。
这里我们需要注意的是,模型的训练一般是从前往后的,即我们从x到a1,到a2,再一直到ŷ。而参数的优化则是从后往前的,既我们先调节w2,再调节w1,再g2,最后是g1。
3.2权重调节的数学细节
将上面的预设模型,用公式的方法抽象出来的话,我们可以得到以下几行模型训练公式:
a1 = f(g1(x))
a2 = f(g2(a1))
a3 = f(w1(a2))
ŷ = f(w2(a3))
随后,我们就可以根据2.3章节中提到的随机梯度下降方法优化调节我们的四个权重参数了。
随后,根据不同模型预先设定好的,不同激活函数与权重相加公式,我们可以分别求出
和
的相关公式。
我们便完成了一次w2权重的更新。
类似的,我们接下来继续更新g2与给g1。
当四个的权重参数都更新过一次之后,我们就完成了一次循环的参数更新。
通常来说,一个深度学习模型都会跑成百上千次的循环或者是参数达成收敛条件。
因为深度学习的数据量和计算复杂度的原因,每一次循环都会花费不少的计算时间和资源。所以如何优化一个深度学习模型变得极为重要。