深度学习基础

目录

  • *深度学习基础*
    • 《第一节 深度学习简介》
      • 一、深度学习与机器学习区别
      • 二、神经网络简介
        • 2.1 单神经元网络
        • 2.2 多神经元网络
    • 《第二节 神经网络基础》
      • 一、数据矩阵化
        • 1.1 惯例符号
        • 1.2 表示方法
      • 二、激活函数与损失函数
        • 2.1 激活函数
        • 2.2 损失函数
          • 2.2.1 损失函数的定义 (均方误差)
          • 2.2.2 损失函数的优化 (对数似然)
      • 三、梯度下降
        • 3.1 梯度下降简介
        • 3.2 梯度下降原理
    • 《第三节 浅层神经网络》
      • 一、神经网络的表示
        • 1.1 神经网络分层说明
        • 1.2 激活值
      • 二、浅层神经网络的正、反向传播
        • 2.1 正、反向传播概念
        • 2.2 逻辑回归中的正向传播
        • 2.3 浅层神经网络中的正向传播
        • 2.4 逻辑回归中的反向传播
      • 三、参数初始化
        • 3.1 权重初始化为零的后果
        • 3.2 参数的随机初始化
      • 四、非线性激活函数
        • 4.1 引入非线性激活函数原因
        • 4.2 Sigmoid函数的两个缺点
        • 4.3 ReLU函数
      • 五、总结

《第一节 深度学习简介》

一、深度学习与机器学习区别

深度学习作为机器学习的子领域,自2012年以来已经在诸多领域取得了突破性成果。与机器学习需要复杂的特征工程不同,深度学习将特征提取和分类整合到神经网络中去完成,通过模型训练大量数据实现“端到端”得出结果的方式。因此深度学习可以让非专业人士将其应用于难以进行特征提取的领域,例如图像、语音等。

二、神经网络简介

2.1 单神经元网络

假设有一个包含六间房屋的数据集:特征值为房屋面积、目标值为房屋价格。现在需要找到一个函数根据房屋面积预测目标房价。假如利用线性回归可以通过找到一条直线去拟合两者间的关系,其实这就是一个最简单的神经网络(单神经元网络)。将房屋面积作为神经网络的输入(将输入用X表示),通过计算输出价格(将输出用Y表示),如下图:

上图是一个独立的神经元结构,所做的就是对输入的面积完成线性运算,输出不小于0的值(一般通过激活函数实现,后续介绍),即预测价格。逻辑回归算法可理解为一个单神经元网络。

2.2 多神经元网络

多神经元网络就是由单神经元堆叠形成。假如现在不仅仅通过房屋面积预测房屋价格,还通过卧室数量(bedroom)、邮编(zip code)、人民富裕程度(wealth)来进行预测。其中房屋面积和卧室数量决定家庭人口,邮编决定步行路程,邮编和人口赋予程度决定附件学校的质量。而家庭人口数量、步行路程、附件学校质量决定房价。如下图:

上述例子中:X是四个输入,Y是预测价格,中间的预测器由众多神经元叠加形成,这些神经元被称为隐藏单元,这就是一个简单的神经网络。

《第二节 神经网络基础》

一、数据矩阵化

1.1 惯例符号

用一对(x, y)来表示一个单独的训练样本,其中 x 是 nx 维的特征向量,y为目标值(0或1,二分类情况)。设一个训练集是由m个训练样本组成,用( x(1),y(1))来表示第1个样本(以此类推),在深度学习中,习惯用“(i)”来表示第 i 个样本。用m_train表示训练集样本数,m_test表示测试集样本数。用ypredict表示预测目标值,ytrue是样本的真实目标值。

1.2 表示方法

用大写的 X 定义一个矩阵,表示训练集:该矩阵是由训练集中的 x(1),x(2)…组成,将 x(1) 放入矩阵第一列、x(2) 放入第二列… x(m) 是第m列,最后得到下图所示的矩阵 X。这个矩阵X有m列(m为样本数),有 nx 行(nx为特征向量x的维度):

这就是如何将训练样本即输入x用矩阵表示的过程。可以用同样的方式将输出的y全部放入矩阵Y中,得到一个1*m的矩阵 Y。

