全连接神经网络、卷积神经网络

  • 前言
  • 全连接神经网络
  • 介绍
  • 结构
  • 损失函数
  • 梯度下降
  • 链式法则
  • 反向传播
  • 总结
  • 卷积神经网络
  • 背景
  • 结构
  • 卷积(Convolution)
  • 池化(Max Pooling)
  • 激活机制
  • Example:风格迁移


前言

 

全连接神经网络

 

介绍

 深度学习有三个步骤

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习

选择一个合适的神经网络—>选择一个模型评估方法—>选择最优的函数

全连接神经网络,应该叫做全连接前馈神经网络(Fully Connect Feedforward Network),全连接(Fully Connect)指的是下一层每一个神经元都会与上一层的每一个神经元相连;而前馈(Feedforward)指的是输入信号进入网络后,信号流动是单向的,其间没有反馈。
 

结构

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_使用全连接神经网络拟合非线性函数_02


 

输入—>乘权重后加上偏差(线上的是权重,绿色格子内的是偏差)—>激活函数—>作为下一层输入

 

激活函数不止一种,Sigmoid函数值总是在0到1之间。

所以,可以把整个神经网络看成一个函数,权重和偏差就是函数参数,参数确定了,函数也就确定了。

而深度学习,意思是可以叠加很多层神经网络,形成深度。当然也不是都叠加全连接层了…

设多少层?每层几个神经元?对一个具体问题,需要尝试加直觉来调试,炼丹…
 

损失函数

用损失函数来判定模型好坏。

采用交叉熵(cross entropy)函数来对预测和目标,即使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_03使用全连接神经网络拟合非线性函数 全连接神经网络dnn_使用全连接神经网络拟合非线性函数_04的损失进行计算,接下来就是调整参数,让交叉熵越小越好。

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_05


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_06


对于损失,我们不单单要计算一笔数据的,而是要计算整体所有训练数据的损失,然后把所有的训练数据的损失都加起来,得到一个总体损失使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_07。接下来就是在Function Set里面找到一组函数能最小化这个总体损失L,或者是找一组神经网络的参数使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_08,来最小化总体损失使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_07

如何找到最优的函数和最好的一组参数,方法是梯度下降。

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_使用全连接神经网络拟合非线性函数_10


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_11


 

这是用来更新权重的方法。应该是和反向传播结合在一起。计算损失函数对权重的偏导,然后权重-(学习率乘偏导值)。

在神经网络中计算损失最好的方法就是反向传播,我们可以用很多框架来进行计算损失,比如说TensorFlow,theano,Pytorch等等

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_12


 

梯度下降

 

比较重要的部分。

 

都是减梯度,所以不存在梯度上升的说法,沿着梯度反方向更新即可。

 

如下图

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_13

  • 给出参数使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_14
  • 选择初始的使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_15,计算使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_15的损失函数对参数的偏微分。
  • 用这个偏微分的值乘学习率使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_17,减去这一个值更新参数。
     

链式法则

 

链式法则差不多就是从后往前时,可以一层一层求前面权重对于最终损失函数的梯度。如下图

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_18

 

反向传播

 

  • 损失函数时定义在单个训练样本上的,比如在分类问题中,则表示预测的类别和实际类别的区别。
  • 总体损失函数(Total loss function)是定义在整个训练集上的,所有误差的总和。也是反向传播所需要最小化的值。

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_19


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_20是输出层每一个神经元的损失使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_21的和。计算总损失的偏微分,只需要计算每个神经元损失的偏微分。

 

取出一个neuron进行分析

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_22


计算梯度分成两个部分

  • 计算使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_23
  • 计算使用全连接神经网络拟合非线性函数 全连接神经网络dnn_使用全连接神经网络拟合非线性函数_24

Forward Pass部分计算:

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_25


 Backward Pass 部分计算

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_26


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_27


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_28


 

总结

 
计算Forward Pass 和 Backward Pass部分以后,两部分相乘可得到梯度,使用梯度下降来寻找损失最小的函数。
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_29

