神经网络(1)---传统神经网络准备

来源:互联网 发布:南京大学人工智能专业 编辑:程序博客网 时间:2024/05/17 08:01

学习吴恩达的课程所写

图像分类原理

对于一个rbg的图像,计算机是使用一个r矩阵,一个b矩阵和一个g矩阵来使得图像能够被肉眼看见,而在图像识别中,我们要把这个rbg图像转化成一个向量x来作为输入,所以,我们就一列一列的遍历图像矩阵,先遍历r矩阵,一个一个排成列向量,然后接下来b矩阵,g矩阵,最后可以得到一个n行1列的列向量作为特征向量。

常用符号说明:

样本:(x,y)
特征向量的维数使用n表示
训练样本的个数用m表示
(x^(1),y^(1))表示第一个样本

用一个很大的矩阵X来表示所有的训练集
X = [x^(1),x^(2),…,x^(m)],不难发现X是一个n行m列的矩阵。

所有标签使用Y表示
Y = [y^(1),y^(2),…,y^(m)] ,这是一个1行m列的矩阵

logistic 回归

问题

问题描述,输入X,权重向量,和常数项b,用于得到ŷ ,当然我们可以使用线性形式即:

ŷ =wTx+b

但是这样做得到的结果不怎么样因为它是线性的,logistic的常用做法是将wTx+b作为sigmoid函数的输入,然后sigmoid函数的输出作为y的预测量。
什么是sigmoid函数呢?
这里写图片描述
就是我们常见的logistic的表达式:
11+ez

注:这种函数在神经网络中被称为激活函数,因为这种函数使得神经网络具有非线性的性质。ReLu函数同样也是一种常用的激活函数,在MNIST的CNN实现中,用的就是ReLu。

如何训练权重向量w和常数项b?

在训练之前,你需要定一个损失函数来告诉程序,什么样的w和b是好的,而什么样的权重向量是应该被舍弃的。

很显然我们可以直接以ŷ y的差距作为损失函数,因为它们之间的差距越大,结果就越垃圾。但是我们不这样做,而是采用一种更高度大气的损失函数(怀着使梯度下降法更好用的心态):

L=(ylogŷ +(1y)log(1ŷ ))

注意,这个损失函数它的值的大小衡量了对单个样本预测的精准程度(当然是越小越精确),但是如果我们要看他们在一个训练集上的总体预测的表现的时候,则要定义一个叫做成本函数的东西:

J(w,b)=1mi=1mLi

在定义了成本函数之后,我们将学习使用梯度下降法来优化w,b。
梯度下降法的思想就是,先任意给定w和b,然后求成本函数J关于w和b的导数,这表明随着w和b的增大,成本函数J的变化趋势,求了导数之后,我们就可以得到一个方向使得J以最快的速度进行最小化。交替更新w和b

当然这只是思想,在具体实现的时候,还会有很多具体的问题,例如学习率的设定需要我们来考虑。

接下来的这幅图片展示了神经网络的正向传播过程和逆向传播的过程。

这里写图片描述

尝试通过逐步反向求导数,我们可以求得a对J的影响,b对J的影响,和c对J的影响。这样我们就有了调整a,b,c的方向,从而实现对输入的训练。

上面的图片只是一个简单的四则运算的例子,在logistic的运用同理:
这里写图片描述

只不过这里对让L对sigmoid函数求导会比较困难,whatever,我们这里不考虑这么多,反正我们坚信,逐步往回求导就一定可以从w和b上找到原因。

但是注意,虽然这时候我们掌握了更新的策略,但是我们还是停留在对于单个个体的更新方向,如果我们面对的仅仅是一个样本的话,我们当然能够通过不断的迭代使得损失函数达到最小值,但是事实上我们的样本有m个,这时候我们该如何更新呢?

算法如下:这里写图片描述

其wi对J的影响的计算方式时将所有样本中的wi对J的影响求和,然后取平均,然后再使用平均值来更新wi。

但是我们可以看到,这个算法使用到了两个便利,吴恩达大哥认为for循环的减少可以使得程序的运行速度加快(或许这正是为什么高等代数重要的原因把,然后商空间什么鬼的概念有什么用啊。。。),无论如何,接下来我们谈论向量化(讲道理是可以自己推导出来的内容把),通过矩阵的运算方式使得不需要for循环我们也能进行运算。

然后吴大哥就准备教我们如何实现向量化刚刚的logistic问题了。。。这个好没有挑战性啊,大家自己去看把。

原创粉丝点击