深度学习笔记(1)-人工神经网络

来源:互联网 发布:vivo手机虚拟网络设置 编辑:程序博客网 时间:2024/05/16 06:30

作者:吴玉霞

时间:2017年5月1日

出处:http://blog.csdn.net/sinat_36171246/article/details/71056454

声明:本文为博主原创文章,未经博主允许不得转载

    前传:最近开始学深度学习,报了七月在线的11月深度学习班,为了防止学完后遗忘,也为了加深自己的理解,就记下此系列的笔记,其中引用了一些课程PPT里的图片,已征求过July大Boss的同意,我个人比较喜欢通俗易懂的技术博客,因此尽量做到大部分人都能看懂吧,讲得比较浅,如若有何不妥,还望大家尽情地批评指正吧!

目录
1、线性分类器
2、人工神经网络
3、神经网络之BP算法
4、神经网络之SGD算法


1、线性分类器

1.1 基本图像处理知识

    首先,因为后面会用到图像处理的知识,所以我觉得有必要讲一下基本的知识,即图像的数字表示,因为计算机不像人,它看不见的,它只认识数字,所以我们跟计算机打交道,得说计算机能懂的语言不是?

    先说计算机怎么看彩色图像的吧,
    对于不了解图像处理知识同学,在这里解释一下,对于计算机而言,一张彩色图像就是一个三维的矩阵
(m×n×3),
    这里的3代表3个颜色通道,就是传说中的三基色R(红)、G(绿)、B(蓝),


这里写图片描述

    通过对每一个基色赋予一个比重,就能够组合出很多种颜色,对于我们所要处理的数字图像呢,每个颜色的比重范围都是从0~255,共256级,总共能组合出256×256×256=16777216种色彩,厉害吧。

    为了更加直观,我们在matlab里面看一下哈,
    首先我们给计算机输入一张图像 I=imread('D:\图片\2.jpg');


这里写图片描述

    显示一下它的三个通道:IR=I(:,:,1); IG=I(:,:,2); IB=I(:,:,3);


这里写图片描述

    看到了吧,I是一个300×343×3的矩阵吧,并且每个矩阵元素的范围是0~255。

    下面我们来看一下R、G、B矩阵里的数值吧


这里写图片描述

这里写图片描述

这里写图片描述

    看第一个元素,它的颜色组合就是R=100,G=71,B=55。
    而灰度图像,就只有一个通道,代表亮度,是一个二维矩阵。这里就不再展示了哈。

1.2 线性分类器(linear classifier)

    好,我们言归正传,对于输入图像x (如彩色图像32×32×3),我们现在是要做图像分类问题,什么意思呢,就是你给计算机一张图片,并且告诉它这张图可能是猫、狗、汽车,让它判断属于哪一类。这,是不是难度有点儿大啊,就好像一个刚出生的婴儿,你冷不丁地拿张图片给它看,它肯定分不出来嘛,但是幼儿园的小朋友就能分出来,为什么呢?因为家长、老师会教他们啊,他们会指着一张猫的图片,跟小朋友说,这是猫,这样下来,小朋友记的多了,自然能分辨出来。所以,我们就要把计算机当做小朋友,先告诉它,这是猫,这是狗,但是计算机怎么记忆呢?我们就给它训练一个模型呗,有输入,有输出,就像一个函数一样,输入一张图像,就能得到分类结果,这样不就可以了?我们自然就想到简单的线性函数y=kx+b了,这就是我们接下来要讲的线性分类器(只是换了一个更高大上的名字罢了,大家都喜欢高大上的称呼是吧,哈哈)。
    在这里我们假设总共有10个类别(猫、狗、汽车、船等等),对计算机来说,就是一个10×1的矩阵,对吧,然后让计算机判断它属于哪一类,具体来讲,就是定义一个函数:f(x,W)=Wx+b,我们称为得分函数,哪一类的得分高,就判断为哪一类。如下图所示:


这里写图片描述

:很多文献中直接写f(x,W)=Wx,并不是没有偏置项b,而是在x向量中增加一个元素1,把b放到W里了。
如下图


这里写图片描述

    具体操作时首先把x展开成一个列向量,即变成大小为3072×1的列向量,通过计算f(x,W)=Wx+b得到所有类别的得分f(10×1),其中W是权重参数(10×3072),就是直线的斜率嘛,b是偏置项(10×1),就是截距。对于怎么选取参数Wb,我们后面会介绍。

