机器学习——基于神经网络学习过程的简单理解

本文深入解析深度学习和神经网络的核心概念,包括分类与回归问题、神经网络学习流程、卷积神经网络(CNN)架构及其经典模型,如LeNet5、AlexNet、VGG、GoogLeNet和ResNet。探讨了CNN在视觉领域的应用,如物体检测、图像分割和图像标题生成。同时,介绍了深度学习的超参数调整策略,正则化方法以及流行的深度学习框架。

优点是神经网络的对所有的问题都可以用同样的流程来解决。即不断地学习所提供的数据,尝试发现待求解的问题的模式。与待处理的问题无关,神经网络可以将数据直接作为原始数据,进行“端对端”的学习。
自己的一句话概括就是:神经网络的学习就是把训练中原始数据直接作为输入数据,通过减小结果与原来标签的误差的方法不断调整权重参数,最终使用优化的权重的参数来推理新的数据。(神经网络的学习以损失函数为指标,更新权重参数,以使损失函数的值减小,自动地从数据中学习到合适的权重参数.)

1. 首先深度/机器学习问题分为两大类:分类问题和回归问题。其实分类和回归的本质是一样的,都是对输入做出预测,其区别在于输出的类型。分类问题就是使用通过学习获得的参数来重新分类新的同一种分类问题,并将它们进行分类识别。分类问题的输出是离散型变量,是一种定性输出。回归问题:回归问题的输出是连续型变量,是一种定量输出。

2.一些概念解释:
2.1 从数据中学习
神经网络的特征就是可以从数据中学习,即指由利用数据自动决定权重参数的值。大量的数据就是机器学习的核心。这个过程就是从收集到的数据中发现答案,避免人为因素。
普通机器学习和深度学习的关系如下:
人工算法: 问题------->                                人工算法                                                ------->答案
机器学习: 问题------->   人工特征量(SIFT等)   ------->机器学习(KNN,SVM等)       ------->答案
深度学习: 问题------->                               深度学习(神经网络)                                ------->答案
2.2 损失函数
神经网络以某个指标为线索寻找最优权重参数,所用的指标称为损失函数(loss function),这个损失函数可以使用任意函数,
但一般用均方误差和交叉熵误差等。学习的目的就是以损失函数为基准,找出能使它的值达到最小的权重参数。神经网络学习的目的就是通过使损失函数达到最小值的过程来调整权重参数,使神经网络的输出接近真实标签。而代价函数是损失函数总和的平均。
损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。
均方误差函数   :E = \frac{1}{2} \underset{k}{\Sigma }(y_k-t_k)^2,y_k是表示神经网络的输出(概率),t_k表示训练数据的输出(概率,一般是其中一项为1其余为0), k表示数据的维数(即分类类别数)即分多少类.
交叉熵误差函数E = -\underset{k}{\Sigma} t_k log y_k,y_kt_k同均方误差函数表示意义一致即训练/监督数据的输出.使用交叉熵函数代替均方误差二次函数避免了学习变慢的问题。可以看出输出概率yk越大,越接近1,E的值越小。
2.3 梯度法:神经网络必须在学习时找到最优参数(权重和偏置),使用梯度来寻找损失函数最小值方法就是梯度下降法,这是深度学习过程中常使用的方法。这里的权重和偏置就是每一层网络的权重偏置参数的总各。
2.4 mini-batch学习mini-batch 是一个一次训练数据集的一小部分,而不是整个训练集的技术。它可以使内存较小、不能同时训练整个数据集的电脑也可以训练模型。

