[深度学习入门]基于Python的理论与实现


一、前言

  本文是本人在认真学习完[日]斋藤康毅所著《深度学习入门-基于Python的理论与实现》(因为封面上有条鱼,以下皆用《鱼书》代称之)后的学习心得与体会。至于为什么要把写成文字记录下来呢,一是为了我后续的学习方便快速地回忆之前的知识点,一是为了给同样在学习这本《鱼书》的朋友们提供一些帮助。


二、概述

  该书一共包含八个章节,暂且把它分成三大部分,分别涉及到:
  部分一:Python入门、感知机
  部分二:神经网络、神经网络的学习、误差反向传播法、与学习相关的技巧(我觉得部分二是其精华所在)
  部分三:卷积神经网络、深度学习


三、正文部分

第一章:Python入门

  该章节主要介绍了Python基础内容,从Python的安装到Python基础的语法介绍,再到机器学习、深度学习中常用库:Numpy(用于数据的高效计算)、Matplotlib(用于图形的绘制)的介绍。
  可以选择安装Anaconda,它会自动安装一个基本的python,该python下已经装好了一大堆工具包,之后用到的超过一半的包不需要额外再去从pip上安装,之后也可以通过Anaconda下载一些第三方库


第二章:感知机

  感知机是神经网络的起源算法。
  感知机接收多个输入信号(x1、x2 …),输出一个信号(只有1/0两种取值)。不同的输入信号对应不同的权重(w1、w2 …),当接收的信号总和(w1x1+w2x2 …)大于某个阈值(θ)时,才会输出1
在这里插入图片描述
在这里插入图片描述
  用于调整输出信号为1的程度的阈值θ挪到公式左边,把(-θ)用b代替,通常叫做偏置
在这里插入图片描述
  可以利用感知机构建逻辑电路
  与门:仅在两个输入均为1时输出1,否则输出0。感知机构建条件很多,比如:(w1, w2, θ) = (0.5, 0.5, 0.7)。
  与非门:跟与门相反,仅在两个输入均为1时输出0,否则输出1。感知机构建条件很多,比如:(w1, w2, θ) = (-0.5, -0.5, -0.7)。
  或门:只要有一个输入信号是1,输出就为1。感知机构建条件很多,比如:(w1, w2, θ) = (1, 1, 0.7)。
  然而单层感知机无法实现异或门(仅当两个输入中的一方为1时,才会输出1)。
在这里插入图片描述
  将上图转换为下图:
在这里插入图片描述
  感知机的局限性就是它只能表示由一条直线分割的空间(线性空间)。y用○表示0,△表示1。感知机就是一条分割○△的直线。
在这里插入图片描述
  要分开上图的○△,只能使用曲线分割出非线形空间
  叠加感知机的层数可以来表示异或门。
