【花师小哲】面向一般大众的神经网络科普(1)-基础知识
最近AI作画很火,但很多朋友并不是很懂AI,对AI作画的一些批评意见主要停留在“新时代炼金术”“只是拼凑素材”这样比较感性的认识之上,我觉得画师们稍微懂一些AI,特别是懂一些神经网络,可能能更好的帮助他们。(当然,大画师估计是看不到这篇专栏)
这篇专栏主要介绍神经网络的一些基本知识和介绍一些著名的网络,讲讲它们是干什么的,为什么发明出来。当然,肯定有很多不全面的内容。
注意,这篇专栏的主要目的是面向一些并不从事AI研究,主要是不熟悉神经网络的朋友的(当然,AI领域的朋友也可以当小说来看),所以很多说法会不太严谨,主要目的是让大家对神经网络有一个粗略的了解。
如果你是想入门AI的话不建议看这篇专栏,这篇专栏基本上不涉及数学公式推导和概念的深入和专业解释的。
再加上AI领域的相关研究真的太多了,我个人能力也有限,难免会出现错误,望大家见谅。
好,套完了盾,我们正式开始。
这篇主要讲神经网络的基础知识。

1.最基本的神经网络相关知识
1.0神经网络名称来源
神经网络之所以叫神经网络(或者称为人工神经网络),其实就是模仿我们的大脑设计的一个模型,虽然整个模型其实和我们的大脑差别还是蛮大的。
至于为什么要模仿大脑,很简单,一般我们认为人类的智能和我们的大脑结构有很大的关系。

1.1神经元
如果是正经从头开始学神经网络的(而不是直接掉包来用),最开始肯定会讲神经元。
先放一张生理上的神经元模型。

人工神经网络的神经元是下面这样的模型:

两者还是挺像的。
中间那个圆圈就可以看做是生理学上神经元的胞体,左边的x1、x2等就可以看做是这个神经元的输入(生理学上神经元的树突),右边的a就是这个神经元的输出(生理学上神经元的轴突)
整个神经元模型的任务就是接受输入并进行整合,通过一个激活函数(图中的方块,就是一个特殊的函数)得到一个输出,是一个多输入单输出的模型。
我们先不要管图中的b,这个不讲,我们主要关注w,w是说神经元并不是将所有输入同等看待的,w值越大说明此神经元认为所对应的输入越重要,或者说,这个输入和自己的联系更密切。
1.2多层感知机MLP
19世纪50年代末,MLP就被提出了。多层感知机模型如下:

其中每一个圆圈都可以看做是一个神经元,每一条线都可以看做是一个w,即一个权值。我们训练神经网络就是训练这些权值。
(这里插一句,这张图可能有些误导,每一层的神经元个数不一定一样,都是根据需要来的,特别是输入和输出都是服务于我们的使用目的的)
没错,听上去就是这么简单,最基础的神经网络就长这样子,而且多层感知机的代码也不复杂,基本程序员是可以简单地手撸出来的。
但这个模型性能其实并不差,我第一次学神经网络还是很震惊的,这个模型这么简单,为什么可以取得很好的效果?只能说,玄学。
当然,MLP相比于其他很多网络还是差很多。
1.3深度神经网络
所谓深度神经网络也没有什么太复杂的想法,就是多做很多隐含层,就是这样一个改动就使得早已被打入冷宫的神经网络在近些年再次崛起。
当然,深度神经网络一开始面临的问题很多,为了把网络做深,有很多细节的问题要解决,这些问题太琐碎了,就不展开谈。
1.4神经网络基本知识的解答
对于很多非AI领域的朋友来说,看了上面这些内容,估计还是一头雾水,所以简单讲一些相关基本知识的解答,有些可能涉及专业内容。
(1)神经网络的输入和输出是什么?
对于最基本的神经网络,输入和输出都是数据,当然,单纯说数据大家肯定不明白,举个例子,我们的任务是这样的,我们知道小明身高173cm,每天吃3kg饭,年龄23岁,想要预测小明的体重,那么输入就是173、3和23,输出就是小明的体重。这种问题叫做回归问题。
另一个任务是预测小明是否是胖的,那么输出可以是一个数值,我们可以认为这个值小于一个值(例如75kg)就是不胖,大于等于这个值就是胖。我们也可以输出两个数值,数值1比数值2大的话就认为是不胖,否则就是胖,这种就是分类问题。
可以看到,输入和输出都是跟具体任务有关的。如果我们要做视觉识别,输入就是图像的每一个像素值;如果我们要做自然语言处理,输入就是一个个的词语(这里大家可能不太理解,即词语怎么输入啊,这个之后再讲)。
(2)真的只需要训练权值就可以了吗?
对的,神经网络所训练的真的只有这个W,当然,不同网络对权值的叫法是不一样的,不同权值所起到的作用也是不一样的,但我们训练的目的真的就只是调整这些数值。
(3)这些权值有什么意义?
一般认为,是没有意义的。他们不像是物理模型中的参数(例如光速)一样是有明确的物理意义的。
但我们当然可以认为这个模型既然能够做一些预测工作,那这些权值是有一定的意义的,但是具体的意义是什么我们是不知道的
所以为什么我们常说神经网络是黑盒、是炼金术、是不可解释的,就是因为虽然我们能够看到每个权值都是什么,但我们仍然不能理解神经网络到底是怎么工作的,为什么就可以完成我们的任务。
(4)神经网络都长这样吗?
不一定,现在的神经网络各种邪门的结构都有的,简单列举一个:

