说明:本系列是七月算法深度学习课程的学习笔记
1 背景介绍
深度学习在图片上的应用:功能上讲:图像分类和物体识别;应用上:可以用来分类图片:白菜形状的玉器摆件、白菜、大白菜;图片搜索;给照片打标签;识别超市的蔬菜;自动驾驶;模仿画家作画;拍立淘:以图搜索产品。
深度学习在nlp上的应用:模仿作家写作;抽取图片中的文字。
综合应用:识别图片中的物品以及人物。
2 神经网络非线性能力及原理
2.1 感知器与逻辑门
2.1 得分函数
线性分类器
分类问题:输入图像数据;输出所属分类;线性分割:f(x,W)。找到合适的映射函数f。
f(x,W) = Wx
输入是一个32x32x3的图片,W是一个10x3072的矩阵,x是一个3072x1的向量),其中W叫做参数或者权重。f称为得分函数。
把输入值全部展开就是一个3072x1的向量。
![](https://i-blog.csdnimg.cn/blog_migrate/36eabe30a3fbd1ee2d89cae885a64bd4.png)
如果我们的分类是3个:cat,dog,ship。
W中每一行是对一个分类的线性参数。
b是偏移,相当于是截距。
最后一列是得分,在哪个分类上得分最高就最 可能是哪种分类。
2.2 损失函数
f(x,W) = Wx是否与实际符合,需要用损失函数来衡量。
损失函数:用来衡量参数W的吻合度。
损失函数1: hinge loss 支持向量机损失
衡量的是当前样本计算的得分与标准答案之间的差异到底有多大。
例如在图片分类中有3个分类,标准答案是分类2,那么蓝色的线就是分类2的得分。delta是警戒线。如果蓝色线是90,分类1和分类3的得分都比90小,那就分类正确,没有损失。但是有点不靠谱。加个delta可以让正确答案更靠谱一些。其他分类的值,只要不超过警戒线损失就是0,否则就有损失。
计算每个错误分类的错误距离之和。对于第i个图片的损失值等于:
L
i
=
∑
j
!
=
y
i
m
a
x
(
0
,
f
(
x
i
,
W
)
j
−
f
(
x
i
,
W
)
y
i
+
δ
)
L_i=\sum_{j!=y_i}max(0,f(x_i,W)_j-f(x_i,W)_{y_i}+\delta)
Li=∑j!=yimax(0,f(xi,W)j−f(xi,W)yi+δ)
损失函数2: 交叉熵损失(softmax)
如果将每个分类上的得分记为s1,s2,s3。我们将它们处理为
e
s
1
e^{s1}
es1,
e
s
2
e^{s2}
es2,
e
s
3
e^{s3}
es3,然后对他们做归一化得到概率。做指数的原因是每个分类的得分可正可负,没法计算概率。
对于训练集中的第i张图片数据
x
i
x_i
xi,如果真实分类是dog,如果我们把分类记为:cat,dog,ship,那真实的向量应该是:[0,1,0]。如果我们计算得到的向量是(已经是e的次方了):[0.9,0.05,0.05]。那这个向量和真实的向量之间的差距有多大,这时候从极大似然的角度来看,我们会希望dog的概率
p
d
o
g
p_{dog}
pdog是最大的,从而log
p
d
o
g
p_{dog}
pdog也应该是最大的。那么
−
l
o
g
p
d
o
g
-logp_{dog}
−logpdog就会希望是最小值。
极大似然会将所有分类的概率乘积起来,这里使用log是因为概率值比较小,概率值相乘可能会超出计算机的精度范围。
那么最后得到损失函数:对于训练集中的第i张图片数据
x
i
x_i
xi,在W下会有一个得分结果向量
f
f
f,损失值等于:
L
i
=
−
l
o
g
(
e
f
y
i
∑
j
e
f
j
)
L_i=-log(\dfrac{e^{f_{y_i}}}{\sum_{j} e^{f_j}})
Li=−log(∑jefjefyi)
j:所有的类别,
f
y
i
{f_{y_i}}
fyi是第i张图片计算得到的结果向量在正确分类上的数值。
例如上面例子中的
L
i
=
−
l
o
g
(
0.05
0.9
+
0.05
+
0.05
)
=
−
l
o
g
(
0.05
)
=
3.0
L_i=-log(\dfrac{0.05}{0.9+0.05+0.05})=-log(0.05)=3.0
Li=−log(0.9+0.05+0.050.05)=−log(0.05)=3.0
这样我们的目标就是求
L
i
L_i
Li的最小值。
问题:这里为什么不用MSE做损失函数?
在做线性回归问题的时候(也就是函数的结果值是一个连续的数,例如房价预测),我们经常使用MSE做损失函数。MSE是一个非凸的函数,而交叉熵是一个凸函数。我们给交叉熵加入softmax之后,是一个具有单调性的函数,损失越大,梯度越大,非常利于梯度下降的反向传播。所以softmax经常和交叉熵一起使用。参考链接
2.3 神经网络
一般神经网络的结构分为:输入层、1-多个隐藏层、输出层。
在logistic回归中
z
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
z=\theta_0+\theta_1x_1+\theta_2x_2
z=θ0+θ1x1+θ2x2
a
=
g
(
z
)
=
1
1
+
e
−
z
a=g(z)=\dfrac{1}{1+e^{-z}}
a=g(z)=1+e−z1
可以把这个看所一个神经元感知器。
神经网络有若干个这样的感知器。就相当于有多个logistic回归,有多个线性切分。多个线性切分可以得到什么结果呢?
![](https://i-blog.csdnimg.cn/blog_migrate/77588aea900c8064330f4c9a75496ead.png)
2.3 非线性切分
logistic回归在上图数据中就没有办法画出非线性的边界。
通过神经元的逻辑与、逻辑或操作多个线性切分就可以画出复杂的决策边界。但是也是复杂的线性边界。
逻辑与
逻辑或
![](https://i-blog.csdnimg.cn/blog_migrate/882d32773a1b9431dfcd790d33628981.png)
![](https://i-blog.csdnimg.cn/blog_migrate/728cf3502a173d2537900a88178bdb42.png)
对线性分类器的与或 进行组合就可以得到复杂的线性切分
2.4 网络表达能力与过拟合问题
提升隐层层数或者隐层神经元的个数,神经网络的容量会变大,空间表达能力会更强。
解决方法:不要试图通过降低神经网络参数数量来缓解,用正则化或者dropout。
2.5 神经网络之激活函数
sigmoid 和 双s函数tahn,通常是非线性函数。在每一个隐藏层后面都会加一个激活函数层。
加激活函数是要起到非线性的作用。否则无论加多少个隐层,这个符合函数还是线性的。遇到下图这样的数据,即使多复杂的线性表达式也不能完全区分。
![](https://i-blog.csdnimg.cn/blog_migrate/80c16fe802eb9527a6400b742a6f30ea.png)
如果使用激活函数,例如sigmoid。三个隐藏层每层过sigomoid函数,就能得到下图右边的效果。参考链接
2.6 BP与SGD
BP:反向传播,传播误差;做题,传回修正值。
SGD:相当于改题,找到梯度,沿着梯度的方向更新参数