在这里插入图片描述
在这里插入图片描述
  与门、与非门、或门均为单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机
  通过叠加层(加深层),感知机能进行更加灵活的表示(能够进行非线性的表示


第三章:神经网络

  神经网络和感知机最大的区别,其实就是激活函数不同。
在这里插入图片描述
  上图就是一个简单的神经网络,最左侧一列为输入层,最右侧一列为输出层,中间一列为中间层(隐藏层)
  几种激活函数:
  阶跃函数:随着输入函数不同,在阈值处发生急剧性的变化。感知机的激活函数就是它。
在这里插入图片描述
  sigmoid函数:输出随着输入发生连续性的变化。
在这里插入图片描述
  sigmoid函数的平滑性对神经网络的学习具有重要意义。
  相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731 、0.880等实数
在这里插入图片描述
  ReLU函数:在输入大于0时,直接输出该值;在输入小于等于0时,输出0。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  上述几种激活函数的代码实现(common/functions.py):
在这里插入图片描述
在这里插入图片描述


第四章:神经网络的学习

  通常要解决某个问题时,人们习惯以自己的经验和直觉来分析问题找出规律,然后反复试验推进。
  “学习”是指从训练数据中自动获取最优权重参数的过程
  机器学习在前期收集问题的各项特征数据,用模型从数据中发现答案,争取避免人为介入。
  深度学习在数据收集上(比如选/不选哪些特征的数据)较之机器学习更能避免人为介入。
在这里插入图片描述
  神经网络的学习目标是寻找权重参数的最优值,在学习的过程需要有数值类指标来表示当前的状态
  通常,我们用损失函数来作为这个指标。损失函数表示神经网络当前的性能与最优目标的差距,一般用均方误差和交叉熵误差等。
  均方误差
在这里插入图片描述
  (yk表示神经网络的输出,tk表示训练数据,k表示数据的维度)
  交叉熵误差
在这里插入图片描述
  (log表示以e为底数的自然对数(ln)。yk是神经网络的输出,tk是正确解标签。并且,tk中只有正确解标签的索引为1,其他均为0(one-hot表示)。因此,上式实际上只计算对应正确解标签的输出的自然对数)
  上述几种损失函数的代码实现(common/functions.py):
在这里插入图片描述
  mini-batch学习
  不管是机器学习还是神经网络学习,在遇到要处理的训练数据量在万级以上的时候,如果以全部数据为对象求损失函数的和,计算过程太长。因此,从全部数据中随机选出多个小批量数据,作为全部数据的近似,然后对这几个批次的数据进行训练,这种方式称为mini-batch学习。
  为何要设定损失函数
  学习的目标是获得使识别精度尽可能高的神经网络,为什么不直接把识别精度作为指标,而是要另外引入损失函数呢?
  这里需要考虑导数的连续性问题。假设某个神经网络正确识别出了100个训练数据中的32个,识别精度为32%,以识别精度为指标的话,微调参数,识别精度不会有反应,即使有反应也是不连续地、突然地变化(类似于阶跃函数)。
  在参数变化而精度不变的阶段,参数的导数为0,神经网络无法进行学习。
  梯度
  在神经网络的学习中,寻找最优参数(权重和偏置)时,要寻找使损失函数的值尽可能小的参数。为此需要计算参数的导数,并以这个导数为指引,逐步更新参数的值。
  由全部变量的偏导数汇总而成的向量称为梯度
  梯度法
  虽然梯度的方向并不一定指向最小值(可能指向局部极小值或者鞍点),但是沿着梯度方向能够最大限度地减小损失函数的值,所以以梯度信息为线索,作为最小值位置的寻找方向。函数的取值沿着梯度方向前进一定距离后重新计算梯度,再沿着新梯度方向前进的过程就是梯度法。
在这里插入图片描述
  经过对x、y轴求偏导后为:
在这里插入图片描述
  神经网络的学习步骤
  前提
  神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为“学习”。神经网络的学习分成下面4个步骤。
  步骤1(mini-batch)
  从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值
  步骤2(计算梯度)
  为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
  步骤3(更新参数)
  将权重参数沿梯度方向进行微小更新
  步骤4(重复)
  重复步骤1、步骤2、步骤3。


第五章:误差反向传播法

  在之前的内容中,我们介绍了神经网络的学习,同时在更新损失函数关于权重梯度的时候,使用了微分计算。该方法虽然容易实现,但是在计算过程中比较消耗时间。如何去高效的计算权重数梯度?此时就必须通过误差反向传播实现。
  计算图求解的优势:
  优势一:计算图可以集中精力于局部计算。无论全局的计算有多么复杂,各个步骤所要做的就是对象节点的局部计算。通过局部计算,最后求出最优解。
  优势二:利用计算图可以将中间的计算结果全部保存起来,通过反向传播高效计算导数
  计算图:
在这里插入图片描述
在这里插入图片描述
  上图中,“从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation)。正向传播是从计算图出发点到结束点的传播。
  既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左)的传播。实际上,这种传播称为反向传播(backward propagation)。
在这里插入图片描述
在这里插入图片描述
  通过链式法则计算得:
在这里插入图片描述
  a. 加法节点的反向传播
加法节点的反向传播只是将输入信号直接输出到下一个节点。
在这里插入图片描述
  形如:
在这里插入图片描述
  b. 乘法节点的反向传播
乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游。
在这里插入图片描述
  形如:
在这里插入图片描述

不同层中误差反向传播介绍

a. 激活函数-ReLU层

在这里插入图片描述
在这里插入图片描述

b. 激活函数-Sigmoid层

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

c. Affine层

  神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿射变换”。因此,这里将进行仿射变换的处理实现为“Affine层”。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

d. Softmax-with-Loss层

  Softmax层将输入值正规化(将输出值的和调整为1)之后再输出。
  Softmax层中的误差反向传播也包含作为损失函数的交叉熵误差(cross entropy error),所以称为“Softmax-with-Loss层”。其简易计算图如下:
在这里插入图片描述

