该文章所记录的来自《深度学习入门:基于Python的理论与实现》。我个人认为该书对于初学者比较友好,讲述清晰简单,并非繁杂的纯理论知识,对于新概念该书会进行类比,让读者容易理解。初学者可以看一下
Numpy
在深度学习实现中,经常用到数组和矩阵的计算(例如卷积)。Numpy的数组提供了很多便捷的方法,在深度学习中可以进行使用。
首先要导入Numpy。因为它属于外部库
>>> import numpy as np 意思是:将Numpy作为np导入,可以理解为将Numpy命名为np。之后需要调用Numpy时,可以调用np。这样更加简便。
>>>x = np.array([1.0, 2.0, 3.0]) 使用na.array()的方法生成numpy数组。
>>> x = np.array([1.0, 2.0, 3.0])>>> x / 2.0array([ 0.5, 1. , 1.5])
axis | 数组 |
---|---|
0 | [ [ [ ] ] ] |
1 | [ [ [ ] ] ] |
2 | [ [ [ ] ] ] |
括号最大块法有且仅有两步:
第一步:由axis = value,找对应[ ]里的最大单位块。(np.sum()拆掉此层[ ],求和;np.argmax()不拆此层[ ],取对应数组元素最大值的下标)
第二步:对单位块进行计算,这里又分为两种情况:
- 当单位块是数值时,直接计算
- 当单位块是数组时,对应下标元素进行计算
广播
Numpy中不同形状的数组之间进行运算是基于广播的功能。同样不同形状的矩阵之间也可以进行运算。
数组与标量(单一的数字)进行运算,将标量扩展为与数组相同的形式,再进行运算。该功能便是广播
![](https://i-blog.csdnimg.cn/direct/a331fd48fc2a4d9e85690e4cd9cc8940.png)
![](https://i-blog.csdnimg.cn/direct/04166b2491ad460b91504b5688742bdd.png)
神经网络
激活函数
感知机接受多个输入信号,输出一个信号。感知机信号仅有“0”/“1”两种取值。
上图即为接收两个输入信号的感知机例子。其中x1,x2是输入信号,y是输出信号,w1,w2是权重(weight首字母),图片中的○为“神经元”或者“节点”。只有当 w1x1+w2x2 值超过某个界限时,才会输出1(y=1)。也可以成为“神经元被激活”。该界限值成为阈值,用符号θ表示。可用下方数学公式表示:
感知机信号单一仅能为0/1,而且其存在设定权重的工作依靠人工该局限性,由此出现神经网络。
中间层有时也称为隐藏层
为了简化感知机的式子,可以引用函数来表示这种分情况的动作(大于0输出1,否则输出为0)。
引入的新函数为h(x),将感知机的式子改为y=h(b+w1x1+w2x2)
引入的函数h(x)会将输入信号的总和转换为输出信号,这种函数一般成为激活函数。其作用如同名字,可以决定如何来激活输入信号的总和。
改写y=h(b+w1x1+w2x2)式子,将其分为两个阶段处理,先计算输入信号的加权总和,记为a;然后用激活函数转换这一总和(用h()函数将a转换为输出y)。
a=b+w1x1+w2x2 → y=h(a)
神经网络使用的激活函数:
三层神经网络
隐藏层的激活函数一般用h( )表示,输出层的激活函数用( )表示。
在编写伸进网络实现的代码中,会出现forward( )函数。一般封装的是出入信号转换为输出信号的处理过程。forward(向前),代表的是从输入到输出方向的传递处理。
backward(向后),代表从输出到输入方向的处理。
输出层的设计
回归问题(根据某个输入预测一个数值的问题)用恒等函数。恒等函数会将输入按原样输出。
分类问题(数据属于哪一个类别的问题)用softmax函数:
输出层的神经元数量需要根据待解决的问题来决定。对于分类问题,输出层的神经元数量一般设定为类别的数量。
把数据限定到某个范围内的处理称为正规化。
对神经网络的输入数据进行某种既定的转换称为预处理。
批处理
神经网络的学习
该“学习”是指从训练数据中自动获取最优权重参数的过程。为了使神经网络能进行学习,将导入损失函数这一指标,而学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。
深度学习有时也称为端到端机器学习。即一端到另一端的意思,也就是从原始数据(输入)中获得目标结果(输出)的意思。
将数据分为训练数据(学习,寻找最优参数)和测试数据(评价训练得到的模型的实际能力)两部分来进行学习和实验,分为两部分是为了正确评价模型的泛化能力。泛化能力是指处理未被观察过的数据的能力。
只对某个数据集过度拟合的状态称为过拟合。在深度学习中过拟合一般要尽量避免。
损失函数
神经网络的学习通过某个指标表示现在的状态,然后以这个指标为基准,寻找最优权重参数。神经网络以诺和指标为线索寻找最优权重参数,所用的指标称为损失函数。损失函数可以使用任意函数,一般用均方误差和交叉熵误差等。
均方误差
表示神经网络的输出,
表示训练数据(也称监督数据),k表示数据的维度。
one-hot表示:将正确解标签表示为1,其他标签表示为0
交叉熵误差
log表示以e为底的自然对数(
)。
表示神经网络的输出,
表示正确解标签。
中只有正确解标签的索引为1,其他均为0。因此交叉熵误差实际上至计算对应正确解标签的输出的自然对数。也就是说,交叉熵误差的值是由正确解标签所对应的输出结果决定的。
如果正确解标签对应的输出较小,则E值较大。
mini-batch学习
使用训练数据进行学习,严格来说就是针对训练数据计算损失函数的值,找出使该值尽可能小的参数。因此,计算损失函数时必须将所有的训练数据作为对象。
所有训练数据的损失函数的总和,以交叉熵误差为例:
N:数据个数
:第n个数据的第k个元素的值
:神经网络的输出
:训练数据(监督数据)
式子虽然看起来复杂,其实只是把求单个数据的损失函数扩大到了N份数据,然后除以N进行正规化。
但是训练数据一般比较多,计算过程需要花费较长的时间,因此从全部数据中随机选出一部分,作为全部数据的“近似”(mini-batch,小批量)。神经网络的学习也是从训练数据中选出一批数据,然后对每个mini-batch进行学习,这种学习方式称为mini-batch学习。
设定损失函数的原因
梯度
函数的梯度会指向各点处的函数值减小最多的方向。其方向并非是函数的最小值或者真正应该前进的方向。
鞍点:从某个方向上看时极大值,从另一个方向上看则是极小值的点。鞍点梯度为0。
函数的极小值、最小值、鞍点的梯度均为0。
梯度法
神经网络在学习时找到最优参数(权重和偏置),最优参数是指损失函数取最小值时的参数。但是寻找其最小值很复杂,巧妙地利用梯度来寻找函数最小值(或者尽可能小的值)的方法就是梯度法。
梯度法是要寻找梯度为0的地方,但不一定就是最小值,也有可能是极小值或者鞍点。虽然如此,但沿着该方向能最大限度地减小函数的值,因此在寻找最小值时要以梯度信息为线索,决定前进的方向。
不断地沿梯度方向前进(前进一定距离后重新求梯度,再前进),逐渐减小函数值的过程就是梯度法。
梯度下降法:寻找最小值的梯度法
梯度上升法:寻找最大值的梯度法
表示更新量,在神经网络的学习中称为学习率。学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。上式表示更新一次的式子,该步骤会反复执行。学习率事先确定为某个值,一般该值过大或过小都无法使函数抵达一个“好的位置”。在神经网络学习中一般会一般改变学习率的值,一边确认学习是否正确进行了。
像学习率这样的参数称为超参数。是人工设定的,一般需要尝试多个值,以便找到一种可以使学习顺利进行的设定。
神经网络的学习也要求梯度,该梯度是指损失函数关于权重参数的梯度。
学习算法的实现
神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为“学习”。神经网络的学习氛围下面4个步骤:
步骤1(mini-batch)
从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。
步骤2(计算梯度)
为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
步骤3(更新参数)
将权重参数沿梯度方向进行微小更新
步骤4(重复)
重复步骤1、2、3