在图像分类问题上,普通的机器学习算法都是将二维或者三维的像素矩阵拓展成一维的,而这个过程其实丢失了很多图像原本的结构特征,比如说边缘,纹理等等。一维的像素往往直接用来做特征,或者先做一个降维再去做特征。而且,如果是彩色图像,机器学习往往会把颜色类似的图像分成一类(比如蓝天,绿色的草原),准确度不高,而且分类的依据非常不合理。
softmax就是将简单的二分类问题扩展成了多分类问题。对于一个十元分类问题,初始的损失函数值应该接近于log(10),这个经验值可以用来check。
而神经网络包含了很多隐藏层,可以挖掘比像素级特征更好的图像特征。因此准确率会更高。但是神经网络的层数,每一层神经元的数量(相当于要挖掘的特征数目)都是不可控的超参数(常见的有网格搜索法),这些都大大影响了神经网络的学习泛化能力。
激活函数(主要起了非线性的作用,没有它,再复杂的神经网络也相当于LR模型)
sigmoid除了用于二元分类的输出层之外,其他地方基本上用不到。其导数为g(z)(1-g(z)).
而tanh虽然有着和sigmoid类似曲线形状,其导数为g(z).^2。但是由于它的函数值范围是(-1,1),因此会使平均值趋于零,这点会对下一层网络有好的影响。但二者都面临着梯度消失的问题(权重更新是用的backprop后向传播,通俗一点其实就是链式求导法则).
因此在实际训练中,ReLU 和leaky ReLU由于梯度是常数,被广泛应用。
训练神经网络要注意的事项:
(1)对于每一层的W系数的初始值要随机设置,一定不能设为全0(这和机器学习不太一样)。否则,无论怎么更新每一层的权重系数,它们都会保持相同。(Ng在Deeplearning这门课中有详细的推导)
(2)如果激活函数包含tanh或者sigmoid函数,则W在初始化时,除了考虑随机化之外,还要考虑数值的大小。因为在z特别大时,a=g(z)(g为某激活函数)的梯度会很小,基本趋于零(业界很关注的梯度消失问题),这时的学习收敛速度也会很慢。因此,为了保证在初期的训练中能有较快的学习速率,W应该尽量小一些。
(3)但是对于深层次的神经网络,W不能过小。随着层数的增加,均值仍趋于0,但方差和标准差会越来越小,这就会造成反向传播的梯度值也很小,即收敛慢。W过大又会有饱和的问题。Xavier初始化保证了每层的方差不会过大或者过小。
(4) 当激活函数选择sigmoid时,可以设交叉熵为损失函数,可以在一定程度上解决梯度消失的问题。公式为−[ylna+(1−y)ln(1−a)],y为标签,a为实际输出值。导数中没有σ′(z)这一项,权重的更新是受σ(z)−y这一项影响,即受误差的影响。所以当误差大的时候,权重更新就快,当误差小的时候,权重的更新就慢。http://blog.youkuaiyun.com/u012162613/article/details/44239919 讲解的很详细。
(5)batch normalization(使得输入数据趋于高斯型) 通常插入在激活函数之前,全连接层之后
(6)在训练时,可以先选取一小部分数据集,取消正则化那一项,来检查神经网络是否可以过拟合(损失函数降到无限小,准确度是否接近1)。如果前期顺利,在进行全部训练集的训练。
CNN卷积神经网络(CS231n第五课)
主要包含卷积层,池化层(下采样),全连接层(最后一层)
卷积层有点类似于图像的模板滤波,并不是真正意义上的卷积。它考虑到了图像的空间特性。所以变成了部分连接而不是全部连接。滤波通常是5*5或者3*3类似的大小,还有滑动步长(通常为1,2)。为了使滤波后的大小和之前一样(不丢弃边缘的信息),又引入了0 padding.
池化层就是下采样的过程,分为平均值和最大值下采样(通常为2*2)。而一般都采用最大值下采样(最大值表示的是相应神经元被激活的程度)。其实卷积层滤波的步长设为2,也可以达到和池化类似的效果,从而简化CNN的结构,但是效果可能没加入池化层好。
图像风格迁移
对于图像而言,内容和风格的概念都是直观的。图像内容是指图像中出现的事物,例如狗、房屋、脸等,图像风格则是指图像的颜色、光线明暗、笔触和质感。图像风格迁移之所以能成功实现,实际上是因为DNN可以出色地完成图像识别任务(例如:目标识别)。由于DNN能学习可以用来区分图像中不同目标的特征,因此它可以利用反向传播算法改变目标图像,使其与内容图像的特征相匹配。