| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 神经网络与BP反向传播 -> 正文阅读 |
|
[人工智能]神经网络与BP反向传播 |
BP的思路: 使用每一个结点的输出去求梯度更新到达这个结点的权值,如下图 使用h1的输出和h2的输出求梯度,去更新i1的w1和w2, b1参数 也就是用h1这一层的输出去计算梯度更新第一层的权重,使用o1这一层网络的所有输出计算梯度,更新第二层参数。 1.首先用随机初始化w矩阵(或者其他初始化方式),用这个w和输入数据x作矩阵运算,得到隐藏层输出和输出层的输出值,? 前向传播完成 2. 之后计算损失值, 利用这个损失值去更新输出层参数w和b, 隐藏层每个结点梯度用下面方法,??????????????????????????????? ??????????? 解释隐层的梯度计算方法: 如下图, 计算o1的梯度是将o1和o2的损失加起来,求导得到梯度,但是h1的梯度等于o1对h1求导 + o2对h1求导? ,因为h1有两个输出都会影响h1的梯度。 3. 使用梯度下降算法迭代更新网络中的w和b值,最终训练结束得到的w和b值就是我们想要的模型. 公式:???z = w T * x + b?????? a = sigmoid( z )?????? J(w,b)=(1/2)*(a-y)^2????? w1 := w1 - α * dw1 现在要计算J对w的导数,根据链式法则,?????????????????????????????????????????????????????????????????????????????????????? 1. 先用J对预测值a求偏导, 导数等于= (1/2)*(a-y)^2??? 对a求偏导,? 等于=a-y ???????????????????????????? 2. 用a对z也就是激活函数求偏导,?? 就是求sigmoid(z)对z求导数, 导数等于=激活函数的导数??????? 3. 用z再对w求偏导,导数等等于w T * x + b 对w求偏导,????????????????????????????????????????????????????????????? 最后,三个导数相乘,根据链式法则,就得到了 J对w的导数. 隐藏层的求导过程:? 1.使用输出的得到的损失J, 用J和h1的输出a求导,(若隐层的下一层有多个神经元,则该神经元的输出等于下一层每个神经元的输入之和,即J对a求偏导,要将该神经元的所有输出分别求偏导累加) ? 之后h1的输出a再对z求偏导, 3. z在对h1的w求偏导,三个导数相乘就得到了隐层之间求导关系。 吴恩达老师的求导过程: 激活函数以及对应的导数: 1.感知器: 是模仿神经元,对于多个输入节点,{xi | i=1,2,3....}对应一个输出结点y,每一个输入xi乘以相应的连续权重wi,然后累加得到输出。 神经元运算: ? 下面是搬运:反向传播——通俗易懂_chengchaowei的博客-CSDN博客_反向传播 向看明白下面的BP,就要搞清楚net1, o1代表的是什么。 Step 1 前向传播 1.输入层---->隐含层: 计算神经元h1的输入加权和: 神经元h1的输出o1:(此处用到激活函数为sigmoid函数): 同理,可计算出神经元h2的输出o2:
2.隐含层---->输出层: 计算输出层神经元o1和o2的值:
这样前向传播的过程就结束了,我们得到输出值为[0.75136079 , 0.772928465],与实际值[0.01 , 0.99]相差还很远,现在我们对误差进行反向传播,更新权值,重新计算输出。 Step 2 反向传播 1.计算总误差 总误差:(square error) 但是有两个输出,所以分别计算o1和o2的误差,总误差为两者之和: 2.隐含层---->输出层的权值更新: 以权重参数w5为例,如果我们想知道w5对整体误差产生了多少影响,可以用整体误差对w5求偏导求出:(链式法则) 下面的图可以更直观的看清楚误差是怎样反向传播的: 现在我们来分别计算每个式子的值: 计算: 计算: (这一步实际上就是对sigmoid函数求导,比较简单,可以自己推导一下) 计算: 最后三者相乘: 这样我们就计算出整体误差E(total)对w5的偏导值。 回过头来再看看上面的公式,我们发现: 为了表达方便,用来表示输出层的误差: 因此,整体误差E(total)对w5的偏导公式可以写成: 如果输出层误差计为负的话,也可以写成: 最后我们来更新w5的值: (其中,是学习速率,这里我们取0.5) 同理,可更新w6,w7,w8: 3.隐含层---->隐含层的权值更新: 方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从out(o1)---->net(o1)---->w5,但是在隐含层之间的权值更新时,是out(h1)---->net(h1)---->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。 计算:? 这里的分子表示的是h1结点的总输出值, 不是输出层的 J(w,b)值。 先计算: Eo1对net求导看成是输出对a值求导,? net对outh1求导看成是对激活函数求导 下图,0.74136507是损失J(w,b)=(1/2)*(a-y)^2,? 是J 对a求导??? 下图的0.186815602是把z值代入得到激活函数sigmoid(z)的导数值, 同理,计算出:
两者相加得到总值: 再计算:? 这是激活函数求导。 再计算:?? 这是 z=w*x+b对w求导 最后,三者相乘: ?为了简化公式,用sigma(h1)表示隐含层单元h1的误差: 最后,更新w1的权值: 同理,额可更新w2,w3,w4的权值: 这样误差反向传播法就完成了,最后我们再把更新的权值重新计算,不停地迭代,在这个例子中第一次迭代之后,总误差E(total)由0.298371109下降至0.291027924。 数据特征对学习的影响:?? ?1.一般而言, 机器学习中特征越多, 给出信息 就越多, 识别准确性会得到提升; 2.但特征多, 计算复杂度增加, 探索的空间就大??? 3.如果有对分类无益的特征, 反而可能干扰学习效果。 ? 结论: 特征不一定越多越好, 获得好的特征 是识别成功的关键。 需要有多少个特征, 需要学习问题本身来决定。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 7:51:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |