机器学习总结(3)—分类中的代数模型(神经网络)

前言

  过去几个月,一直在学习机器学习模型,输入只是学习的一部分,输出可以帮助自己更熟练地掌握概念和知识。把一个复杂的事物简单的讲述出来,才能表示真正弄懂了这个知识。所以我将在博客中尽量简单地把这些模型讲述出来,以加深自己的掌握,也为他人提供一点点参考。感谢大神刘建平Pinard的博客,如有任何疑惑可参考该神博客,此作仅为狗尾续貂之作。

  每个模型介绍都将用基本思想,输入,输出,损失函数,优化方法,伪代码来进行介绍

正文

1.深度神经网络(DNN)

  基本思想

  在感知机当中,我们用了线性回归和sign激活函数,这只能用于解决二分类的问题,深度神经网络改进了感知机,也可以说添加了多个感知机,并且层层套用,并改变了激活函数

  原来感知机

  深度神经网络

   具体改变如下:

  1.加深了模型,用前一层的输出结果来作为下一层的输入

  2.可以有多个输出了,不仅仅为2元分类

  3.改变了激活函数,现在的激活函数有tanx, softmax,和ReLU等

  输入

  输入仍然是X样本矩阵和y标签,这里y标签对于2分类可以是1,0。对于多分类,就用独热化表示。(比如1,2,3是三种类型,我用独热化表示就是100,010,001)

  输出

  我们希望能够输出合适的隐藏层,来计算出结果,每一层都是一个矩阵W和偏置向量b,所以我们神经网络有多少隐藏层,我们就希望得到多少个合适的W和b,使得最后输出层的值和原来的y尽可能相近。

  损失函数

  深度神经网络的损失函数可以有多种,但都是为了度量最后输出值与原来的y的差距。度量方法有:均方差,逻辑回归中针对概率的对数似然函数等。这里用均方差进行演示,专注于算法思想。我们设想神经网络的训练过程,通过前向传播得到输出,再得到损失函数,通过损失函数求导优化多个W和b(反向传播)。于是我们为了计算损失函数,先要得到前向传播的输出结果。

  前向传播

  前向传播其实就是利用上一层计算下一层,每一层的计算都是一个矩阵,一个偏置和一个激活函数,于是上层到下层的计算公式为:,这里al是下一层的输出(一个向量),σ是激活函数,Wl是层与层之间的矩阵,al-1就是上一层的数据,b是偏置。比如对于这样一个神经网络模型

   用第一层计算第二层,公式就应该如下:,把这些w组合起来,就是W矩阵,b组合起来就是b向量。这就是前向传播

  于是损失函数用均方差计量,那么就等于:

  我们刚刚有关于al的公式,所以损失函数可以写成:

  

  优化方法

  有了损失函数,我们用梯度下降法来优化模型(批量梯度,小批量梯度,随机梯度)。由于深度神经网络有多个矩阵和偏置向量需要优化,跟前向传播对应,这个过程叫做反向传播,反向传播就是一个求各层梯度的过程。

  反向传播

  1.首先就求损失函数对输出层的偏导:

  

  (公式解释:对于J对W求导,是一个标量对矩阵求导,这里用到了求导的链式法则,,有了这个公式后具体推导如下:

  ⊙代表哈达马乘积,表示一个向量,值为这个向量对向量求导的雅可比矩阵的对角线,加个diag就变成对角线矩阵。不要被雅可比矩阵这种专业名词吓到,其实就是分子布局下向量对向量的求导结果。另外说一下向量对向量求导的分母布局叫做梯度矩阵

  

  2.接着我们对输出层的上一层求偏导,注意这里大写L变成了小写l,代表不同层数:

  (此公式可以用于对上几层求偏导都可以,只要算出对应层的δl就行了)

  (公式解释:我们发现在求偏导过程中,对W和b求偏导有共同部分,另外我们发现这个共同部分可以根据链式求导法则,求出对任意一层的zl的偏导,演化一下我们可以得到:,有了这个公式我们就有了σl和σl+1的关系,我们能直接求出终极BOSSσL的值,于是我们就知道了所有的σ,因此各层的偏导数可求

  3.现在我们有了计算各层偏导的方法,我们使用梯度迭代,就能求出各层合适的W和b了。

  伪代码

  这里用了批量梯度下降,如果用小批量就不需要一次加权所有样本

  输入:总层数L,各隐藏层与输出层的神经元个数,激活函数,损失函数,迭代步长α,最大迭代次数max,停止迭代阈值e,m个训练样本 

  输出:各隐藏层与输出层的线性关系系数矩阵W和偏倚向量b

  1.初始化各层W和b

  2.for iter in 1 to max:

    2.1.for i in 1 to m:

      a.将DNN的输入设置成xi

      b.前向传播,算出损失函数和δi,L

      c.反向传播,算出所有层的δi,l

    2.2.for l in 2 to L(输入层不用更新)

        

    2.3.如果所有W,b的变化值都小于停止迭代阈值ϵ,则跳出迭代循环到步骤3

  3.输出各隐藏层与输出层的线性关系系数矩阵W和偏倚向量b

   算法改进

  前面已经说过,DNN可以配合不同的损失函数和激活函数使用,交叉熵+sigmoid可以改进收敛速度,对数似然函数+softmax可以解决多分类的问题,softmax函数就是保证所有输出结果和为1,形式也很简单

  关于梯度爆炸和梯度消失,是指网络层数多了以后,由于我们用了链式求导,那么可能导致梯度特别大或者接近0,这样会造成无法收敛。梯度爆炸可以通过尝试不同的初始化矩阵解决,梯度消失现在的解决方法是使用Relu激活函数,,就是小于0的元素取为0,大于0就保持。

  还有其他的激活函数,这里不细说了。

  另外DNN可以加正则化,就是在迭代时加上一项就行了。

  DNN还可以做bagging的集成模型和dropout的来增加泛化能力。

 

2.卷积神经网络(CNN)

基本思想

  卷积神经网络是用来能看懂图形的算法。由于图形是矩阵构成的,所以CNN的基本思想是把矩阵化成向量,再用DNN把向量处理了,然后做出分类等效果。

  基本操作是在网络中加入了卷积层和池化层,这两个层的作用就是上面说的,提取关键信息化成向量。由于卷积层和池化层的存在使得前向传播和反向传播的推导复杂了一些。

 

   知道了基本思想,接下来就是公式推倒了,以后再写吧,先写树模型去了

输入

输出

损失函数

优化方法

  仍然是梯度法

  反向传播:

  这里有几个问题需要解决:

  1)池化层没有激活函数,这个问题倒比较好解决,我们可以令池化层的激活函数为σ(z)=zσ(z)=z,即激活后就是自己本身。这样池化层激活函数的导数为1.

  2)池化层在前向传播的时候,对输入进行了压缩,那么我们现在需要向前反向推导δl1δl−1,这个推导方法和DNN完全不同。

  3) 卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得的当前层的输出,这和DNN很不相同,DNN的全连接层是直接进行矩阵乘法得到当前层的输出。这样在卷积层反向传播的时候,上一层的δl1δl−1递推计算方法肯定有所不同。

  4)对于卷积层,由于WW使用的运算是卷积,那么从δlδl推导出该层的所有卷积核的W,bW,b的方式也不同。

  解决了这些问题,就可以解决求梯度的问题,暂时没时间了,只能之后再写了

