Make Your Own Neural Network (14) - How to actually update the weights (2)

Make Your Own Neural Network

Build your own neural network

https://blog.csdn.net/lz0499

Author: lz0499


 

statement:

1) Make Your Own Neural Network translated from the Neural Network Introductory book written by Tariq Rashid . The author's goal is to use as little jargon and advanced mathematics as possible to explain how neural networks work in a graphic and textual way. Anyone with a high school math level can understand how neural networks work. This book is highly recommended for beginners as an introductory book on neural networks.

2) This article is for academic exchange only, not for commercial use. The original intention of translation is to deepen the understanding of neural networks while translating.

3) Due to the new knowledge of neural networks, some mistakes are inevitable in the translation process. If you find any mistakes, please correct me. Thanks!

4) Due to work reasons, I will selectively update the translation according to the original chapters from time to time.

5) This belongs to the first version. If there are errors, it is necessary to continue to correct and add or delete.


content:

Part 1: How Neural Networks Work

A simple prediction machine

Classification is Prediction

train a simple classifier

A single classifier does not seem to be enough

Neurons, the computers of nature

Signals through the neural network

Matrices are useful

Using a matrix to calculate the output of a three-layer neural network

Update weights from multiple nodes

Backpropagating errors from multiple nodes

Multilayer Neural Network Layer Backpropagation Error

Calculating Backward Propagation Error Using Matrix Multiplication

How to actually update the weights (1)

How to actually update the weights (2)

Weight update example
How to actually update the weights (2)

The output of a neural network is a complex function with very many weighted parameters. Can we find its weights using gradient descent? As long as we can use the correct error function, the parameter values ​​of the weights in the neural network can be obtained.

The output of a neural network is not itself an error function. But we can easily convert it to an error function, because the error is the difference between the target value of the training sample and the output value of the neural network.

as shown in the table below. The table below annotates the training and actual output values ​​of the three output nodes, as well as the error values ​​between them.


第一个候选误差函数非常简单,即目标值-实际输出值。这看起来很合理不是?如果我们以所有节点的误差和这个角度来度量神经网络训练的是否足够好,你将观察到其误差和为0!!

怎么回事?很明显,神经网络并没有被很好的训练,因为两个输出节点的值与目标值不一样,并且误差和为0意味着没有误差!!由于正负误差刚刚抵消了所以出现了误差和为0。即使误差没有完全的抵消,我们也可以观察到这是一种比较差的误差测量法。

让我们用实际输出值和目标值之间的绝对值来测量误差。这意味着我们将忽略符号,并即为|目标值-实际值|。最后误差求和时并没有完全的抵消。但是实际我们并不采用这种方法测量误差,因为在梯度下降法中靠近最小值的时候,其斜率并不是连续的,导致梯度下降法并不能很好的发挥作用。

第三种误差测量函数使用的是(目标值-实际值)的平方。我们采用这种函数测量误差主要是基于如下几点:

1.梯度下降法中求解斜率的时候比较容易。

2.这个误差函数时平滑而连续的,能够很好的发挥梯度下降法的优势

3.当靠近最小值的时候,梯度值越来越小。这意味着我们将使用平滑的步长靠近最小值,从而避免越过最小值的风险。

下面小节中我们将采用第三种误差测量函数。有人会问,有没有第四种误差测量函数呢?是的,当然有。你可以构建其他误差测量函数。有些不能很好的适用,有些只是针对特定的问题适用。

好了!在开始计算自变量是权重的误差函数之前,我们有些预备知识需要了解---微积分。你可能已经很熟悉微积分了,如果你不是很熟悉或者只是大概了解一些,本书的附录将包含一些这方面的介绍。微积分在数学上描述的是当一个变量变化时,另外一个变量将做如何变化。比如说,弹簧的长度改变时,弹簧的弹力将如何改变。对于神经网络而言,我们关心的是误差函数将随着权重的改变做何种改变。

让我们从一幅图画开始。


就像上一小节那样,图例中我们并没有做过多的修改。但是这次我们想获得的最小值指的是神经网络中误差的最小值。我们需要修改的参数是神经网络中的斜率。在这简单的例子中,我们只是标示了一个权重值,但是你要知道的是神经网络中将会有很多的权重值。

下图表示的是两个权重值,并且误差函数中包含两个权重参数。我们试图求得最小误差值的过程有点像之前复杂地形中找到最低山谷的过程。

 

