Python.NN(一) 神经网络入门

1

将感知机用于多义务分类

我们之前在 Python · SVM(一)· 感知机干货|SVM(一)·最全面的感知机总结 内里先容感知机时,用的是这么一个公式:,然后样本中的y要求只能取正负1。

这在二分类义务时固然没问题,然则到多分类时就会有些问题。

虽说我们是可以用种种方式让二分类模子去做多分类义务的,不外那些方式普遍都对照贫苦。

为了让我们的模子自然适应于多分类义务,我们通常会将样本中的y取为one-hot向量,亦即


此时我们的感知机就会酿成这样(以 N 个拥有 n 维特征的样本的 K 分类义务为例;为简练,省略了偏置量 b):

(看在我纯鼠绘的份上原谅我画得那么丑吧 |
此时模子的示意会变为。注意到我们原来输出的是一个数,在革新后输出的则是一个 K 维向量。

也正因此,我们不能简朴地沿用之前界说的损失函数()、而应该界说一个新的损失函数

由于我们的目的是让模子输出的向量和真实的()标签向量“越近越好”,而“距离”是一个自然的权衡“远近”的器械,以是用欧氏距离来界说损失函数是对照自然的。

详细而言,我们可以把损失函数界说为

在有了损失之后就可以求导了。需要指出的是,虽然我接下来写的公式看上去挺显然,但由于我们举行的是矩阵求导事情,以是它们背后真正的逻辑实在没那么显然。

有兴趣的观众老爷可以看看这篇文章矩阵求导术,这里就先直接给出效果,细节会附在文末:

行使它,我们就能写出响应的梯度下降训练算法了:

该模子的显示如下:

此时正确率为 50% 左右。

可以看到模子输出中基本没有对角线上的那一类(而这一类恰恰是最多的),这是由于将感知机拓展为多类模子并不会改变它是线性模子的本质、以是其分类效果仍然是线性的,从而它无法拟合出对角线那一类的界限

2

从感知机到神经网络

那么怎样才能把感知机酿成一个非线性的模子呢?详细而言:

  • 现有的感知机只有两层(输入层和输出层),是否能多加一些层?
  • 核方式从直观上来说,是行使知足一定条件的核函数将样本空间映射到高维空间;若是我放宽条件、使用一些一样平常的对照好的函数,是否也能起到一定的效果?
    基于这两个想法,我们可以把上面画过的感知机模子的结构弄成下图这种结构:

其中,我们通常(假设共有 N 个样本):

  • 称为“激活函数”
  • 称和为权值矩阵
  • 称往中心加的那些层为“隐藏层”;为简练,今后我们讨论时以为只加了一层隐藏层,多层的情形会在下一篇文章讨论
  • 称图中每个圈儿为“神经元”。以上图为例的话:
  • 输入层有 n 个神经元
  • 隐藏层有 m 个神经元
  • 输出层有 K 个神经元
    然后,激活函数实在就是上文所说的一样平常的对照好的函数;常用激活函数的相关先容我会附在文末,这里就暂时认定激活函数为我们之前在 SVM 处就见过的 ReLU,亦即认定

这个结构看上去很壮大,但求导求起来却也会贫苦不少(损失函数仍取(仍是只给出效果并将细节附在文末):

其中,“ * ”示意乘法的 element-wise 操作(或者专业一点的话,叫 Hadamard 乘积)、ReLU'示意对 ReLU 函数举行求导。由于当为 ReLU 时我们有,以是其求导也是异常简朴的:

行使这两个求导公式,响应的梯度下降算法是对照好实现的:

该模子的显示如下:

虽然照样对照差(准确率 70% 左右),但已经有模有样了

3

使用Softmax + Cross Entropy

可能已经有观众老爷发现,我把上面这个模子的训练速率的默认值调到了,这是由于稍大一点的训练速率都会使模子直接爆炸。

这是由于我们没有对最后一层做变换、而是直接简朴粗暴地用了。这导致最终模子的输出很有可能突破天涯,这固然不是我们想看到的

考虑到标签是向量,换一个角度来看的话,它实在也是一个概率漫衍向量。那么我们是否可以将模子的输出也酿成一个概率向量呢?

事实上,我们耳熟能详的 Softmax 正是干这活儿的,详细而言,假设现在有一个向量,那么就有:

不难看出这是个概率向量,且从直观上来看颇为合理。

在真正应用 Softmax 会有一个提高数值稳固性的小技巧,细节会附在文末,这里就暂时按下

于是在应用了 Softmax 之后,我们模子的输出就酿成一个概率向量了。

诚然此时仍然能用欧氏距离作为损失函数,不外一种普遍更优的做法是使用 Cross Entropy(交织熵)作为损失函数。

详细而言,两个随机变量(真值)、(展望值)的交织熵为:

交织熵拥有如下两个性子:

  • 当真值为 0()时,交织熵实在就化为了此时展望值越靠近 0、交织熵就越靠近 0,反之若展望值趋于 1、交织熵就会趋于无限
  • 当真值为 1()时,交织熵实在就化为了,此时展望值越靠近 1、交织熵就越靠近 0,反之若展望值趋于 0、交织熵就会趋于无限
    以是拿交织熵作为损失函数是合理的。真正应用交织熵时同样会有提高数值稳固性的小技巧——在 log 内里放一个小值以制止泛起 log 0 的情形:

在加了这两个器械之后,我们就要举行求导了。

虽说求导历程对照繁复,但令人惊喜的是,最终效果和之前的效果是险些一致的,区别只在于倍数(推导历程参见文末):

以是响应的实现也险些一致:

,

以太坊数据网

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,


该模子的显示如下:

虽说仍不完善,但它和不使用 Softmax + Cross Entropy 的模子相比,有这么两个优势:

  • 训练速率可以调得更大(vs),这意味着该模子没那么容易爆炸(什么鬼)
  • 模子的训练加倍稳固,亦即每次训练出来的效果都差不多。
  • 反观之前的模子,我所给出的模子显示实在是精挑细选出来的;在一样平常情形下,其显示实在是类似于这样的(这告诉我们,一个好的效果很有可能是由无数 sb 效果聚积出来的……):

4

相关数学理论

1)常见激活函数

A、Sigmoid:

B、Tanh:

C、ReLU:


D、ELU:

E、Softplus:

以及最近出了一个叫 SELU 的激活函数,论文整整有 102 页……感兴趣的观众老爷们可以参见[1706.02515] Self-Normalizing Neural Networks

2)神经网络中导数的盘算

