《深度学习原理及应用》课件 第2章神经网络_第1页
《深度学习原理及应用》课件 第2章神经网络_第2页
《深度学习原理及应用》课件 第2章神经网络_第3页
《深度学习原理及应用》课件 第2章神经网络_第4页
《深度学习原理及应用》课件 第2章神经网络_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章神经网络目录2.1从感知机到神经网络2.2激活函数2.3神经网络的前向传播2.4输出层的设计2.5损失函数2.6梯度法2.7学习算法的实现2.8误差反向传播2.9简单层的实现2.10激活函数层的实现2.11Affine层和softmax层的实现2.12softmax-with-loss层第2章

神经网络上一章学习了感知机。尽管感知机能够表示复杂函数,但设定权重的工作仍然需要人工进行,以确定合适的、符合预期的输入和输出的权重。神经网络的出现就是为了解决刚才的坏消息。具体地说,神经网络的一个重要特性是它可以自动地从数据中学习到合适的权重参数。在本章中,将深入探讨神经网络的基本概念和结构,首先从感知机的原理入手,了解其在神经网络发展中的重要性。接着,将介绍神经网络的基本结构,包括各层的组成及其功能,进而引入激活函数的概念,讨论其对神经网络性能的影响。此外,本章还将详细阐述神经网络的前向传播过程,包括信号在各层间的传递及实现方法、输出层的设计,以及不同激活函数的应用。通过逐步解析损失函数、梯度法以及学习算法的实现,最后给出误差反向传播相关理论。2.1从感知机到神经网络2.1.1神经网络结构神经网络中信号是如何传递的呢?2.1从感知机到神经网络2.1.2回顾感知机(2-1)2.1从感知机到神经网络2.1.3激活函数2.2激活函数2.2.1阶跃函数的实现根据式(2-2),实现阶跃函数的代码如下:defstep_function(x):ifx>0:return1else:return0importnumpyasnp

defstep_function(x):returnnp.array(x>0,dtype=)以上代码实现简单、易于理解,但是参数x只能接受实数(浮点数)。为了便于后面的操作,把它修改为支持numpy数组的实现。2.2激活函数2.2.2阶跃函数的实现根据式(2-2),实现阶跃函数的代码如下:defstep_function(x):ifx>0:return1else:return0importnumpyasnp

defstep_function(x):returnnp.array(x>0,dtype=)以上代码实现简单、易于理解,但是参数x只能接受实数(浮点数)。为了便于后面的操作,把它修改为支持numpy数组的实现。2.2激活函数2.2.2Sigmoid函数2.2激活函数2.2.3ReLu函数2.3神经网络的前向传播2.3神经网络的前向传播2.3.1符号的含义2.3神经网络的前向传播2.3.1符号的含义2.3神经网络的前向传播2.3.2各层间信号传递的实现importnumpyasnp

#设置输入信号、权重和偏置X=np.array([1.0,0.5])#输入信号,形状为(2,)W1=np.array([[0.1,0.2,0.3],[0.4,0.5,0.6]])#权重,形状为(2,3)B1=np.array([0.1,0.2,0.3])#偏置,形状为(3,)

#计算输出A1=np.dot(X,W1)+B12.3神经网络的前向传播2.3.2各层间信号传递的实现2.3神经网络的前向传播2.3.2各层间信号传递的实现2.3神经网络的前向传播2.3.2各层间信号传递的实现2.3神经网络的前向传播2.3.2各层间信号传递的实现2.3神经网络的前向传播2.3.2各层间信号传递的实现2.3神经网络的前向传播2.3.2各层间信号传递的实现2.3神经网络的前向传播2.3.2各层间信号传递的实现2.3神经网络的前向传播2.3.2各层间信号传递的实现2.3神经网络的前向传播2.3.3代码实现importnumpyasnp

defsigmoid(x):

return1/(1+np.exp(-x))

defidentity_function(x):

returnx

definit_network():

network={}

