神经网络NN

一、神经网络其实就是输入变量先后进行加权求和与非线性变换之后得到输出。神经网络分为前向传播和反向传播。

神经网络NN_第1张图片

神经网络的工作原理:

Ⅰ、前向传播:首先生成一个任意结构的神经网络,并且用一些字母来表达这些神经网络的参数,为了推导方便,我们将同一层的神经网络用一个向量去表示。权重和偏置分别用w和b表示,b是一个偏移量,在最后计算结果中加上它就可以。通过加权求和法的方式我们可以逐层得到神经网络下一层的值是什么。

神经网络NN_第2张图片

sigmoid激活函数:

神经网络NN_第3张图片

  引入激活函数的原因:一方面是为了将我们的数值规范化到 [0,1] 区间当中,这样能够避免数值在网络中不断地被放大;另一个是由于神经网络的加权都是一个线性运算,如果不引入非线性的激活函数,即便是多层的线性运算最后也只会等效成一个线性运算,所以必须要引入激活函数。

    对于一个训练样本来说,当我们将输入值按照前向传播的方式进行计算后会得到输出值,除了网络的输出值外,也会有精确值

 如何减小偏差/求最小值问题:这个优化问题实际上是关于权重(ogema)以及偏差(b)的一个优化问题,用梯度算法去优化这个问题。

Ⅱ、反向传播/求解梯度:首先求输出层的梯度,想输出层的前一层求梯度计算量稍微大一些,会发现递推关系式,有了递推关系式就可以容易得到每一层的偏导数,也就是梯度的因式,这也就是反向传播算法计算梯度的方式,这是从最后一层往前面去不断地求解梯度,反向传播算法也指得是计算梯度的方法。

神经网络NN_第4张图片

神经网络NN_第5张图片

神经网络NN_第6张图片

    有了梯度之后可以选择更多的方式优化网络的结构:最常用的最速下降法或者是梯度下降法,就是以梯度的反方向作为搜索方向以及适当的步长去更新权重,可以将偏差减小一下。

以上是对于一个样本而言。

神经网络NN_第7张图片

得分函数:

损失函数:

神经网络NN_第8张图片

    神经网络在计算过程中前向传播去计算loss function损失函数,反向传播通过损失函数去更新权重参数。 

神经网络NN_第9张图片

解释:做归一化得到了概率值。对数函数输出是负值,所以加负号。回归任务是用得分值去计算一个损失,分类任务是由概率值去计算一个损失。 神经网络NN_第10张图片

 偏导可以求出极限最小,也就是损失最小。

参数初始化:通常使用随机策略来进行参数初始化。

DROP-OUT:在训练阶段防止网络模型太复杂采取的随机杀死的办法。

二、卷积神经网络:就是一种用卷积等操作代替了全连接网络中的运算,这种替代可以是全部的,也可以是部分的。被广泛应用于图像分类等领域,卷积核用于提取图像特征。

  Ⅰ、卷积:构建一些小矩阵(这里的小矩阵被称作卷积核),用卷积核扫描原始图像,将对应位置的元素相乘后相加,用一个新的矩阵记录计算后的值,这个操作叫做卷积。

  Ⅱ、池化:单个卷积核通常处理单个特征,对一幅图中的多个特征可以分别采用多个卷积核,卷积后的图像非常大,也可能提取到了太多弱的特征,因此需要进行压缩降维,这个操作叫做池化。

  池化的原理:就是对一块区域内的结果取等效值,可以取最大值,也可以取平均值。经过池化后,图像的大小会显著降低。池化可以加快运算速度,也能够很大程度避免“过拟合”的发生,提高神经网络的泛化能力。池化层所做的就是通过减小输入的大小降低输出值的数量

  Ⅲ、激活层主要对池化层的输出进行一个非线性映射。在CNN中一般为RELU函数。

   进行非线性映射的原因:是为了使得多层的神经网络具有实际意义,否则无论多少层线性的映射最终都会与单层的感知机等效。

   引入RELU函数而不是sigmoid等函数的原因:采用sigmoid等函数后续的反向传播求误差梯度时,求导涉及除法计算量大,而采用RELU激活函数整个过程的计算量节省很多。对于深层网络,sigmoid函数反向传播时很容易就会出现梯度消失的状况从而无法完成深层网络的训练,RELU会使一部分神经元的输出为0,减少了参数的相互依存关系,缓解了过拟合问题的发生。

    卷积池化激活只是三种操作,可以重复的拼接组合以达到最终含有最佳特征的图像。最后可以将含有不同特征的二维图像展成一维后输入全神经网络进行训练。

分类与检索:做特征提取

超分辨率重构:怎么把图像做的更清晰。         例:无人驾驶、人脸识别。

卷积网络与传统网络的区别:

①传统网络:正常输入层、输出层、隐藏层

②卷积网络卷积是把一个图像分成很多小区域,目的是对于不同的区域得到的特征是不一样的,接下来选择一种计算方法对于每一个小区域他应该的特征值等于多少。

