(0)摘要
# 课程内容
(1)多层感知机---全连接神经网络和激活函数
(2)SOFTMAX 和交叉熵损失
(3)计算图和反向传播
# 本节总览
# 但行好事,莫问前程
(1)多层感知机---全连接神经网络和激活函数
# (1)图像表示
1)cifar 10 的图像表示。和之前的一样,我们直接将图片按行展开即可,当然了,注意 cifar 10 是
的图片(我们按照 pytorch 中的 CHW),也就是展开之后,输入
,其中 i 为第 i 张图片(样本)。
# (2)全连接神经网络
1)回顾前面的线性分类器,那么我们以 cifar10 为例子,重新看看。输入的样本 就是上面的
,对应权值矩阵
,其中 c 为类别数,d 输入图像的向量维度,那显然是 3072 啦。偏置向量
,我们简写一下就是
,其中
,其中 d=3072,c = 1~c。
2)全连接神经网络实际上就是多层感知机级联起来的,感知机和线性分类器是很类似的。只是后者是线性操作,前者是具有非线性。
3)比如两层的全连接神经网络,其数学表达式是
,其中
是一个非线性操作,其图像就是【relu图---见 6) 的函数图像】。进一步看,第一层是
(记
),就是一个线性分类器,接着使用一个
函数对输出的
进行非线性变换,然后作为第二层的输入
,即
,尽管看起来像是线性分类器,但实际上已经不是了,我们只是为了便于解释才这样表示而已。也就是说,当去掉了非线性操作,全连接神经网络就会退化为线性分类器。有了上述基础,很容易理解三层全连接网络的表达式了。
4)全连接神经网络的直观理解,事实上
的行数是确定的,也就是类别数,即其形状则可以
,那实际上
是人为指定的,也就是
的行数相同,那么
形状就是
,d 是输入样本的维度。这也就是能够理解图中的话了。我们继续看下面的图,也就是神经网络的样子。
实际上的样子就是
,至于
其实是隐层的神经元个数,即
,N 是多少这个是超参数来的,更进一步对于
与之隐层所有神经元相连的权值矩阵是
,有了这个思路,进一步就知道
,最后的输出结果的形状
。那么据此,同样的道理,我们来到第二层,此时的输入就变成了
,对应的输出分数
分数向量即为输出层的个数,其实就是类别数了,同样道理,
,这里 c 是确定的,必须是 c 行,因为对应的是最后的分类结果,也就是最后的结果是
的。
5)神经网络的层数,一般是只计算除输入层以外的层数,比如下面的,去掉输入层,两个隐层+一个输出层,即三层神经网络。
6)以下是常用的激活函数。
7)线性可分和线性不可分,其实就是分类面的问题,如果是线性分类器,那么对应的分类界面就是一个超平面,对于线性不可分的数据,就需要分类曲面了。很显然神经网络能够处理线性不可分的数据。
(2)SOFTMAX 和交叉熵损失
# (1)网络结构设计
1)其实网络结构设计,就是设计模型算法了,是没有统一答案的。
2)以下是分类平面随隐层神经元个数越多的可视化结果,我们可以看到隐层神经元个数越多那么对数据拟合的能力越好,也就是分类性能越好,但这只是对现有数据的拟合,可是对于新的数据未必能够有这么好的拟合能力,这也就是所谓的过拟合现象。
# (2)SOFTMAX 分类器
1)为什么会引入 softmax 分类器呢,这是因为原来我们的分数向量,其实输出的是各自类别的得分,不能直观的知道结果分布的情况,也无法更好的计算损失,而引入 softmax 分类后,将分数变成一种分布,更加合理,同时引入新的损失函数,能够更好的衡量损失。
更详细一些来看,举个例子,比如说我们类别数 c = 3,那么最后得到的分数向量
,那么 softmax 操作实际上分为两步,首先第一步是取指数,即
,然后是第二步将此结果相加即
,最后输出的概率就是
,这也就是最后的输出结果了,其实就是归一化操作了。
2)softmax 示例,如下示例,如果我们只是输出分数的话,我们发现分数相差其实不大,但是从 softmax 的概率的情况看就不一样了,虽然大一点,但是概率很大,其他的就很小,有点排他性的感觉。
3)那么有了新的激活函数,我们就需要引入交叉熵损失函数来计算预测的概率和真实的分布的差异。这里介绍一个独热编码(one-hot),同样是三个类别,分别是鸟、猫、车
,独热编码就是对应的类别真值是置一,其余是 0,比如一个样本的真值是猫,那么其独热标签就是
。
4)熵的概念其实是信息论里面的,一组数据中能获得多少的信息,就是多少熵,如果一件事情一看就知道结果的,那么熵就是 0 ,计算公式就是下图中的第一个,即
。比如拿一个真值的标签
,这显然是猫,信息熵为 0 ,利用公式计算,
就是
。交叉熵我们暂且不看,先看相对熵,也就是 KL 散度,我们把交叉熵展开就是图中下面的公式
其中 p 分布是真值,q 是预测值,那么最后展开的是熵和散度的求和,对于利用独热编码的格式的数据,那么熵
,此时交叉熵就是散度了,即两个分布的不相似性。
5) 我们实际操作一下即可,那么对于真值
,
,也就是说
也就是结果是 0.67 。
6)也就是说,事实上使用独热编码的时候,其实度量的就是 KL 散度,两个分布的不相似性。
7)比较一下交叉熵和多类支持向量机两个损失,下面的结果有问题,交叉熵损失的 log 函数一般是 2 或者 e 。
8)我们对比一下两个损失可以看到,多类支撑向量机损失,只要真值比其他数据都大 1 ,损失就是 0 了,但并不意味着没有损失了。
(3)计算图和反向传播
# (1)计算图
1)计算图的概念
2)其实就是我们网络前向计算的图,然后我们用节点的方法来表达出来。我们可以看到下面的前向计算,那就是首先计算
,而后就是
。
3)那么反向传播算法呢?其实就是链式法则。我直接上计算结果。
4)看看计算图的总结吧。
# (2)反向传播
1)反向传播的示例,首先是要进行前向计算公式就是
,当然这只是我们整合后的结果,反向传播不是这样,是一个个算,此时令
,
,由此我们直接给出计算结果。注意了,这里我们是要根据给定 x 的值(给定样本)来计算怎么样的权值系数 w,才能使得整个损失最小,我感觉一般来说是可以不用算 x 的梯度的。
2)计算图的颗粒度其实就是这么一堆计算节点,我们能否统一成一个常用的函数,比如下面的一块框住的就相当于 sigmoid 函数,那么这就是大的颗粒度,这种常用的公式可以直接使用他们的导数来计算。而如果只是一堆计算节点的话,那细粒度很小,反向传播就多走很多次,会影响反向传播的效率。
3)看看,多体会下就知道了。