卷积神经网络

 

背景

 
CNN(Convolutional Neural Network)主要用在图像处理上。
至于为什么提出CNN,可以举例说明比如一张使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_30的彩色图,Flatten后是使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_31,如果下一层有100个神经元,则有300万个参数,再传输到下一层…过于复杂。所以需要提出一个新的简化网络结构来处理这个问题。
 

在影像处理中有三个特点
 

  • 可以通过小区域的特点来识别图片。
     

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_32


 

  • 某一个特征在图片的不同位置出现。
     

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_33


 

  • 图片的尺寸变化不影响对图片的理解。

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_34

结构

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_使用全连接神经网络拟合非线性函数_35


 

首先输入一张image,经过多次卷积和池化以后,输入到全连接分类层。
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_36


 

基于影像处理的特点,设计网络结构。

 

卷积(Convolution)

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_37


 

6*6的Image是网络的输入,而Filter就是需要学习的参数。

每个Filter表示检测的某一个特征,这个Filter并不会一次查看整张图。
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_38


 

然后根据步长移动Filter,和图像的值做内积,得到结果。
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_39


 

多个Filter得到的矩阵叠在一起形成特征图。
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_40


 

如果是彩色图,Filter的深度和输入保持一致。

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_使用全连接神经网络拟合非线性函数_41

 
将filter的9个值和image的9个值做内积(不是把每一个channel分开来算,而是合在一起来算,一个filter就考虑了不同颜色所代表的channel),内积然后相加,得到一个值。

convolution就是fully connected layer把一些weight拿掉了。经过convolution的output其实就是一个hidden layer的neural的output。如果把这两个link在一起的话,convolution就是fully connected拿掉一些weight的结果。

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_42


 

滑动一次则表示一个新的神经元。
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_43

 
其实相当于每次只考虑输入的一部分,即识别某个pattern,以此形成多个神经元。
 

池化(Max Pooling)

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_使用全连接神经网络拟合非线性函数_44


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_45

 
在输出,选择某个范围,保留最大值
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_46


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_47

 
做完一个convolution和一次max pooling,就将原来6 * 6的image变成了一个2 *2的image。这个2 *2的pixel的深度depend你有几个filter(你有50个filter你就有50维),得到结果就是一个new image but smaller,一个filter就代表了一个channel。
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_神经网络_48


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_49


flatten就是feature map拉直,拉直之后就可以丢到fully connected feedforward netwwork,然后就结束了。用的时候,框架已经把以上内容都做好了,只需要确定每层的参数。

 

如下一些例子

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_50


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_51


使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_52

激活机制

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_53


 

人为定义一个激活机制,比如,使Filter的输出的和最大,则称这个Filter被激活了。那么,每个Filter的任务就是,找到一张图片,使得它被激活了。

 

下面找一下池化以后,使得50个Filter激活的图片。取其中12个看看。

 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_54


 

差不多是每个Filter在找一个pattern的意思。

 

再看全连接层
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_cnn_55


 

这里可以看到,似乎又不是上面的纹路一样了。因为这一层实际上综合了之前的多个Filter的信息,拼在了一起。越到后面所寻找的pattern越综合,这就是比较巧妙的地方。(直到最后,找出整张图大小的pattern,相当于完成了图像识别的任务)

 

但是有些时候,可能计算机识别的和人所识别的不太一样。

比如手写数字识别,如果最后结果是这样
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_深度学习_56


 

这个和我们想的不一样。可以根据实际情况加入一个修正项,这里是把所有pixel的值加起来,要求笔画(设为1)的地方尽可能小。
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_全连接_57

 
至此介绍完了激活机制。
 

Example:风格迁移

 
恰好参加了一个项目里面有别人写风格迁移的功能。看了一下似乎也是这个意思:
 

使用全连接神经网络拟合非线性函数 全连接神经网络dnn_使用全连接神经网络拟合非线性函数_58

 
相当于让原图和style一起输入以后,让CNN激活。两部分对激活都有贡献。

 
到此结束。