第五章 随机梯度下降

一、导数、偏微分、梯度

  • 导数代表某一自变量附近的函数值变化率
    在这里插入图片描述

  • 梯度指示了函数变化率最大的方向,是向量
    在这里插入图片描述

  • 使用梯度下降算法求解使函数值取尽可能小时的自变量值,算法性能依赖于:①学习率α;②求解梯度时的起始位置
    在这里插入图片描述


二、深度学习的学习过程(各权值、误差值的求解过程)

① 一般的学习趋势梯度逐渐减小,学习的值逐渐稳定,不同的学习率使得学习过程不一样。应该选择适当的学习率。
在这里插入图片描述

② 采用不同的梯度算法得到的学习过程
在这里插入图片描述

  • 存在全局最优解的情况
    在这里插入图片描述

  • 存在局部最优解的情况
    在这里插入图片描述

  • 实际场景中的局部最优解的情况,很难最终定位在最优解上
    在这里插入图片描述

  • 鞍点
    在这里插入图片描述


三、影响深度学习学习过程的因素

在这里插入图片描述

  • 初始化参数
    在这里插入图片描述

  • 学习率
    ① 设置大了会振荡,可能不会收敛
    ② 设置小了会学习的很慢
    在这里插入图片描述

  • 动量(如何逃离局部最小值)
    综合之前的梯度值以“逃离”局部值区域
    在这里插入图片描述

  • 其他


四、常见函数的梯度

在这里插入图片描述


五、激活函数

  • 设置后置函数f,主要起到设置阈值的作用
    在这里插入图片描述

5.1 跳变激活函数

  • 采用跳变的处理方式。
    缺点:在z=0处不可导
    在这里插入图片描述

5.2 sigmoid/Logistic激活函数

sigmoid/Logistic激活函数,使处处可导。
适用于:输出为概率预测值、输出值值域在(0,1)之间的等
缺点:由于函数斜率均小于1,在多层结构的神经网络中,反向传播会有梯度弥散问题
在这里插入图片描述

  • sigmoid求导
    在这里插入图片描述

  • pytorch中实现sigmoid
    torch.sigmoid(torch) or F.sigmoid(torch)
    注:from torch.nn import functional as F
    在这里插入图片描述

5.3 tanh激活函数

  • 广泛应用于RNN的结构中

  • 主要特征与sigmoid一致,相当于sigmoid向下平移了0.5
    在这里插入图片描述

  • tanh求导
    在这里插入图片描述

  • pytorch中实现tanh
    torch.tanh(torch)
    在这里插入图片描述


5.4 Relu(Rectified Linear Unit)激活函数

  • 斜率固定,主要解决梯度弥散\爆炸问题
    在这里插入图片描述

在这里插入图片描述

  • pytorch中实现relu
    torch.relu(torch) or F.relu(torch)
    在这里插入图片描述

六、Loss函数

  • Loss用于表示深度学习学习的函数值与实际值之间的 “相似” 关系,loss越小学习的函数越准确
    在这里插入图片描述

6.1 均方差MSE ∑ ( y − y ‾ ) 2 \sum(y - \overline y)^2 (yy)2

在这里插入图片描述

  • MSE求导
    在这里插入图片描述

  • pytorch实现MSE梯度求解
    F.mse_loss(pred,label)
    设置MSE loss函数
    a) pred:预测值
    b) label:标签真实值
    torch.autograd.grad(loss,[param1,…])
    自动求导数,函数返回参数的导数
    a) y:loss的函数值
    b) param1…:表示梯度下降求解的参数变量
    w.requires_grad_()
    设置tensor需要更新
    在这里插入图片描述

④ mse.backward()
自动求导数,模拟反向传播,所有的梯度信息,均赋给参数的grad成员变量中,该函数无返回值
在这里插入图片描述

在这里插入图片描述

6.2 softmax

适用于多分类情况的概率输出层,可以探知预测为不同类别的概率值大小
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • softmax求导的公式
    在这里插入图片描述

在这里插入图片描述


七、感知机

7.1 梯度推导过程 — 单层感知机(激活层使用跳变函数)

在这里插入图片描述

在这里插入图片描述

  • 方向传播的对应参数的梯度值
    在这里插入图片描述

  • pytorch的实现
    在这里插入图片描述