二、激活函数与损失函数

2.1 激活函数

已知输入的一个 nx 维向量 x,权重为 w、偏置为 b,现计算输出预测结果 y:
1)方法一:令激活函数为 g(x) = wx(i)+b = y(线性关系),这是线性回归的预测方式,但并不适用于二分类问题,因为二分类情况下y 的概率应该是介于0-1之间的,而通过 g(x) = wx(i)+b 得到的y值可能不止于0-1范围内,这样的概率是没有意义的。
2)方法二:sigmoid作为激活函数,将 “wx(i) + b” 作为sigmoid函数σ的自变量z,得 σ(z)= 1 / [ 1 + e(-z) ] (其中z=wx(i)+b)。由sigmoid函数表达式可知,当z趋于正无穷时,e(-z) 接近于0,σ(z)接近于1。由sigmoid函数图像 (如下图) 也可知当自变量趋于无穷大时,函数值无限接近于1。

2.2 损失函数

2.2.1 损失函数的定义 (均方误差)

现有一个含 m 个样本的训练集,希望找到参数 w 和 b,使得 y predict 尽可能接近于真实值 y true。需要构造一个损失函数用于衡量算法的运行情况,将损失函数定义为:L = [ (y predict-y true)2 ] / 2。由公式可知,损失函数可以衡量预测值与真实值的接近程度。但在逻辑回归中一般不将损失函数定义成“做差取平方”的形式,因为这样会使得模型训练时得到很多个局部最优解,从而导致梯度下降法无法找到全局最优解,所以需要对损失函数进行优化。

2.2.2 损失函数的优化 (对数似然)

y predicty true,将损失函数定义为:L= - [ y true logy predict + (1-y predict)log(1-y true)]。当 ytrue 为1时可以得到 L= -log y predict。为了让损失值最小化,需要让 ypredict 最大,又因为 ypredict 是sigmoid函数作用得到,所以值为0-1。要使log ypredict 最大,ypredict 就需无限接近于1。综上,当 ytrue 为1时,可通过该公式推出ypredict需要无限接近于1才能使损失最小化(当真实目标值y为0时同理,这里不再赘述)。

三、梯度下降

目的:找到使得损失值最小的参数w和b。

3.1 梯度下降简介

如下图,横轴代表参数w和b(实际中w更高维,因为权重与特征数量成正比),成本函数 (可理解为整个数据集上的损失) 值为该曲面,需要找到一组 w 和 b 使得 J 值取最小。可以发现,成本函数是一个凸函数(不同于之前的“做差取平方”的损失函数有多数个局部最优解,成本函数只有一个最优解,这也是逻辑回归使用成本函数的重要原因之一)。找最优的 w 和 b 过程 (梯度下降):首先随机初始化 w 和 b(相当于在函数图像上任意找一点),然后从这个点开始沿着最陡的方向跨一步,以上过程是梯度下降的一次迭代。通过多次这样的迭代,最终收敛到“谷底”的全局最优解。

3.2 梯度下降原理

假设先忽略偏置参数b,只看成本函数 J 与权重 w 的关系,将两者关系量化于坐标系中得到下图。梯度下降方法首先会令 w: = w-α[dJ(w) / dw](使用 : = 表示 w 的更新),不停重复该公式更新 w 直到找到全局最优解(公式中的 α 代表学习率,即梯度下降速率,dJ(w) / dw为求 w 对 J 的偏导数,代表对参数 w 的更新或者变化量)。

公式思想:以函数最低点为分界,以左为左区域,以右为右区域。假设初始 w 值在左区域,那么 w 对应的 J 点处的斜率应该为负,所以该点的导数值为负,那么此时 w-α [dJ(w) / dw] 就相当于 w 减去一个负数,从而导致 w 的更新使得 w 值逐渐增大(逐渐趋向于全局最优解)。同理,当初始 w 在右区域,通过上述分析思路可得 w 的更新会使得w值逐渐减小。所以最终效果是让 w 逐渐收敛于全局最优解。在实际的梯度下降过程中还有参数 b 的参与,原理同上。所以在实际的梯度下降过程中,进行的是下面两个式子:w: =w -α[dJ(w,b)/dw]b: =b -α[dJ(w,b)/db]。通过这两个梯度下降公式不断更新权重 w 和偏置 b 直到找到全局最优解也就是使损失取最小的点。