3.神经网络的学习步骤(随机梯度下降法(stochastic gradient descent,SGD))
前提:神经网络存在合适的权重和偏置,调整每一层网络的权重和偏置以便拟合训练数据的过程称为“学习”。
步1: mini-batch: 从训练数据中随机选出一部分数据,这部分数据称为mini-batch。目标是减小mini-batch的损失函数的值。
步2:计算梯度: 为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
步3:更新参数: 将权重参数沿梯度方向进行微小更新。
步4:根据设定循环次数进行循环更新:重复步骤1、步骤2、步骤3。
对于分类问题的深度学习过程的通俗理解就是首先读入训练和测试数据的像素和标签,接下来设置参数(循环次数N、batch大小,、学习率等),然后进行N次循环:a.从训练数据中选出batch大小的数据,b.计算梯度batch数据的梯度,c.将权重/偏置参数W沿梯度方向进行微小更新,W = W - \lambda \Delta W.循环结束后可以输出相应的精度以及权重和偏置参数。其中最重的过程也是发挥空间较大的一个过程是计算梯度这一部分。神经网络学习的具体过程用流程图表示如下:

4. 卷积神经网络CNN
以上部分介绍的神经网络,相邻层的所有神经元之间都有连接,称为全连接,而CNN方法中新增卷积层和池化层。因此CNN的结构一般为: Convolution->ReLU(->Pooling)->Affine-ReLU->Affine-Softmax,即卷积层、激活函数层、池化层(可省)、全连接激活函数层组合、全接接-Softmax组合输出层。卷积层是以一定间隔滑到滤波器进行计算,池化层是从目标区域取出最大值。卷积神经网络可以简单地理解为,用滤波器(Filter)将相邻像素之间的"轮廓"过滤出来。对于卷积层学习的内容就是卷积核的值,全连接层和最后一层就是输入×输出的权重和相应偏置。激活函数处在最后一层,用于连接前面的网络和输出。代价或损失函数就是输出值与真实值的差的表示。
4.1 卷积层:主要使用滤波器通过设定步长、深度等参数对输入数据进行不同层次的特征提取。这点与全连接层不同,全连接层将相邻层的神经元全部连接在一起,这样会忽视重要的关联性等信息。
       卷积运算:卷积运算相当于图像处理中的滤波器运算。对于输入数据,卷积运算以一定间隔滑动滤波器的窗口并计算,将各个位置上滤波器的元素和输入的对应元素相乘再求和,然后将这个结果保存到输出的对应位置,将这个过程在所有位置都进行一遍,得到卷积运算的输出。其中滤波器的参数相当于全连接层的权重参数,偏置通常只有一个,这个值会被加到应用了滤波器的所有元素上。可以使用填充调整输出大小,这样卷积运算可以在保持空间大小不定的情况下将数据传给下一层。也可以调整步幅,步幅越大,输出越小。
4.2 池化层:池化是缩小高、长方向上的空间的运算。Max池化是从目标区域中取出最大值,Average池化则是计算目标区域的平均值。在图像识别领域,主要使用Max池化。与卷积层不同,池化只是从目标区域中取最大值(或者平均值),所以不存在要学习的参数;经过池化运算,输入数据和输出数据的通道数不会发生变化。输入数据发生微小偏差时,池化仍会返回相同的结果。
4.3 CNN的实现,一个简单网络的构成是“Convolution - ReLU - Pooling -Affine -ReLU - Affine - Softmax”。超参数指各层的神经元数量、 batch大小、参数更新时的学习率或权值衰减等。
4.4 一个CNN深度学习的过程举简单的例子如下(以theano框架为例):
a.第一步构建网络层: 卷积层-池化层-softmax层,设置相应参数,其中前一层网络的输出是后一层网络的输入,最后的输出是最后一层网络输出
class ConvPoolLayer(imageshape,filtershape,poolsize,activation_fn):
         初始化size=filter_shape权重和size=(filter_shape[0],)偏置参数params=[w,b]
         函数set_inpt(inpt,mini_batch_size):将输入inpt转换成imageshape大小(mini_batch_size, 1, 28, 28),使用权重对输入进行conv2d卷积运算,接下来进行池化运算,output=activation_fn(池化输出+偏置),不使用dropout