对于有很多参数得误差函数来说,我们很难直观的用可视化的方式呈现。但是我们在这个多维平面中找最小值所使用的梯度下降法和之前是一样的。

让我们用数学公式写出下面的误差函数的相关梯度结果:

这个偏导数表示的是当权重Wjk变化时,误差E将怎样变化。这个偏导数表示的是误差函数靠近最小值的斜率。

在我们详细解释这个表达式之前,让我们专注于隐藏层和最后输出层之间一个节点的情况。如下图高亮度标注。我们将会回到这张图,阐述输出层与隐藏层之间权重的计算方法。

在后续计算微积分的时候,我们将会提到上面这幅图,确保我们不会忘记每一个符号所代表的含义。别太紧张,后续计算步骤并不难并且会一一解释。所有的概念在之前的小节中已经阐述过了。

首先,让我们扩展下神经网络的误差函数:神经网络输出层n个输出节点的目标值和实际值之间差值的平方和,即


现在我们做的只是把实际的误差函数写出来。

我们可以简化上述公式,第n个输出节点的输出结果为On,只取决于前向神经网络层与它相连的节点。这意味着对于节点K,其输出结果Ok只取决于权重Wjk。因为只有这些节点与节点k相连。

从另外一个角度来看,节点k的输出结果并不取决于权重wjb,b不等于k。因为节点k与前向节点b之间并无连接。权重Wjb表示的是与输出节点b相连的权重而不是与输出节点k相连的权重。

这意味着我们可以把上述公式中n个输出结果中只与输出节点k的输出结果,因为ok只取决于Wjk

至此,你可能意识到对于某一个节点来说,并不需要计算所有节点的误差平方和。因为输出节点的输出误差只取决于与之相连节点的权重值。

总之,我们有了一个更为简单的表达式:

现在我们可以开始微积分计算了。

tk是一个常量,它不会随着Wjk的变化而变化。即tk并不是Wjk的函数。公式中的Ok这部分取决于权重wjk。我们将用到微积分的链式规则把上述公式中分几步进行微积分运算。即:

现在我们可以分别计算每一个部分。第一部分是对一个简单的二次方函数求导。即:


第二部分需要稍微思考下,但是也并不难。如果你还记得前面小节的话,节点k的输出结果Ok是与前一层相连节点输出结果加权和应用于sigmoid激活函数之后的输出结果。让我们写下如下公式:

其中Oj是隐藏层j节点的输出结果,而不是最后一层的输出结果Ok

我们该如何对sigmoid函数求导呢?用链式法则和e的指数求导法则,可得到如下公式

有些函数求导之后,求导结果会非常复杂。但是sigmoid激活函数却是相对简单的一个结果。这也是为什么sigmoid函数在神经网络中大量使用的原因。

让我们继续计算最后的结果:


这是一个神奇的表达式。我们将使用这个表达式对神经网络进行训练。

我们计算出了求斜率的关键表达式。我们可以利用这个表达式对每一个训练样本进行训练,之后根据训练样本进行更新权重。

记住权重是按照梯度的反方向进行改变。对一些特定问题,我们为了平滑改变权重将使用学习率。使用学习率避免在最小值附近的时候,超过最小值,来回震荡。我们用数学表示为:


需要更新的权重值Wjk是旧的权重值减去误差函数斜率值。之所以减去误差函数的梯度值是因为当斜率是正值的时候,我们想减小权重;当斜率是负值的时候我们想增加权重。符号æ是保证权重值平滑变化的一个因子,避免在靠近最小值的时候越过最小值。这个因子常常被称为学习率。

这个表达式也是可以应用于输出层和隐藏层,而不仅仅限于隐藏层和输出层之间。在我们计算微积分之前,我们试着用矩阵的形式表示上述表达式:

矩阵权重改变的值包括:某一层的节点j与下一层的节点k之间的权重。我们可以观察到表达式的第一部分使用的是下一层的值,而表达式最后一部分使用的是前一层的输出值。

上式中最后一部分是一个行向量,也即是上一层输出结果的转置。因此我们可以使用下面公式表示最终的结果:


这个表达式其实不是很复杂。那些sigmoid激活函数消失了,因为我们用节点的输出Ok替代了它。




















Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325407590&siteId=291194637