《第三节 浅层神经网络》

一、神经网络的表示

1.1 神经网络分层说明

下图为一个浅层神经网络示意图:

第一层:包含输入特征的这一层称为神经网络的输入层
第二层:含有多个计算单元这一层称为神经网络的隐藏层
第三层:输出ypredict的层叫做输出层(注:有些神经网络的输出层含有多个输出单元)。
何谓隐藏:在使用监督学习训练神经网络时,我们能看到输入的训练集特征x,也能看到目标输出的预测值ypredict,而介于输入层和输出层之间的这些层里面进行的计算无从得知,所以将这些中间层称之为隐藏层。

1.2 激活值

神经网络中输入特征有一种表示方式为:a[0] = x,其中a代表“激活”的意思,将输入层的激活值记为a[0]。隐藏层同样也会产生激活值,将其记作a[1],例如隐藏层中第一个节点的激活值记为a[1] _1(其它节点以此类推)。每一层的激活值由每一层相对应的激活函数计算得来,每层中激活函数的输入为该层的权重 w 和偏置 b 与上一层的激活值的线性运算得来,例如

二、浅层神经网络的正、反向传播

2.1 正、反向传播概念

正向传播:从输入开始经过层层计算得出每一层的 z 和 a ,最后输出预测值的过程。
反向传播:得到了预测值,就可以根据它和真实值的差别来计算损失。根据损失函数来反方向地计算每一层 z、a、w、b 的偏导数(梯度),从而通过梯度下降公式更新参数。

2.2 逻辑回归中的正向传播


上图是逻辑回归的计算过程,其节点中包含两个计算步骤:计算 z 和 a。而实际上,神经网络只不过将这两个步骤多进行了多次而已。

2.3 浅层神经网络中的正向传播


对于上图这个神经网络:将隐藏层另外三个节点和输出层去除,先只看隐藏层的第一个节点,你会发现看上去与逻辑回归很相似。在第一个节点中同样进行了两步运算:z[1] _1=w[1] _1x+b[1] _1a[1] _1=σ(z[1] _1),其它几个节点同理如下:

2.4 逻辑回归中的反向传播

通过正向传播和反向传播之后,就可以更新w和b,进而更新模型了,即:


浅层神经网络的反向传播原理同上,这里不再赘述。

三、参数初始化

3.1 权重初始化为零的后果

如果将神经网络的权重初始化为0,梯度下降算法将会完全无效,原因如下:

上图神经网络中有两个输入特征、两个隐藏单元,隐层的权重组成的矩阵为W[1],隐层的偏置组成的矩阵为b[1]。假设将W[1]和b[1]初始化为0矩阵,这会导致无论输入任何样本,两个隐藏单元都在做完全一样的运算,得到的激活值a[1] _1和a[1] _2也会是一样的,由对称原则可知在进行反向传播时dz[1]_1和dz[1]_2也是完全相同的,一般称这种情况为 “完全对称”。这会导致每次迭代过后两个隐藏单元仍然在计算相同的函数,那么在多次迭代过后,同样的对称性依然存在。所以无论神经网络训练多少次,两个隐藏单元仍然在计算完全一样的函数。对于有多个输入和多个隐藏单元的神经网络,将W[1]初始化为0矩阵同样会导致上述问题。更一般地说,如果隐层中各隐层单元的权重矩阵都初始化为同一个矩阵(不一定都是0矩阵,只要是同样矩阵),就必会出现“完全对称”

3.2 参数的随机初始化

1)对于W[1]:令W[1] = np.random.randn((2,2)) × 0.01,这可以产生参数为(2,2)的随机分布变量。在后面乘上0.01的目的是将权重初始化为很小的随机数,因为在利用sigmoid或tanh作为激活函数时,权重 w 过大会导致 z 很大(小),从而导致 z 值落在函数图像中斜率较小的部分,从而导致梯度下降非常慢,所以在初始化权重值时,一般在后面乘上0.01。
2)对于b[1]:b完全没有对称性这个问题,所以可以直接将b[1]初始化成0:b[1] = np.zeros((2,1))。将b[1]初始化为0的好处是只要W[1]随机初始化,不同的隐藏单元就在计算不同的函数,而且还简化了函数运算。对于W[2]、b[2]…可同样执行上述参数随机初始化的操作。