1.3 线性分类器的理解

    我们举个简单的例子,假设输入图像只包含4个像素,x是4维向量,类别数是3,那么W就是3×4的矩阵,b是三维列向量,通过计算f(x,W)=Wx+b得到3个得分值。
比如下图第一个类别cat score就是将Wb的第一行代入f(x,W)=Wx+b得到,即:
0.2×56+0.5×231+0.1×24+2.0×2+1.1=96.8


这里写图片描述

    那么,怎么理解线性分类器实现分类呢?

    (1)可以把线性分类器看做是空间的划分
    比如下面三个不同的线段把二维平面分成不同的部分,当然更高维的便是超平面了


这里写图片描述

    我们根据三行Wb的值,是不是就得到了三条直线啊?直线上的点满足Wx+b=0,箭头所指方向表示得分增加的方向,反方向是得分减少的方向,因此根据得分情况就能得到图像的类别。

    (2)把线性分类器看做是模板的匹配

    这个怎么理解呢?很简单,就是把W的每一行看做是某一类别的模板,而得分就是图像像素点和模板的匹配度,而匹配度通过计算模板和像素点的内积得到,哪个匹配度最高,就属于哪个类别咯。

1.4 损失函数

    下面一个问题就是,如何判断通过得分函数得出的类别准确性呢?这就引出了损失函数(Loss function),或称为代价函数(Cost function),表示结果和实际类别的差异,差异越大,损失函数值越大。我们对Wb的参数的调整,就是为了减小损失函数值,具体怎么减小,后面会介绍到。

    下面主要介绍两种Loss function:
    就像我们考试时做题目,两个老师有不同的判分标准。
    1) hinge loss(对应于SVM)
    中心思想就是:对于图像x的分类结果,我们要求正确类别的得分比错误类别的得分高出一个marginΔ
具体来讲,对于输入图像xi,在W下,我们得到一个得分向量f(x,W)j(比如3个类别就是3×1的列向量,j=0,1,2),损失函数计算如下:


这里写图片描述

    其中yi是正确类别,hinge loss就是把所有错误类别与正确类别的差都计算一遍。
    先不要被这个复杂的公式吓着了,咱来举个例子,假设我们得到三个得分[13,7,11],第一个类别是实际类别,即yi=0,那么Li=max(0,713+10)+max(0,1113+10)=0+8=8
什么意思呢?我们先看第二个类别得分-7,是错误类别,而正确类别是13,13比-7多多少呢,显然是20,比老师设置的Δ大,所以老师认为你这道题做的很好,老师并不惩罚你。而对于第三个类别得分11,同样的道理,13比11多2,小于Δ,差了多少?差了8,所以对不起,要惩罚一下,代价为8。
    直观地理解:


这里写图片描述

    前面已经说到,我们的要求是正确类别的得分比错误类别高,至少高出Δ分,图中蓝色分割线处为正确类别的得分,绿色分割线为错误类别的得分,红色线段为设置的边界线长度Δ(比如Δ=10),如果你的类别得分落在红色线段处,甚至更高,就要接受惩罚,如果落在红色线段左边,我们认为达到要求,不予惩罚。

    2) cross-entropy loss(交叉熵损失,对应于softmax分类器)

    很简单,就是得到得分向量后,根据得分向量计算正确类别的概率,我们清楚地知道,实际概率应该是[1,0,0],所以我们计算两个概率分布的差异,用下面这个公式就好了:


这里写图片描述

    其中yi是正确类别的得分,j是所有类别,j=0,1,2,采用e的指数次方是为了防止概率得到负值。

    关于公式背后具体的原理,大家可以参考知乎上如何通俗的解释交叉熵与相对熵?的回答。
    最后,当我们得到Loss function后,就可以采用一些方法来减小损失,在一步步减小损失的过程中,求得最佳Wb

2、人工神经网络

    线性分类器存在一个问题,就是它是一个线性函数,对于空间线性不可分的情况(即一条直线分不开),它就没办法做分类了。
    比如下面这种情况,一条直线怎么分都分不开嘛。


这里写图片描述

    But, 如果我们用两条直线求交集,不就可以分开啦?


这里写图片描述

    那怎么做呢,于是人工神经网络就应运而生了!

    首先介绍简单的感知器


这里写图片描述

    其中最左边x所在的那一列是输入层,Wb是权重参数,输出z=w1x1+w2x2+b(这不就是个线性分类器嘛),g(z)是激励函数(非线性,如sigmoid函数),最终输出a=g(z)=11+ez,就是说,一个简单的感知器里面就有一个线性函数,显然,我们再增加一个感知器,不就能生成两个线性函数了?我们求两条直线的交集,上图线性不可分的情况就变得可分了。


