梯度下降法简单来说就是⼀种寻找使损失函数最⼩化的⽅法。⼤家在机器 学习阶段已经学过该算法,所以我们在这⾥就简单的回顾下,从数学上的⻆度来看,梯度的⽅向是函数增⻓速度最快的⽅向,那么梯度的反⽅向就 是函数减少最快的⽅向,所以有:
其中,η是学习率,如果学习率太⼩,那么每次训练之后得到的效果都太 ⼩,增⼤训练的时间成本。如果,学习率太⼤,那就有可能直接跳过最优 解,进⼊⽆限的训练中。解决的⽅法就是,学习率也需要随着训练的进⾏⽽变化。
根据在进⾏迭代时使⽤的样本量,将梯度下降算法分为以下三类:
实际中使⽤较多的是⼩批量的梯度下降算法,在tf.keras中通过以下⽅法 实现:
tf.keras.optimizers.SGD(
learning_rate=0.01, momentum=0.0
)
例⼦:
# 导⼊相应的⼯具包
import tensorflow as tf
# 实例化优化⽅法:SGD
opt = tf.keras.optimizers.SGD(lr=0.1)
# 定义要调整的参数
var = tf.Variable(1.0)
# 定义损失函数:⽆参但有返回值
loss = lambda: (var ** 2)/2.0
# 计算梯度,并对参数进⾏更新,步⻓为 `- learning_rate * grad`
opt.minimize(loss, [var])
# 展示参数更新结果
var.numpy()
#1- (var )* 2/2.0 =0.9
# 1-0.1*1=0.9
更新结果为:0.9
在进⾏模型训练时,有三个基础的概念:
实际上,梯度下降的⼏种⽅式的根本区别就在于 Batch Size不同,,如下 表所示:
注:上表中 Mini-Batch 的 Batch 个数为 N / B + 1 是针对未整除的情况。 整除则是 N / B。
假设数据集有 50000 个训练样本,现在选择 Batch Size = 256 对模型进 ⾏训练。
每个 Epoch 要训练的图⽚数量:50000
训练集具有的 Batch 个数:50000/256+1=196
每个 Epoch 具有的 Iteration 个数:196
10个 Epoch 具有的 Iteration 个数:1960
反向传播算法(BP算法)
利⽤反向传播算法对神经⽹络进⾏训练。该⽅法与梯度下降算法相结合, 对⽹络中所有权重计算损失函数的梯度,并利⽤梯度值来更新权值以最⼩ 化损失函数。在介绍BP算法前,我们先看下前向传播与链式法则的内容。
前向传播指的是数据输⼊的神经⽹络中,逐层向前传输,⼀直到运算到输 出层为⽌。
在⽹络的训练过程中经过前向传播后得到的最终结果跟训练样本的真实值总是存在⼀定误差,这个误差便是损失函数。想要减⼩这个误差,就⽤损失函数ERROR,从后往前,依次求各个参数的偏导,这就是反向传播(Back Propagation)。
链式法则
反向传播算法是利⽤链式法则进⾏梯度求解及权重更新的。对于复杂的复合函数,我们将其拆分为⼀系列的加减乘除或指数,对数,三⻆函数等初等函数,通过链式法则完成复合函数的求导。为简单起⻅,这⾥以⼀个神 经⽹络中常⻅的复合函数的例⼦来说明这个过程. 令复合函数 𝑓(𝑥; 𝑤, 𝑏) 为:
其中x是输⼊数据,w是权重,b是偏置。我们可以将该复合函数分解为:
并进⾏图形化表示,如下所示:
整个复合函数 𝑓(𝑥; 𝑤, 𝑏) 关于参数 𝑤 和 𝑏 的导数可以通过 𝑓(𝑥; 𝑤, 𝑏) 与参 数 𝑤 和 𝑏 之间路径上所有的导数连乘来得到,即:
以w为例,当 𝑥 = 1, 𝑤 = 0, 𝑏 = 0 时,可以得到:
注意:常⽤函数的导数:
反向传播算法
反向传播算法利⽤链式法则对神经⽹络中的各个节点的权重进⾏更新。我 们通过⼀个例⼦来给⼤家介绍整个流程,假设当前前向传播的过程如下图 所以:
计算损失函数,并进⾏反向传播:
参数更新:
重复上述过程完成模型的训练,整个流程如下表所示:
如下图是⼀个简单的神经⽹络⽤来举例:激活函数为sigmoid
前向传播运算:
接下来是反向传播(求⽹络误差对各个权重参数的梯度):
我们先来求最简单的,求误差E对w5的导数。⾸先明确这是⼀个“链式法则”的求导过程,要求误差E对w5的导数,需要先求误差E对out o1的导 数,再求out o1对net o1的导数,最后再求net o1对w5的导数,经过这个链式法则,我们就可以求出误差E对w5的导数(偏导),如下图所示:
导数(梯度)已经计算出来了,下⾯就是反向传播与参数更新过程: