I . 梯度下降 Gradient Descent 简介 ( 梯度下降过程 | 梯度下降方向 )



1 . 后向传播算法 : 针对每个数据样本 , 从输入层到输出层传播输入 , 这是向前传播输入 , 然后从输出层向输入层传播误差 , 这是向后传播误差 ;


② 权重和偏置更新 : 传播误差过程中 , 对神经元网络中 , 单元连接的权重 , 和单元本身的偏置 , 进行更新 ;

③ 单元连接权重增量 : Δ w i j = ( l ) E r r j O i \Delta w_{ij} = (l) Err_j O_i Δwij=(l)ErrjOi

③ 单元偏置增量 : Δ θ j = ( l ) E r r j \Delta \theta_j = (l) Err_j Δθj=(l)Errj


2 . 权重和偏置更新要求 : 更新的时候 , 涉及到 权重 和 偏置的增量 , 分别是 Δ w i j \Delta w_{ij} Δwij Δ θ j \Delta \theta_j Δθj , 这两个增量值要使损失函数取最小值 , 并且该最小值越来越小 ;


3 . 权重和偏置更新方向 : 这两个增量的方向要求是 , 损失函数不仅要下降 , 并且损失函数下降的速度越快越好 , 这个损失函数下降最快的方向 , 就是梯度的反方向 , 梯度通常是对损失函数进行求导得到的 ;


损失函数 下降最快的方向 , 是梯度的反方向 ;

梯度通常是对损失函数进行求导得来的 ;

在某一点求导 , 就是这一点的曲线的切线的方向 ;

这里的方向只有两个 , 坐标轴正向 ( 从左到右 | 从负数到正数 | 增加 ) , 坐标轴反向 ( 从右到左 | 从负数到正数 | 减小 ) ;

4 . 权重和偏置更新步长 : 有了梯度以后 , 对 单元连接权重 和 单元偏置 参数进行更新时 , 还涉及到学习率 l l l , 这个学习率 l l l 又叫做超参数 ;



II . 梯度下降 示例说明 ( 单个参数 )



1 . 坐标轴说明 : 下图是损失函数 f ( θ ) f(\theta) f(θ) , 横轴 θ \theta θ 是指需要更新的 权重 或 偏置 参数 , 纵轴是损失函数 f ( θ ) f(\theta) f(θ) 的计算结果 ;


2 . 损失函数最小值 : 取一个合适的 θ \theta θ 值 , 使损失函数值 f ( θ ) f(\theta) f(θ) 大小最小 , 此时是图中黄色的点对应的 θ ^ \hat{\theta} θ^ 值 ;


3 . 初始值 : 图中最左侧的值 , 标注为 Radom initial value , 即 随机初始值 ;


4 . 初始值变化趋势 : 每次对初始值进行一次变化 , 变化的方向是逐步使损失函数趋于最小 , 就是图中初始值开始到最小值的箭头方向 ;


5 . 梯度下降算法 : 梯度下降算法的目的是为了使损失函数 f ( θ ) f(\theta) f(θ) 达到最小值 ;


6 . 梯度本质 : 梯度 或 求导 , 本质上是求某一点在曲线上的切线 , 切线的斜率表示的就是导数 ;


7 . 初始值累加方向 : θ \theta θ 是初始值时 , 切线的斜率是负数 , θ \theta θ 是向右走 , 每次累加的 Δ θ \Delta\theta Δθ 是正数 , 因此 θ \theta θ 值需要减去梯度的值 , 相当于加上了一个正数 , 因此说 θ \theta θ 的方向与斜率是反方向 ( 方向指的是符号的正负号方向 ) , 即与梯度是反向方的 ; 每次累加的 Δ θ \Delta\theta Δθ 就是在 x x x 轴上的两点之间的距离 ;


8 . 方向说明 ( 重点 ) :


损失函数 下降最快的方向 , 是梯度的反方向 ;

梯度通常是对损失函数进行求导得来的 ;

在某一点求导 , 就是这一点的曲线的切线的方向 ;

这里的方向只有两个 , 坐标轴正向 ( 从左到右 | 从负数到正数 | 增加 ) , 坐标轴反向 ( 从右到左 | 从负数到正数 | 减小 ) ;


9 . 学习步长 : 由初始值开始迭代 , 对 θ \theta θ 参数进行更新 , 最终取得使损失函数值最小 , 即横轴坐标轴参数等于 θ ^ \hat{\theta} θ^ ; 该步长代表了该操作的效率 , 步长越大 , 速度越快 ;