class FullyConnectedLayer(n_in,n_out,activation_fn,p_dropout):
         初始化size=(n_in, n_out)的权重和size=(n_out,)偏置,params=[w,b]
         函数set_inpt(inpt, inpt_dropout, mini_batch_size):将输入inpt转换成(mini_batch_size, self.n_in)大小,output=activation_fn ((1-p.dropout)*inpt*w +b),y_out = argmax(output, axis=1),再给出inpt_dropout,output_dropout的值
class SoftmaxLayer(n_in,n_out,p_dropout):
         初始化size=(n_in, n_out)的权重和size=(n_out,)偏置,params=[w,b]
         函数set_inpt(inpt,inpt_dropout,mini_batch_size):将输入inpt转换成(mini_batch_size, self.n_in)大小,output = softmax((1-p_dropout)*T.dot(inpt, w) + b),y_out = argmax(output, axis=1),再给出inpt_dropout,output_dropout的值,其中output_dropout是输出值的概率分布, 还有cost,accuracy函数。
net=Network(ConvPoolLayer(image_shape=(mini_batch_size, 1, 28, 28),filter_shape=(20, 1, 5, 5),poolsize=(2,2)),  
                     FullyConnectedLayer(n_in=20*12*12, n_out=100),
                     SoftmaxLayer(n_in=100, n_out=10)], mini_batch_size)
layers=[ConvPoolLayer,FullyConnectedLayer,SoftmaxLayer]
params=[[w20x5x5,b20],[w640x100,b100],[w100x10,b10]],其中[w20x5x5,b20],[w640x100,b100]是正态分布的值,[w100x10,b10]是零矩阵,params是优化的参数
ConvPoolLayer.input(batch的输入图像,mini_batch_size)
FullyConnectedLayer.input(ConvPoolLayer.output,ConvPoolLayer.output_dropout,mini_batch_size)
SoftmaxLayer.input(FullyConnectedLayer.output,FullyConnectedLayer.output_dropout,mini_batch_size)
output=SoftmaxLayer.output, output_dropout=SoftmaxLayer.output_dropout
b.第二步优化params里面的参数:使用minibatch 随机梯度下降法SGD
net.SGD(training_data, epochs, mini_batch_size, eta,validation_data, test_data, lmbda=0.0):
初始化要训练测试的数据,mini-batch的个数,正则化代价函数cost,梯度grads,梯度更新updates,训练函数train_mb(计算代价函数,并更新params),验证数据精度validate_mb_accuracy,测试精度test_mb_accuracy等
开始epoch训练,对每一个epoch: 迭代次数iteration=num*epoch,num*(epoch+1);代价函数=train_mb,每个epoch计算一次validate_mb_accuracy,并与最佳精度比较,确定最佳精度和相应的迭代次序,并给出相应的测试精度。如果test_data不为空,同时给出相应的测试精度。保存相应的参数params到params.pkl文件中。
5.5 CNN的使用过程,接上面的学习过程保存的参数,来初始化CNN,得到一个可使用的CNN系统,将图像数据输入这个系统,预测图像类别。具体如下:
a.首选读取之前保存参数load_params,返回每一网络层的w,b参数
b.读取图像,返回numpy.array类型的图像数据及对应的label
c.构建和之前一样的网络:class ConvPoolLayer(input,params.w,params.b,filtershape,imageshape,poolsize,activation_fn),
class FullyConnectedLayer(input,params.w,params.b,n_in,n_out,activation_fn),
class SoftmaxLayer(input,params.w,params.b,n_in,n_out).
这些网络中的w,b都是使用params.pkl中的参数来初始化,其他参数与训练时保持一致。构建相同网络,并在最后一层预测w*x+b中最大值为对应的分类。这就是CNN的一种使用过程的简介。

