【songbo】TF学习笔记总结记录之week3--知行合一

人工智能
机器学习

#1

做到知行合一,不能光知道理论。要用代码实现,这样不断地优化会提升自己的成就感。


#2

##李飞飞团队课程-损失函数和优化总结

目前叙述到关于分类图片的分类器是线性分类器,也就是有一个矩阵W和偏移量b,将图片的像素转换为向量,与W相乘然后和b相加,最终得到各个类别的不同得分,选取得分最高的作为分类结果。

衡量这个W矩阵里边的参数好坏就称之为损失函数。它接收一个W作为参数,输出得分,表示这个W的好坏程度。

通常损失函数定义如下 $$L = \frac{1}{N} \sum L_i(f(x_i,W),y_i)$$

####多分类SVM损失函数 函数定义形式如下: $$\begin{equation} \begin{aligned} L_i &= \sum_{j\not=y_i} \begin{cases} 0 & if \quad s_{y_j} \ge s_j + 1 \
s_j-s_{y_i} +1 & otherwise \end{cases} \
&=\max(0,s_j-s_{y_j}+1) \end{aligned} \end{equation}$$

该公式对于单个例子而言,首先为该例子进行分类,会得出一个它在各个类别上的得分。我们对除了正确类别外的所有类别进行循环,每次取这个类别作为$s_j$,如果正确类别的得分大于该得分的和再加上一个阈值,这里是1,那么就表明分的没问题,损失值为0.否则,就算出错误分类和减去正确分类得分,加上一个阈值,这里是1.作为损失值。然后将所有不正确类别的得分加起来最为这个样本的最终损失值。 然后都每个训练样本都这样做,求和平均得出最终值。

为了避免过拟合现象,通常会加一个正则化项 $$L = \frac{1}{N} \sum L_i(f(x_i,W),y_i)+{\lambda}R(W)$$

在正则化项常用的有:

  • L2正则化项 $R(W) = \Sigma_k\Sigma_lW^2_{k,l}$

  • L1正则化项 $R(W) = \Sigma_k\Sigma_l|W_{k,l}|$

  • Elastic net(L1+L2) $R(W) = \Sigma_k\Sigma_l{\beta}W^2_{k,l}+|W_{k,l}|$

  • Max norm regularization

  • Dropout

  • Fancier:Batchnormalization,stochastic depth

####Softmax Classifier 这个损失函数所做的事情考虑了分类器对于一张图片进行不同类别的得分。然后将得分指数化,以便所得结果为正数,然后进行进行归一化处理,就是每个结果除以所有结果的和。算出在不同类别上的概率。概率最大则为结果。 $$L_i = logP(Y=y_i | X = x_i)$$ $$L_i = -log \frac{e^{sy_i}}{\Sigma_je^s_j}$$ 为什么取对数,以及为什么加负号 原因如下: 我们希望在正确的类别上概率趋近于1,其它趋近于0,log函数图像符合这一现象,而当我们增加log的值的时候,是在衡量这个结果有多好,取负号,是为了符合损失函数的意义。它表达的是这个分类器有多不好。比如从0.5到0.6,概率增加,结果变好了,取负值,即是-0.5到-0.6,值变小了,说明不那么坏了。

####优化

  • 随机搜索 随机生成一些权重值,然后检查损失函数的值是否下降了,下降就更新,不下降就再随机找,这样也是一种办法,不过效率不是很好。

  • 梯度下降算法

  • 利用在该点的斜率来探知往底部的点在哪里。这样不断更新,找到最低点。这里的斜率是通过微分计算的。梯度下降,这里的梯度就是偏导数组成的向量。偏导数指向函数增加最快的方向,那么负的偏导数就指向函数减少最快的方向。

  • 有限差分法,一个简单的计算梯度的方法。它基于这样一个公式 $$\frac{df(x)}{dx} = \lim_{h \to 0} \frac{f(x+h)-f(x)}{h}$$ 在权重的第一个值上添加一个小小的h,然后根据公式算下值作为对该点的偏导数,然后恢复第一个值,对其他的值反复操作,得出对该W的偏导数。 这样是可以的,但是在CNN中,由于参数非常非常的多。计算起来非常的慢。

+分析梯度 利用微分进行函数对某个变量的微分,算出在该点微分值,这样比较有效率而且比较精确。数值梯度可以用来debug

  • 随机梯度下降(Stochastic Gradient Descent(SGD)) 数据集非常大的时候,要对所有数据计算一次损失函数会非常非常的慢。因为我们计算每一个W中的值的时候,都要对所有的数据集进行迭代一次。SGD选在一小批量数据计算梯度。相当于对真实数据做一次蒙特卡洛估计。