这里写图片描述

    当我们加入一些少量的隐层单元,就得到了浅层神经网络,就是由很多个感知器组成的网络:


这里写图片描述

    为什么线性函数后面要有一个非线性激励函数?它的作用就是可以滤除一些不必要的信号(让其值为0或很小)或者增加某些重要信号的权重,因为我们的大千世界,什么都有啊,我们会接收到各种各样的信号,比如,你在打电话,突然一阵风吹过来,跟你有关系吗?你需要挂断电话,考虑这阵风来自哪个方向吗?你四不四洒啊,哈哈,开个玩笑。但是,如果你在打电话时,突然一个歹徒拿着刀子对着你,你再不管,小命都没了。另外,假如没有非线性激励函数,层与层之间都是线性函数,那么叠加起来还是线性函数啊,就是说加入更多的神经元,更多的层次,只是改变了一下Wb,和单层的效果一样。就像你去买汉堡,你说,老板,给我多加几层吧,你又不想加钱,你以为老板给你多加几层,就多加了很多牛肉吗?并没有,还是那么多牛肉。

    行文至此,这么多参数,我们怎么调整得到最佳参数呢?这就要用到BP算法了。

3、神经网络之BP算法

    其实BP算法的原理很简单,就是求导嘛,大家不要被它吓着了。
    就两步:正向传播和反向传播
    就像寒老师在课上拿考试举例子,我们去参加考试,不能裸考吧,你得学习吧,然后参加考试对答案,看看你哪地方错了,这个过程就是正向传播,计算我们的loss,得到误差,然后将误差反向传播,错误的原因肯定跟你考前对知识的掌握程度有关,我们要找到原因,然后修正,这样下次才能考高分啊。
    在我们的神经网络中,层与层之间是函数嵌套的关系,即复合函数,大家看每个神经元,它的输入是不是由上一层的函数g(f(Wx+b))得来,然后再经过函数fg,那不就是g(f(Wg(f(Wx+b))+b))吗?就是一个复合函数求导而已,根据链式法则,就是各个函数导数的乘积嘛。

    我们举个简单的三层的例子,如下图:
    设我们的输入是x=x1,x2,xn,输出是o=o1,o2,ol,(图中oj应该是ol哈)实际结果是d=d1,d2,dl, 我们要比较ob的误差,然后把误差向前面传。


这里写图片描述

    以输出层的第k个神经元为例,
    它的误差就是:


这里写图片描述

    式中12是为了求导方便,因为后面有个平方项嘛。
    那么,ok怎么来的?是不是前一层的g(f(Wx+b))计算得到的啊?
    因此,我们把误差展开到隐层,得到:


这里写图片描述

    再展开到输入层:


这里写图片描述

    现在误差有了,是一个复合函数,那么怎么调整权重,让误差不断减小呢?

4、神经网络之SGD算法

    如下图所示,比如误差函数是图中的凸函数,初始点在Starting point,我们怎么找到它的最低点呢?


这里写图片描述

    现在,让我们想象一下,你站在山顶上,想要下山,那么,怎样才能下得最快呢,只能一步一步来喽,于是你环顾一下四周,找到了一个最陡的方向(就是数学中梯度的方向咯),你走了两步,停下来,又环顾一下四周,再找一个最陡的方向,就这样一直到了山脚下。
    所以,这个过程中的几个关键的因素就是:
    初始值,就是初始位置了。
    方向:就是你选的下山的方向,函数梯度的方向。
    步长(学习率):每个方向走多远,走的距离太长,可能会错过最低点,走的距离太短,又会走很慢,走到天黑还没下来,你妈妈会担心的。


这里写图片描述

    关于梯度的计算,就是对复合函数E求导咯:


这里写图片描述

    然后新的w就得到啦:w=w+Δw

    后记:之前在微博上说过“学习,还是要戒骄戒躁,夯实基础,不积跬步,无以至千里。那么问题来了,怎么知道自己学会了呢?我觉得你能写出来,讲出来,讲给大家听,让没学过的人都能够听懂,那你肯定学会了,摸透了,在讲述的同时,也锻炼了逻辑思维能力和表达能力,这就是我学习的终极目标。恩,以后每学会一个东西,我也写到博客里,锻炼一下,对自己也对他人负责”。所以也要说到做到嘛。但是感觉虽然写出来了,有些地方还是理解地不够透彻,大家可以多提意见,再完善一下。

参考资料
七月在线11月深度学习班
斯坦福大学cs231n线性分类器svm与softmax

1 1