全连接神经网络、卷积神经网络
- 前言
- 全连接神经网络
- 介绍
- 结构
- 损失函数
- 梯度下降
- 链式法则
- 反向传播
- 总结
- 卷积神经网络
- 背景
- 结构
- 卷积(Convolution)
- 池化(Max Pooling)
- 激活机制
- Example:风格迁移
前言
全连接神经网络
介绍
深度学习有三个步骤
选择一个合适的神经网络—>选择一个模型评估方法—>选择最优的函数
全连接神经网络,应该叫做全连接前馈神经网络(Fully Connect Feedforward Network),全连接(Fully Connect)指的是下一层每一个神经元都会与上一层的每一个神经元相连;而前馈(Feedforward)指的是输入信号进入网络后,信号流动是单向的,其间没有反馈。
结构
输入—>乘权重后加上偏差(线上的是权重,绿色格子内的是偏差)—>激活函数—>作为下一层输入
激活函数不止一种,Sigmoid函数值总是在0到1之间。
所以,可以把整个神经网络看成一个函数,权重和偏差就是函数参数,参数确定了,函数也就确定了。
而深度学习,意思是可以叠加很多层神经网络,形成深度。当然也不是都叠加全连接层了…
设多少层?每层几个神经元?对一个具体问题,需要尝试加直觉来调试,炼丹…
损失函数
用损失函数来判定模型好坏。
采用交叉熵(cross entropy)函数来对预测和目标,即和的损失进行计算,接下来就是调整参数,让交叉熵越小越好。
对于损失,我们不单单要计算一笔数据的,而是要计算整体所有训练数据的损失,然后把所有的训练数据的损失都加起来,得到一个总体损失。接下来就是在Function Set里面找到一组函数能最小化这个总体损失L,或者是找一组神经网络的参数,来最小化总体损失
如何找到最优的函数和最好的一组参数,方法是梯度下降。
这是用来更新权重的方法。应该是和反向传播结合在一起。计算损失函数对权重的偏导,然后权重-(学习率乘偏导值)。
在神经网络中计算损失最好的方法就是反向传播,我们可以用很多框架来进行计算损失,比如说TensorFlow,theano,Pytorch等等
梯度下降
比较重要的部分。
都是减梯度,所以不存在梯度上升的说法,沿着梯度反方向更新即可。
如下图
- 给出参数
- 选择初始的,计算的损失函数对参数的偏微分。
- 用这个偏微分的值乘学习率,减去这一个值更新参数。
链式法则
链式法则差不多就是从后往前时,可以一层一层求前面权重对于最终损失函数的梯度。如下图
反向传播
- 损失函数时定义在单个训练样本上的,比如在分类问题中,则表示预测的类别和实际类别的区别。
- 总体损失函数(Total loss function)是定义在整个训练集上的,所有误差的总和。也是反向传播所需要最小化的值。
是输出层每一个神经元的损失的和。计算总损失的偏微分,只需要计算每个神经元损失的偏微分。
取出一个neuron进行分析
计算梯度分成两个部分
- 计算
- 计算
Forward Pass部分计算:
Backward Pass 部分计算
总结
计算Forward Pass 和 Backward Pass部分以后,两部分相乘可得到梯度,使用梯度下降来寻找损失最小的函数。
卷积神经网络
背景
CNN(Convolutional Neural Network)主要用在图像处理上。
至于为什么提出CNN,可以举例说明比如一张的彩色图,Flatten后是,如果下一层有100个神经元,则有300万个参数,再传输到下一层…过于复杂。所以需要提出一个新的简化网络结构来处理这个问题。
在影像处理中有三个特点
- 可以通过小区域的特点来识别图片。
- 某一个特征在图片的不同位置出现。
- 图片的尺寸变化不影响对图片的理解。
结构
首先输入一张image,经过多次卷积和池化以后,输入到全连接分类层。
基于影像处理的特点,设计网络结构。
卷积(Convolution)
6*6的Image是网络的输入,而Filter就是需要学习的参数。
每个Filter表示检测的某一个特征,这个Filter并不会一次查看整张图。
然后根据步长移动Filter,和图像的值做内积,得到结果。
多个Filter得到的矩阵叠在一起形成特征图。
如果是彩色图,Filter的深度和输入保持一致。
将filter的9个值和image的9个值做内积(不是把每一个channel分开来算,而是合在一起来算,一个filter就考虑了不同颜色所代表的channel),内积然后相加,得到一个值。
convolution就是fully connected layer把一些weight拿掉了。经过convolution的output其实就是一个hidden layer的neural的output。如果把这两个link在一起的话,convolution就是fully connected拿掉一些weight的结果。
滑动一次则表示一个新的神经元。
其实相当于每次只考虑输入的一部分,即识别某个pattern,以此形成多个神经元。
池化(Max Pooling)
在输出,选择某个范围,保留最大值
做完一个convolution和一次max pooling,就将原来6 * 6的image变成了一个2 *2的image。这个2 *2的pixel的深度depend你有几个filter(你有50个filter你就有50维),得到结果就是一个new image but smaller,一个filter就代表了一个channel。
flatten就是feature map拉直,拉直之后就可以丢到fully connected feedforward netwwork,然后就结束了。用的时候,框架已经把以上内容都做好了,只需要确定每层的参数。
如下一些例子
激活机制
人为定义一个激活机制,比如,使Filter的输出的和最大,则称这个Filter被激活了。那么,每个Filter的任务就是,找到一张图片,使得它被激活了。
下面找一下池化以后,使得50个Filter激活的图片。取其中12个看看。
差不多是每个Filter在找一个pattern的意思。
再看全连接层
这里可以看到,似乎又不是上面的纹路一样了。因为这一层实际上综合了之前的多个Filter的信息,拼在了一起。越到后面所寻找的pattern越综合,这就是比较巧妙的地方。(直到最后,找出整张图大小的pattern,相当于完成了图像识别的任务)
但是有些时候,可能计算机识别的和人所识别的不太一样。
比如手写数字识别,如果最后结果是这样
这个和我们想的不一样。可以根据实际情况加入一个修正项,这里是把所有pixel的值加起来,要求笔画(设为1)的地方尽可能小。
至此介绍完了激活机制。
Example:风格迁移
恰好参加了一个项目里面有别人写风格迁移的功能。看了一下似乎也是这个意思:
相当于让原图和style一起输入以后,让CNN激活。两部分对激活都有贡献。
到此结束。