5.CNN的经典模型有LeNet5,AlexNet,VGG,GoogLeNet,ResNet,GAN,R-CNN。
5.1 LeNet5: 网络为Conv-Pool-Conv-Pool-Full-Full.卷积都是5*5的filter,步长为1,。池化都是max-pooling.
特征如下几点:
1)卷积神经网络使用三个层作为一个系列:卷积、池化、非线性
2)使用卷积提取空间特征
3)使用映射到空间均值下采样
4)双曲线(tanh)或s型(sigmoid)形式的非线性
5)多层神经网络(MLP)作为最后的分类器
6)层与层之间的稀疏链接矩阵避免大的计算成本
5.2 AlexNet: 五个卷积,三个池化和三个全连接层,使用两块GPU.
主要技术点在于:
1)使用RELU作为CNN的激活函数,解决了sigmoid在网络较深时的梯度弥散问题。
2)训练时使用了Dropout随机忽略一部分神经元,以避免模型过拟合。
3)在CNN中使用重叠的最大池化,步长小于池化核,这样输出之间会有重叠和覆盖,提升了特征的丰富性。此前CNN普遍使用平均池化,AlexNet全部使用最大池化,避免平均池化的模糊性效果。
4)提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈比较小的神经元,增强了模型的泛化能力。
5)使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵计算。AlexNet使用了两块GTX 580 GPU进行训练,单个GTX 580只有3GB显存,这限制了可训练的网络的最大规模。因此作者将AlexNet分布在两个GPU上,在每个GPU的显存中储存一半的神经元的参数。因为GPU之间通信方便,可以互相访问显存,而不需要通过主机内存,所以同时使用多块GPU也是非常高效的。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。
6)使用数据增强,减轻过拟合,提高泛化能力
5.3 VGG 网络使用多个 3×3 卷积层去表征复杂特征.VGG模型主要关注的是网络的深度,因此它固定了网络的其他参数,通过增加卷积层来增加网络的深度.
5.4 GoogleNet提出了一种加深网络的结构——inception结构,通过使用1x1,3x3,5x5的小卷积核并列构成一个inception结构,最后在特征图的厚度上进行简单的堆叠,不但加深了网络深度,同时增加了网络对尺寸的适应性,在一个特征图中融合多尺寸卷积核所得到的结果。
5.5 RestNet提出了残差网络的概念,在之前的网络结构中都是采用stack layer进行堆叠使得网络层数加深,从而获得更好的网络结构。但是随着网络的越来越深,网络的性能却在下降(识别率逐渐下降)。残差网络的提出一方面保证了网络的深度可以更深,另一方面保证了网络的性能没有下降。

6.深度学习:深度学习是加深了层的深度神经网络。加深网络具有以下优点:
a.减小参数数量:叠加小型滤波器来加深网络的好处是可以减少参数的数量(如一个5x5卷积运算转换成两个3x3卷积运算,前者参数量是25,后者参数量18),扩大感受野(receptive field,给神经元施加变化的某个局部空间区域)。并且,通过叠加层,将 ReLU等激活函数夹在卷积层的中间,进一步提高了网络的表现力。这是因为向网络添加了基于激活函数的“非线性”表现力,通过非线性函数的叠加,可以表现更加复杂的东西。
b. 学习更加高效,减少学习数据:与没有加深层的网络相比,通过加深层,可以减少学习数据,从而高效地进行学习,因为随着层的加深,开始对纹理、物体部件等更加复杂的东西有响应。
c.分层次传递信息:通过加深层,可以分层次地传递信息,比如,因为提取了边缘的层的下一层能够使用边缘的信息,所以应该能够高效地学习更加高级的模式。
一些典型的深度学习模型: VGG是由卷积层和池化层构成的基础的CNN。它的特点在于将有权重的层(卷积层或者全连接层)叠加至16层(或者19层),加深了深度,结构简单,应用性强。GoogLeNet的特征是,网络不仅在纵向上有深度,在横向上也有深度(广度)。
深度学习在视觉领域的应用: 物体检测-从图像中确定物体的位置并进行分类的问题,它的四大类任务是:分类、定位、检测和分割。图像分割-在像素水平上对图像进行分类。图像标题的生成-给出一个图像后,会自动生成介绍这个图像的文字(图像的标题)。将组合图像和自然语言等多种信息进行的处理称为多模态处理。

