深度学习的优化方法

文章介绍了梯度下降法在寻找损失函数最小化中的作用,讨论了学习率的影响,并区分了批量、随机和小批量梯度下降。接着,文章讲解了反向传播算法,它是神经网络训练的关键,利用链式法则计算损失函数关于权重的梯度,从而更新网络参数。最后,通过示例展示了反向传播的过程和参数更新的步骤。
摘要由CSDN通过智能技术生成

        梯度下降法简单来说就是⼀种寻找使损失函数最⼩化的⽅法。⼤家在机器 学习阶段已经学过该算法,所以我们在这⾥就简单的回顾下,从数学上的⻆度来看,梯度的⽅向是函数增⻓速度最快的⽅向,那么梯度的反⽅向就 是函数减少最快的⽅向,所以有:

{w_{i j}^{n e w}=w_{i j}^{o l d}-\eta \frac{\partial E}{\partial w_{i j}}}

        其中,η是学习率,如果学习率太⼩,那么每次训练之后得到的效果都太 ⼩,增⼤训练的时间成本。如果,学习率太⼤,那就有可能直接跳过最优 解,进⼊⽆限的训练中。解决的⽅法就是,学习率也需要随着训练的进⾏⽽变化。

        根据在进⾏迭代时使⽤的样本量,将梯度下降算法分为以下三类:

        实际中使⽤较多的是⼩批量的梯度下降算法,在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)。

 链式法则

        反向传播算法是利⽤链式法则进⾏梯度求解及权重更新的。对于复杂的复合函数,我们将其拆分为⼀系列的加减乘除或指数,对数,三⻆函数等初等函数,通过链式法则完成复合函数的求导。为简单起⻅,这⾥以⼀个神 经⽹络中常⻅的复合函数的例⼦来说明这个过程. 令复合函数 𝑓(𝑥; 𝑤, 𝑏) 为:

{f(x ; w, b)=\frac{1}{\exp (-(w x+b))+1}}

 其中x是输⼊数据,w是权重,b是偏置。我们可以将该复合函数分解为:

并进⾏图形化表示,如下所示:

 

        整个复合函数 𝑓(𝑥; 𝑤, 𝑏) 关于参数 𝑤 和 𝑏 的导数可以通过 𝑓(𝑥; 𝑤, 𝑏) 与参 数 𝑤 和 𝑏 之间路径上所有的导数连乘来得到,即:

\begin{array}{l} \frac{\partial f(x ; w, b)}{\partial w}=\frac{\partial f(x ; w, b)}{\partial h_{6}} \frac{\partial h_{6}}{\partial h_{5}} \frac{\partial h_{5}}{\partial h_{4}} \frac{\partial h_{4}}{\partial h_{3}} \frac{\partial h_{3}}{\partial h_{2}} \frac{\partial h_{2}}{\partial h_{1}} \frac{\partial h_{1}}{\partial w} \\ \frac{\partial f(x ; w, b)}{\partial b}=\frac{\partial f(x ; w, b)}{\partial h_{6}} \frac{\partial h_{6}}{\partial h_{5}} \frac{\partial h_{5}}{\partial h_{4}} \frac{\partial h_{4}}{\partial h_{3}} \frac{\partial h_{3}}{\partial h_{2}} \frac{\partial h_{2}}{\partial b} \end{array}

以w为例,当 𝑥 = 1, 𝑤 = 0, 𝑏 = 0 时,可以得到:

\begin{aligned} \left.\frac{\partial f(x ; w, b)}{\partial w}\right|_{x=1, w=0, b=0} & =\frac{\partial f(x ; w, b)}{\partial h_{6}} \frac{\partial h_{6}}{\partial h_{5}} \frac{\partial h_{5}}{\partial h_{4}} \frac{\partial h_{4}}{\partial h_{3}} \frac{\partial h_{3}}{\partial h_{2}} \frac{\partial h_{2}}{\partial h_{1}} \frac{\partial h_{1}}{\partial w} \\ & =1 \times-0.25 \times 1 \times 1 \times-1 \times 1 \times 1 \\ & =0.25 \end{aligned}

 注意:常⽤函数的导数:

 反向传播算法

        反向传播算法利⽤链式法则对神经⽹络中的各个节点的权重进⾏更新。我 们通过⼀个例⼦来给⼤家介绍整个流程,假设当前前向传播的过程如下图 所以:

计算损失函数,并进⾏反向传播:

参数更新:

        重复上述过程完成模型的训练,整个流程如下表所示:

         如下图是⼀个简单的神经⽹络⽤来举例:激活函数为sigmoid

 

 前向传播运算:

 接下来是反向传播(求⽹络误差对各个权重参数的梯度):

        我们先来求最简单的,求误差E对w5的导数。⾸先明确这是⼀个“链式法则”的求导过程,要求误差E对w5的导数,需要先求误差E对out o1的导 数,再求out o1对net o1的导数,最后再求net o1对w5的导数,经过这个链式法则,我们就可以求出误差E对w5的导数(偏导),如下图所示:

 导数(梯度)已经计算出来了,下⾯就是反向传播与参数更新过程:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XMM-struggle

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

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

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

打赏作者

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

抵扣说明:

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

余额充值