network['W1']=np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])

network['b1']=np.array([0.1,0.2,0.3])

network['W2']=np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])

network['b2']=np.array([0.1,0.2])

network['W3']=np.array([[0.1,0.3],[0.2,0.4]])

network['b3']=np.array([0.1,0.2])

returnnetwork

defforward(networ,x):

W1,W2,W3=network['W1'],network['W2'],network['W3']

b1,b2,b3=network['b1'],network['b2'],network['b3']

a1=np.dot(x,W1)+b1

z1=sigmoid(a1)

a2=np.dot(z1,W2)+b2

z2=sigmoid(a2)

a3=np.dot(z2,W3)+b3

y=identity_function(a3)

returny

network=init_network()x=np.array([1.0,0.5])y=forward(network,x)print(y)2.4输出层的设计神经网络可以应用于分类问题和回归问题。根据问题的性质,需要选择适当的输出层激活函数。通常情况下,对于回归问题,会选择恒等函数作为输出层的激活函数,而对于分类问题,会选择softmax函数。2.4输出层的设计2.4.1恒等函数2.4输出层的设计2.4.2softmax函数2.4输出层的设计2.4.2softmax函数importnumpyasnp

defsoftmax(a):

exp_a

=np.exp(a)

sum_exp_a

=np.sum(exp_a)

returnexp_a

/sum_exp_a需要注意的是,由于指数函数的特性,softmax函数在处理大数字时可能导致数值稳定性问题。因此在实际应用中,通常会对输入向量先进行适当的缩放处理,以避免数值溢出或数值不稳定的情况。【例2-1】softmax函数实现示例。importnumpyasnp

defsoftmax(x):

returnnp.exp(x)/np.sum(np.exp(x),axis=0)

#示例用法x=np.array([1000,999,1010])result=softmax(x)print(result)运行结果为:[nannannan]2.4输出层的设计2.4.2softmax函数【例2-2】采用溢出对策的softmax函数实现示例。2.4输出层的设计2.4.2softmax函数2.4输出层的设计2.4.2softmax函数2.4输出层的设计2.4.2softmax函数2.4.3输出层的神经元数量2.4输出层的设计对于分类问题,输出层的神经元数量通常设置为类别的数量,例如对图像中的数字0到9进行分类,输出层的神经元数量设定为10。神经网络在训练过程中学习将输入映射到不同类别,每个输出神经元对应一个类别,最终产生分类预测结果。对于回归问题,输出层的神经元数量通常根据目标变量的维度决定。如果要预测单个实数值(如房价、温度),则输出层的神经元数量设置为1;如果需要同时预测多个相关的实数值(如坐标点的x和y坐标),则设置为对应实数值的维度。这样的设置保证了神经网络输出与问题需求相匹配,更好地完成回归预测任务。2.5损失函数损失函数在神经网络中扮演着关键的角色,它用于衡量模型预测结果与实际标签之间的差异。通过损失函数,能够量化模型的预测性能,进而引导网络的学习过程,使其不断优化以更好地拟合数据。损失函数的作用是评估模型的预测值与真实值之间的差距,这种差距通常被称为“损失”,它是衡量模型性能的重要指标。在训练过程中,目标是最小化损失函数,通过调整神经网络中的参数,使得模型能够更准确地预测数据的标签。因此,损失函数在神经网络中起着至关重要的作用,它不仅指导着模型的学习方向,也是评价模型性能优劣的重要标准。损失函数一般情况下采用均方误差和交叉熵误差。2.5损失函数2.5.1均方误差2.5.2交叉熵误差2.5损失函数交叉熵误差实现代码如下:defcross_entropy(y,t):delta=1e-7return-np.sum(t*np.log(y+delta))2.5损失函数2.5.2交叉熵误差2.5.3mini-batch学习2.5损失函数2.5.3mini-batch学习2.5损失函数在神经网络的学习中,通常会从训练数据中选取一批数据(称为mini-batch,小批量),然后对每个mini-batch进行学习。比如,从80000个训练数据中随机选择100个样本,再利用这100个样本进行学习。这种学习方式被称为mini-batch学习。这样的方法不仅能够提高计算效率,同时也保持了对整体数据集的有效学习。2.5.4mini-batch版交叉熵误差的实现如果监督数据是one-hot编码形式时,可采用下面的代码实现单个数据和批量数据的交叉熵误差:defcross_entropy_error_1(y,t):ify.ndim==1:t=t.reshape(1,t.size)y=y.reshape(1,y.size)

