学习资源
- B站视频:台大李宏毅19深度学习课程
待学习
- 牛顿法
- FCN,全卷积网络及反卷积
- OctConv:一种新的卷积操作
- 特征可视化的方法:
[1]keras: https://github.com/heuritech/convnets-keras
[2]https://github.com/kvfrans/feature-visualization
[3]https://github.com/FHainzl/Visualizing_Understanding_CNN_Implementation
[4]https://zhuanlan.zhihu.com/p/26746283中间位置
- 次梯度下降算法
- 多任务学习
- boosting技术(Freund and Schapire)
- autoencoding无监督预训练
- batch normalization
- 胶囊网络:一种新的机器学习思路
- automl:自动机器学习
- pytorch:
算法中常见参数
- epoch: 一个epoch 指的是使用全部数据集进行一次训练。进行训练时一个epoch可能更新了若干次参数。epoch_num为指定的epoch次数。
- step: 一个step或一次iteration 指的是更新一次参数,每次更新使用数据集中的 batch_size 个 数据。
- 换算关系:iteration或step的总数为 ( 数据总数 / batch_size +1 ) * epoch_num
- 一般来说每个 epoch 算法都会进行shuffle,对要输入的数据进行重新排序,分成不同的batch。
优化算法
主要介绍基于梯度的无约束优化算法,梯度下降、牛顿法、BFGS和L-BFGS算法。
梯度下降算法
转载链接:[梯度下降法的三种形式BGD、SGD以及MBGD]
在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练。其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点。
下面我们以线性回归算法来对三种梯度下降法进行比较。
一般线性回归函数的假设函数为:
对应的能量函数(损失函数)形式为:
下图为一个二维参数(θ0θ0和θ1θ1)组对应能量函数的可视化图:

1. 批量梯度下降法BGD
批量梯度下降法(Batch Gradient Descent,简称BGD)是梯度下降法最原始的形式,它的具体思路是在更新每一参数时都使用所有的样本来进行更新,其数学形式如下:
(1) 对上述的能量函数求偏导:

(2) 由于是最小化风险函数,所以按照每个参数θθ的梯度负方向来更新每个θθ:

具体的伪代码形式为:
repeat{

(for every j=0, … , n)
}
从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果样本数目mm很大,那么可想而知这种方法的迭代速度!所以,这就引入了另外一种方法,随机梯度下降。
优点:全局最优解;易于并行实现;
缺点:当样本数目很多时,训练过程会很慢。
从迭代的次数上来看,BGD迭代的次数相对较少。其迭代的收敛曲线示意图可以表示如下:

2. 随机梯度下降法SGD
由于批量梯度下降法在更新每一个参数时,都需要所有的训练样本,所以训练过程会随着样本数量的加大而变得异常的缓慢。随机梯度下降法(Stochastic Gradient Descent,简称SGD)正是为了解决批量梯度下降法这一弊端而提出的。
将上面的能量函数写为如下形式:

利用每个样本的损失函数对θθ求偏导得到对应的梯度,来更新θθ:

具体的伪代码形式为:
Randomly shuffle dataset;
repeat{
for i=1, … , mm{

(for j=0, … , nn)
}
}
随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
优点:训练速度快;
缺点:准确度下降,并不是全局最优;不易于并行实现。
从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。其迭代的收敛曲线示意图可以表示如下:

