5第章 体系架 构 深度网络是神经网络的自然进化,它们本身都是起源于由Rosenblat 在1957年提 出的感知机的概念[165]。从历史来看①,Minsky和Papert在1969年批评感知机不 能对非线性可分域(nonlinearlyseparabledomain)进行分类[130]②,而也正是由于这一批 评,推动了另一种基于符号表示和推理的人工智能方法的发展。 图5- 1 线性可分性的例子(左图)和非线性可分的例子(右图) 神经网络在20世纪80年代再次出现,它利用隐藏层(hiddnlayer)与非线性单元联 合的思想,解决了对初始的线性可分性的限制,并通过反向传播((e) n, 算法,训练了这类多层神经网络[166]。 BackPropagatioBP) 20世纪90年代,由于神经网络难以有效地训练多层③,以及其竞争者支持向量机 (SupportVectorMachines,SVM)具有强大的理论支撑且SVM的设计理念是使得分离间 请参阅文献[2节,以获得深度学习历史中有关的关键趋势的更详细分析。 ①62]1. ② 如图5-1所示是一个简单例子和一个线性可分性的反例(在二维空间中属于绿叉或红圆类的4个点的集 合)。如果至少有一条直线将这两类元素分开,那么它们就是线性可分的。请注意,反例的离散数据版本对应于异或 (XOR)逻辑运算符的情况,这是由Minsky和Papet在文献[130]中提出的。 ③ 与此同时,卷积网络开始引起人们的兴趣, 别是在手写数字识别应用中[111]。正如Goodfelow等人在文献特(r) [62]的9.在许多方面, 并为神经网络的广泛应用铺 11节中所说的那样:“ 他们为其余的深度学习的传播带来了希望, 平了道路。” 40 隔(SeparationMargin,SM)最大化[196],因此,人们对神经网络的兴趣开始下降①。 2006年,Hinton等人提出的预训练技术(pre-training)②[79],解决了这一局限性。 2012年,一种名为AlexNet的深度神经网络算法③以显著优势④超越其他基于手工特性 的算法并因此赢得了图像识别竞赛(ImageNet Large Scale Visual Recognition Challenge[167])。这一惊人的胜利,终结了那些认为具有许多隐含层的神经网络无法被有 效地训练⑤的观点。 5.1 神经网络简介 本节将介绍并回顾人工神经网络(artificialneuralnetworks)的基本原理,目的是明确 我们在分析各种音乐生成系统时将要使用的关键概念(concepts)和术语(terminology)。 然后,介绍各种被用于音乐应用的衍生架构的概念和基本原理,如自动编码器、递归神经 网络、RBM 等。本书不会详细描述神经网络和深度学习的技术,若需要了解有关技术细 节可参考文献[62]。 5.1.1 线性回归 虽然受生物神经元的启发,但神经网络和深度学习的基础仍然是线性回归(linear regression)。在统计学中,线性回归是一种对假定线性关系进行建模的方式,它用来表示 标量y∈IR和一个⑥或多个解释变量(explanatoryvariable(s))x1…xn 之间的关系,其 中,xi∈IR,共同记为向量x。一个简单的例子是预测房价,这需要考虑其中的某些因素 (例如,房屋大小、高度、位置……)。 公式(5-1)给出了(多元)线性回归的一般模型,其中: ① ② ③ ④⑤ ⑥ 另一个相关的限制,是在非常长的序列上有效地训练它们的困难,虽然这是针对于循环网络的情况。 Hochreiter和Schmidhuber在1997年用长短期记忆神经网络(LongShort-Term Memory,LSTM)体系架构解决了这个 问题,参见文献[82]5.8.3节。 预训练是指对每个隐含层进行级联(cascade),一次一层,也称为贪婪分层无监督训练(greedylayer-wise unsupervisedtraining)的先验训练[79][62]。结果表明,它对于具有多层[46]的神经网络的精确训练,有显著改进。也就 是说,预训练现在很少使用,它已经被其他更新的技术,如批量归一化(batchnormalization)和深度残差学习(deep residuallearning)所取代。它的底层技术对于解决一些新的问题(比如迁移学习(transferlearning)是有用的,它解决了 可重用性(reusability)的问题(请参阅8.3节)。 AlexNet是由Hinton领导的SuperVision团队设计的,该团队由AlexKrizhevsky、IlyaSutskever和Geoffrey E.Hinton组成[103]。AlexNet是基于深度卷积神经网络构建的,有6000万个参数和65万个神经元,由5个卷积层、 最大池化层以及3个全局连接层组成。 在第一个任务中,AlexNet以15%的错误率赢得了比赛,而其他团队的错误率较高,超过26%。 有趣的是,Hinton等人关于预训练的文章[79]的标题是关于“深度信念网”,并没有提到“神经网络”这个术 语,因为正如Hinton在文献[105]中描述的那样:“当时,有一种强烈的信念,即认为深度神经网络不好,它不可能 (never)被训练,而ICML(机器学习国际会议)不应该接受有关神经网络的论文。” 只有一个解释变量的情况称为简单线性回归(simplelinearregression),否则称为多元线性回归(multiple linearregression)。 41 h(x)=b+θ1x1 + … +θnxn =b+ Σn i=1 θixi (5-1) (1)h 是模型(model),也叫假说(hypothesis),因为它是假设的将要发现(即学习到) 的最好模型。 (2)b 是偏差(bias)①,代表偏移(offset)。 (3)θ1,…,θn 是模型的参数(parameters),也叫权重(weights),它们是相对于不同的 解释变量x1,…,xn 的。 5.1.2 符号 本书简单地做以下符号约定。 (1)常量(constant)用Roman(straight)字体表示,例如,整数1和音符C4。 (2)模型变量(variable)用Roman字体表示,例如,输入变量x 和输出变量y(可能是 向量)。 (3)模型参数(parameter)用斜体表示,如偏置b、权重参数θ1、模型函数h、解释变量 数n、变量xi 的索引i。 (4)用斜体和大写表示概率(probability)和概率分布(probabilitydistribution),如概 率P(note=A4)表示音符变量的值为A4,概率分布P(note)表示所有可能音符(结果)的 概率分布。 5.1.3 模型训练 训练线性回归模型的目的是找出最适合的针对实际训练数据/示例的每个权重θi 和 偏差b 的值,即各种值对(x,y)。换句话说,要根据某些度量值(成本(cost)),找到相应 的参数和偏差值,使得对于所有的x 值,h(x)尽可能地接近于(ascloseaspossible)y②。 在所有样本中,这个度量值表示h(x)(即预测值,也记为y^)和y(即实际的真实值)之间的 差异(distance)。 成本,又称损失(loss),记为Jθ(h)③,是可以度量的。例如,用均方误差(MSE)度量 平均平方差,如式(5-2)所示,其中,m 是样本的数量,(x(i),y(i))是第i 个样本对。 Jθ(h)=1/mΣm i=1 (y(i)-h(x(i)))2 =1/mΣm i=1 (y(i)-y^(i))2 (5-2) 图5-2是简单的线性回归的一个例子,它只有一个解释变量x。训练数据用蓝色实 点表示。一旦模型被训练好,参数值被调节,就可以用蓝色实线拟合最合适的样本。然后 将该模型用于预测(prediction)。例如,通过计算h(x)(绿色),可以很好地估计出在给定 ①② ③ 也可记为θ0,参见5.1.5节。 实际上,比线性回归更复杂的神经网络(非线性模型),将在5.5节中介绍。这是出于“对训练数据的完美拟 合不一定是最好的拟合”这一假设,因为这种情况下可能带来低泛化(generalization)的问题,即预测不可见数据(yet unseendata)的能力较低。这个问题叫作过拟合(overfitting),它将在5.5.9节介绍。 或者J(θ),Jθ 或Jθ。 42 值x 下,对应于实际值y 的估计值y^。 图5-2 简单的线性回归示例 5.1.4 梯度下降训练算法 使用简单的梯度下降(gradientdescent)法来训练线性回归模型的基本算法,是非常 简单的①。 (1)将每个参数θi 和偏差b 初始化为一个随机值或某个启发式值②。 (2)计算对于所有样本的模型的值h③。 (3)计算成本(cost)Jθ(h),如式(5-2)所示。 (4)计算梯度(gradients).Jθ(h) .θi ,即代价函数Jθ (h)对每个θi 和偏差b 的偏导数 (partialderivatives)。 (5)按更新规则,同时更新(updatesimultaneously)④所有参数θi 和偏差,如式(5-3) 所示⑤,其中,α 为学习率(learningrate)。 θi:=θi -α.Jθ(h) .θi (5-3) 如图5-3所示,为了降低损失函数Jθ(h),进行梯度反向更新。 (6)迭代(iterate)执行,直到错误达到最小值(minimum)⑥,或者达到一定次数的迭 ①② ③ ④ ⑤ ⑥ 详情见文献[141]。 预训练带来了显著的进步,因为它通过使用实际训练数据,通过对连续层[46]进行顺序训练,改善了参数的初 始化情况。 计算所有数据例的代价是最好的方法,但也需要很高的计算成本。有许多启发式的选择来最小化计算成本, 例如,随机梯度下降SGD(stochasticgradientdescent,其中的数据例是随机选择的)和小批量梯度下降(minibatch gradientdescent,其中一个数据例的子集是随机选择的)。更多解释可参见文献[62]5.9节和8.1.3节。 同步更新是算法正确运行的必要条件。 更新规则也可以记为θ:=θ-α.θJθ(h),其中,.θJθ(h)是梯度.Jθ(h) .θi 的向量。 如果成本函数是凸函数(convex),对于线性回归的情况,则只有一个全局最小值(globalminimum),因此能找 到最优的模型(译者注:即能找到全局最优)。 43 代后终止。 5.1.5 从模型到体系架构 图5-4 中是作为神经网络前身的线性回归模型的图形表示,所表示的体系架构 (architecture)实际上是该模型的计算表示①。 加权和被表示为一个计算单元(computationalunit)②,即图5-4中带有Σ 的方框, 它从画成圆的xi 结点获取输入。 图5-3 梯度下降 图5-4 线性回归的架构模型 在图中的示例中有四个输入型解释变量:x1、x2、x3 和x4。注意,通常情况下,将偏 差b 视为权重的一种特殊情况(因此记为θ0),它也有一个相应的输入结点(称为偏差结 点(biasnode)),这是隐式的(implicit)③,表示为一个常数值(记作+1)。这实际上相当于 考虑一个隐含的附加解释变量x0,其值为常数值+1(译者注:其权重为偏差b),如式(5- 4)所示,该公式是最初定义的线性回归公式(5-1)中的一个变形: h(x)=θ0 +θ1x1 + … +θnxn =Σn i=1 θixi (5-4) 5.1.6 从模型到线性代数表示 初始线性回归方程式(5-1)中引入式(5-5)的线性代数符号后变得更紧凑。 h(x)=b+θx (5-5) (1)b 和h(x)是标量。 (2)θ 是一个由一行n 个元素[θ1,θ2,…,θn]组成的行向量④。 ① ② ③④ 在这本书中,主要使用体系架构(architecture)这个术语,因为我们关注的是实现和计算给定模型的方法以及 体系架构和表示之间的关系。 我们将结点(node)这个术语用于神经网络的任何组成部分,无论是一个接口(interface)(例如,一个输入结 点)还是一个计算单元(computationalunit)(例如,一个加权和或一个函数)。我们只在计算结点的情况下使用单元 (unit)这个术语。神经元(neuron)这个词也经常用来代替单元(unit),以强调这是来自生物神经网络的灵感。 然而,稍后将在5.5节中解释,偏置结点很少出现在非玩具神经网络的插图中。 这是一个只有一行的矩阵,即它是一个维数为1×n 的矩阵。 44 (3)x 是一个由一列n 个元素 x1 x2 . xn é . êêêêêê ù . úúúúúú 组成的列向量①。 5.1.7 从简单模型到多元模型 当存在多个待预测的变量y1,…,yp 时,线性回归可泛化为多元线性回归 (multivariatelinearregression),如图5-5所示,有三个预测变量y1,y2,y3,每个子网用不 同的颜色表示。 对应的线性代数方程为式(5-6),其中: h(x)=b +wx (5-6) (1)b:偏置向量,是维度为p×1的列向量,其中,bj 表示偏置输入结点与第j 个输 出结点对应的第j 个求和运算的关联权重。 (2)W :权重矩阵,是维数为p×n 的矩阵,有p 行n 列,其中,Wi,j 代表第j 个输入 结点与第i 个输出结点对应的第i 个求和运算对应的权重。 (3)n:输入结点数(不考虑偏置结点)。 (4)p:输出结点的数量。 对于如图5-5所示的架构,n=4(指W 的输入结点数和列数),p=3(指W 的输出结 点数和行数)。对应的b 和W 如式(5-7)和式(5-8)②以及图5-6所示③。 b = b1 b2 b3 é . êêêê ù . úúúú (5-7) 图5-5 多元线性回归的体系架构 图5-6 显示与第三层级输出的连接对应的偏置和 权重的多元线性回归的体系架构 ①② ③ 这是一个只有一列的矩阵,即,它是一个维数为n×1的矩阵。 实际上,b 和W 是b 和θ 从单变量线性回归情况(见5.1.6节)到多行多变量线性回归情况的推广,每一行对 应一个输出结点。 通常只显示到一个输出结点的连接点,以保持其可读性。 45 W = W1,1W1,2W1,3W1,4 W2,1W2,2W2,3W2,4 W3,1W3,2W3,3W3,4 é . êêêê ù . úúúú (5-8) 5.1.8 激活函数 在图5-7中,对每个加权求和单元应用了激活函数(activationfunction,AF)。允许使 用任意的非线性函数(nonlinearfunctions)来作为这种激活函数。 图5-7 带有激活函数的多元线性 回归的系统架构模型 (1)从工程(engineering)的角度来看,需要一 个非线性函数来克服单层感知机的线性可分性限 制(见5.5节)。 (2)从生物灵感(biologicalinspiration)的角 度来看,非线性函数可以通过传入信号(通过树 突)来捕捉神经元激活的阈值(threshold)效应,并 决定是否沿着输出信号(轴突)来输出信号。 (3)从统计学(statistical)的角度看,当激活 函数为sigmoid 函数时,模型为logistic 回归 (logisticregression)模型,它对某一类或某一事件 的概率进行建模,并进行二值分类①。 从历史上看,logistic回归(logisticregression)模型的激活函数中,sigmoid函数是最 常见的。sigmoid函数(通常写成σ)定义在式(5-9)中,其图形如图5-8所示。在5.5.3节 中将对激活函数做进一步的分析。 图5-8 sigmoid函数 ① 对于每个输出结点/变量。更多细节请参见5.5.3节。 46 另一个可选用的激活函数是类似于sigmoid的通常被称为tanh() 的双曲正切函数, 其值域范围为[-1,+1]( 而sigmoid的值域范围为[0,1])。tanh() 的定义如式(5-10)所 示,函数图像如图5-9所示。 图5- 9 tanh() 函数 如今,ReLU 激活函数因其简单和高效而被广泛使用。ReLU 表示线性整流单元 rectifiedlinearunit),其定义见式(5-11), 图像如图5-10 所示。请注意,通常使用 z 作为( 激活函数的变量名,因为 x 通常用于输入变量。 z)z)1 sigmoid(=σ((5-9) -z 1(=) +e tanh( = ez-e- z (5-10) z)ez+e- z z)x(z) ReLU(=ma0,(5-11) 图5-10 ReLU 函数 47 5.2 基本组件 如图5-7所示的带有激活函数的多元线性回归的体系架构,是一个基于神经网络和 深度学习框架的基本组件(basicbuildingblock)的一个实例(它具有4个输入结点和3个 输出结点)。虽然它的图形简单,但这个基本组件确实是一个工作中的神经网络架构组 件。它有两层①: (1)图中左侧为输入层(inputlayer),由输入结点(inputnodes)xi 和偏置结点(bias node)组成。偏置结点是一个隐式的(implicit)特定输入结点,常值为1,因此它通常记 为+1。 (2)图右侧为输出层(outputlayer),由输出结点yj 组成。 训练这样一个基本模块,本质上与训练一个线性回归模型是相同的(它已经在5.1.3节 中描述了)。 5.2.1 前馈计算 经过训练后,我们可以使用这个基于基本组件的神经网络进行预测。因此,只需对网 络进行前馈(feedforward),即向网络“馈进”输入数据并计算对应的输出值,如式(5-12) 所示。 y^=h(x)=AF(b +Wx) (5-12) 对于如图5-5所示的体系架构,用于预测的前馈计算方法如式(5-13)所示,其中, hj(x)(即y^j)为第j 个变量yj 的预测值。 y^=h(x)=h x1 x2 x3 x4 é . êêêêê ù . úúúúú =AF(b +Wx) =AF b1 b2 b3 é . êêêê ù . úúúú + W1,1 W1,2 W1,3 W1,4 W2,1 W2,2 W2,3 W2,4 W3,1 W3,2 W3,3 W3,4 é . êêêê ù . úúúú × x1 x2 x3 x4 é . êêêêê ê ù . úúúúú ú é . êêêêê ê ù . úúúúú ú =AF b1 b2 b3 é . êêêê ù . úúúú+ W1,1 x1 +W1,2 x2 +W1,3 x3 +W1,4 x4 W2,1 x1 +W2,2 x2 +W2,3 x3 +W2,4 x4 W3,1 x1 +W3,2 x2 +W3,3 x3 +W3,4 x4 é . êêêê ù . úúúú é . êêêê ù . úúúú ① 正如将在5.5.2节中看到的,虽然它将被视为一个单层神经网络体系架构,但由于其没有隐藏层,因此它仍然 受到感知机对线性可分性的限制。 48 =AF b1 +W1,1 x1 +W1,2 x2 +W1,3 x3 +W1,4 x4 b2 +W2,1 x1 +W2,2 x2 +W2,3 x3 +W2,4 x4 b3 +W3,1 x1 +W3,2 x2 +W3,3 x3 +W3,4 x4 é . êêêê ù . úúúú é . êêêê ù . úúúú = h1(x) h2(x) h3(x) é . êêêê ù . úúúú = y^1 y^2 y^3 é . êêêê ù . úúúú (5-13) 5.2.2 同时计算多个输入数据 同时进行前馈的几组输入,很容易通过矩阵乘法表示为一个矩阵。将式(5-12)中的 单向量x 用向量矩阵(通常记为X)代替,可得到式(5-14)。 X 矩阵的连续列对应于不同的输入。我们用一个上标记号X(k)来表示第k 组输入 (即X 矩阵的第k 列),以避免其与下标符号xi (它表示第i 个输入变量)混淆。因此, X (k) i 表示第k 组输入的第i 个输入值。几组输入的前馈计算如式(5-15)所示,输出预测 值h(X(k))是结果输出矩阵的连续列。 h(X)=AF(b +WX) (5-14) h(X)=h X1(1) X1(2) … X1(m) X2(1) X2(2) … X2(m) X3(1) X3(2) … X3(m) X4(1) X4(2) … X4(m) é . êêêêê ù . úúúúú =AF(b +WX) =AF b1 b2 b3 é . êêêê ù . úúúú + W1,1 W1,2 W1,3 W1,4 W2,1 W2,2 W2,3 W2,4 W3,1 W3,2 W3,3 W3,4 é . êêêê ù . úúúú × X1(1) X1(2) … X1(m) X2(1) X2(2) … X2(m) X3(1) X3(2) … X3(m) X4(1) X4(2) … X4(m) é . êêêêê ù . úúúúú é . êêêêê ù . úúúúú = h1(X (1)) h1(X (2)) … h1(X (m)) h2(X (1)) h2(X (2)) … h2(X (m)) h3(X (1)) h3(X (2)) … h3(X (m)) é . êêêê ù . úúúú =[h(X(1))h(X(2))…h(X(m))] (5-15) 请注意,正在进行的主要计算①是矩阵的乘积,通过使用已有的线性代数向量化库以 及图形处理单元(GPU)等专门的软硬件,可以使计算更高效。 5.3 机器学习 5.3.1 定义 现在,结合线性回归模型(在5.1.1节讲述)以及5.2节中介绍的基本构件体系架构, ① 除了使用AF激活函数的计算。在使用ReLU 激活函数的情况下,这是很快的。