10 . 梯度下降算法本质 : 对于当前的参数 θ \theta θ 值 , 计算 f ( θ ) f(\theta) f(θ) 的梯度 , 即导数 / 斜率 ( 负的 ) , 在梯度的反方向 ( 正数方向 ) 走一个步长 , 然后继续向前传播输入 , 再次向后传播误差时 , 继续计算其 θ \theta θ 值对应的梯度值 , 迭代 N N N 多次 , 即可得到使损失函数最小的参数值 ;

【数据挖掘】神经网络 后向传播算法 ( 梯度下降过程 | 梯度方向说明 | 梯度下降原理 | 损失函数 | 损失函数求导 | 批量梯度下降法 | 随机梯度下降法 | 小批量梯度下降法 )_批量梯度下降法

上图是一个凸函数 , 最小值只有一个 , 比较好分析 , 实际情况是 , 同时存在多个甚至无数个能使 损失函数 f ( θ ) f(\theta) f(θ) 取到最小值的 θ \theta θ 值 ;



III . 梯度下降 示例说明 ( 多个参数 )



1 . 两个参数的损失函数 : 下图是有两个参数的情况下的损失函数情况 ;


2 . 损失函数示例 :

z = x 2 + 2 y 2 z = x^2 + 2y^2 z=x2+2y2


① 分析基础 : 该损失函数 z z z 有两个参数 , 该函数就不能再二维坐标轴中进行分析了 , 需要在三维坐标空间中进行分析 ;

② 坐标轴说明 : z z z 轴是损失函数值 , x x x 轴是 x x x 参数的取值 , y y y 轴是 y y y 参数的取值 ;

③ 梯度下降要求 : 不仅要在 x x x 轴损失函数下降最快 , y y y 轴损失函数也要下降最快 ; 如下图中的蓝色箭头方向 ;


3 . 参数说明 :


如果有 1 1 1 个参数 , 就是在二维空间中进行分析 , 如在 x x x 轴 和 y y y 轴平面上分析 ;

如果有 2 2 2 个参数 , 就是在 3 3 3 维空间中进行分析 , 如在 x x x , y y y 轴 和 z z z 轴 三维空间上分析 ;

⋮ \vdots

如果有 n n n 个参数 , 就是在 n + 1 n + 1 n+1 维空间中进行分析 ;

【数据挖掘】神经网络 后向传播算法 ( 梯度下降过程 | 梯度方向说明 | 梯度下降原理 | 损失函数 | 损失函数求导 | 批量梯度下降法 | 随机梯度下降法 | 小批量梯度下降法 )_后向传播算法_02

最终的效果可能不是这样的 , 实际可能会存在很多弯曲波折 , x , y x , y x,y 参数数值 , 在各轴上 , 按照锯齿形状下降 , 但是大概的趋势是这样的 ;



IV . 梯度下降 总结 ( 定义损失函数 | 损失函数求导 )



1 . 单个参数的梯度下降算法公式表示 :


θ j n e w = θ j o l d − α ∂ ∂ θ j o l d J ( θ ) \theta^{new}_j = \theta^{old}_j - \alpha \frac{ \partial }{ \partial \theta^{old}_j} J (\theta) θjnew=θjoldαθjoldJ(θ)


θ j \theta_j θj 表示第 j j j 个参数 ;

θ j n e w \theta^{new}_j θjnew 表示新的第 j j j 个参数 ;

θ j o l d \theta^{old}_j θjold 表示旧的第 j j j 个参数 ;

α \alpha α 指的是学习率 , 或梯度下降的步长 ;


如果是单个参数值 , 是对 目标函数 / 损失函数 J ( θ ) J (\theta) J(θ) 关于当前的第 j j j 个参数 θ j \theta_j θj 进行求导 , 只对一个参数进行求导 ;



2 . 使用矩阵的形式表示多个参数的梯度下降算法 :


θ n e w = θ o l d = α ∇ θ J ( θ ) \theta^{new} = \theta^{old} = \alpha \nabla_\theta J (\theta) θnew=θold=αθJ(θ)


θ \theta θ 表示很多参数的矩阵 ;

θ n e w \theta^{new} θnew 表示新的参数的矩阵 ;

θ o l d \theta^{old} θold 表示旧的参数矩阵 ;

α \alpha α 指的是学习率 , 或梯度下降的步长 ;


