系列之1-神经网络的基本工做原理

Copyright © Microsoft Corporation. All rights reserved.
适用于License版权许可
更多微软人工智能学习资源,请见微软人工智能教育与学习共建社区git

看过不少博客、文章,东一榔头西一棒子的,总以为没有一个系列的文章把问题从头至尾说清楚,找东西很困难。有的博客、文章的质量还不算很理想,似是而非,或者重点不明确,或者直接把别人的博客抄袭过来......种种不靠谱,让小白们学习起来很困难,增长了学习曲线的陡峭程度。固然也有不少博主很是很是负责任,文章质量很高,只是连续度不够,正看得过瘾的时候,没有后续章节了。github

从本文开始,咱们试图用一系列博客,讲解现代神经网络的基本知识,使你们可以从真正的“零”开始,对神经网络、深度学习有基本的了解,并能动手实践。这是本系列的第一篇,咱们先从神经网络的基本工做原理开始讲解。算法

神经元细胞的数学计算模型

神经网络由基本的神经元组成,下图就是一个神经元的数学/计算模型,便于咱们用程序来实现。网络

输入

(x1,x2,x3) 是外界输入信号,通常是一个训练数据样本的多个属性,好比,咱们要识别手写数字0~9,那么在手写图片样本中,x1可能表明了笔画是直的仍是有弯曲,x2可能表明笔画所占面积的宽度,x3可能表明笔画上下两部分的复杂度。框架

(W1,W2,W3) 是每一个输入信号的权重值,以上面的 (x1,x2,x3) 的例子来讲,x1的权重多是0.5,x2的权重多是0.2,x3的权重多是0.3。固然权重值相加以后能够不是1。函数

还有个b是干嘛的?通常的书或者博客上会告诉你那是由于\(y=wx+b\),b是偏移值,使得直线可以沿Y轴上下移动。这是用结果来解释缘由,并不是b存在的真实缘由。从生物学上解释,在脑神经细胞中,必定是输入信号的电平/电流大于某个临界值时,神经元细胞才会处于兴奋状态,这个b实际就是那个临界值。亦即当:学习

\[w1*x1 + w2*x2 + w3*x3 >= t\]测试

时,该神经元细胞才会兴奋。咱们把t挪到等式左侧来,变成\((-t)\),而后把它写成b,变成了:优化

\[w1*x1 + w2*x2 + w3*x3 + b >= 0\]人工智能

因而b诞生了!

求和计算

\[Z = w1*x1 + w2*x2 + w3*x3 + b = \sum_{i=1}^m(w_i*x_i) + b\]

在上面的例子中m=3。咱们把\(w_i*x_i\)变成矩阵运算的话,就变成了:

\[Z = W*X + b\]

激活函数

求和以后,神经细胞已经处于兴奋状态了,已经决定要向下一个神经元传递信号了,可是要传递多强烈的信号,要由激活函数来肯定:

\[A=\sigma{(Z)}\]

若是激活函数是一个阶跃信号的话,那受不了啊,你会以为脑子里老是一跳一跳的,像继电器开合同样咔咔乱响,因此通常激活函数都是有一个渐变的过程,也就是说是个曲线。

激活函数的更多描述在后续的博客中。

至此,一个神经元的工做过程就在电光火石般的一瞬间结束了。

神经网络的基本训练过程

单层神经网络模型

这是一个单层的神经网络,有m个输入 (这里m=3),有n个输出 (这里n=2)。在单个神经元里,b是个值。可是在神经网络中,咱们把b的值永远设置为1,而用b到每一个神经元的权值来表示实际的偏移值,亦即(b1,b2),这样便于矩阵运算。也有些做者把b写成x0,实际上是同一个意思,只不过x0用于等于1。

  • (x1,x2,x3)是一个样本数据的三个特征值
  • (w11,w12,w13)是(x1,x2,x3)到n1的权重
  • (w21,w22,w23)是(x1,x2,x3)到n2的权重
  • b1是n1的偏移
  • b2是n2的偏移

从这里你们能够意识到,同一个特征x1,对于n一、n2来讲,权重是不相同的,由于n一、n2是两个神经元,它们完成不一样的任务(特征识别)。这就如同老师讲一样的课,不一样的学生有不一样的理解。

而对于n1来讲,x1,x2,x3输入的权重也是不相同的,由于它要对不一样特征有选择地接纳。这就如同一个学生上三门课,可是侧重点不一样,第一门课花50%的精力,第二门课30%,第三门课20%。

训练流程

从真正的“零”开始学习神经网络时,我没有看到过一个流程图来说述训练过程,大神们写书或者博客时都忽略了这一点,我在这里给你们画一个简单的流程图:

损失函数和反向传播的更多内容在后续的博客中。

前提条件

  1. 首先是咱们已经有了训练数据,不然连目标都没有,训练个啥?
  2. 咱们已经根据数据的规模、领域,创建了神经网络的基本结构,好比有几层,每一层有几个神经元
  3. 定义好损失函数来合理地计算偏差

步骤

假设咱们有如下训练数据样本:

Id x1 x2 x3 Y
1 0.5 1.4 2.7 3
2 0.4 1.3 2.5 5
3 0.1 1.5 2.3 9
4 0.5 1.7 2.9 1

其中,x1,x2,x3是每个样本数据的三个特征值,Y是样本的真实结果值,

  1. 随机初始化权重矩阵,能够根据高斯分布或者正态分布等来初始化。这一步能够叫作“蒙”,但不是瞎蒙。
  2. 拿一个或一批数据做为输入,带入权重矩阵中计算,再经过激活函数传入下一层,最终获得预测值。在本例中,咱们先用Id-1的数据输入到矩阵中,获得一个A值,假设A=5
  3. 拿到Id-1样本的真实值Y=3
  4. 计算损失,假设用均方差函数 \(Loss = (A-Y)^2=(5-3)^2=4\)
  5. 根据一些神奇的数学公式(反向微分),把Loss=4这个值用大喇叭喊话,告诉在前面计算的步骤中,影响A=5这个值的每个权重矩阵,而后对这些权重矩阵中的值作一个微小的修改(固然是向着好的方向修改,这一点能够用数学家的名誉来保证)
  6. 用Id-2样本做为输入再次训练(goto 2)
  7. 这样不断地迭代下去,直到如下一个或几个条件知足就中止训练:损失函数值很是小;迭代了指定的次数;计算机累吐血了......

训练完成后,咱们会把这个神经网络中的结构和权重矩阵的值导出来,造成一个计算图(就是矩阵运算加上激活函数)模型,而后嵌入到任何能够识别/调用这个模型的应用程序中,根据输入的值进行运算,输出预测值。

神经网络中的矩阵运算

下面这个图就是一个两层的神经网络,包含隐藏层和输出层:

其中,w1-m,n(应该写做\(w^1_{1,1},w^1_{1,2},w^1_{1,3}\),上面的角标1表示第1层,可是visio里不支持这种格式)表示第一层神经网络的权重矩阵,w2-m,n(应该写做\(w^2_{1,1},w^2_{1,2},w^2_{1,3}\))表示第二层神经网络的权重矩阵。

\[Z^1_1 = w^1_{1,1}x_1+w^1_{1,2}x_2+w^1_{1,784}x_{784}+b_1^1\\ ......\\ Z^1_{10} = w^1_{10,1}x_1+w^1_{10,2}x_2+w^1_{10,784}x_{784}+b_{10}^{1}\]

变成矩阵运算:

\[ Z_1^1=\begin{pmatrix}w^1_{1,1}&w^1_{1,2}&...&w^1_{1,784}\end{pmatrix} \begin{pmatrix}x_1\\x_2\\...\\x_{784}\end{pmatrix} +b^1_1\\ .....\\ Z_{10}^1= \begin{pmatrix}w^1_{10,1}&w^1_{10,2}&...&w^1_{10,784}\end{pmatrix} \begin{pmatrix}x_1\\x_2\\...\\x_{784}\end{pmatrix} +b^1_{10} \]

再变成大矩阵:

\[Z_1 = \begin{pmatrix} w^1_{1,1}&w^1_{1,2}&...&w^1_{1,784} \\ w^1_{2,1}&w^1_{2,2}&...&w^1_{2,784}\\ ......\\ w^1_{10,1}&w^1_{10,2}&...&w^1_{10,784} \end{pmatrix} \begin{pmatrix}x_1\\x_2\\...\\x_{784}\end{pmatrix} +\begin{pmatrix}b^1_1\\b^1_2\\...\\ b^1_{10} \end{pmatrix}\]

最后变成矩阵符号:

\[Z_1 = W_1X + B_1\]

而后是激活函数运算:

\[A_1=\sigma{(Z_1)}\]

同理可得:

\[Z_2 = W_2A_1 + B_2\]
\[A_2=\sigma{(Z_2)}\]

神经网络为何能广泛适用

单层的神经网络可以模拟一条二维平面上的直线,从而能够完成线性分割任务。而理论证实,两层神经网络能够无限逼近任意连续函数。

好比下面这张图,二维平面中有两类点,红色的和蓝色的,用一条直线确定不能把二者分开了。