####图像特征 在之前我们是直接将图像的像素值输入到线性分类器进行分类。这样很丢失掉一些特征信息。我们可以先计算一些图像特征,然后将特征向量整合到一起,作为图片的特征描述,目的是将线性不可分转换为线性可分的。

  • 可以考虑极坐标转化,不失为一种方法。

  • 还可以统计出颜色直方图。可以描述出这个图片都有哪些颜色,以及那种颜色占主导地位。

  • 方向梯度直方图,描述每个小块的方向变化。

  • 我们可以对训练样本进行随机采用统计,寻找出某一类别常见的图像块,然后将图像出现这些图像块的次数作为特征向量,输入给线性分类器。

在进行神经网络的时候,我们将原始的像素扔进去,然后可以计算不同的特征表示方法,再进行线性分类,更新所有的权重,包括特征转换和分类的,最后得出不同类别的打分。


#3

有机会多交流哈,共同进步。


#4

##李飞飞团队课程-介绍神经网络总结

####反向传播算法 在神经网络训练时,要计算梯度下降的时候,由于参数众多,以及层数多,算起来比较麻烦,因此利用规则连,采取从结果算起的方法,减少不必要的计算。 有公式如下 $$f(x,y,z) = (x+y)z$$ 我们记$q = x+y$ ,现在我们要求$\frac{\partial{f}}{\partial{x}},\frac{\partial{f}}{\partial{y}},\frac{\partial{f}}{\partial{z}}$这三者的值

此时$\frac{\partial{f}}{\partial{z}} = q$,$\frac{\partial{f}}{\partial{q}} = z$,$\frac{\partial{q}}{\partial{x}} = 1$,$\frac{\partial{q}}{\partial{y}} = 1$

根据规则链,就可以知道$\frac{\partial{f}}{\partial{z}} = x+y$,$\frac{\partial{f}}{\partial{x}} = z$,$\frac{\partial{f}}{\partial{y}} = z$

其它复杂的函数可以拆解成每个节点进行计算,这也是反向传播的做法。

现在引入多维的情况。 $$f(x,W) =||W\dot{}x||^2 = \Sigma_{i=1}^n(W\dot{}x)_i^2$$ 假设W为22维度的,x为12维度的。他们的点乘为2*1维度下,截图如下:

假设此时计算W中的变量对q的影响,我们可以分开来看每个元素比如第一列元素求导的结果为$x_1$,第二列为$x_2$等等。那么现在来分析他们对于最终结果f的影响,q的第一行只被W的第一行影响,由此可以计算f对于W每个元素的偏导数。

梯度矩阵的维度应该和变量维度一致。

####神经网络

将一层增加为多层,并引入激活函数,进行非线性变化。每一层的输出作为下一层的输入。


#5

嗯,我是刚开始学习,一起努力,!


#6

##李飞飞团队课程-卷积神经网络总结

####历史

卷积神经网络采用多层卷积层来保持最开始的空间结构,但当时没有充分的数据,以及强大的计算能力。因此无法实现大型卷积神经网络,在2012年ImageNet中,CNN取得了巨大的进步,慢慢的开始被广泛应用于各个领域。 刚开始从猫的大脑中视觉刺激的学习中,了解到不同的细胞进行不同的工作。有的感知光,有的感知物体的移动,基于这个想法,出现了神经网络模型,并不断地进行完善。 可以进行

  • 图像分类 识别图像属于哪一类

  • 图像检索 寻找相似的图像

  • 图像检测 检测一张图片中都有哪些物体,用方框框出来

  • 图像分割 不去用方框框起来,而是用标记标出物体在哪里,以及轮廓。

  • 图像描述,甚至是描述出图像的内容,用一句话描述图像的内容

卷积

卷积的目的是为了保持空间结构 之前的做法是用一个权重W求出这个输入的结果,而我们现在为了保持原来的空间结构,则是用一个比较小的卷积权重来进行整个图像的滑动,如下图:

每个5*5作为一个新的像素,然后再用另外一个卷积核表示其他的模式或者概念,采用一组卷积核来得到相同纬度大小的结果,然后进行激活函数的处理。 最终进行不断地迭代:

这里相当是在做特征提取,最后输入线性模型进行预测。

在进行卷积的时候,我们会发现,维度缩小了,我们通常不希望损失一些信息,因此可以边缘进行填补,使得输出的维度和输入的维度一样。

池化

通常输入一个图片后,经过卷积,Relu后还要夹杂一个池化层,目的是将卷积层的平面维度缩小,深度保持不变,在这里采用和之前卷积所用的卷积核大小的一个滤波器,将这个区域内的值进行处理后行程一个维度小的池化层,提取区域中的最大值或者平均值,根据不同的处理方法进行不同的池化处理,通常的处理方法是区域不重叠。且采用最大值池化,选取最大值池化的意义是,用其中最显著的特征来代表这个区域的样本。 在卷积池化做完之后,将矩阵拉平输入全连接网络,得到最后的分类结果。