《Deep Learning with Python》第三章 3.1 走进神经网络之神经网络剖析

327 阅读7分钟
原文链接: bigdata-ny.github.io

《Deep Learning with Python》第三章 3.1 走进神经网络之神经网络剖析

发表于

第三章 走进神经网络

本章涉及的知识点:

  • 神经网络核心组件

  • 开始Keras之旅

  • 组建深度学习工作站

  • 使用神经网络解决基本的分类和回归问题

    本章开始使用神经网络解决实际问题。巩固第二章中的示例,并应用学到的知识解决三类问题,其可以覆盖最常见三类神经网络场景:二值分类,多分类和线性回归。

    本章将仔细讲解第二章涉及的神经网络核心组件:layer,网络,观察函数和优化器。接着快速的过一下Keras,其是本章通篇使用的Python深度学习库。组建支持TensorFlow、Keras和GPU的深度学习工作站。然后将着重深挖使用深度学习解决三个实际问题:

    • 影评分类(好评或者差评,二分类)
    • 路途社新闻主题(多分类)
    • 预估房价(回归)

    本章之后,你会使用神经网络解决简单的机器学习问题,比如,分类问题和回归问题。你将在第四章开始建立更有原则性、理论驱动的理解机器学习。

    3.1 神经网络剖析

    训练神经网络模型绕不开下面的对象:

    • Layer:layer可以组成一个网络(network)或者模型(model)
    • 输入数据和相应的目标
    • 损失函数:损失函数定义深度学习中的反馈信号
    • 优化器:优化器决定深度学习的行进

    如图3.1所示,可视化上述对象间的交互:网络是由多个layer联结组成的,将输入数据映射到输出的预测数据。损失函数则比较预测值和目标的差值,意即损失值。优化器最小化损失函数来调整网络权重。

    image

    图3.1 网络、layer、损失函数和优化器之间的关系

    下面详细介绍网络、layer、损失函数和优化器。

    3.1.1 Layer:深度学习的基础组件

    神经网络的基础数据结构是layer,其在第二章中有提到。layer是将一个或者多个输入张量转换成一个或者多个输出张量的数据处理模块。有些layer是无状态的,但是更多的layer是带状态的:layer的权重,该权重是由随机梯度下降学习的一个或者几个张量,它们包含网络的知识(knowledge)。

    不同的张量格式和数据类型需要不同的layer进行数据处理,比如,简单的向量数据存储成形状为(样本,特征)的2D张量,它经常用致密的全联接层(也称为全联接层或者致密层,Keras中的Dense类)处理。序列数据存储成形状为(样本,时间戳,特征)的3D张量,使用循环神经网络层(recurrent layer,比如,LSTM layer)处理。图片数据存储成4D张量,常用2D卷积层(Conv2D)处理。

    Layer犹如深度学习的“乐高积木”,Keras通过剪辑拼接兼容的layer来构建深度学习模型,从而形成数据转换的管道。这里layer的兼容性特指:每类layer只接受一定形状的输入张量,返回一定形状的输出张量。下面看个具体的例子:

    from keras import layers
    layer = layers.Dense(32, input_shape=(784,))
    

    上面的例子中,创建一个只接受2D张量的layer,该2D张量的第一个维度是784(轴0,batch维度并没有指定,因此它可以接受任意值)。该layer返回第一个维度是32的张量。

    因此,这个layer联结的下游layer是以32维的向量为输入。使用Keras时无需担心layer的兼容性,因为加入到模型的layer会自动适配上一layer的形状。例如,下面的代码:

    from keras import models
    from keras import layers
    model = models.Sequential()
    model.add(layers.Dense(32, input_shape=(784,)))
    model.add(layers.Dense(32))

    其中第二个layer没有输入形状的参数,但是它可以自动推导其输入张量的形状是前一个layer的输出张量的形状。

    3.1.2 模型:层的网络(networks of layers)

    深度学习模型是一个有向无环图。最常见的例子是layer的逐层排列、线性连接,将单个输入映射到单个输出。

    继续深究,你会发现更多种网络拓扑的变种。下面是一些常用的网络拓扑:

    • Two-branch网络
    • Multihead网络
    • 感知机

    网络组成的拓扑定义了假设空间(hypothesis space)。你可能还记得第一章中机器学习的定义:在预定的可能空间中,基于反馈信号寻找输入数据集的有效的表示。选定了一个网络拓扑,意味着限制了一系列张量操作的可行性空间(假设空间)。为权重张量搜索一组合适的值,将输入数据映射到输出数据。

    挑选正确的网络结构更像是一个艺术活,而不是一种科学。虽然有一些最佳实践和基本原则貌似可以依赖,但是实际上只有不断地实践才能帮你成为合适的神经网络架构师。后面几个章节将会教你明确的原则构建神经网络,帮你塑造直面问题的直觉。

    3.1.3 损失函数和优化器:掌控学习的进度

    一旦网络定义好,接着迫在眉睫的是以下两件事:

    • 损失函数(观察函数):模型训练中损失函数值最小化,意味着任务的成功;
    • 优化器:决定基于损失函数的神经网络如何迭代。它一般是随机梯度下降(stochastic gradient descent,SGD)的某种变体。

    有多路输出的神经网络可能有多个损失函数(每路输出一个损失函数)。而梯度下降的过程必须基于单个标量损失值;所以,对于多损失函数的网络,所有损失函数被组合(一般通过平均)成单个标量值。

    选择好正确的观察函数对于解决问题来说是至关重要的:你的网络尽可能找到最小化损失的捷径。所以,如果观察函数不能很好的与任务的成功相关联,那网络迭代结束并不会得到预想的结果。记住所有的神经网络都是最小化损失函数。

    幸运地是,对于常见问题(比如分类、回归、序列预测),有些简单的指导原则来选择正确的损失函数。例如,二分类问题采用二值交叉熵损失,多分类问题采用分类交叉熵,回归问题选取均方误差,序列化学习问题选择联结时序分类(connectionist temporal classification,CTC)损失,等等。只有当你遇到完全新的问题,才需要开发自定义的观察函数。后面几章将会详细的阐述哪类问题选择哪种损失函数。

未完待续。。。

Enjoy!

翻译本书系列的初衷是,觉得其中把深度学习讲解的通俗易懂。不光有实例,也包含作者多年实践对深度学习概念、原理的深度理解。最后说不重要的一点,François Chollet是Keras作者。声明本资料仅供个人学习交流、研究,禁止用于其他目的。如果喜欢,请购买英文原版。


侠天,专注于大数据、机器学习和数学相关的内容,并有个人公众号:bigdata_ny分享相关技术文章。

若发现以上文章有任何不妥,请联系我。

image

《Deep Learning with Python》第二章 2.2 神经网络的数据表示 《Deep Learning with Python》第三章 3.2 走进神经网络之Keras简单入门