神经网络学习全貌图(包含反向传播版):

  前提
  神经网络中有合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为学习。神经网络的学习分为下面4个步骤。
  步骤1(mini-batch)
  从训练数据中随机选出一部分数据。
  步骤2(计算梯度)
  计算损失函数关于各个权重参数的梯度。(该步骤中实现误差反向传播法
  步骤3(更新参数)
  将权重参数沿梯度方向进行微小更新
  步骤4(重复)
  重复步骤1、步骤2、步骤3。


第六章:与学习相关的技巧

  权重参数的更新
  训练神经网络的目的是找到使损失函数的值尽可能小的参数。寻找最优参数的过程称为最优化(optimization)。因为参数空间非常复杂,所以无法通过数学式一下子求出最小值。在前几章中,我们曾将参数的梯度(导数)作为寻找最优参数的线索。下面将介绍SGD、Monmentum、AdaGrad和Adam四种常见的最优化方法。

a. SGD

  使用参数的梯度,沿着梯度方向更新参数,重复该步骤多次,从而逐渐靠近最优参数,这个过程称为随机梯度下降法(stochastic gradient descent),简称SGD。
在这里插入图片描述
  (这里把需要更新的权重参数记为 W,而η 表示学习率,实际上会取 0.01 或 0.001 这些事先决定好的值。式子中的← 表示用右边的值更新左边的值。)
  SGD虽然简单且容易实现,但是在解决某些问题时可能没有效率。在具体说明缺点之前,我们先来思考求函数:f(x, y) = 1/20 * x^2 + y^2的最小值问题。注意此处的x平方较于y平方前面除以20,即x轴方向的梯度比y轴方向的要平缓很多
在这里插入图片描述
  SGD的缺点就在于,如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。其根本原因是梯度的方向没有指向最小值的方向
在这里插入图片描述

b. Momentum:

  Momentum是“动量”的意思,和物理相关。
  这里新出现的变量v,对应物理上的速度。式(6.3)表示物体在梯度方向上受力,在力的作用下速度增加,类似于小球在地面上滚动。式(6.3)中的αv,在物体不受任何力时,承担使物体逐渐减速的任务(α设定小于1大于0的值),对应物理上的摩擦力或空气阻力。
在这里插入图片描述
  x 轴方向上一直受同一方向的力,y轴方向上,像小球在碗中滚动一样,从高处滚动底处再到高处,交互地受到正反两个方向的力,所以y轴方向上的速度不稳定。和SGD相比,减弱了“之”字形的变动程度
在这里插入图片描述

c. AdaGrad

  在神经网络的训练中,过小的学习率会导致训练时间长,过大的学习率会导致网络不能收敛、在最优值附近徘徊。实际上,一开始“多” 学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。AdaGrad会为参数的每个元素适当调整学习率,同时进行训练。
在这里插入图片描述
  这里出现的新变量h保存了以前的所有梯度值的平方和。在更新W时学习率η除以h的开根号,意味着参数的元素中变动较大的元素的学习率将变小(抑制震荡)
  由于y 轴方向上的梯度较大,因此刚开始变动较大,但是后面会根据这个较大的变动按比例进行调整,减小更新的步伐。因此,y 轴方向上的更新程度被减弱,“之”字形的变动程度有所衰减。
在这里插入图片描述

d. Adam

  Adam方法的基本思路更像是融合Momentum和AdaGrad二者的优点,此外还进行了超参数的“偏置校正
在这里插入图片描述

权重参数的初始值

  权重初始化的目的是防止神经网络的正向传播过程中层激活函数的输出损失梯度出现爆炸或消失。如果发生任何一种情况,损失梯度太大或者太小,都无法有效向后反传,即便可以反向传播,神经网络也需要花更长的时间来达到收敛。
  为了提高模型的泛化能力,我们采用一个技巧是权值衰减(weightdecay),即以减小权重参数的值为目的进行学习的方法。
  但初始值不可以设为0,因为那样由于参数相同以及输出值都一样,不同的节点根本无法学习到不同的特征,这样就失去了网络学习特征的意义了。
  严格地说,初始值设成一样的值的时候都会出现这种问题,所以必须随机生成初始值
在这里插入图片描述
在这里插入图片描述
  Xavier初始值的特点是:与前一层有n个节点连接时,初始值使用标准差为(1/n)的开根号的分布。使用Xavier初始值后的结果如上图所示。从这个结果可知,越是后面的层,图像变得越歪斜(tanh函数作为激活函数的时候能改善),但是呈现了比之前更有广度的分布。
  当激活函数使用ReLU时,一般推荐使用ReLU专用的初始值,也就是KaimingHe等人推荐的初始值,也称为“He初始值”。He初始值的特点是:与前一层有n个节点连接时,初始值使用标准差为(2/n)的开根号的分布。
在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TJUTCM-策士之九尾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值