目录
前言
在上周的学习中主要学习了机器学习的相关概念与机器学习的学习过程,包含三个步骤:定义一个函数、定义损失函数、最优化。但如果需要达到更加优秀的结果则需要寻找一个更优的损失函数,在经过一系列过程之后得到了一个更加强大的 Loss 函式 Sigmoid Function。当有多个Feature,时,就需要做一些变化,例如用 j 来代表 Feature 的编号,下面将详细介绍该过程,并将本周学习内容一起撰写如下。
摘要
从深度学习的发展史来看,深度学习是人工神经网络的一个分支,具有深度网络结构的人工神经网络是深度学习最早的网络模型。在本周的学习首先学习了深度学习的发展历史,其次是学习了神经网络中的各个层以及各个层之间的连接方式,最后学习了神经网络中的前向传播与反向传播。
Abstract
From the development history of deep learning, deep learning is a branch of artificial neural network, and artificial neural network with deep network structure is the earliest network model of deep learning. In this week’s study, we first learn the history of the development of deep learning, followed by learning the layers in neural networks and the connection between each layer, and finally learning the forward and backward propagation in neural networks.
1、更多的 Feature
在上周当中已经找到了一个更加强大的 Loss 函式 Sigmoid Function,当 拥有更多的Feature 时,则需要对函式进行一些变化,我们也可以用多个 Feature,可以用 j 来代表 Feature 的编号。如下图1-1.
1.1、向量表示 Model
接下来用比较直观的方式把这个式子实际上做的事把它画出来。我们只考虑前一天、前两天跟前三天的情况,所以 j 等于 1、2、3;输入就是 x1 代表前一天的观看人数,x2 和 x3 分别表示三天前的观看人数。由上面的式子可以看出每个 i 就代表了一个蓝色的 Function,即一个 Sigmoid Function。
因此,对于前一天,即 j = 1 ,Sigmoid 括号中的式子就可以表示为如下图
用同样的方式可以计算出前三天的情况。计算方式如下:
为了简化起见,把括号中的数字用一个比较简单的符号来表示,分别表示为 r1、r2 和 r3。到这里,发现已经可以用矩阵跟向量相乘的方法写一个比较简单、简洁的写法了。把 x1、x2、x3 乘上不同的 Weight,加上不同的 Bias,也就是不同的 b 会得到不同的 r,再次简化成矩阵跟向量的相乘,把 x1、x2、x3 拼在一起变成一个向量 x,把所有的 w 统统放在一起变成一个矩阵 w,把 b1、b2、b3 拼起来变成一个向量 b,把 r1、r2、r3 拼起来变成一个向量 r,即可以得到第三个更加简洁的式子。
现在所有的 Sigmoid Function 要做的事情,就可以简化表示成下面的样子。把 r1、r2、r3 分别通过 Sigmoid Function 表示,然后得到 a1、a2、a3。
接下来 Sigmoid 的输出还要乘上 ci 然后再加上 b,就得到了最终的 Model Function。这里需要注意的一点,就是我们把 c1、c2、c3 拼起来叫向量 c,为了和矩阵 a 相乘,需要对向量 c 进行转置,在这里就是由 1x3 的矩阵 c 转置为 c,再和 3x1 的矩阵 a 相乘。
到这里我们整理下一下,就得到最终用向量表示的式子,如下所示。
说明:
x 表示 Feature,即例子中的前一天、前两天、前三天和前 j 天的观看人数;w、绿底 b、c、灰底 b 是未知参数。
2、机器学习新三部曲
接下来将用一种新的方式重新开始机器学习的三个步骤。
2.1、找一个函式
把这些东西通通拉直拼成一个很长的向量,把 w 的每一个 Column 或每一个 Row 拿出来拼成一个长的向量,把绿色 b 拼上来,把 c 拼上来,把灰色 b 也拼上来,这个长的向量用一个符号 θ 来表示它。 θ 统称我们所有的未知参数。这样我们就重新改写了机器学习的第一步,即重新定了一个有未知参数的 Function。
2.2、定义loss函式
有了新的这个 Model,用 θ 来代表所有未知的参数,Loss Function 就变成 L( θ ),这个 Loss Function 要问的就是 θ 如果它是某一组数值的话,会有多不好或有多好,计算的方法和之前只有两个参数的时候是一模一样的。先给定某一组 θ 的值,然后把一种 Feature x 带进去,看看估测出来的 y 是多少,再计算跟真实的 Label 之间的差距 e,把所有的误差通通加起来就得到最终的 Loss 。
2.3、Optimization 最佳化
接下来下一步就是 Optimization,它的算法还是 Gradient Descent,就是要找一组 θ,这个 θ 可以让 Loss 越小越好,可以让 Loss 最小的那一组 θ,就叫做 θ 。
随机选一个初始的数值 θ ,然后对每一个未知的参数都去计算它对 L 的微分,计算的结果集合起来就是一个向量,用 g 表示,叫它 Gradient,中文可以称为梯度向量。可以在 L 前面放了一个倒三角形,来简写这个向量。
接下来将更新参数,本来有一个参数叫 θ1,那上标 0 代表它是一个起始的值,把这个 θ10 减掉 learning rate 乘上微分的值得到 θ11,代表 θ1 更新过一次的结果,以此类推就可以把所有的参数统统都更新了,用向量表示就是下方的简写式子。
说明:
Learning Rate是调整神经网络输入权重的一种方法。一般Learning Rate的取值都在0.0001到0.01之间。举个例子,Learning Rate的效果就像走路时的步子,步子迈大了,很容易错过最佳点,而迈小了又需要花更长的时间才能到最佳点。
根据 Gradient 去把 θ0 更新成 θ1;然后再算一次 Gradient,然后根据 Gradient 把 θ1 再更新成 θ2;再算一次 Gradient 把 θ2 更新成 θ3,以此类推。直到我们不想做或者算出来的 Gradient 是零向量 Zero Vector 导致没有办法再更新参数为止。
3、Batch 和 Epoch
实际上我们在做 Gradient Descent 的时候,并不会拿所有的大 N 笔资料来计算 Loss,而是把这大 N 笔资料随机分成一包一包的数据,每一个包就是一个 Batch。然后只拿一个 Batch 里面的 数据来计算一个 Loss,这里叫它 L1;根据 L1 来算 Gradient,用这个 Gradient 来更新参数;接下来再选下一个 Batch 算出 L2,然后更新参数;再取下一个 Batch 算出 L3,再根据 L3 算出 Gradient 来更新参数。把所有的 Batch 都计算过一次叫做一个 Epoch ,每一次更新参数叫做一次 Update。
4、神经网络
4.1、神经网络简介
神经网络中包含许多的神经元,一个神经元通俗的说是一个函式,函式之间可以进行全连接,也可以使用其他的连接方式,一系列函式组合在一起就形成了函数网络,也叫神经网路。神经网络中所有的weight和所有的bias组合在一起形成的参数叫做
θ
\theta
θ,如下图。
前馈神经网络:前馈神经网络(Feedforward Neural Network),简称前馈网络,是人工神经网络的一种。在此种神经网络中,各神经元从输入层开始,接收前一级输入,并输出到下一级,直至输出层。
在神经网络中主要包含三层:输入层、隐藏层、输出层。在输入层中输入数据,隐藏层对数据进行处理,输出层对处理好的数据进行输出,隐藏层的层数称为深度。
当我们需要进行神经网络的运作时通常会使用matrix,输入数据后,将各个weight转换为matrix再加上对应的bias,将得出的数值放到function中进行计算得出新的值,作为下一层的input数据,以此类推,直到算出最终的output。如下图
如何计算输出层的数据呢?将第一个layer中所有的输入数据记为X,所有的weight记为W1,所有的b记为b1,再经过function的计算得到a1,以此类推,最终得到output。
使用并行计算能够加快矩阵计算的速度,得到一个最终的function,如下图。
神经网络中的隐藏层分为单个隐藏层、多个隐藏层。
单个隐藏层:把输入数据抽象到一个维度空间,用于展现其抽象化的特征,得到的特征能够更好地进行特征划分。
多个隐藏层:对输入的数据进行多层次的抽象,以便于更好地划分不同类型的数据。
在下图中,输出层的数据时通过较为复杂的多分类器进行分类输出数据。输出层神经元的个数表示
分类标签的个数。
说明:
做二分类时,输出层所使用的激活函数是sigmoid函数,输出层神经元个数为1个,如果使用softmax函数,输出层神经元个数为2个
4.2、神经网络的前向传播与反向传播
4.2.1、前向传播
在全连接神经网络中,每一层的每个神经元都会与前一层的所有神经元或者输入数据相连,因此,在计算的时候,每一个神经元的输出=使用激活函数激活前一层函数的累加和,具体每一个神经元的计算如上图matrix operation中所示。
4.2.2、反向传播
反向传播算法(Backpropagation,简称BP算法)是“误差反向传播”的简称,是适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。梯度下降法是训练神经网络的常用方法,许多的训练方法都是基于梯度下降法改良出来的。梯度下降法通过计算损失函数的梯度,并将这个梯度反馈给最优化函数来更新权重以最小化损失函数。
梯度下降的计算方法首先是选取出一组
θ
\theta
θ值,再对每一个W和B进行求微分得到
θ
\theta
θ^0,再结合learning rate,计算得到
θ
\theta
θ^1,再接着一次更新
θ
\theta
θ值,为了更加高效的计算该过程,因此可以使用反向传播。
在反向传播的计算过程中,需要使用的计算法则为train rule,计算方式如下:
如何计算快速计算一个梯度呢?使用下图中的公式进行计算:其中 x^n 是一系列的输出值,经过计算得到y^n (输出值)的值,C^n 是 y~^n (目标值)之间的差值,loss=一系列的C^n 值的和,loss再对每一个参数求微分,则可以得到一个右边新的式子,那么接下来就只需要计算部分数据的 C^n与部分数据的W微分,则可以得到蓝色箭头指向的式子。
当把第一个神经元单独拿出来的时候,图中x1与x2作为input,那么第一个神经元的计算方式即为图中所计算z=x1w1+x2w2+b,loss根据chain rule再对w求微分即得到如下式子:
其中对计算所有parameters中w求微分叫做前向传播,为所有激活函数的输入z计算偏微分即为反向传播。如下图所示:
首先需要做的是计算前向传播的部分中
∂
\partial
∂z/
∂
\partial
∂w,在该部分的计算中,可以得出一个规律:与神经元相连的W的输入即为对应的Wi的微分。如下图所示:
具体详细计算举例如下图所示:其中第二层的input为input层经过激活函数计算得出的数据,以此类推。
那么接下来将计算
∂
\partial
∂C/
∂
\partial
∂z的值,该部分的计算比较复杂,假设第一个layer得到的数据为a,则可以变换为
∂
\partial
∂C/
∂
\partial
∂z=
∂
\partial
∂a/
∂
\partial
∂z*
∂
\partial
∂C/
∂
\partial
∂a,而
∂
\partial
∂a/
∂
\partial
∂z为
σ
\sigma
σ(z)的微分。
再进入到下一层中,假设有两个neuron会对
∂
\partial
∂C/
∂
\partial
∂a产生影响,经过chain rule法则得到
∂
\partial
∂C/
∂
\partial
∂a的值,其中根据根据前向传播的计算规律,可以得到
∂
\partial
∂z’/
∂
\partial
∂a的值为w3,而
∂
\partial
∂C/
∂
\partial
∂z’以及后面红色问号不部分将如何计算呢?如下图所示:
∂
\partial
∂C/
∂
\partial
∂z’以及后面红色问号部分假设已经知道结果,那么将已经知道的结果带入到上图中的式子就可以得到如下图的等式:
在假设
∂
\partial
∂C/
∂
\partial
∂z’以及后面红色问号部分假设已经知道结果的情况下,上图中
∂
\partial
∂C/
∂
\partial
∂z的等式与下图中的过程是同理的:
那么现在只有
∂
\partial
∂C/
∂
\partial
∂z’,与
∂
\partial
∂C/
∂
\partial
∂z’‘,还没有具体计算出来,现在假设y1与y2即为output layer,并且已经知道结果,那么
∂
\partial
∂C/
∂
\partial
∂z’的计算将变成下图中式子,
∂
\partial
∂C/
∂
\partial
∂z’'同理,在case1 中已经知道output的情况下,此时所有未知的东西都能够计算出来,那么就已经计算结束。
当神经网络中不只是三层的时候,还需要继续往下计算,那么将会更加麻烦,举例case2,那么用case1的计算方法可以继续进行计算,进而得到数据,使用同样的方法一直继续下去,直达到达output layer时停止。
但实际上我们可以从反向方进行计算,这样就可以使得计算更加高效。
总结
在本周的学习中,重要的知识点是反向传播,所使用的到的微分法则为chain rule,反向传播概括的说包含两个步骤:1、计算误差;2、更新权重。在反向传播中,实际上是建立一个反方向的申请网络,但在这个过程中需要先计算出前向传播的 ∂ \partial ∂z/ ∂ \partial ∂w,再以反方向进行进行计算。