深度学习原理学习3:神经网络学习

深度学习原理学习3:神经网络学习

本文是深度学习原理的学习笔记,是作者学习斋藤康毅的《深度学习入门-基于Python的理论与实现》中产生的感悟和笔记。

学习过程的对比

普通程序,机器学习与神经网络的学习过程有所不同,大致可以分为如下算法:

在这里插入图片描述

对于普通程序来说,程序员需要手动从数据中找寻规律,并将规律编为算法输入到程序中,让程序能根据固定的算法找到答案,典型事例如眨眼算法,面部识别等。机器学习不需要人类去寻找规律,但仍需要人们提供某种特征量。比如时钟的角度等,边界的形状等。而在神经网络中,连图像中包含的重要特征量也都是由机器来学习的。神经网络的特征就是可以从数据中学习。所谓“从数据中学习”,是指可以由数据自动决定权重参数的值。

神经网络的优点是对所有的问题都可以用同样的流程来解决。比如,不管要求解的问题是识别 5,还是识别狗,抑或是识别人脸,神经网络都是通过不断地学习所提供的数据,尝试发现待求解的问题的模式。也就是说,与待处理的问题无关,神经网络可以将数据直接作为原始数据,进行“端对端”的学习。

这里所说的端到端是指从一端到另一端的意思,也就是从原始数据(输入)中获得目标结果(输出)的意思。

建立数据集

在机器学习中,一般将数据分为训练数据和测试数据两部分来进行学习和实验等。模型首先使用训练数据进行学习,寻找最优的参数,随后使用测试数据衡量模型的实际能力。之所以将数据分为训练数据和测试数据,是因为模型不止要对训练的数据进行计算,而是对类似于训练数据的所有同类型数据进行计算,这也被称为模型的泛化能力。检测模型的泛化能力,自然就不能使用与训练时相同的数据,正如考核学生的能力时不能使用书上的原题。

因此,仅仅用一个数据集去学习和评价参数,是无法进行正确评价的。这样会导致可以顺利地处理某个数据集,但无法处理其他数据集的情况,只对某个数据集过度拟合的状态称为过拟合 (over fitting)。

损失函数

仅靠神经网络,优化参数时模型并不知道如何进行优化,它必须以某个指标为线索寻找最优权重参数。神经网络的学习中所用的指标称为损失函数 (loss function) 。损失函数是表示神经网络性能的“恶劣程度”的指标,它的结果是损失值,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。这个损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等。

均方误差如下所示:
E = 1 2 ∑ k ( y k − t k ) 2 E=\frac{1}{2}\sum_k(y_k-t_k)^2 E=21k(yktk)2
交叉熵误差如下所示:
E = − ∑ k t k log ⁡ y k E=-\sum_kt_k\log y_k E=ktklogyk
其中,k指输出的维度, t k t_k tk指正确的监督数据, y k y_k yk指神经网络的输出。对于上述两种损失函数,当神经网络的输出与监督数据越接近时,损失函数的输出越小,当神经网络的输出与监督数据越远时,损失函数的输出越大。

为什么引入损失函数,而不是直接使用精度作为指标优化参数?

通俗来说,假设神经网络对100则数据进行分类,并成功进行了32则数据的分类工作。对于神经网络内的某参数来说,改变该参数影响准确度的结果较小,可能更改参数后仍只能进行32则数据的成功分类,模型既无法得知参数是否被优化,也无法得知优化的方向是否正确。而使用误差函数,神经网络的指标不再是离散的,而是连续的,只需要一点点变化就能改变损失值。

究其数学原理,在神经网络的学习中,寻找最优参数(权重和偏置)时,要寻找使损失函数的值尽可能小的参数。为了找到使损失函数的值尽可能小的地方,需要计算参数的导数(确切地讲是梯度),然后以这个导数为指引,逐步更新参数的值。精度的变化本质上是离散的,精度值会在参数更改中跳跃,因此参数在大部分变换时导数均为0,神经网络无从得知参数优化的方向和速度。而对于损失函数,对该权重参数的损失函数求导,表示的是“如果稍微改变这个权重参数的值,损失函数的值会如何变化”。如果导数的值为负,通过使该权重参数向正方向改变,可以减小损失函数的值;反过来,如果导数的值为正,则通过使该权重参数向负方向改变,可以减小损失函数的值。