伪代码

 

3.循环神经网络(RNN)

  基本思想

  如果说CNN是为了看懂图形,那RNN就是为了记住顺序(顺序在我们的生活中也起了很大的作用,比如你说一句话,语序就很重要,所以RNN可以用来理解单词和句子)。那么RNN到底如何结合上文呢?很简单,比如分析一个句子,把上一个单词的输出拿来做我的一个单词的部分输入就行了。具体如下图所示:

  在句子分析当中,xt就相当于一个单词,ht的计算就来源于上一个ht-1和此次的xt。这样就用到了之前的信息了。如果还是不太明白,可以看看RNN简单例子

    1)x(t)代表在序列索引号tt时训练样本的输入。同样的,x(t1)x(t+1)代表在序列索引号t1t+1时训练样本的输入。有多少个x在术语里就叫有多少timestep 

    2)h(t)代表在序列索引号tt时模型的隐藏状态。h(t)x(t)h(t1)共同决定。

    3)o(t)代表在序列索引号tt时模型的输出。o(t)只由模型当前的隐藏状态h(t)决定。

    4)L(t)代表在序列索引号tt时模型的损失函数。

    5)y(t)代表在序列索引号tt时训练样本序列的真实输出。

    6)U,W,V这三个矩阵是我们的模型的线性关系参数,它在整个RNN网络中是共享的,这点和DNN很不相同。 也正因为是共享了,它体现了RNN 

     的模型的“循环反馈”的思想。  

  输入

  如果用于分类模型,RNN的输入,还是样本X,和真实分类y

  (如果从处理句子的角度来看:xt就是一个词向量,我还不清楚如果是在word2vec里,这个y代表什么,但在分类里面是很好确定的,就是分类的one-hot)

  输出

  输出合适的U,V,W还有存在于其中的偏置b,c,这些东西就相当于我们CNN中想求的矩阵参数

  损失函数

  前向传播:

  

 

 

   

 

 

   预测输出为,用均方差,用对数似然函数,都可以度量预测值和真实值的差距

  优化方法

  优化方法依然是梯度下降,还是分别求偏导,这里为了方便模型讲述,用交叉熵做损失函数,softmax做激活函数,隐藏层的激活函数是tanh。

 

 

   对于RNN,我们序列的t位置都有一个损失,我们把它加总起来

  于是对于梯度:

  (

  这里的δ(t)跟我们再CNN里讲的中间变量类似,在这里代表的含义是:

  用递归法可以得到δ(t)和δ(t+1)的关系:

  同时我们又知道,最后一个δ(T)的值:

  )

 

 

   很明显由于RNN存在递归那么同样存在梯度消失的问题,所以实际的算法基本不用RNN,而是用它的改进方法

 

  伪代码

  输入:激活函数,损失函数,迭代步长α,最大迭代次数max,停止迭代阈值e,m个训练样本 

  输出:UVW,bc

  1.初始化UVW,bc

  2.for iter in 1 to max:

    2.1.for t in 1 to m:

      a.将输入设成xi

      b.前向传播,算出损失函数和δ(T)

      c.反向传播,算出所有层的δ(t)

    2.2.for t in 1 to m:

      计算UVW,bc  

    2.3.如果所有UVW,bc的变化值都小于停止迭代阈值ϵ,则跳出迭代循环到步骤3

  3.输出

 

4.LSTM(循环神经网络的改进)

  基本思想 

  LSTM是为了解决RNN梯度消失的问题提出的,基本思想是改进计算ht的过程,改得更贵族一些,RNN是乞丐什么都要,而LSTM是贵族,我只挑我喜欢的。原来的RNN计算ht如下图:

  现在的LSTM对A这个过程进行了改变:

 

   添加了一些复杂的变化,以实现挑选,进而解决梯度消失问题

  前向传播和反向传播和RNN类似,只是要多一些参数,以后再写吧,我得写树模型去了

  输入

  输出

  损失函数

  优化方法

  伪代码

 

  

 

posted @ 2020-11-06 17:21  simpleye1  阅读(500)  评论(0编辑  收藏  举报