Press "Enter" to skip to content

神经网络与BP反向传播 BP的思路:1.首先用随机初始化w矩阵(或者其他初始化方式),用这个w和输入数据…

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

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.隐含层—->隐含层的权值更新:

 

隐层中,z对w的求导就是前一层输出值。

 

方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对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.如果有对分类无益的特征, 反而可能干扰学习效果。

 

结论: 特征不一定越多越好, 获得好的特征 是识别成功的关键。 需要有多少个特征, 需要学习问题本身来决定。

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注