在对参数进行求导时,如果导数为0,则参数无法进行更新。但如果使用 sigmoid 函数等激活函数,不仅函数输出连续变换,函数本身的切线斜率也处处不为0。如下图所示。黑线表示 sigmoid 函数曲线,灰线表示在交点位置的切线。

在这里插入图片描述

换言之,使用 sigmoid 函数后,参数的导数不会为0,这个性质使神经网络的学习得以正确进行。

引入mini-batch

对单个数据计算损失值,只会反应模型对该数据的误差。要反应神经网络在整个训练数据中的学习,就必须把整个训练数据进行作为计算损失函数值的对象,最后再除以训练数据个数,就能得到单个数据的平均损失函数。通过这样的平均化,可以获得和训练数据的数量无关的统一指标。

但是,部分数据集数量多,这种情况下以全部数据为对象计算损失函数需要花费较长的时间,因此,我们从全部数据中随机选出一部分,作为全部数据的“近似”,称为mini-batch,然后对每个mini-batch进行学习,这种学习方式被称为mini-batch学习。

梯度法

对于一元函数而言,对函数进行求导可解得函数变化的方向和速度。对于多元函数而言,对单一变量进行求偏导表示函数值随该变量改变的方向和速度。由全部变量的偏导数汇总形成的向量称之为梯度,梯度的方向是在多元函数的超空间域中函数值下降最快的方向,梯度的模表示函数值变化的大小。对于函数 f ( x 0 , x 1 ) = x 0 2 + x 1 2 f(x_0,x_1)=x_0^2+x_1^2 f(x0,x1)=x02+x12而言,梯度的可视化展示如下图所示:

在这里插入图片描述

机器学习的主要任务是在学习时寻找最优参数。同样地,神经网络也必须在学习时找到最优参数(包括权重和偏置)。这里所说的最优参数是指损失函数取最小值时的参数。但是,一般而言,损失函数很复杂,参数空间庞大,我们不知道它在何处能取得最小值。而通过巧妙地使用梯度来寻找函数最小值(或者尽可能小的值)的方法就是梯度法。

需要注意的是,梯度不一定指向全局最优点,大多数情况下梯度指向的是局部最优点。当学习率较小时,模型参数可能会困在局部最优点从而无法进一步优化。这时需要使用特殊方法越过局部最优点。

采用数学式来表示梯度法,如下所示:
w i ′ = w i − η ∂ f ∂ w i w_i' = w_i-\eta\frac{\partial f}{\partial w_i} wi=wiηwif
其中, w i w_i wi表示第i个权重原始值, w i ′ w'_i wi表示更新后的权重值。 η \eta η表示更新量,在神经网络中称为学习率。学习率表示在一次学习中,应该学习多少,以及多大程度上更新参数。 f f f表示损失函数值, ∂ f ∂ w i \frac{\partial f}{\partial w_i} wif表示权重对损失函数的偏导数值,如果该值是正数,表示当权重增加 a a a时,损失值将增加 ∂ f ∂ w i a \frac{\partial f}{\partial w_i}a wifa,换言之,想要损失值减小,我们应当对权重进行负方向更新,更新值为 η ∂ f ∂ w i \eta\frac{\partial f}{\partial w_i} ηwif​。

神经网络的学习过程

神经网络的学习步骤如下所示:

1. mini-batch

从训练数据中随机选出一部分数据,这部分数据称为 mini-batch。我们的目标是减小 mini-batch 的损失函数的值。

这个方法通过梯度下降法更新参数,不过因为这里使用的数据是随机选择的 mini-batch 数据,所以又称为随机梯度下降法 (stochastic gradient descent,SGD)。

2. 计算梯度

为了减少mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示函数的值减小最多的方向。

3. 更新参数

将权重参数沿梯度方向进行微小更新。

神经网络的学习就是不断重复这3个步骤,直至达到指定轮数或某指标达到某一数值。梯度的计算有两种方法,一种是传统的数值微分法,另一种是深度学习技术的核心——误差反向传播法。具体实现将在下一篇进行介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值