batch_size=y.shape[0]return-np.sum(t*np.log(y+1e-7))/batch_size其中,y是神经网络的输出,t是监督数据。求单个数据的交叉熵误差时,需要改变数据的形状。并且,当输入为mini-batch时,要用batch的个数进行正则化,计算单个数据的平均交叉熵误差。2.5损失函数2.6梯度法机器学习的主要任务是在学习过程中寻找最优参数。同样,神经网络在训练时也需要找到最优的参数(包括权重和偏置)。在这一过程中,损失函数用于衡量模型的预测与实际结果之间的差距,目标是使损失函数的值最小化。然而,损失函数通常是复杂的,参数空间也非常庞大,无法直接知道在哪些位置能够获得最小值。为了解决这个问题,梯度法通过巧妙地利用梯度信息来寻找函数的最小值,从而有效地优化模型的参数。2.6梯度法2.6.1梯度2.6梯度法2.6.1梯度函数numerical_gradient(f,x)中,参数f为函数,x为numpy数组,该函数对numpy数组x的各个元素求数值微分,下面给出求点(3,4)的梯度。deff_2(x):returnx[0]**2+x[1]**2

defnumerical_gradient(f,x):h=1e-4grad=np.zeros_like(x)#生成和x形状相同的数组

foridxinrange(x.size):tmp_val=x[idx]

#f(x+h)的计算

x[idx]=tmp_val+hfxh1=f(x)

#f(x-h)的计算

x[idx]=tmp_val-hfxh2=f(x)

grad[idx]=(fxh1-fxh2)/(2*h)x[idx]=tmp_val

returngradnumerical_gradient(f_2,np.array([3,4]))2.6梯度法2.6.1梯度函数numerical_gradient(f,x)中,参数f为函数,x为numpy数组,该函数对numpy数组x的各个元素求数值微分,下面给出求点(3,4)的梯度。deff_2(x):returnx[0]**2+x[1]**2

defnumerical_gradient(f,x):h=1e-4grad=np.zeros_like(x)#生成和x形状相同的数组

foridxinrange(x.size):tmp_val=x[idx]

#f(x+h)的计算

x[idx]=tmp_val+hfxh1=f(x)

#f(x-h)的计算

x[idx]=tmp_val-hfxh2=f(x)

grad[idx]=(fxh1-fxh2)/(2*h)x[idx]=tmp_val

returngradnumerical_gradient(f_2,np.array([3,4]))运行结果为:array([6.,8.])

梯度表示的是各个点处函数值减小最快的方向,因此并不能保证梯度所指向的方向就是函数的最小值或最优前进方向。实际上,在复杂的函数中,梯度指示的方向往往并不指向函数的最小值。尽管如此,沿着梯度的方向仍然能够最大限度地降低函数的值。因此,在寻找函数最小值的过程中,应以梯度信息为线索,决定前进的方向。

此时,梯度法便发挥了重要作用。在梯度法中,从当前位置出发,沿着梯度方向前进一定的距离,然后在新的位置重新计算梯度,再继续沿着新的梯度方向前进,如此反复,不断迭代。通过这种方式,逐步沿梯度方向前进,从而逐渐减小函数值,这就是梯度法的基本过程。梯度法是解决机器学习中优化问题的常用方法,尤其在神经网络的训练中得到了广泛应用。2.6梯度法2.6.1梯度2.6梯度法2.6.1梯度下面给出梯度下降法的实现。defgradient_descent(f,init_x,lr=0.01,step_num=100):x=init_x