为了誊写简练,接下来我们会用矩阵求导的技巧来举行盘算;不外若是以为看着太绕的话,建议照样参照这篇文章、依界说逐元素求导(事实上我也经常绕不外来……)

由简入繁,我们先来看多分类感知机的求导历程。我们之前曾说过多分类感知机可以写成、其中(假设有 N 个样本):

不少人在实验求 时,会以为需要用向量对矩阵求导的规则,虽然不能说是错的,却可能会把问题变庞大。

事实上,多分类感知机的本质是对随机向量的某个采样举行展望,只不外是一个多次采样后发生的样本矩阵而已。因此,多分类感知机的本质实在是、其中:

于是求导历程就化简为标量对矩阵的求导了:

由此可知。在求出这个特殊情形之后,应该若何把它拓展到样本矩阵的情形呢?

虽说严谨的数学叙述会对照贫苦(需要用到矩阵的向量化【又称“拉直”】之类的),但我们可以这样直观地明白:

  • 当样本从一个酿成多个时,权值矩阵的导数理应是从一个酿成多个的加总
    因此我们只需行使矩阵乘法完成这个加总的历程即可。注意到我们可以直观地写出:


于是

以及

3)Softmax + Cross Entropy


也就是

亦即

本文我们主要讨论了若何将感知机应用于多分类义务,并通过直观的头脑——加深感知机的条理和应用激活函数来获得更强力的模子(神经网络)。

此外,我们还讨论了若何应用 Softmax + Cross Entropy 来让模子变得加倍稳固。

然而我们讨论的局限仍局限于单隐藏层和 ReLU 激活函数,下一篇文章我们会先容更一样平常的情形,并通过一种方式来直观说明神经网络的壮大

推荐阅读:

为什么要对数据举行归一化处置?
logistic函数和softmax函数
视频解说|为什么神经网络参数不能所有初始化为全0

全是通俗易懂的硬货!只需置顶~迎接关注交流~