7.2 梯度推导过程 — 多层感知机(伪全连接层)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • pytorch实现
    在这里插入图片描述

八、链式法则

在这里插入图片描述

  • 多层间的链式变量求导
    在这里插入图片描述

在这里插入图片描述

  • pytorch实现
    在这里插入图片描述

九、MLP(Multi-Layer Perceptron 全连接层结构)反向传播

在这里插入图片描述

存在:输入层、隐藏层、输出层的结构
在这里插入图片描述

在这里插入图片描述

  • 推导公式总结
    在这里插入图片描述

十、实战pytorch API使用

  • 目标求自变量梯度的函数为:
    在这里插入图片描述

  • 已知的最小值位置:
    在这里插入图片描述

  • 利用pytorch实战求解

# -*- coding: UTF-8 -*-
'''
@version: 1.0
@PackageName: pytorch_learning - pytorch_grad_demo.py
@author: yonghao
@Description: 使用pytorch API解决问题的练习
@since 2021/02/21 23:01
'''
import torch
import torch.nn.functional as F


# 定义求最小值位置的函数
def himmelblau_function(x):
return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2


# 定义求解过程
def run():
# 学习率
learning_rate = 1e-3
# 初始位置
x_inital, y_inital = 4., 0.
x = torch.tensor([x_inital, y_inital], requires_grad=True)
# 定制梯度下降学习公式
optimizer = torch.optim.Adam([x], lr=learning_rate)
for step in range(20000):
pred = himmelblau_function(x)
optimizer.zero_grad()
pred.backward()
optimizer.step()
if step % 2000 == 0:
print('step {}: x = {} , f(x) = {}'.format(step, x.tolist(), pred.item()))


if __name__ == '__main__':
run()
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于随机梯度下降算法的线性回归的 Spark Java 类实现,不使用 MLlib 包: ```java import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.Function; import org.apache.spark.api.java.function.VoidFunction; import org.apache.spark.sql.SparkSession; import java.util.Arrays; import java.util.List; public class LinearRegressionSGD { public static void main(String[] args) { // 创建 SparkSession SparkSession spark = SparkSession.builder().appName("LinearRegressionSGD").master("local[*]").getOrCreate(); // 定义样本数据 double[][] data = {{1, 2, 3}, {1, 3, 5}, {1, 4, 7}, {1, 5, 9}}; double[] label = {5, 7, 9, 11}; // 转换为 JavaRDD JavaRDD<double[]> dataRDD = spark.sparkContext().parallelize(Arrays.asList(data)).toJavaRDD(); JavaRDD<Double> labelRDD = spark.sparkContext().parallelize(Arrays.asList(label)).toJavaRDD(); // 定义初始参数值 double[] theta = {0, 0, 0}; // 定义学习率 double alpha = 0.01; // 定义迭代次数 int iterations = 1000; // 进行随机梯度下降 for (int i = 0; i < iterations; i++) { // 随机抽取一个样本 int index = (int) (Math.random() * data.length); final double[] x = data[index]; final double y = label[index]; // 计算梯度并更新参数 List<Double> gradient = dataRDD.map(new Function<double[], Double>() { @Override public Double call(double[] v1) throws Exception { double h = hypothesis(theta, x); return (h - y) * v1[index]; } }).collect(); for (int j = 0; j < gradient.size(); j++) { theta[j] -= alpha * gradient.get(j); } } // 输出最终参数值 System.out.println(Arrays.toString(theta)); // 关闭 SparkSession spark.stop(); } // 假设函数 public static double hypothesis(double[] theta, double[] x) { double h = 0; for (int i = 0; i < theta.length; i++) { h += theta[i] * x[i]; } return h; } } ``` 这段代码实现了一个基于随机梯度下降算法的线性回归模型,使用 Spark Java API 实现。其中,样本数据为一个二维数组,每一行表示一个样本,第一列为常数项,后面的列为特征值;标签为一个一维数组,表示每个样本的标签值;初始参数值为一个一维数组,学习率和迭代次数为指定的值。在迭代过程中,每次随机抽取一个样本,通过计算梯度来更新参数值,最终输出最优参数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ModelBulider

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

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

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

打赏作者

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

抵扣说明:

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

余额充值