foriinrange(step_num):grad=numerical_gradient(f,x)x-=lr*grad

returnx参数f是要进行优化的函数,init_x是初始值,lr是学习率,step_num是梯度法的重复次数。numerical_gradient(f,x)会求函数的梯度,用该梯度乘以学习率得到的值进行更新操作,由step_num指定重复的次数。2.6梯度法2.6.1梯度2.6梯度法2.6.2神经网络的梯度2.6梯度法2.6.2神经网络的梯度importnumpyasnp

defsoftmax(z):exp_z=np.exp(z)sum_exp_z=np.sum(exp_z)returnexp_z/sum_exp_z

defcross_entropy(y,t):delta=1e-7return-np.sum(t*np.log(y+delta))

classsimpleNet:def__init__(self):self.w=np.random.randn(2,3)

defpredict(self,x):returnnp.dot(x,self.w)

defloss(self,x,t):z=self.predict(x)y=softmax(z)loss=cross_entropy(y,t)returnloss下面构建一个简单的神经网络来,然后来求梯度。代码如下:2.7学习算法的实现2.6.2神经网络的梯度步骤1(mini-batch):从训练数据中随机选出一部分数据,这部分数据称为mini-batch。目标是通过这一mini-batch来减小损失函数的值。步骤2(计算梯度):为了降低mini-batch的损失函数的值,需要求出各个权重参数的梯度,梯度指示了损失函数值下降最快的方向。步骤3(更新参数):根据计算得到的梯度,沿着梯度方向对权重参数进行微小更新。步骤4(重复):重复步骤1、步骤2和步骤3,直到模型的性能达到预期目标。神经网络的学习按照上述四个步骤进行。该方法通过梯度下降法来更新参数,但由于使用的是随机选择的mini-batch数据,因此被称为随机梯度下降法(StochasticGradientDescent,简称SGD)。2.8

误差反向传播神经网络的学习通常依赖于数值微分来计算权重参数的梯度。虽然数值微分方法简单且易于实现,但其主要缺点是计算效率较低,耗时较长。在本节中,将学习一种更高效的计算权重参数梯度的方法——误差反向传播法。2.8

误差反向传播2.8.1用计算图求解计算图是将计算过程以图形形式表示的工具。它由多个节点和边组成,其中节点用圆圈○表示,圆圈○中是计算的内容,而连接节点的有箭头的直线线段称为“边”。通过这种方式,计算图清晰地展示了数据流和依赖关系。【例2-7】用计算图描述问题示例1。小张在超市买了2个100日元一个的苹果,消费税是10%,请计算支付金额。用计算图描述支付金额的计算过程,得到图2-18。节点○表示乘法运算。通过此图示得到最终的支付金额为220元。2.8

误差反向传播2.8.1用计算图求解计算图是将计算过程以图形形式表示的工具。它由多个节点和边组成,其中节点用圆圈○表示,圆圈○中是计算的内容,而连接节点的有箭头的直线线段称为“边”。通过这种方式,计算图清晰地展示了数据流和依赖关系。【例2-8】用计算图描述问题示例2。小李在超市买了2个苹果、3个橘子。其中,苹果每个100日元,橘子每个150日元。消费税是10%,请计算支付金额。用图2-19描述上述过程,这个问题中新增加了加法节点“+”,用来合计苹果和橘子的金额。构建了计算图后,从左向右进行计算。综上,用计算图解题的情况下,需要按如下流程进行。1)构建计算图。2)在计算图上,从左到右进行计算。这里的第2步“从左到右进行计算”是一种正方向上的传播,简称为正向传播。正向传播是从计算图出发点到结束点的传播。既然有正向传播这个名称,当然也可以考虑反向的传播(从图上看,就是从右向左的传播)。反向传播将在接下来的导数计算中发挥重要作用。前面用计算图解答了两个问题,那么计算图到底有什么优点呢?一个优点就在于前面所说的局部计算。无论全局是多么复杂的计算,都可以通过局部计算使各个节点致力于简单的计算,从而简化问题。另一个优点是,利用计算图可以将中间的计算结果全部保存起来(比如,计算进行到2个苹果时的金额是200日元、加上消费税之前的金额650日元等)。但是只有这些理由可能还无法令人信服。实际上,使用计算图最大的原因是,可以通过反向传播高效计算导数。2.8

