神经网络和深度学习个人手记


前言

   记录一下自己的学习笔记,该部分内容为神经网络的基础知识。

概念简要
机器学习:机器能从数据中学习到知识(例如数据与数据间的关系)。
神经网络:仿造人脑神经网络的工作原理,提出的一种数据处理方法。
深度学习:机器能自动从数据中提取特征,并学习数据间隐含的关系。故深度学习=特征提取/表示方法 + 浅层机器学习

在这里插入图片描述


一、全连接神经网络/前馈神经网络/多层感知机

全连接神经网络Fully Connected Neural Network(简称FCNN),
又称为前馈神经网络Feedforward Neural Network(简称FNN),
有些地方又称为多层感知机Multilayer perceptron(简称MLP)

全连接神经网络
   该网络中,神经元(或节点)被组织成多个层,每一层的神经元与前一层和后一层的神经元全都相连“全连接”名字的由来),但同一层内的神经元之间没有连接。
  同时,数据在网络中是从输入层向输出层单向传播的,没有反馈(或循环)连接(“前馈”名字的由来)。
单层感知机

  单层感知机如上图所示,故该网络又可以看做是多个单层感知机的叠加(“多层感知机”名字的由来)。

   总而言之,这类网络从神经元连接方式上看,可以被称作全连接网络;从反馈方向上看,可以被称作前馈网络;从神经元的结构看,可以被称为多层感知机,但它们本质上可以是同一种网络,只是关注着重点不同。

二、神经元的原理

简单来说,神经元(也可以认为是单个感知机)的作用可以简单概括为两步:
1)加权(即计算"输入X和权重w的内积 + 偏置值b")
2)激活(即经过激活函数做非线性变化)

在这里插入图片描述

输入数据为:[x1, x2]
连接权重为:[w1, w2]
偏置值:b
激活函数:h()
输出数据为:y

三、激活函数

   激活函数的种类有很多,作用和所适用的问题类型也不同,这里简单介绍其中一种——sigmod函数。(之后有时间再对其他激活函数做一个总结吧

sigmod函数: f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x} } f(x)=1+ex1
在这里插入图片描述

f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x} } f(x)=1+ex1 函数有以下特点:
1)平滑且非线性——对神经网络后续的处理很重要
2)函数值在(0,1)区间内——可以表示概率值
3)导数 f ′ ( x ) f{}'(x) f(x)很容易由原函数 f ( x ) f(x) f(x)的值计算得到——方便计算梯度
   f ′ ( x ) = e − x ( 1 + e − x ) 2 = e − x + 1 − 1 1 + e − x 1 1 + e − x = ( 1 − f ( x ) ) f ( x ) f{}'(x) = \frac{e^{-x}}{({1+e^{-x}})^2} = \frac{e^{-x}+1-1}{1+e^{-x}}\frac{1}{1+e^{-x}} = (1-f(x))f(x) f(x)=(1+ex)2ex=1+exex+111+ex1=(1f(x))f(x)


四、正向传播和反向传播

  这部分内容有助于对神经网络功能的理解

4.1 概念

  简单来说就是根据数据在网络中的流动方向可以分为:

正向传播:数据流动方向从神经网络的输入层–》输出层
反向传播:数据流动方向从神经网络的输出层–》输入层
在这里插入图片描述

  正向传播的过程:沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)的过程。

  反向传播的过程:沿着从输出层到输入层的顺序,依据链式法则,依次计算并存储目标函数有关的神经网络各层的中间变量以及参数的梯度的过程。
简单认为:正向传播是预测的过程,反向传播是学习的过程

4.2 正向传播的作用

   正向传播的作用比较好理解,神经网络的作用无非就是实现“由输入到输出的计算”。
  拿全连接神经网络来举例子,你输入的数据是一张图片,经过神经网络的计算,得到输出结果为“小猫”,这就是一个解决分类问题的网络;你输入的是年份时间,地区等等数据,经过网络的计算,得到的输出结果为“对应年份的某地区的房价”,这就是一个解决回归问题的网络。无论是哪种,它们都是一个由输入数据经过网络得到输出结果的过程(只不过中间层处理方式不同),这就是正向传播。所以说“正向传播是预测的过程”。
  

4.3 反向传播的作用

   反向传播是为了计算梯度。
  神经网络所谓的“学习”其实就是求模型中参数的值。拿全连接神经网络来举例子,这些参数指的就是每层网络间的权重w和偏置量b。
在这里插入图片描述
  在梯度下降的方法中(求参数的方法有很多,梯度下降是最常用的一种),神经网络会根据参数的导数值,不断去修正参数的值,从而向着最合适的参数值的方向进行调整,这个过程就是学习的过程。具体的实现细节这里不做介绍,但可以知道的是:求参数(即w和b)的导数是"学习"中的关键步骤。
  那么,要求导的函数是哪个呢?答案是:损失函数。(损失函数也有很多种类型,这里不做介绍
简单来说,就是能表示“现实中的真实结果和我们经过网络得到的预测结果之间误差”的函数。

   我们这里主要是讨论反向传播的作用,故不去详细介绍诸如“梯度下降”、“损失函数”的相关内容。但我们通过现有的了解,目前可以知道的是:我们需要求损失函数的导数,以达到学习参数的目的。而反向传播就是为了计算梯度(或者说是计算导数)。
  

4.3.1 反向传播的过程和优点

   在神经网络网络中:相当于数据流从输出层–》输入层。
   在求导计算过程中:相当于复合函数链式求导法的表达式从左往右计算。

   例如在以下的网络中: d y d x = d y d b d b d a d a d x \frac{\mathrm{d} y}{\mathrm{d} x} = \frac{\mathrm{d} y}{\mathrm{d} b} \frac{\mathrm{d} b}{\mathrm{d} a} \frac{\mathrm{d} a}{\mathrm{d} x} dxdy=dbdydadbdxda

在这里插入图片描述

   而在计算式中,正向传播和反向传播所对应的计算方向为:
在这里插入图片描述

   那问题来了,为啥不直接用正向传播来计算梯度(即计算导数)呢?正向传播计算梯度的过程对应到实际计算中,就相当于复合函数链式求导法的表达式从右往左计算,明明也是可以计算的啊,何必再用一种新的方式来计算呢?原因在于:反向传播计算梯度的效率更高!

反向传播计算梯度的优点如下:
1)能复用之前的导数计算结果
2)能减少矩阵计算的计算量

详见:
神经网络求梯度为什么要用反向传播呢?


总结

以上有部分知识这里未做详细的介绍:
激活函数
梯度下降的具体内容
损失函数的具体内容


参考:
书籍
深度学习入门:基于Python的理论与实现 (斋藤康毅)

链接
https://zhuanlan.zhihu.com/p/636055369
http://t.csdnimg.cn/EGMKg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值