《成为机器学习工程师》:什么是神经网络与反向传播算法?

1.什么是神经网络?

1.1 用来干嘛

线性可分与线性不可分

首先,为什么要用神经网络,神经网络可以用来干嘛,它可以用于解决线性不可分或者多分类问题,即非线性分类问题,图中的线性可分和线性不可分都是二分类问题,还有多分类问题,多分类问题即大于2个输出。

解决非线性问题有两种方式,一种是用逻辑回归的方式构造一个含多个非线性项的逻辑回归函数,当特征n太多时,计算的负荷会非常大,比如有100个特征,因为要采用非线性的方式,至少两两组合的话,都有C100 2,从100个特征中选取2种来组合,都有接近5000种组合,这需要计算的特征就太多了,对于很多实际的机器学习问题,n是很大的,如果使用神经网络的方式,计算成本就会小很多了。

1.2 长什么样

神经网络长什么样,它有一个输入层,一个输出层,还有一个或多个隐含层,每一层都有一个偏置单元,例如这里的x0和a0。神经网络模型实际上就是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量,下一层获得了更为高级的特征值,这样就能更好的获得数据的特征,更准确的预测新数据

1.3 具体表示

那它的具体表示是怎样的呢?一般在计算神经网络层数的时候,只计算输入层和隐含层的数量,即上方是一个 2 层神经网络结构。假如是这样的一个两层的神经网络,我们用代表第 层的第 个激活单元,代表从第 层映射到第+ 1 层时的权重的矩阵,通过类似于逻辑回归的形式,这里的g表示的仍然是sigmoid函数,那的值就是学习了训练实例x0,x1,x2,x3之后得到的新的特征值,把得到的新特征值作为输入变量,在输出层就能得到假设值hx。

这里的每一个都是由上一层所对应决定的,这种从左到右的算法称之为前向传播算法

另外行数为第层的激活单元数量,列数为第层的激活单元数+1,例如1的尺寸是3行4列,为什么不是4行4列呢?因为这里的x0和a0都是在计算下一层的时候加上去的,所以a1,a2,a3有三行,x0,x1,x2,x3有四列

1.4 举个例子:为什么有效

这个例子是要去构造一个函数去实现一个XNOR运算功能,即“同或”运算,XNOR运算是两值相同则为真,两值相反则为假,如同图上真值表上的效果,00则1, 11则1, 01和10则0,那么要怎么构造这样的一个函数呢?比如与运算,x1与x2,我们可以赋予-30,20,20的权重构造这样的一个函数,这里的g仍然是sigmoid函数,这样就能得到一个能够拟合与运算的函数了

同理,非x1与非x2,x1或x2都能通过赋予不同的权重去构造一个拟合对应运算的函数。

那XNOR,同或运算要怎么构造类似的函数呢?如果直接构造这样的函数很难,可以间接去构造。

实际上可以先各自计算x1与x2,非x1与非x2,再将两者结果做或运算,x1与x2得到0001的结果a1,非x1与非x2得到1000的结果a2,再将a1,a2相或,这样就得到了一个能实现 XNOR 运算符功能的神经网络。按照神经网络的方法可以逐渐构造出越来越复杂的函数,去解决更复杂的机器学习问题。

2.如何实现一个神经网络

2.1 总体流程

那么要如何实现一个神经网络呢?大概分了7步:

2.2 具体细节2.2.1 如何选择网络结构

第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。

第一层输入层的单元数即我们训练集的特征数量。

最后一层输出层的单元数是我们训练集的结果类型的数量。如果是二元分类问题,就只有0和1两种输出,用1个输出单元即可;如果结果类型有K中,则要设置K个输出单元,每个输出单元设置成K维向量,只有Ki为1,其他都是0

隐藏层合理默认结构是1层,如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好,可以和特征数量相近,也可以是它的2-4倍

2.2.2 如何随机化参数

任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非 0 的数,结果也是一样的

因此我们要把每个初始化成–epsilon到+epsilon区间的随机数

2.2.3 如何计算h(x)

如何用向量化表示的方式计算hx?相对与使用循环来编码,利用向量化的方法会使得计算更为简便,用向量化表示的话,z就等于· X ,a = g(z),以右上角的神经网络为例,用向量化表示就是这样的运算过程。

上面只是针对训练集中一个训练实例x0,x1,x2,x3所进行的计算,如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里,这里一列,这里一列...

2.2.4 如何计算代价函数

如何计算代价函数,神经网络的代价函数和逻辑回归的很类似,是逻辑回归代价函数的一般形式,如果是二元分类问题,k就等于1,就和上面一样的,如果k>1的话,对于每一行特征都会给出个预测,可以利用循环,对每一行特征都预测个不同结果,然后再利用循环在个预测中选择可能性最高的一个,将其与中的实际数据进行比较。

正则化的那一项是排除了每一层0后,每一层的 矩阵的和。

2.2.5 如何计算偏导数

2.2.6 如何确保正确

当我们对神经网络使用梯度下降算法时,可能会存在一些不容易察觉的错误,可能代价看上去在不断减小,但最终的结果可能并不是最优解。

这时可以用一种梯度检测的方法,去估计真实梯度是否和反向传播算法得出的梯度值相近

方法就是在代价函数上沿着切线的方向选择离两个非常近的点,然后计算两个点的斜率用以估计梯度。即对于某个特定的 ,我们计算出 J - 和 J + 的差,再除以2倍的(是一个非常小的值,通常选取10的-4次方,即0.001,这里的epsilon和上面随机化参数是没有关系的)

2.2.7 如何最小化代价函数

如何最小化代价函数,首先,由于高级最优化步骤中的使用需要,要把参数从矩阵展开成向量,接着用 fminuc 优化算法来求解求出权重矩阵。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181021G05OI300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券