基于Python的深度学习理论与实现(P4——神经网络的学习与损失函数)

神经网络的学习

 前面提到了神经网络与感知机的一个重要区别——激活函数。现在介绍神经网络的另外一个精髓——学习。
神经网络的学习指的是从训练数据中自动获得最优权重参数的过程。
 从以上的定义中,我们可以看出神经网络学习中的几个重点。

  • 数据:
     数据是所有机器学习算法中的根本,深度学习当然也不例外,从数据中寻找答案、从数据中发现模式是机器学习算法的根本模式和核心内容。这种以数据为驱动的方式,脱离了过往以人为中心(即人为先验)的各种方法。
  • 权重参数:
     现在,我们有了数据,比如有了一百万张各式各样的手写数字5,让我们设计一个能够将数字5正确分类的程序该怎么办?这对人来说是件非常容易的事情,而计算机想要将其正确分类却不容易。在图像识别算法里有一些算法可以做到,但是往往会出现精度低、复杂度高、复用度低,而且图像的复杂程度也影响了这些算法的可行性。
     在传统的机器学习算法中,我们先从图像中提取特征量,如SIFT、SURF特征点等,使用这些特征量将图像转换为向量,而后对转换后的向量使用机器学习中的算法进行学习,而后再对其他。但是,将图像转换为向量时使用的特征量仍然是人为设计的,对于不同的问题,不同的特征量会造成不同的结果。
     而在神经网络中,这些重要的特征量也是可以学习的;除了连接权重和偏置外,还有如图像中的卷积参数等,都是可以学习的权重参数。
  • 最优
     深度学习是端到端的机器学习,即从原始数据中获得目标结果。前面也提到了深度学习中分类与回归的特征量都是通过学习来实现的,而这个学习的过程也就是一个寻找最优的过程,即一个最优化的过程。
     了解过最优化的都会了解一个寻找最优的过程免不了损失函数、微积分、梯度等知识。接下来我们就先从损失函数说起,不过在此之前,不得不先对数据进行分类。

训练集与测试集

 机器学习中一般将数据分为训练数据和测试数据两部来进行。
 首先,使用训练数据(这部分数据集称为训练集)进行学习,寻找最优参数,另外,训练数据往往也被称为监督数据(这个称呼似乎更常用);然后使用测试数据(这部分数据称为测试集)对得到的模型进行评价。
 为什么需要将数据分为训练数据和测试数据呢?
 因为我们追求的是模型的泛化能力,即当新的数据作为输入时模型能够对新数据做出准确预测的能力,因此,必须划分训练集和测试集。
 为了防止过拟合过拟合,往往会进行三级划分,即不仅仅将数据集分为训练集与测试集,而是以6:2:2的比例将数据分为训练集、验证集以及测试集。不过我们这里先不介绍有关验证集的内容。
 无论训练集还是测试集,都是以<feature,label>——数据和标签的形式,即不仅仅有数据,还有标记数据的标签。在训练过程中,使用训练集,比如给定一张手写的5的图像,这个图像就是数据,还要给出这个数据结果应该是数字5,那么通过神经网络向前传播的结果与数据标签的“差”就可以作为模型的评估依据。
 在训练过程结束后,在评估阶段我们可以使用测试集中的数据给整个模型做出一个评分,这个过程就是一个非学习的过程了。
 整个过程就像初高中做练习卷,我们平时会买一些练习卷来做模拟,一份空白的卷子可以认为是一个训练集中的一个元素的数据部分,做卷子的过程可以理解为一个向前传播的过程,我们得到了一份做完的卷子,通过将这份卷子与答案对比(答案就是训练集该元素的标签部分),降低我们的理解与正确的知识间的误差,这就是调整神经网络模型参数的过程。通过无数份卷子,我们逐渐调整模型的准确度。终于!考试来临了。考试中的试卷类比为测试集中的数据,这个时候我们无法看到答案(虽然测试集中的数据也有标签,但是如往往深度学习中的测试集是不会公布标签的,这里的标签也仅仅是为了评估而不是学习,就像考试中只有评分老师有卷子的答案而考生没有,或者说测试集和训练集类型相同,但是角度完全不同),此时,会对我们脑中的知识(模型)做一个评分。

损失函数

 神经网络的学习通过某个指标表示当前神经网络的状态,或者说“优劣程度”,即通过当前神经网络的预测结果与监督数据标签做对比然后以当前的状态作为基准寻找最优权重参数,这个指标就是损失函数。损失函数可以使用任意可以准确表达误差的函数,但是一般使用均方误差函数和交叉熵误差函数等;

  • 均方误差:
     数学表达如下:
    E = 1 2 ∑ k ( y k − t k ) 2 E = \frac{1}{2} \sum_{k}^{ }(y_{k}-t_{k})^2 E=21k(yktk)2
    其中,yk表示神经网络的输出结果,tk表示监督数据的标签,k表示数据维度。
     比如在手写数字识别的例子中,
y = np.array([0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0])
t = np.array([0,0,1,0,0,0,0,0,0,0])

其中,t是one-hot表示,即,只有正确结果表示为1,其他表示为0,所以能够看出这张图片实际上是手写的2。
 y表示softmax的输出,可以理解为这张图像为手写0的概率为10%、为手写1的概率为5%, … ,而概率最高(即这张图通过神经网络预测的最可能的结果)是图像为手写2的概率——60%,即我们可以认为神经网络将这种图片分类为手写2。
 那么这个结果是否正确呢?从分类结果看来,是正确的,但是从神经网络学习的学习需求来看,“正确”或是“不正确”是远远不够我们进行学习的。那么此时,我们使用均方误差:

import numpy as np

def meanSquared(y,t):
    return 0.5 * np.sum((y-t)**2)

if __name__ == "__main__":
    y = [0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0]
    t = [0,0,1,0,0,0,0,0,0,0]
    print(meanSquared(np.array(y),np.array(t)))

以上输出结果为0.0975,这个0.0975表示的是,预测结果与正确结果的误差,均方误差实际上就是我们常见的欧式距离。

  • 交叉熵误差
     除了均方误差之外,交叉熵误差(cross entropy error)也常常被用做损失函数,其数学表达如下:
    E = − ∑ k t k l o g y k E= -\sum_{k}^{ }t_klogy_k E=ktklogyk
    其代码实现为:
def crossEntropy(y,t):
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))
if __name__ == "__main__":
    y = [0.1,0.05,0.6,0.0,0.05,0.1,0.0,0.1,0.0,0.0]
    t = [0,0,1,0,0,0,0,0,0,0]
    print(crossEntropy(np.array(y),np.array(t)))

其中的delta是一个极小值,为了方式y中的值出现0而导数数值溢出。
以上代码输出结果为:0.510825457099
 那么接下来怎么办?我们不满足与神经网络的预测结果是正确或是不正确(因为这将使得优化过程失去可导性和光滑性而造成难以进行优化的情况),得到了一个实数的结果,这个结果以某一个方式来表现了预测结果与正确结果的误差,那么应该有一个最优权重参数使得这个误差最小,那么我们就要最小化这个误差,如果有一百个数据,我们就要最小化这一百个误差的和,即将一个数据集的误差和作为一个训练目标。这就是神经网络学习中通用的方法——mini-batch学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值