四、非线性激活函数

4.1 引入非线性激活函数原因

由正向传播公式可知,假设不用激活函数,即a[1]=z[1](相当于激活函数是f(x) = x),在这种情况下每一层的输出值都是上层输入的特征x的线性组合(这种情况又叫线性激活函数或恒等激活函数),这会导致无论神经网络有多少隐藏层都与没有隐藏层效果一样。例如:令a[1] = z[1]、a[2] = z[2],由a[2] = z[2] = w[2] a[1]+ b[2]可推出:a[2] = w[2] ( w[1] x + b[1]) + b[2] = (w[2] w[1]) x + (w[2] b[1]+ b[2])。可将(w[2] w[1])看作w、 (w[2] b[1]+ b[2])看作b,得a[2] = wx+b(相当于神经网络只是把输入的线性组合再输出)。
正因为上面的原因,决定引入非线性函数作为激活函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入。(注:线性函数是一次函数的别称,则非线性函数即函数图像不是一条直线的函数。只有机器学习的回归问题会将线性函数作为输出层的激活函数)

4.2 Sigmoid函数的两个缺点

(1)激活函数输出需满足zero-centered(以0为中心):Sigmoid函数有一个缺点是函数输出不是以零为中心,那么为什么需要以零为中心的激活函数呢?由于神经网络中每层的激活函数之间的关系是:上一层激活函数的输出作为下一层激活函数的输入。而对于sigmoid函数来说,它的输出始终为正数(非zero-centered),那下一层函数的输入将全部为正数,这就导致了权重w总是关于同一方向变化,从而造成收敛的过程逐渐缓慢。
(2)梯度消失:由tanh函数图像和sigmoid函数图像可知,当 x趋近于无穷大(小)时,函数的斜率(导数)逐渐趋近于0(梯度消失了),这种情况在反向传播求导时会造成信息丢失,从而无法完成深层网络的训练。

4.3 ReLU函数

ReLU函数,全称为Rectified Linear Unit,是神经网络中常用的非线性激活函数,其函数表达式为:f(x) = max(0 , x),函数图像如下:

函数优势:
1)解决了梯度消失的问题 (在正区间)。
2)正反向传播计算速度非常快,只需要判断输入是否大于0。
3)收敛速度远快于sigmoid和tanh。
4)Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
函数劣势:
5)输出不是zero-centered

函数劣势:
Dead ReLU Problem:指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: 1) 错误的参数初始化,这种情况比较少见 2) 学习速率太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。可以通过Leaky ReLU函数解决该问题,这里不再赘述,可自行了解。

五、总结

本章简单介绍了深度学习和神经网络基本概念,其中神经网络的正反向传播是重点。通过本章的学习,你对深度学习有了一个基本的了解,这为后续深入地学习如何根据不同的数据搭建神经网络打好基础。下一部分将学习如何严密地构建并有效地运作神经网络,将会学习到超参数调整、正则化、诊断偏差和方差,还会学习一些高级优化算法:Momentum算法和Adam算法等。