咱们使用一个两层的神经网络能够获得一个很是近似的结果,使得分类偏差在满意的范围以内。而这个真实的连续函数的原型是:

\[y=0.4x^2 + 0.3xsin(15x) + 0.01cos(50x)-0.3\]

哦,my god(我靠)! 这么复杂的函数,一个两层的神经网络是如何作到的呢?其实从输入层到隐藏层的矩阵计算,就是对输入数据进行了空间变换,使其能够被线性可分,而后输出层画出了一个分界线。而训练的过程,就是肯定那个空间变换矩阵的过程。所以,多层神经网络的本质就是对复杂函数的拟合。咱们能够在后面的试验中来学习如何拟合上述的复杂函数的。

为何须要激活函数

为何咱们不能在没有激活输入信号的状况下完成神经网络的学习呢?

若是咱们不运用激活函数的话,则输出信号将仅仅是一个简单的线性函数。线性函数一个一级多项式。现现在,线性方程是很容易解决的,可是它们的复杂性有限,而且从数据中学习复杂函数映射的能力更小。一个没有激活函数的神经网络将只不过是一个线性回归模型(Linear regression Model)罢了,它功率有限,而且大多数状况下执行得并很差。咱们但愿咱们的神经网络不只仅能够学习和计算线性函数,并且还要比这复杂得多。一样是由于没有激活函数,咱们的神经网络将没法学习和模拟其余复杂类型的数据,例如图像、视频、音频、语音等。这就是为何咱们要使用人工神经网络技术,诸如深度学习(Deep learning),来理解一些复杂的事情,一些相互之间具备不少隐藏层的非线性问题,而这也能够帮助咱们了解复杂的数据。

那么为何咱们须要非线性函数?

非线性函数是那些一级以上的函数,并且当绘制非线性函数时它们具备曲率。如今咱们须要一个能够学习和表示几乎任何东西的神经网络模型,以及能够将输入映射到输出的任意复杂函数。神经网络被认为是通用函数近似器(Universal Function Approximators)。这意味着他们能够计算和学习任何函数。几乎咱们能够想到的任何过程均可以表示为神经网络中的函数计算。
而这一切都归结于这一点,咱们须要应用激活函数f(x),以便使网络更增强大,增长它的能力,使它能够学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。所以,使用非线性激活函数,咱们便可以从输入输出之间生成非线性映射。
激活函数的另外一个重要特征是:它应该是能够区分的。咱们须要这样作,以便在网络中向后推动以计算相对于权重的偏差(丢失)梯度时执行反向优化策略,而后相应地使用梯度降低或任何其余优化技术优化权重以减小偏差。

深度神经网络与深度学习

两层的神经网络虽然强大,但可能只能完成二维空间上的一些曲线拟合的事情。若是对于图片、语音、文字序列这些复杂的事情,就须要更复杂的网络来理解和处理。第一个方式是增长每一层中神经元的数量,但这是线性的,不够有效。另一个方式是增长层的数量,每一层都处理不一样的事情。

浅神经网络虽然具有了反向传播机制,可是仍存在问题:

  1. 梯度愈来愈疏,从后向前,偏差校订信号愈来愈微弱
  2. 随机初始化会致使训练过程收敛到局部最小值
  3. 须要数据带标签(人工label好的数据),可是大部分数据没标签

Deep Learning的训练过程简介

  1. 使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):

    采用无标签数据(有标签数据也可)分层训练各层参数,这一步能够看做是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程能够看做是feature learning过程)。
    具体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层能够看做是获得一个使得输出和输入差异最小的三层神经网络的隐层),因为模型capacity的限制以及稀疏性约束,使得获得的模型可以学习到数据自己的结构,从而获得比输入更具备表示能力的特征;在学习获得第n-1层后,将n-1层的输出做为第n层的输入,训练第n层,由此分别获得各层的参数;

  2. 自顶向下的监督学习(就是经过带标签的数据去训练,偏差自顶向下传输,对网络进行微调):

    基于第一步获得的各层参数进一步fine-tune整个多层模型的参数,这一步是一个有监督训练过程;第一步相似神经网络的随机初始化初值过程,因为DL的第一步不是随机初始化,而是经过学习输入数据的结构获得的,于是这个初值更接近全局最优,从而可以取得更好的效果;因此deep learning效果好很大程度上归功于第一步的feature learning过程。

点击这里提交问题与建议
联系咱们: msraeduhub@microsoft.com
学习了这么多,还没过瘾怎么办?欢迎加入“微软 AI 应用开发实战交流群”,跟你们一块儿畅谈AI,答疑解惑。扫描下方二维码,回复“申请入群”,即刻邀请你入群。

相关文章
相关标签/搜索