乍看上去可能一脸懵,但这些仍然是一个简单的网络。可以说,神经网络的结构真的是多种多样。
(5)权值是越多越好吗?
理论上权值是越多越好,因为虽然我们不清楚每一个权值到底有什么意义,但肯定是有意义的嘛,所以权值越多我们就认为这个网络能够学习到更多的东西。
于是就有了一些庞然大物:

当然,并不是说我们只要堆参数量就可以解决一切,事实上,我们看下面这张图:

这是某个数据集上的比赛,这四种方法都是神经网络,我们看到有四十万个参数的TGN-no-mem方法就没有打过不到五千个参数的SAGE方法,即使是比赛中取得最好效果的GEARSage*方法,也不过五万个参数。
这就说明网络结构才是重中之重,选择适合问题的网络结构才能取得更好的效果。
(6)我经常听到监督学习,这是什么呀?
最传统的神经网络修改参数的方法所使用的的方法是监督学习,监督学习是说,我们训练神经网络所用到的数据是有标签的。或者说,我们的训练样本有:
小红身高150cm、每天吃5kg饭、年龄12岁,胖(胖或不胖这个属性就是标签)
小李身高177cm、每天吃2kg饭、年龄20岁,不胖
......
或者说,我们输入“150、5、12”得到结果后就可以立刻知道我们的预测是否正确,根据正确与否我们就可以想办法去调整各个权值(当然,实质上比这个要复杂多了)。
(7)这些权值怎样训练啊?
一般我们都是先分训练集和测试集(有的时候还有验证集等)。训练集就像(5)中的数据那样,我们让这些数据正向走一遍神经网络(从输入层到输出层)得到预测输出,和训练集的真正输出进行比较,然后反向(从输出层到输入层)去修改权值。
具体的算法这里不展开讲。但要清楚,反向传播修改权值是神经网络编程中最难的内容(MLP还好说,其他网络就复杂了)。当然,现在有很多公开框架,例如torch.nn。通过torch.nn你只需要写正向传播,反向传播由框架帮你完成。
(8)我听说神经网络有过拟合、梯度爆炸、梯度消失等问题,这些是什么啊?
我们希望我们的模神经网络通过训练集(训练集一般都比较大,但仍然只是总体的一些样本)学到总体的一些共性,但是神经网络如果过度关注训练集的个性就会出现问题,就会导致神经网络只在训练集上表现好,但测试集上表现很差。
如下图所示:

我们一般认为过拟合的出现是因为模型太复杂了,在神经网络领域中常用的解决过拟合的方法(即降低模型复杂度)是dropout,简单来说,我们可以随机让一些神经元不工作。当然,这样的情况也只能是缓解过拟合,并不能从根本上解决这个问题。
梯度消失和梯度爆炸是调整参数过程中会出现的问题。我们修改参数是反向传播,是从输出层到输入层的,修改的依据主要和激活函数的导数有关,导数和梯度有关,梯度和对权值的修改程度有关。如果导数小于1的话,那么向前传播的过程中,梯度就会越来越小,这样前面的权值就得不到有效的修改;如果导数大于1的话,那么向前传播的过程中,梯度就会越来越大,这样前面的权值就会被过度修改,甚至成为NAN。
也许大家看到解决方案了,激活函数的导数为1不就好了吗?事实上也确实是这样解决的(当然,实质上没有那么简单,这里不展开讲)

下一篇讲一下自然语言处理的神经网络发展,有一些很重要的东西,例如attention和BERT。
写完觉得讲的还是不够清楚,有问题评论区提问吧(真的有人看吗)