误差反向传播2.8.1用计算图求解2.8

误差反向传播2.8.2计算图的反向传播如图2-20所示,反向传播使用与正方向相反的箭头(粗线)表示。反向传播传递“局部导数”,将导数的值写在箭头的下方。在这个例子中,反向传播从右向左传递导数的值(1→1.1→2.2)。从这个结果中可知,“支付金额关于苹果的价格的导数”的值是2.2。这意味着,如果苹果的价格上涨1日元,最终的支付金额会增加2.2日元。(严格地讲,如果苹果的价格增加某个微小值,则最终的支付金额将增加那个微小值的2.2倍)。2.8

误差反向传播2.8.3加法节点的反向传播2.8

误差反向传播2.8.4乘法节点的反向传播2.9

简单层的实现2.9.1乘法层的实现2.9

简单层的实现2.9.1乘法层的实现2.9

简单层的实现2.9.2加法层的实现加法层实现的代码如下:classAddLayer:def__init__(self):pass

defforward(self,x,y):out=x+y

returnout

defbackward(self,dout):dx=dout*1dy=dout*1

returndx,dy2.10激活函数层的实现2.10.1ReLU层2.10激活函数层的实现2.10.1ReLU层2.10激活函数层的实现2.10.2Sigmoid层Sigmoid层的Python实现代码如下:classSigmoid:def__init__(self):self.out=None

defforward(self,x):out=1/(1+np.exp(-x))self.out=out

returnout

defbackward(self,dout):dx=dout*self.out*(1-self.out)

returndx

在这个实现中,正向传播时的输出保存在实例变量

out中。在反向传播过程中,使用该变量out进行计算。2.11Affine层和softmax层的实现2.11.1Affine层2.11Affine层和softmax层的实现2.11.1Affine层2.11Affine层和softmax层的实现2.11.2批版本的Affine层批版本Affine层的代码实现如下:classAffine:def__init__(self,W,b):self.W=Wself.b=bself.x=Noneself.dW=Noneself.db=None

defforward(self,x):self.x=xout=np.dot(x,self.W)+self.b

returnout

def

backward(self,dout):dx=np.dot(dout,self.W.T)self.dW=np.dot(self.x.T,dout)self.db=np.sum(dout,axis=0)

returndx2.11Affine层和softmax层的实现2.11.3softmax-with-loss层神经网络的处理过程主要分为推理和学习两个阶段。在推理阶段,神经网络通常不使用softmax层。例如,在图2-31所示的网络中进行推理时,会直接将最后一个Affine层的输出作为识别结果。在这种情况下,网络的未正规化输出结果有时被称为“得分”。也就是说,当神经网络在推理时只需要给出一个答案时,由于只对得分的最大值感兴趣,因此不需要使用softmax层。然而,在学习阶段,softmax层是必不可少的。它在计算损失函数时提供了类别的预测概率,使得网络能够有效地进行反向传播和参数更新。2.11Affine层和softmax层的实现2.11.3softmax-with-loss层接下来,将实现一个包含softmax层和交叉熵损失函数的“softmax-with-Loss”层。这一层不仅能够将网络输出转换为概率分布,还能计算损失值,以便在训练过程中进行有效的反向传播。这种设计的优点在于,它将softmax和损失计算结合在一起,简化了模型的实现,并提高了计算效率。softmax-with-Loss的代码实现如下:classsoftmaxWithLoss:def__init__(self):self.loss=None#损失