7.超参数: 神经网络中的参数和超参数二者最大的区别就是是否通过数据来进行调整。模型参数通常是有数据来驱动调整,超参数则不需要数据来驱动,而是在训练前或者训练中人为的进行调整的参数。例如卷积核的具体核参数就是指模型参数,这是有数据驱动的。而学习率则是人为来进行调整的超参数。通常可以将超参数分为三类:网络参数、优化参数、正则化参数。
网络参数:可指网络层与层之间的交互方式(相加、相乘或者串接等)、卷积核数量和卷积核尺寸、网络层数(也称深度)和激活函数等。
优化参数:一般指学习率(learning rate)、批样本数量(batch size)、不同优化器的参数以及部分损失函数的可调参数。
正则化:权重衰减系数(weight decay),丢弃法比率(dropout)。
超参数的重要性顺序: 学习率>批样本数量,动量优化器的动量参数beta>Adam优化器的超参数、权重衰减系数、丢弃法比率(dropout)和网络参数。
一般dropout只应用在全连接层,因为卷积层有相当大的先天的对于过度拟合的抵抗。原因是共享权重意味着卷积滤波器被强制从整个图像中学习。这使他们不太可能去选择在训练数据中的局部特质。于是就很少有必要来应⽤其它规范化。

8.优化方法之正则化:正则化也称规范化,常用的是权重衰减(L2 规范化)。L2 规范化的想法是增加⼀个额外的项到代价函数上,这个项叫做规范化项。正则化的交叉熵函数为:
C=-\frac{1}{n}\sum [y_j\textup{ln}a^{L}_j+(1-y_j)\textup{ln}(1-a^L_j)]+\frac{\lambda}{2n} \underset{w}{}\sum w^2.其中第⼀个项就是常规的交叉熵的表达式。第⼆个现在加入的就是所有权重的平方的和。然后使⽤⼀个因子 λ=2n 进⾏量化调整,其中 λ > 0 可以称为规范化参数,而 n 就是训练集合的大小。
正则化的均方误差函数为:C=\frac{1}{2n}\underset{x}{\sum} \left \| y-a^L\right \|^2+\frac{\lambda}{2n}\underset{w}{\sum}w^2
直觉地看,规范化的效果是让网络倾向于学习小一点的权重,其他的东西都⼀样的。大的权重只有能够给出代价函数第⼀项足够的提升时才被允许。换⾔之,规范化可以当做⼀种寻找小的权重和最小化原始的代价函数之间的折中。这两部分之间相对的重要性就由 λ 的值来控制了:λ 越小,就偏向于最⼩化原始代价函数,反之,倾向于小的权重。
L1 规范化: 这个方法是在未规范化的代价函数上加上⼀个权重绝对值的和。

9.深度学习的开源框架
TensorFlow: 这个框架旨在方便研究人员对机器学习的研究,并简化从研究模型到实际生产的迁移的过程。安装相对简单,https://blog.youkuaiyun.com/leilei18a/article/details/79490175
Keras:用Python编写的高级神经网络的API,能够和TensorFlow,CNTK或Theano配合使用。在安装tensorflow之后,加一句pip install keras 即可
Caffe: 一个重在表达性、速度和模块化的深度学习框架。安装极其繁琐,ubuntu1404安装链接:https://blog.youkuaiyun.com/leilei18a/article/details/79490081
PyTorch:与Python相融合的具有强大的GPU支持的张量计算和动态神经网络的框架。
Theano:效地处理用户定义、优化以及计算有关多维数组的数学表达式。
Caffe2是一个轻量级的深度学习框架,具有模块化和可扩展性等特点。它在原来的Caffe的基础上进行改进,提高了它的表达性,速度和模块化。
PaddlePaddle(平行分布式深度学习)是一个易于使用的高效、灵活、可扩展的深度学习平台。它最初是由百度科学家和工程师们开发的,旨在将深度学习应用于百度的众多产品中。

----------------------------------------------------------------------------
本文参考《深度学习入门:基于python的理论与实现》,《神经网络和深度学习》、深度学习500问

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值