开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践:ANN】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1067/detail/15447
ANN
四、激活函数
汇总数据经过激活函数之后才能输出。对二元分类来说,如果激活函数能产生两个值,1和0,那最好,哪些函数能够产生1和0,或者相似的二元分类呢?激活函数常用的有 sigmoid 函数、tanh 函数、softmax 函数等。左图为 sigmoid 函数可视化的结果。
横坐标是 z,经过函数后产生的值为纵坐标,z 取0时
,0在中间,z<0时,值趋向于0,z>0时,激活函数趋向于1。经过 sigmoid 函数处理过以后,它的值一边取0,一边取1。小于0时,取得的结果趋向于0,大于0时,取得的结果趋向于1。
具体的公式如下图
用程序把这个函数执行一下,图形便为
这是最经典的最早期的用于神经网络的激活函数。
左图为tanh函数,双曲正切函数。公式为
公式里有自然数e,在自然科学里是非常重要的常数,它产出的图形结果如左图所示,当z<0时,函数结果趋向于*1,当 z>0时,值趋向于1。tanh(z) 函数是 sigmoid 函数的一种变体,它的取值范围为[-1,1],而不是 sigmoid 函数的[0,1]。也能满足二元分类的要求。
五、一般的人工神经元网络结构
中间多了个隐藏层,最起码是三层结构。有输入层,隐藏层和输出层。输入层里面的每个神经元接受一个输入数据,这里接受了 x1到x5的五个输入数据。中间的隐藏层有三个神经元,每个神经元相当于一个 M-P 的神经元模型。
它可以接收每个输入数据,以及在这个上面有权重,汇总后得到这个神经元的结果。再通过激活函数产生输出。隐藏层的每个神经元都是同样的工作机理。这样的神经网络结构才是真正的神经网络,最早的神经元是理解神经网络的基础。
单层感知器模型是最简单的神经网络。进一步发展为三层的神经网络结构。中间哪怕只有一层隐藏层,那也增加了很强大的功能。隐藏层的每个神经元都要与输入的神经元相连,上面都有权重,然后进行汇总,最后通过激活函数产生输出。每个隐藏的神经元都是这样的功能。因此神经网络具备了强大的功能。
输出层也是 M-P 神经元,他接收隐藏层产生的输出,在这个图里,隐藏层产生了三个输出,对于输出层来说为三个输入,上面也有权重 w,再经过输出层神经元的激活,产生输出。因为加了隐藏层,神经网络变得很智能。现在很热门的深度学习为有更多的中间层,早期的神经网络中间就几层,很多时候就用到一个隐藏层,层数加多了计算量是巨大的,早期的计算机能力不够,而且没有大数据的支持,所以早期的神经网络发展的非常缓慢。到了2010年、2012年,万事俱备,只欠东风,东风即计算能力和大数据。可以加入很多层,也可以计算了,所以产生了强大的计算功能。中间隐藏层的每个神经元,以及输出层的每个神经元。右边图的示意,中间的椭圆代表了一个神经元,代表了像隐藏层的神经元和输出层的神经元。输入层的神经元只接受输入数据,所以这里的椭圆代表了隐藏层的神经元和输出层的神经元。
它接收没个输入数据,这个输入数据可以认为是上一层的输入数据。对于隐藏层来说就是输入层,对于输出层来说是上面的隐藏层。产生的输入数据都有权重,传到这个神经元里,通过汇总以后经过激活函数,再产生输出。这个是一般神经网络的结构和原理。
神经网络模型要训练它,让它更智能。训练神经网络,意思是学习调整改变神经元连接的权重,这个是神经网络的本质。神经元里多了个权重,权重是最关键的。
激活函数很重要,里面最关键的是权重。输入一组样本数据,经过神经元网络学习后就能得出输出结果。输出结果可以帮助我们输出管理,输入图片经过神经元网络,判断是和否,x 数值不变,神经元如何实现强大的功能呢?就因为里面有权重,如果学的不对就再学,关键是调权重。加深一下对权重的理解,输入的 x 数据是不能变的。但输出不对的话,我们能改的只是权重。举例,一个班的同学老师上课讲的知识是 x 是一样的,每个同学接受的 x 是一样的,为什么有的同学学的好,有的学的不好呢?因为每个同学的权重不同,对于名师来说,善于调整学生的权重。比如,中学生背单词,一个单词背错了,老师让他背十遍,抄十遍,目的是调权重,因为输入的 x 这个单值是一样的,只能调权重,如果哪个名师有特异功能,对手上面敲两下,脑袋上面发个功,权重就能调整,那这个名师很厉害。
ANN 学习算法
Initialize the weights (w0, w1,.... ,Wk)
Adjust the weights in such a way that the output of ANN is consistent with class labels of training examples
Objective function:
Find the weights wi's that minimize the above objective function
e.
g., backpropagation algorithm (see lecture notes)
先初始化一组权重,因为输入的 X 是不变的是一样的,一组对应的权重,然后调整这一组权重。调整权重的依据是神经网络的输出值和样本里面带的标签值,来进行比较。因为这个是有接口的分类算法。根据神经网络模型输出的结果和标签结果之间的差异来调整权重,所以需要一个函数,这个函数叫做目标函数,或者成本函数,或者损失函数。这个函数的公式所示,
E 是损失、误差、成本、目标,Yi 是样本真实的标签值,Y 和 y 代表的意思一样,f(wi,xi)中 X 是神经网络的输入数据,W 是权重,f 是激活函数。经过激活函数处理以后,得到的是模型的输出值即预测值。预测值和真实标签值的差值就是误差,一般用误差的平方来表示目标函数或者是成本函数或者是损失函数,这是数学上的一种表达。这是学习算法的一个抓手,一个依据,一个目标,就是有损失函数。训练的理想状况是让损失函数越小越好。让它最小化。即让误差最小。如何让它最小呢?
因为输入的 X 不变,所以只能调整权重,即发现这一组权重,这组权重让目标函数最小,所以数学逻辑很清晰。实际上,神经网络背后最重要的是这些数据。对神经网络来说,最后如何调整权重让误差最小?是内部最关键的技术,如果要推导则非常复杂。有一些算法可以让误差最小,比如 BP 算法,也叫 BP 神经网络,它是误差反向传播的机制,来实现误差最小。如果用中文表达为最小化误差的平方和。
如果把刚刚误差的平方和可视化,应该是个抛物线,如下图所示,纵坐标是成本函数,也可以用 E 表示即为误差函数,纵坐标代表每一个误差,横坐标是输入输出的函数,希望在抛物线上面找到误差最小的那个点,这便是训练的目标。那么,在训练的过程中,如何找到最低点呢?需要一个算法知识,比较常用的是 BP 算法里的梯度下降。梯度下降非常形象,比如随机的一个误差在一个点上面,目标是让误差最小,那该怎么办呢?可以从这个点向上移动,也可以向下移动,看误差是否变小。发现向上移误差变大,因此,不能向上移动,应该向下移动,向下移动误差会变小,也就是梯度在下降,一直降到误差最小。因为这是一条抛物线,是一个凸函数。通过梯度下降便可以找到最低点。梯度下降在数学上面是,在抛物线上求导数,需要用到微积分。
将训练集放入神经网络并获得输出,输入数据是训练集,里面有 X1,X2 等等。然后与权重相乘,到神经元激活产生输出。
将输出与期望输出做对比,期望是标签值,是 y,做对比即求误差,误差一般用平方表示,要构造成本函数,也就是误差函数,来计算误差。基于误差值和使用的成本函数,决定如何改变权重以使误差最小。改变权重有许多算法,其中一个是 BP 神经网络,有一个梯度下降的算法。需要用到微积分,来一步一步求。重复该过程直到误差值最小。