∇ θ J ( θ ) \nabla_\theta J (\theta) θJ(θ) 表示梯度的反向方 , 这是对 目标函数 / 损失函数 J ( θ ) J (\theta) J(θ) 关于 θ \theta θ 进行求导 , 注意 θ \theta θ 是很多参数组成的矩阵 , 需要对每个参数进行求导 , 即偏导 , 然后将这些偏导整合起来 ;



3 . 梯度下降算法实现 :


① 定义损失函数 : 先定义损失函数 , 一般是误差平方和 ;

② 求参数增量 : 对损失函数进行求导 , 使用导数 乘以 学习率 ( 步长 ) , 得到一个 参数增量 , 这里的参数指的是 权值 和 偏置 ;

③ 伪代码实现 :

//迭代循环执行下面的代码 , 每循环一次 , 梯度下降一次 , 损失函数的值就会变小一次
while true : 
	//对损失函数进行求导 , 也就是评估梯度 , J 代表损失函数 , theta 代表参数值 
	//	本质是 对损失函数 J 关于 theta 求导
	theta_gradient = evaluate_gradient ( J , corpus , theta )
	
	//左侧的 theta 是新的 theta , 右侧的 theta 是旧的 theta 
	//	alpha 是学习率 , 也是梯度的步长 , theta_gradient 是损失函数导数
	theta = theta - alpha * theta_gradient 


V . 梯度下降 方法



1 . 常用的梯度下降方法 :


① 批量梯度下降法 : Batch Gradient Descent ;

② 随机梯度下降法 : Stochastic Gradient Descent ;

③ 小批量梯度下降法 : Mini-batch Gradient Descent ; 介于上述两者之间 ;



VI . 批量梯度下降法



批量梯度下降法 : 梯度下降的最常用方法 , 反向传播误差时 , 使用误差更新参数时 , 参考所有样本的误差更新 权值 和 偏置参数 , 如果有 n n n 个样本 , 每次迭代时 , 将这 n n n 个样本全部处理一遍 , 每次迭代都要使用所有的样本进行参数更新 ; 公式如下 :


θ ′ = θ − α ∑ j = 1 n ( h θ ( x 0 ( j ) , x 1 ( j ) , ⋯   , x n ( j ) ) − y j ) x i ( j ) \theta' = \theta - \alpha \sum_{j=1}^n( h_\theta ( x_0^{(j)}, x_1^{(j)}, \cdots , x_n^{(j)} ) - y_j) x_i^{(j)} θ=θαj=1n(hθ(x0(j),x1(j),,xn(j))yj)xi(j)


样本个数 : n n n 代表样本个数 ;

梯度计算 : 此处计算梯度 , 使用了所有的样本的梯度数据 ;



VII . 随机梯度下降法



随机梯度下降法 : 求梯度的时候 , 随机选择一个样本进行 , 使用该样本的误差更新参数 ; 公式如下 , 相对于批量梯度下降法的公式只是删除了 总和 符号 , 不再累加所有的样本误差数据 ;


θ ′ = θ − α ( h θ ( x 0 ( j ) , x 1 ( j ) , ⋯   , x n ( j ) ) − y j ) x i ( j ) \theta' = \theta - \alpha ( h_\theta ( x_0^{(j)}, x_1^{(j)}, \cdots , x_n^{(j)} ) - y_j) x_i^{(j)} θ=θα(hθ(x0(j),x1(j),,xn(j))yj)xi(j)



VIII . 小批量梯度下降法



小批量梯度下降法 :


① 方法引入 : 上述的批量梯度下降法 , 使用所有的样本 , 训练时间很长 , 但是预测准确度很高 ; 随机梯度下降法 , 训练速度很快 , 准确度无法保证 ; 这里引入一种介于上述两个方法之间的一种方法 , 即小批量梯度下降方法 ;

② 参数更新方式 : 数据集有 n n n 个样本 , 采用其中的 m m m 个样本的子数据集 进行迭代更新参数 ;

③ 公式 :

θ ′ = θ − α ∑ j = 1 m ( h θ ( x 0 ( j ) , x 1 ( j ) , ⋯   , x n ( j ) ) − y j ) x i ( j ) \theta' = \theta - \alpha \sum_{j=1}^m( h_\theta ( x_0^{(j)}, x_1^{(j)}, \cdots , x_n^{(j)} ) - y_j) x_i^{(j)} θ=θαj=1m(hθ(x0(j),x1(j),,xn(j))yj)xi(j)

注意上述 求和的是 子数据集的 1 1 1 m m m 索引 ;