神经网络-矩阵运算

神经网络-矩阵运算

作者: 莫烦 编辑: 莫烦 发布于: 2021-10-30

现在我们已经了解了非常多 Numpy 的功能,而且也知道 Numpy 的使用技巧和加速方案。 接下来,我们就开始为机器学习做一些预备演练。

目前的机器学习算法中,深度学习无疑是最厉害之一,而深度学习的核心基础是矩阵运算。恰好 Numpy 就最擅长做这件事。 那为什么 Numpy 能做深度学习中最核心的事,但还有这么多其他机器学习的库,比如 Tensorflow, Pytorch 等,它们和 Numpy 相比,有什么不同呢?

其实,Numpy 是上个时代的产物,它基本上所有的优化都是基于 CPU 的优化,而现在的深度学习,大多都要利用到 GPU 甚至是 TPU 的计算单元。 所以有很多操作,Numpy 是不擅长的。但是像 Tensorflow,Pytorch 这种深度学习库,在很大程度上都是借鉴了 Numpy 而开发的。所以说, Numpy 的贡献还是不可忽视。

好了,说了这么多背景,我有两条建议。

  1. 自己开发不依赖于 Tensorflow 和 Pytorch 的深度学习的项目,建议从 Numpy 入手。(比如遗传算法)
  2. Tensorflow 和 Pytorch 能实现的项目,就尽量用它们开发,Numpy 在深度学习上的功能,和 GPU 的加速上,都不占优势。

回顾矩阵运算

我们在前面的教学中,已经熟悉掌握了 Numpy Array 的创建, 各类运算, 甚至是矩阵(张量)的变形。这些都是今天内容的前置基础。还没有掌握的同学,建议先撸起袖子嗦一把。

在矩阵运算之前,我们肯定要创建一个新的矩阵用来容纳我们的值。在机器学习中,通常数据也是以矩阵的形式存在的。

如果你有些线性代数的基本知识,你就能验证在上面的案例中,一个 4*3 的矩阵点乘一个 3*2 的矩阵,结果会是 4*2 的矩阵。 这种运算就构成了深度学习中-神经网络的基础单元。

神经网络的分类与回归

我们在这节内容中,先说说神经网络是怎么样进行前向传播的, 后面一节内容再说说怎么用 Numpy 做神经网络的自动学习。

在前向传播(计算最终结果)时,我们得首先弄清楚自己处理的是一个回归问题(预测事物的值)还是分类问题(预测事物的类别)。这两种将会带来不同的运算模式。 我们就先说回归问题吧。其实回归比较简单,假设我们要利用 model 预测一个 student 的期末考成绩(score)多少。

nn

你看,这个 score 打印出来,就是模型预测的分数了。注意了,这个 student 数据是我随便编的,它有三个特征值,可能可以代表前几次考试的成绩。model 里安放的是模型的权重值等,而 score 就是计算得出的预测分数了。

那分类怎么搞呢?一般来说,我们还是和上面差不多,如果是二分类,就在矩阵点乘后,对出来的值做二次加工,让它能间接地表示类别信息。这个二次加工通常是经过一次 sigmoid 运算,可以看到下图。

sigmoid

如果计算出来的值大于 0.5,在右半边,我们就认为是类别 1, 如果小于 0.5,在左半边,我们就认为是类别 0。

因为上面我引入了随机权重,你每次运行的结果都可能不同。 当然,神经网络中的分类器比这个还是要复杂不少。我们留到后面再学习。

多层神经网络前向

上面其实更像是一个感知机模型或者是线性回归模型,他们都是最为基础的神经网络架构,我们现在就来用神经网络的思路构建模型。 而且上面我们只添加了权重(weights),还没有添加偏置(bias)。简单来说,权重和偏置都是神经网络的参数。 有了这些东西,一个神经网络才能被训练,自我学习。后面一节 就会具体介绍 Numpy 的神经网络是怎么做到自学习的。

我们先可视化数据的样子,我在上面定义了两个用来画图的功能,你可以自己仔细研究,或者你对画图感兴趣,我后面也有对应的分享

nn2

因为现在还没有训练过程,所以这里的 output 并没有太多意义,当我们下一节加上训练过程后,你就会看到神经网络厉害的地方了。

激活函数

神经网络除了用 weights 和 bias 来加工数据,还有一个非常重要的能力,就是处理复杂(非线性)数据的预测。同样,非线性函数,我们在神经网络中, 就称为激活函数。我下面展示两个最常见的激活函数,然后用 numpy 给你写出来,并添加进神经网络模型中。

relu_tanh

你可以动手运行一下,也可以将 relu(o) 替换成 tanh(o) 来看看效果。你看上面出来的图,很明显已经经历过一次弯曲(非线性)变化了, 这就是激活函数的作用。

总结

好了,这节内容先到这里,不然就太长了。我们介绍了神经网络的核心计算单 - 矩阵点积,也搭建了一个比较简单的神经网络模型。 甚至提到了非线性。但是这还不能构建出一个具备自学习能力的神经网络。下节内容,我们就来解密神经网络的自学习过程。


降低知识传递的门槛

莫烦经常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛

我组建了微信群,欢迎大家加入,交流经验,提出问题,互相帮持。 扫码后,请一定备注"莫烦",否则我不会同意你的入群申请。

wechat