TensorFlow 深度学习读写笔记Python搭建开发环境-Anaconda+PyCharm的安装和入门教程
Jupyter Notebook神器-免费体验来自微软的Azure Notebook
Windows 10 本地搭建TensorFlow(CPU版本)深度学习环境
主流深度学习框架-MXNet、Caffe、TensorFlow、Torch、Theano
机器学习算法和深度学习算法比较
TensorFlow 的计算模型、数据模型和运行模型
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
结合TensorFlow Playground理解神经网络的主要功能
TensorFlow读书笔记:使用placeholder填充方式读取数据
记录TensorFlow训练过程中数据变化趋势-weight、bias、loss等
记录TensorFlow训练过程中数据变化趋势-直方图(Histogram)
本文主要介绍深度神经网络的基本概念,包括激活函数、梯度下降算法、反向传播算法和损失函数的概念,以及部分计算公式,省略了具体的推导公式。
深度神经网络的基本结构和思想神经网络的基本单位是神经元,每个神经元分别接受输入和输出,但与感知器(perceptron)不同的是,除了进行加权计算,还需要利用激活函数输出。
网络的最左边一层被称为输入层,其中的神经元被称为输入神经元。
最右边及输出层包含输出神经元。
中间层被称为隐含层,因为里面的神经元既不是输入也不是输出。下面的4层网络具有2个隐含层。
神经网络的基本思想就是建立在感知器和激活函数上的。对于多个输入,在神经网络经过多个神经元计算之后,得到多个或者单个输出。检查输出结果是否与期望的一致,如果不一致,就对神经网络中神经元的权重进行调整,我们已经知道,神经元权重的细微调整会引起输出结果的细微变化,这样多个神经元组合起来,逐渐调整,直到符合预期的输出结果,我们就可以认为神经网络训练成功了!这里所说的训练调整的方法,利用到了梯度下降法,对神经网络进行反向传播。
对神经网络的训练过程,就是不断调整网络中w和b的值,目标是整个网络表现出我们想要的行为。
激活函数的理论解释激活函数是用来加入非线性因素的,解决线性模型所不能解决的问题。
激活函数用来对前面计算得到的结果做一个非线性计算,这样,人工神经网络的表现力会更好。
常见的激活函数有:sigmoid, tanh, relu 以及它们的变种。
神经元节点 a的值,可以写成向量的形式:
再将每个节点的值的计算公式都整合在一起,写成矩阵运算的方式:
神经网络中的一层,就是对数据的一次非线性映射。
Wx+B 实现了对输入数据的范围转换、空间旋转以及平移操作,而非线性的激活函数f() 则完成了对输入数据原始空间的扭曲。
当网络层数变多时,在前面层网络已经学习到初步特征的基础上,后面层网络可以形成更加高级的特征,对原始空间的扭曲也更大。很多复杂的任务需要高度的非线性的分界面,深度更深的网络可以比浅层的神经网络有更好的表达。
梯度下降算法原理梯度下降方法是常用的参数优化方法,经常被用在神经网络中的参数更新过程中。
神经网络中,将样本中的输入X和输出Y当做已知值(对于一个样本[X,Y],其中X和Y分别是标准的输入值和输出值,X输入到模型中计算得到Y,但是模型中的参数值我们并不知道,所以我们的做法是随机初始化模型的参数,不断更新迭代这些参数,使得模型的输出与Y接近),将连接权(weight)和偏置值(bias)当做自变量,误差L(loss 损失函数的值)作为因变量。
梯度下降的目的是找到全部连接权和偏置值在取何值的情况下误差最小。
经常有人把梯度下降的过程比作从山顶走到谷底,一次走多远比作“学习率(Learning Rate)”。那么,它的数学表现形式是什么呢?
这就是梯度下降算法的迭代公式,当梯度下降为零时,w、b收敛,训练结束。
其中 α 是学习率(Learing Rate);另外两个分别是损失函数对W和b的偏导数。
用来训练神经网络的反向传播算法是梯度下降法,它需要计算损失函数对众多权重(weight)和偏置值(bias)的偏导数。
反向传播算法(1)残差δ定义:损失函数对神经元节点v 偏导数。
利用残差可以以统一的形式表示各层节点的连接权和偏置值的迭代公式。
计算损失函数对权值 w 和 b 的偏导数,可以转换为计算每一层每个节点的“残差”。
最后一层的残差计算公式(省去推导过程):
即输出层的第 i 个节点的残差为:(该点的激活值a-该点的真实值y)*该点激活函数f() 对该点值(v)的导数。
对于第K-1层的残差,可以根第K层的残差计算出来。
倒数第二层的第 i 个节点的残差的值,等于最后一层所有节点的残差值和连接此节点的权值 w 相乘之后的累加,再乘以此节点上的激活函数对它的导数值。
不断地重复这个过程,就得到了K-3, K-4, K-5,…2层上所有节点的残差值。
(2)基于残差,求偏导数,计算更新值
在计算所有节点上的残差之后,就可以根据公式得到损失函数对所有W和b的偏导数:
获得偏导数计算结果之后,在利用下面的公式对参数W和b进行更新。
如果多个样本作为一个分组进行训练,则将W和b的偏导数做累加求平均后,再更新参数值:
(3)反向传播算法的思路
给定一个样本 (x, y) ,我们首先随机初始化网络中参数W 和 b 接近0的随机值,然后进行“前向计算”。从输入层开始,根据公式逐层计算神经网络中所有节点的激活值,包括最终输出层的输出。对于每一层节点,计算其“残差” δ,其含义是该节点的值对最终输出层的结果和真实值的偏差造成了多大的影响。反向传播就是从最后一层开始,一层一层往前计算每一层神经元的残差值。根据残差值计算损失函数对权值W和b的偏导数,然后根据一定的学习率(Learning Rate)更新参数W和b的值。损失函数(Loss Function)损失函数有很多种,可以根据使用场景选择不同的损失函数。最简单的情况是可以使用两个值的差的绝对值作为损失函数。
总之,损失函数用于衡量预测值与实际值的偏离程度,损失值越小表示预测值越接近真实值。如果预测是完全精确的,则损失值为0;如果损失值不为0,则表示预测和真实值不一致。损失值越大,表示差的越远。
任何问题,欢迎沟通交流,欢迎关注,共同学习成长!
参考链接:
神经网络初探
梯度下降算法原理与反向传播思想(推导及核心观点)