self.y=None#softmax的输出

self.t=None#监督数据

defforward(self,x,t):self.t=tself.y=softmax(x)self.loss=cross_entropy_error(self.y,self.t)

returnself.loss

defbackward(self,dout=1):batch_size=self.t.shape[0]dx=(self.y-self.t)/batch_size

returndx2.12Affine层和softmax层的实现2.11.3softmax-with-loss层接下来,将实现一个包含softmax层和交叉熵损失函数的“softmax-with-Loss”层。这一层不仅能够将网络输出转换为概率分布,还能计算损失值,以便在训练过程中进行有效的反向传播。这种设计的优点在于,它将softmax和损失计算结合在一起,简化了模型的实现,并提高了计算效率。softmax-with-Loss的代码实现如下:classsoftmaxWithLoss:def__init__(self):self.loss=None#损失

self.y=None#softmax的输出

self.t=None#监督数据

defforward(self,x,t):self.t=tself.y=softmax(x)self.loss=cross_entropy_error(self.y,self.t)

returnself.loss

defbackward(self,dout=1):batch_size=self.t.shape[0]dx=(self.y-self.t)/batch_size

returndx2.12误差反向传播法的实现2.12.1神经网络学习的全貌图神经网络中,存在合适的权重和偏置。调整这些权重和偏置以便拟合训练数据的过程称为学习。神经网络的学习分为以下4个步骤:步骤1(mini-batch)从训练数据中随机选择一部分数据。步骤2(计算梯度)计算损失函数关于各个权重参数的梯度。步骤3(更新参数)将权重参数沿着梯度方向进行微小的更新。步骤4(重复)重复步骤1、步骤2、步骤3。2.12误差反向传播法的实现2.12.2误差反向传播法的神经网络实现2.12误差反向传播法的实现2.12.2误差反向传播法的神经网络实现importnumpyasnpfromcollectionsimportOrderedDict

classReLU:def__init__(self):self.mask=None

defforward(self,x):self.mask=(x<=0)out=x.copy()out[self.mask]=0

returnout

defbackward(self,dout):dout[self.mask]=0dx=dout

returndx#TwoLayerNet类的实现classTwoLayerNet:def__init__(self,input_size,hidden_size,output_size,weight_init_std=0.01):#初始化权重和偏置

self.params={}self.params['W1']=weight_init_std*np.random.randn(input_size,hidden_size)self.params['b1']=np.zeros(hidden_size)self.params['W2']=weight_init_std*np.random.randn(hidden_size,output_size)self.params['b2']=np.zeros(output_size)

defpredict(self,x):forlayerinself.layers.values():x=layer.forward(x)returnx

defloss(self,x,t):y=self.predict(x)returnself.lastLayer.forward(y,t)

defaccuracy(self,x,t):y=self.predict(x)y=np.argmax(y,axis=1)#预测类别

ift.ndim!=1:t=np.argmax(t,axis=1)#正确类别

accuracy=np.sum(y==t)/float(x.shape[0])returnaccuracy

defnumerical_gradient(self,x,t):loss_w=lambdaw:self.loss(x,t)grads={}forkeyinself.params:grads[key]=self.numerical_gradient(loss_w,self.params[key])returngrads

defgradient(self,x,t):#前向传播

self.loss(x,t)

#反向传播#保存各层

self.layers=OrderedDict()self.layers['Affine1']=Affine(self.params['W1'],self.params['b1'])self.layers['ReLU1']=ReLU()self.layers['Affine2']=Affine(self.params['W2'],self.params['b2'])

#最后一层

self.lastLayer=softmaxWithLoss()

dout=self.lastLayer.backward()layers=list(self.layers.values())layers.reverse()#反向传播需要从后往前

forlayerinlayers:dout=layer.backward(dout)

#保存梯度

grads={}grads['W1']=self.layers['Affine1'].dWgrads['b1']=self.layers['Affine1'].dbgrads['W2']=self.layers

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论