3. 小批量梯度下降法MBGD
有上述的两种梯度下降法可以看出,其各自均有优缺点,那么能不能在两种方法的性能之间取得一个折衷呢?即,算法的训练过程比较快,而且也要保证最终参数训练的准确率,而这正是小批量梯度下降法(Mini-batch Gradient Descent,简称MBGD)的初衷。
MBGD在每次更新参数时使用b个样本(b一般为10),其具体的伪代码形式为:
Say b=10, m=1000.
Repeat{
for i=1, 11, 21, 31, … , 991{

(for every j=0, … , nn)
}
}
4. 总结
Batch gradient descent: Use all examples in each iteration;Stochastic gradient descent: Use 1 example in each iteration;Mini-batch gradient descent: Use b examples in each iteration.
牛顿法及分支
参考链接:
无约束优化方法:梯度法-牛顿法-BFGS- L-BFGS
深入机器学习系列17-BFGS & L-BFGS
牛顿法
BFGS
L-BFGS
限制内存的拟牛顿算法
各类神经网络
CNN
关于感受野的计算
为了更好地说明整个卷积神经网络的工作过程,下面以一个例子说明,原始图像的大小为10x10,一共设计了5个网络层,前面4个是卷积层,卷积核的大小为3x3,最后一个是池化层,大小为2x2,为了较简单的说明,本次所有的步幅stride均为1.
注意:感受野在计算的时候不考虑“边界填充”,因为填充的边界已经不是原始图像本身的内容了,感受野描述的是输出特征到原始图像的映射关系,故而不考虑padding 。实际建模过程中可能需要填充边界,原理一样,只是计算稍微复杂点。
1、第一次卷积运算
从上面可以看出:第一层网络输出的图像中,输出结果为8x8,output1输出的每一个特征(即每一个像素)受到原始图像的3x3区域内的影响,故而第一层的感受野为3,用字母表示为
RF1=3 (每一个像素值与原始图像的3x3区域有关)
2、第二次卷积运算
从上图可以看出,经历两次卷积运算之后,最终的输出图像为6x6,output2输出的每一个特征(即每一个像素)受到output1的范围影响为3x3,而output1中的这个3x3又收到原始图像的5x5的范围的影响,故而第二层的感受野为5,即
RF2=5 (每一个像素值与原始图像的5x5区域有关)
神经网络中参数量parameters和FLOPs计算
- CNN中的parameters分为两种:W和b,对于某一个卷积层,它的parameters的个数为:
其中,是卷积核的高度,
是卷积核的宽度,
是输入的通道数,
是输出的通道数
- 对于某个全连接层,如果输入的数据有
个节点,输出的数据有
个节点,它的参数个数为:
- FLOPs:全称是floating point operations per second,指的是每秒浮点运算次数,即用来衡量硬件的计算性能
- 对于某个卷积层,它的FLOPs数量是:
其中,表示该层参数的数量,H是输出图像的高,W是输出图片的宽
- 例题1:假设你的输入是一个300×300的彩色(RGB)图像,而你没有使用卷积神经网络。 如果第一个隐藏层有100个神经元,每个神经元与输入层进行全连接,那么这个隐藏层有多少个参数(包括偏置参数)?
A1:因为输入的节点数量是3003003,输出的节点数量是100。然后加上偏置项b,因为隐藏层有100个节点,每个节点都有一个偏置,所以b=100。利用上面计算全连接网络的公式,故3300300*100+100
- 例题2:假设你的输入是300×300彩色(RGB)图像,并且你使用卷积层和100个过滤器,每个过滤器都是5×5的大小,请问这个隐藏层有多少个参数(包括偏置参数)?
A2:首先,参数和输入的图片大小是没有关系的,无论你给的图像像素有多大,参数值都是不变的,在这个题中,参数值只与过滤器有关。单个过滤器的大小是55,由于输入的是RGB图像,所以输入通道数目是3。因此一个过滤器的组成是553,每一过滤器只有一个偏置项b,因此一个过滤器所拥有的参数是553+1=76,一共用了100个过滤器,所以隐藏层含有76100=7600个参数。其实,也就是上面的公式计算CNN的参数量。
残差网络ResNet
出自论文《Deep Residual Learning for Image Recognition》
这篇博文介绍的很清楚:残差网络ResNet笔记
摘要如下:
- 背景
当神经网络越来越深,训练集和测试集上都出现了误差先下降再上升的情况。这显然不是过拟合,何凯明等大神认为不合理的是:如果浅层的网络就已经达到了饱和,那么后面的网络层可以通过训练将每层变为恒等映射(输入x,输出x)来避免误差增加。但实际上却并非如此。于是何等猜测过深的传统神经网络想拟合恒等映射是很难的。然后基于“残差的思想都是去掉相同的主体部分,从而突出微小的变化”的想法,他们提出了残差网络。
- 基本结构
引入残差前的网络层可以以F’(x)来表示。引入残差后,F是求和前网络映射,H是从输入到求和后的网络映射(第二次relu前的和,图中未标出)。
比如把5映射到5.1,那么引入残差前F’(5)=5.1。引入残差后是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射F’的输出增加了1/51=2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。
RNN网络(循环神经网络,recurrent neural network)

实际的RNN网络往往是右图形式,比方说我们有一个输入序列[x0,x1,x2,x3],网络的计算过程是这样的:首先x0被输入输入层,隐藏层的计算结果记为s0,输出s0(视需求而定)。接着输入x1,隐藏层将s0和x1一起作为输入进行计算,结果为s1,输出s1(视需求而定)。。。。。。如此不断迭代。注意,虽然有图每一层只有一个标记,但实际应用时,针对单个输入如某句话中的某个单词,设计的输入层和隐藏层中的神经单元为复数个。
所以说CNN的参数共享是空间上的,而RNN的参数共享是时间上的。
因此,我们可以沿着时序将网络进行展开
简单理解可以参考莫凡的视频:什么是循环神经网络 RNN (深度学习)?
公式推导可以参考:零基础入门深度学习(5) - 循环神经网络
LSTM网络
参考:零基础入门深度学习(6) - 长短时记忆网络(LSTM)
递归神经网络
好巧不巧,递归神经网络的缩写也是RNN(recursive neural network).
深入理解可以参考:递归神经网络
基础概念
end to end方法
即一端我输入原始数据,一端输出我想要的结果,中间的环节无需干预。比如像yolo这种算法,就是只通过CNN网络,就能够实现目标的定位和识别,无需人工增加其他环节,这就是端到端。而其他RCNN类的方法,CNN只是用来分类,定位之类的功能还是要依靠其他算法完成,没有做到一种方法端到端。
end-to-end 的本质是你要解决的问题是多阶段的或多步的(跟所谓的raw feature没啥关系)。如果分阶段学习的话,第一阶段的最优解不能保证第二阶段的问题达到最优。end-to-end把他们堆在一起来优化,确保最后阶段的解达到最优。
end-to-end的好处:通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出,给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。
新的进展
新的卷积操作:OctConv
基于卷积神经网络的风格迁移
(已阅)Perceptual Losses for Real-Time Style Transfer and Super-Resolution.pdf
参考:方案实现部分