【零基础深度学习教程第一课:深度学习基础】相关推荐

  1. 人工智能教程第一课 深度学习和计算机视觉TensorFlow入门

    深度学习 学习目标 知道什么是深度学习 知道深度学习的应用场景 1.什么是深度学习 在介绍深度学习之前,我们先看下人工智能,机器学习和深度学习之间的关系: 机器学习是实现人工智能的一种途径,深度学习是 ...

  2. 第一课.深度学习简介

    机器学习 在吴恩达老师的课程中,有过对机器学习的定义: ML:<P T E> P即performance,T即Task,E即Experience,机器学习是对一个Task,根据Experi ...

  3. 【STC单片机学习】第一课:学习介绍

    第一部分.章节目录 1.1.1.单片机适合谁来学? 1.1.2.咱们学什么? 1.1.3.我为什么要学单片机 1.1.4.为什么要从51单片机学起 1.1.5.咱们的开发板 1.1.6.学习本课程需要 ...

  4. 【项目实战课】从零掌握安卓端Pytorch原生深度学习模型部署

    欢迎大家来到我们的项目实战课,本期内容是<从零掌握安卓端Pytorch原生深度学习模型部署>.所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战 ...

  5. 【直播课】6小时教你掌握轻量级网络,在安卓部署第一个深度学习模型

    前言 想要设计自己的神经网络,却不知道如何下手完成搭建? 想获得更高的任务指标吗?想获得更快的运行速度吗? 想获得更小的模型体积吗?想获得稳定可靠的性能吗? 跑通了经典模型却不知道模型结构是什么样的? ...

  6. 【视频课】言有三每天答疑,38课深度学习+超60小时分类检测分割数据算法+超15个Pytorch框架使用与实践案例助你攻略CV...

    计算机视觉中大大小小可以包括至少30个以上的方向,在基于深度学习的计算机视觉研究方向中,图像分类,图像分割,目标检测无疑是最基础最底层的任务,掌握好之后可以很快的迁移到其他方向,比如目标识别,目标跟踪 ...

  7. 【CV实战】年轻人的第一个深度学习图像分割项目应该是什么样的(Pytorch框架)?...

    我们上次给新手们介绍了第一个合适入门的深度学习CV项目,可阅读[CV实战]年轻人的第一个深度学习CV项目应该是什么样的?(支持13大深度学习开源框架),本次我们再给大家介绍一个新的任务,图像分割,包括 ...

  8. 天才少年稚晖君 | 【保姆级教程】个人深度学习工作站配置指南

    天才少年稚晖君 | [保姆级教程]个人深度学习工作站配置指南 来源:https://zhuanlan.zhihu.com/p/336429888 0. 前言 工作原因一直想配置一台自己的深度学习工作站 ...

  9. 乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍(可供技术选型时使用)

    乐行学院RabbitMQ学习教程 第一章 RabbitMQ介绍 RabbitMQ介绍 1.RabbitMQ技术简介 2.RabbitMQ其他扩展插件 2.1监控工具rabbitmq-managemen ...

最新文章

  1. 微软惹的祸!CVPR提交网站最后1小时被挤崩,官方紧急延长36小时
  2. python 青蛙跳台阶问题
  3. Python中有了列表,为什么还有元组?
  4. Spring 中的内部bean 和集合
  5. mybatis sql中有中文处理
  6. freemind在ubuntu20.04下面的安装
  7. IE6不支持min-heigt的bug解决的办法
  8. 开奖|1024中奖名单公布以及Postman资料分享
  9. 数据挖掘原理与算法 K-Means算法
  10. 放弃 vs2005 的 crystal report 。推荐使用国内强人开发的第三方报表开发工具:袁氏报表 。...
  11. 使用Visual Studio编译Geos
  12. php 有道翻译api,php有道翻译api调用方法实例
  13. LeetCode——自除数
  14. win10下,扩展屏不清晰模糊。
  15. 比较全面的log4j配置
  16. Intention Oriented Image Captions with Guiding Objects
  17. 英特尔核显自定义分辨率_如何在新版英特尔核芯显卡控制面板中自定义显示器分辨率...
  18. FL Studio教程之Riff机的简介
  19. APP——功耗测试(耗电测试)——adb命令复杂获取分析
  20. matlab 画 带虚部,MATLAB1:求实部、虚部、模和幅角的运算

热门文章

  1. Linux 安装DockerMysql
  2. 【Python】利用摸鱼的时间,我写了一个三国杀开盒模拟器...
  3. 面向对象和面向过程有什么区别
  4. html中怎么做扇形菜单,纯CSS3实现扇形动画菜单(简化版)实例源码
  5. 如何在mac版chrome安装第三方插件
  6. NLP之语义自动匹配emoji
  7. 淘宝/天猫店铺订单数据导出、销售报表、数据分析
  8. 8、开发工具软件 - 软件技术系列文章
  9. 微信浏览器中进行支付宝支付
  10. echarts之legend-改变图例的图标为自定义图片