太原自助建站系统,兰州商城网站建,网站做优化好还是推广好,建立网站的相关信息彻底理解BP之手写BP图像分类你也行 转自#xff1a;https://zhuanlan.zhihu.com/p/397963213 第一节#xff1a;用矩阵的视角#xff0c;看懂BP的网络图
1.1、什么是BP反向传播算法
BP(Back Propagation)误差反向传播算法#xff0c;使用反向传播算法的多层感知器又称为B…彻底理解BP之手写BP图像分类你也行 转自https://zhuanlan.zhihu.com/p/397963213 第一节用矩阵的视角看懂BP的网络图
1.1、什么是BP反向传播算法
BP(Back Propagation)误差反向传播算法使用反向传播算法的多层感知器又称为BP神经网络。BP是当前人工智能主要采用的算法例如你所知道的CNN、GAN、NLP中的Bert、Transformer都是BP体系下的算法框架。理解BP对于理解网络如何训练很重要在这里我们采用最简单的思路理解BP。确保能够理解并且复现
1.2、矩阵乘法
参考https://www.cnblogs.com/ljy-endl/p/11411665.html 1.3、感知机
感知机模拟了神经元突触的信息传递 1.4、感知机-矩阵表示
用矩阵的视角来定义感知机结构 1.5、感知机-多个样本
当a、b是第一个x、y是第二个样本时 1.6、感知机-增加偏置
关于偏置的存在考虑y kx b直线公式若b0则退化为y kx此时表达的直线必定过0点无法表达不过0点的直线所以偏置在这里非常重要 1.7、感知机-多个样本并增加偏置样本维度增加 1.8、感知机-多个输出同一个样本输出维度增加
讨论增加一个输出时的样子 1.9、感知机-多个样本多个输出样本、输出维度同时增加
当样本维度和输出维度同时增加时 1.10、关于广播机制
对于矩阵A和B的元素操作点乘、点加、点除等等。广播机制约定了假设A是1x5B是3x5则约定把A在行方向复制3份后再与B进行元素操作同理可以发生在列上或发生在B上 1.11、以下是动画
解释维度增加时矩阵表示的差异 1.12、锻炼一下
注意这里没有考虑激活的存在是否和你想的一样 再回过头看BP的图你看懂了吗学会了用矩阵的视角看这种了吗这种图通常省略了偏置和激活实际中都存在偏置和激活 第二节BP在干嘛到函数的最小化
BP到底干了嘛函数最小化是什么
2.1 实际例子理解样本书、特征数 2.2 理解BP的意义
当我们明白了特征可以逐层映射到结论时输入特征和结论可以收集得到。权重该怎么来呢对BP就是在给定输入特征和输出结论后告诉你中间权重应该取值多少是合适的 2.3 样本1
这里分析了单位带来的问题 2.4 样本2 2.5 发生误差
这里着重强调输入特征、推测结果、结论之间的关系 - 通过推测结果和真实情况之间的误差反向传递到模型中促使模型做出调整使得推测结果更接近真实情况。用到的方法即误差反向传播算法BPBack Propagation
2.6 定义误差度量方式
注意分类问题二元交叉熵更合适这里为了简化 2.7 转换为函数最小化问题
归根结底是为了知道误差最小时 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YuRuTYw4-1657805811986)(https://www.zhihu.com/equation?tex%5Ctheta)] 的取值如何得到最合适的权重?这里提到BP告诉我们采用 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfClaXwG-1657805811986)(https://www.zhihu.com/equation?tex%5Ctheta)] 的负梯度方向关于负梯度方向请看后面分析 2.8 函数最小化举例1 2.9 函数最小化举例2
为什么是适当的很小步长因为梯度方向告诉我们函数上升最快的方向但是并没有人告诉我们距离最小值有多远那么我们只能走很小的一步。然后再看看梯度方向继续走很小一步。多次迭代后找到最小值。如果步长太大其结果是在中间震荡无法收敛。所以是超参数经验值 第三节矩阵求导的推导和结论
既然BP可以用矩阵描述那么反向求导时则需要处理矩阵求导。这是简化BP理解的一个关键一定不要用单个值的方式去理解他太绕了还难以实现
3.1 导数定义
资料https://www.cnblogs.com/lingjiajun/p/9895753.html 3.2 f(x)ax时的导数 3.3 f(x)x^2时的导数 3.4 使用梯度下降求解sqrt(a) - 有了导数值我们可以使用梯度下降负梯度方向更新法迭代找到误差函数的极小值位置今儿找到我们想要的解 步骤如下 代码部分如下 3.5 扩展阅读使用牛顿法求解sqrt(a)
牛顿法更新时采用的是x x - 一阶导/二阶导速度比梯度下降法快不少但是他要求解二阶导很难计算 3.6 矩阵求导定义操作
定义基本操作模拟误差计算函数使用矩阵表达 3.7 定义误差函数error 3.8 汇总error的定义 3.9 error对A的偏导数 3.10 error对B的偏导数 3.11 矩阵求导结论 第四节代码实现
4.1 介绍
对于C
既然是基于矩阵操作则首先要实现基于C的矩阵类。这里matrix.hpp解决矩阵操作问题矩阵的元素操作、广播等由于C矩阵乘法效率问题可以考虑引用OpenBLAS库工程实现代码请访问https://github.com/shouxieai/bp-cpp
对于Python
直接利用Numpy可以轻易实现矩阵操作、广播、元素乘法Python中Numpy的矩阵操作已经进行了优化
IDE采用VSCode编译采用Makefile若要配置Makefile和vscode的开发环境请访问使用Makefile配置标准工程环境
4.2 图像矩阵化 4.3 训练逻辑
加载mnist数据集为矩阵分别有
训练集图像50000 x 784训练集标签50000 x 1测试集图像10000 x 784测试集标签10000 x 1
\2. 预处理数据 将训练集图像转换为浮点数并做归一化 将训练集标签转换为onehot热独编码变为50000 x 10将测试集图像转换为浮点数并做归一化将测试集标签转换为onehot热独编码变为10000 x 10
\3. 初始化部分 初始化超参数隐藏层数量定为1024迭代次数10轮动量0.9批次大小256 定义4个权重分别是 输入映射到隐层input_to_hidden784 x 1024 隐层偏置hidden_bias1 x 1024隐层到输出层hidden_to_output1024 x 10输出层偏置output_bias1 x 10 初始化权重使用凯明初始化fan_in fan_out偏置初始化为0
\4. 前向部分 - forward 从训练集中随机选择batch个样本记为x(batch x 784)。选择对应的onehot标签记为y(batch x 10) 以x乘以映射矩阵input_to_hidden然后加上隐层偏置再对结果做激活。作为隐层输出这里采用relu函数为激活 hidden_act (x input_to_hidden hidden_bias).relu() 以hidden_act乘以映射矩阵hidden_to_output然后加上输出层偏置再对结果做激活。作为输出层的输出值。这里采用sigmoid函数做激活 probability (hidden_act hidden_to_output output_bias).sigmoid() 使用probability和y计算交叉熵损失并打印损失
\5. 反向部分 - backward 计算loss对所有权重的梯度例如先计算对括号内的导数然后链式求导往前递推直至所有权重梯度计算出来这里利用矩阵求导 对所有权重和其梯度值执行SGDMomentum算法更新权重。该算法相比前面讲的增加了动量因素。稍微公式不一样
\6. 循环迭代直至迭代次数满足定义次数后结束并储存模型
PPT课件下载
点击下载
原稿地址
彻底理解BP反向传播算法矩阵思维你更好懂 | 手写AI
视频讲解
崔更规划中B站主页地址https://space.bilibili.com/1413433465/