卷积特征值计算方法:

  图像颜色通道:经常见到的RGB,通常数据是32x32x3,做计算的时候让每个通道单独去做,再把每个通道卷进来的的结果加到一起。

   例如:输入数据是7x7x3的,RGB三颜色通道大小都是一样的。分区域进行特征提取,随机初始化一组数据,都是用内积进行计算的,对应位置相乘,然后把所有值加在一起,得到一个特征提取的值再加上偏置项。

  特征图个数:正常得到一个,对于同样的数据来说,可以多尺度多粒度的来进行特征提取,可以用多个卷积核进行特征提取,选择不同的矩阵得到的特征图是不一样的,最终将他们堆叠在一起,相当于得到一个比较丰富的特征。

  堆叠的卷积层:一开始在原始数据上进行卷积,得到一个中间特征,再在中间特征上再做卷积,进行进一步特征提取。

 卷积层涉及常见参数:滑动窗口步长、卷积核尺寸、边缘填充、卷积核个数

  ①步长:步长比较大的时候得到的特征比较少,步长比较小的时候得到的特征比较丰富,计算效率比较慢,得根据实际头像来,图像一般步长是1,文本数据一般是2。

  ②尺寸:一般是3x3,选择区域的大小最终得到的数据不一样,卷积核越小对数据进行越细得提取。

  ③边缘填充:一定程度上弥补了一些边界信息缺失的问题,使边缘特征能够充分的利用,让网络能够更加公平地对待边界特征。

  ④卷积核个数:得到多少个特征图就有多少个卷积核个数。

卷积结果计算公式:

神经网络NN_第11张图片

卷积参数共享:对于不同的区域选择的不同的卷积核来做总共需要的参数太多了,不好计算,计算速度慢,过拟合风险大。在对每一个区域进行特征提取的时候,它里面的值都是一样的,也就是说,用同样一组卷积核对于图像中每一个小区域进行特征提取的话,核里面的值是不变的。实际执行卷积需要的参数少。

     例如:5*5*3= 75,表示每一个卷积核只需要75个参数,此时有10个不同的卷积核,就需要10*75= 750个卷积核参数,不要忘记还有b参数,每个卷积核都有一个对应的偏置参数,最终只需要750+10=760个权重参数。

 池化层:压缩/下采样

最大池化(max pooling):指定参数选择几个区域,选择每个位置中最大的值筛选出来/神经网络中得到大的值比较重要,因为权重参数在不断地改变,是线性的,效果好

平均池化:选择平均的值,已经淘汰了

整体网络架构:卷积----RELU----池化----全连接层

  特征图变化:

神经网络NN_第12张图片

经典网络:

Alexnet:12年,8层

Vgg:14年,所有卷积大小都是3x3,大概16层和19层

Resnet:5年,残差网络,特征提取,分类网络。相当于通用的一个网络。

  深层网络遇到的问题:训练集上56层上面的error比20层遇到的error更多。

  解决方案:同等映射,在继续堆叠的过程当中,把中间的一层有错误的去掉,接下来对他进行卷积,进行多次卷积得到的效果不好,这时候把之前那个数据原封不动的拿过来,做一个堆叠,结果有之前的结果和堆叠之后的结果,可能有好的数据也有不好的数据,但是有原来的数据保底,所以这样得到的数据不会比原来的差。但是提升也比较少。

神经网络NN_第13张图片

 首选残差网络,现在更主流一些。

  感受野:当前最后的值,也就是说,能看到的值是由前面那个原始输入数据的值当中参与计算的。比如说,如果堆叠3个3*3的卷积层,并且保持滑动窗口步长为1,其感受野就是7*7的了,这跟一个使用7*7卷积核的结果是一样的。

    例如:一个7*7卷积核所需参数:=C×(7×7x C)= 49 c^2,3个3*3卷积核所需参数:=3xCx(3×3xC)= 27 c^2

    优势:很明显,堆叠小的卷积核所需的参数更少一些,并且卷积过程越多,特征提取也会越细致,加入的非线性变换也随着增多,还不会增大权重参数个数,这就是VGG网络的基本出发点,用小的卷积核来完成体特征提取操作。

三、递归神经网络RNN:主要应用到自然语言处理中

隐藏:数据经过隐藏之后会得到一个隐藏的数据。

首先需要把输入数据转换成对应的特征向量,并且按照时间顺序从前到后进行排列,之后开始训练模型。会把之前所有的结果全部记下来,可能会产生一些误差。

CNN主要应用在计算机视觉当中。

四、LSTM网络:让一些没必要的特征过滤掉,通过一个控制参数C(决定什么样的信息会被保留,什么样的信息会被遗忘)

  门单元:是一种让信息选择式通过的方法(sigmoid神经网络层)

神经网络NN_第14张图片

自然语言处理(NLP)-----词向量模型:主要有了向量就可以用不同的方法来计算相似度。数据的维度越高,能提供的信息也就越多,从而计算结果的可靠性就更加信赖。通常都在词的层面上来构建特征。词向量模型就是要把词转成向量。

  在word2vec中输入和输出分别是随便前后位置的词多分类

  基本流程:不仅会更新整个神经网络模型的权重参数矩阵,会连输入一起进行更新,相当于一开始词库大表是随机进行初始化的,随着训练的进行,每一次都会把输入的一个训练数据在进行一个更新,每个词都进行更新,越进行更新说明神经网络训练得越好,计算机会想当前每个词向量怎么猜的更准确一些。

  构建训练数据:自己制定滑动窗口,不是必须非要是监督的数据集,什么数据拿过来都可以做,不断用窗口扫描不断得到数据。

如果一个语料库稍微大一些,可能的结果简直太多了,最后一层相当于softmax,计算起来十分耗时,解决方案:

①初始方案:输入两个单词,看他们是不是前后对应的输入和输出,也就相当于一个二分类任务,此时训练集构建出来的标签全为1,无法进行较好的训练。

②改进方案:加入一些负样本(负采样模型)

负样本是人为构建出来的,个数选择三个五个比较合适。

Ⅰ、初始化向量矩阵

Ⅱ、通过神经网络反向传播来计算更新,此时不光更新权重参数矩阵,也会更新输入数据。

你可能感兴趣的:(神经网络,深度学习,人工智能)