####深度学习
感知机
2.1感知机是什么
感知机接收多个输入信号,输出一个信号。,感知机的信号只有“流/不流”1/0两种取值。
输入信号被送往神经元时,会被分别乘以固定的权重神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号θ表示。
感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。
2.2简单电路逻辑
1.与门
与门是有两个输入和一个输出的门电路

与门仅在两个输入均为1时输出1,其他时候则输出0。
2.与非门和或门
与非门
与非门就是颠倒了与门的输出,仅当x1和x2同时为1时输出0,其他时候则输出1
只要把实现与门的参数值的符号取反,就可以实现与非门
或门
只要有一个输入信号是1,输出就为1
2.3感知机的实现
b称为偏置,感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0。
偏置和权重w1、w2的作用是不一样的。具体地说,w1和w2是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。
2.4感知机的局限性
异或门
异或门也被称为逻辑异或电路仅当x1或x2中的一方为1时,才会输出1(“异或”是拒绝其他的意思)
线性和非线性
感知机的局限性就在于它只能表示由一条直线分割的空间,不能表示异或门。
曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间
2.5多层感知机
已有门电路的组合
单层感知机无法表示异或门”或者“单层感知机无法分离非线性空间
x1和x2表示输入信号,y表示输出信号。x1和x2是与非门和或门的输入,而与非门和或门的输出则是与门的输入。
异或门的实现
实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机(multi-layered perceptron)。
神经网络
3.1从感知机到神经网络
中间层有时也称为隐藏层。
激活函数
会将输入信号的总和转换为输出信号的函数一般称为激活函数
3.2激活函数
以阈值为界,一旦输入超过阈值,就切换输出。这样的函数称为“阶跃函数”。
sigmoid函数
h(x)=1/(1+ecp(-x))的exp(−**x)表示e−**x 的意思。e是纳皮尔常2.7182 ...。
sigmoid函数与阶跃函数的比较
1.sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。sigmoid函数的平滑性对神经网络的学习具有重要意义。
2.相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731 ...、0.880 ...等实数(这一点和刚才的平滑性有关)。也就是说,感知机中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号。
共同性质:具有相似的形状。两者的结构均是“输入小时,输出接近0(为0);随着输入增大,输出向1靠近(变成1)”。也就是说,当输入信号为重要信息时,阶跃函数和sigmoid函数都会输出较大的值;当输入信号为不重要的信息时,两者都输出较小的值。还有一个共同点是,不管输入信号有多小,或者有多大,输出信号的值都在0到1之间。
非线性函数
阶跃函数和sigmoid函数还有其他共同点,就是两者均为非线性函数。sigmoid函数是一条曲线,阶跃函数是一条像阶梯一样的折线,两者都属于非线性的函数。
激活函数不能使用线性函数。
线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。(简单理解为存在比引入线性函数更高效便捷的方法,即无隐藏层的神经网络。)
ReLU(Rectified Linear Unit)函数
ReLU函数在输入大于0时,直接输出该值;在输入小于等于0时,输出0
Numpy中的maximum函数会从输入的数值中选择较大的那个值进行输出。
3.3多维数组的运算
数组的维数可以通过np.dim()函数获得,数组的形状可以通过实例变量shape获得
这里的A.shape的结果是个元组(tuple)。这是因为一维数组的情况下也要返回和多维数组的情况下一致的结果。例如,二维数组时返回的是元组(4,3),三维数组时返回的是元组(4,3,2),因此一维数组时也同样以元组的形式返回结果。下面我们来生成一个二维数组。
二维数组也称为矩阵(matrix)。数组的横向排列称为行(row),纵向排列称为列(column)。
矩阵乘法:矩阵的乘积是通过左边矩阵的行(横向)和右边矩阵的(纵向)以对应元素的方式相乘后再求和而得到的。
NumPy 的np.dot()函数计算(乘积也称为点积)。np.dot()接收两个NumPy数组作为参数,并返回数组的乘积。
注:np.dot(A, B)和np.dot(B, A)的值可能不一样。和一般的运算(+或*等)不同,矩阵的乘积运算中,操作数(A、 B)的顺序不同,结果也会不同。
矩阵A的第1维的元素个数(列数)必须和矩阵B的第0维的元素个数(行数)相等。
3.4 3层神经网络的实现
符号确认
权重和隐藏层的神经元的右上角有一个“(1)”,它表示权重和神经元的层号(即第1层的权重、第1层的神经元)。此外,权重的右下角有两个数字,它们是后一层的神经元和前一层的神经元的索引号。比如,表示前一层的第2个神经元x2到后一层的第1个神经元 的权重。权重右下角按照“后一层的索引号、前一层的索引号”的顺序排列。
各层间信号传递的实现
一般地,回归问题可以使用恒等函数,二元分类问题可以使用sigmoid函数,多元分类问题可以使用softmax函数
3.5输出层的设计
恒等函数和softmax函数
softmax函数:exp(x)是表示ex 的指数函数(e是纳皮尔常数2.7182 ...)。式(3.10)表示假设输出层共有n个神经元,计算第k个神经元的输出y**k。如式(3.10)所示,softmax函数的分子是输入信号a**k的指数函数,分母是所有输入信号的指数函数的和。
注:softmax函数会出现溢出问题,即数据巨大导致结果出现不确定的情况。
softmax函数的特征:softmax函数的输出是0.0到1.0之间的实数。并且,softmax函数的输出值的总和是1。输出总和为1是softmax函数的一个重要性质。正因为有了这个性质,我们才可以把softmax函数的输出解释为“概率”。
即便使用了softmax函数,各个元素之间的大小关系也不会改变。
3.6 手写数字识别
我们使用学习到的参数,先实现神经网络的“推理处理”。这个推理处理也称为神经网络的前向传播(forward propagation)
MNIST数据集
首先,为了导入父目录中的文件,进行相应的设定A。然后,导入dataset/mnist.py中的 load_mnist函数。最后,使用 load_mnist函数,读入MNIST数据集。load_mnist函数以“(训练图像 ,训练标签 ),(测试图像,测试标签 )”的形式返回读入的MNIST数据。此外,还可以像load_mnist(normalize=True, flatten=True, one_hot_label=False) 这 样,设 置 3 个 参 数。第 1 个参数normalize设置是否将输入图像正规化为0.0~1.0的值。如果将该参数设置为False,则输入图像的像素会保持原来的0~255。第2个参数flatten设置是否展开输入图像(变成一维数组)。如果将该参数设置为False,则输入图像为1 × 28 × 28的三维数组;若设置为True,则输入图像会保存为由784个元素构成的一维数组。第3个参数one_hot_label设置是否将标签保存为onehot表示(one-hot representation)。one-hot表示是仅正确解标签为1,其余皆为0的数组,就像[0,0,1,0,0,0,0,0,0,0]这样。
图像的显示
使用PIL(Python Image Library)模块。
神经网络的推理处理
像这样把数据限定到某个范围内的处理称为正规化(normalization)。
对神经网络的输入数据进行某种既定的转换称为预处理(pre-processing)。
批处理
输入数据的形状为 100 × 784,输出数据的形状为100 × 10。这表示输入的100张图像的结果被一次性输出了。比如,x[0]和y[0]中保存了第0张图像及其推理结果,x[1]和y[1]中保存了第1张图像及其推理结果,等等。这种打包式的输入数据称为批(batch)。
神经网络的学习
4.1从数据中学习
深度学习又是也称为端到端机器学习,这里说的端到端是指从一端到另一端的意思,也就是从原始数据(输入)中获得目标结果(输出)的意思。
数据是机器学习的核心
机器学习的一般流程:首先,使用训练数据进行学习,寻找最优参数;然后,使用测试数据评价训练得到的模型的实际能力。
训练数据也称为监督数据。
泛化能力是指处理未被观察过的数据(不包含在训练数据中的数据)的能力。
只对某个数据集过度拟合的状态称为过拟合(over fitting)
4.2损失函数
神经网络学习中以某个指标来寻找最优权重参数,神经网络的学习中所用的指标称为损失函数(loss function)。这个损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等。
损失函数表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对监督数据在多大程度上不拟合,在多大程度上不一致。
均方误差:
y**k是表示神经网络的输出,t**k表示监督数据,k表示数据的维数。
将正确解标签表示为1,其他标签表示为0的表示方法称为one-hot表示
交叉熵误差:
log表示以e为底数的自然对数(log e )。y**k是神经网络的输出,t**k是正确解标签。t**k中只有正确解标签的索引为1,其他均为0(one-hot表示)。
mini-batch学习
要求所有训练数据的损失函数的总和
神经网络的学习也是从训练数据中选出一批数据(称为mini-batch,小批量),然后对每个mini-batch进行学习。这种学习方式称为mini-batch学习。
损失函数的意义:寻找最优参数(权重与偏置),若以识别精度为指标,参数的导数在绝大多数的地方都会变为0
4.3数值微分
舍入误差,是指因省略小数的精细部分的数值(比如,小数点第8位以后的数值)而造成最终的计算结果上的误差。
为了减小这个误差,我们可以计算函数f在(x + h)和(x − h)之间的差分。这种计算方法以x为中心,计算它左右两边的差分,所以也称为中心差分(而(x + h)和x之间的差分称为前向差分)。
偏导数:我们把有多个变量的导数称为偏导数
4.4梯度
由全部变量的偏导数汇总而成的向量称为梯度(gradient)
梯度指示的方向是各点处的函数值减小最多的方向
通过不断地沿梯度方向前进,逐渐减小函数值的过程就是梯度法(gradient method)。
寻找最小值的梯度法称为梯度下降法(gradient descent method),寻找最大值的梯度法称为梯度上升法(gradient ascent method)。
4.5学习算法的实现
前提:神经网络存在合适的权重和偏置
1.mini-batch:从训练数据中随机选出一部分数据,目标为减小mini-batch的损失函数的值
2.计算梯度:求出各个权重参数的梯度,梯度表示损失函数的减小最多的方向
3.更新参数:将权重参数沿梯度方向进行微小更新
4.重复步骤1,2,3
误差反向传播法
5.1计算图
计算图解题步骤:1.构建计算图 2.在计算图上,从左往右计算
从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation)。正向传播是从计算图出发点到结束点的传播。既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左)的传播。实际上,这种传播称为反向传播(backward propagation)。
局部计算
5.2链式法则
反向传播的计算顺序是,将信号E乘以节点的局部导数( ),然后将结果传递给下一个节点。这里所说的局部导数是指正向传播中y = f(x)的导数,也就是y关于x的导数( )。
链式法则:如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。
5.3反向传播
5.4简单层的实现
乘法层的实现:层的实现中有两个共通的方法(接口)forward()和backward()。forward()对应正向传播,backward()对应反向传播。
5.5激活函数层的实现
ReLU层
在神经网络的层的实现中,一般假定forword()和backward()的参数是NumPY数组。
SIgmoid层
步骤1:”/“节点表示y=1/x,它的导数可以解析性的表示为下式。
dy=-(1/xx)=-yy
步骤2:”+“节点将上游的值原封不动的传给下游。
步骤3:”ecp"节点表示y=ecp(x),他的导数为dy=ecp(x)。
步骤4:“x”节点将正向传播是的值翻转后做乘法运算。英雌这里要乘以-1.
5.6Affine/Softmax层的实现
Affine的实现:以矩阵为对象的反向传播,按矩阵的各个元素进行计算时,步骤和以标量为对象的计算图相同。
Softmax-with-Loss层
与学习相关的技巧
6.1参数的更新
神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化(optimization)
使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠近最优参数,这个过程称为随机梯度下降法(stochastic gradient descent),简称SGD
这里把需要更新的权重参数记为W,把损失函数关于W的梯度记为 。 η表示学习率,实际上会取0.01或0.001这些事先决定好的值。式子中的←6.1 表示用右边的值更新左边的值。如式(6.1)所示,SGD是朝着梯度方向只前进一定距离的简单方法
SGD的缺点:,如果函数的形状非均向(anisotropic),比如呈延伸状,搜索的路径就会非常低效。
Momentum(动量)
W表示要更新的权重参数, 表示损失函数关于W的梯度,η表示学习率。这里新出现了一个变量v,对应物理上的速度。式(6.3)表示了物体在梯度方向上受力,在这个力的作用下,物体的速度增加这一物理法则
AdaGrad
在神经网络的学习中,学习率(数学式中记为η)的值很重要。学习率过小,会导致学习花费过多时间;反过来,学习率过大,则会导致学习发散而不能正确进行
学习率衰减:随着学习的进行,使学习率逐渐减小
W表示要更新的权重参数, 表示损失函数关于W的梯度,η表示学习率。这里新出现了变量h,如式(6.5)所示,它保存了以前的所有梯度值的平方和(式(6.5)中的表示对应矩阵元素的乘法)。然后,在更新参数时,通过乘以 ,就可以调整学习的尺度。这意味着,参数的元素中变动较大(被大幅更新)的元素的学习率将变小。也就是说,可以按参数的元素进行学习率衰减,使变动大的参数的学习率逐渐减小。
Adam:融合了Momentum和AdaGrad的方法。
6.2权重的初始值
权值衰减:一种以减小权重参数的值为学习目的进行学习的方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步