《深度学习入门》学习笔记①

该文章所记录的来自《深度学习入门:基于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数组。
Numpy数组不仅可以进行对应元素(element-wise)运算,也可以和标量进行运算。NumPy数组的各个元素和标量之间进行运算,该运算是基于“广播”功能。
>>> x = np.array([1.0, 2.0, 3.0])
>>> x / 2.0
array([ 0.5, 1. , 1.5])
np.array()可以生成 N维数组,即可以生成一维数组、 二维数组、三维数组等任意维数的数组。数学上将一维数组称为向量, 将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统
称为 张量(tensor)
axis——轴。numpy数组有[ ]的标记。
axis=0对应最外层的[ ] ; axis=1对应第二外层的[ ] ;
axis数组
0[  [  [   ]  ]  ]
1[  [  [   ]  ]
2[ [   ]  ]  ]

括号最大块法有且仅有两步:

第一步:由axis = value,找对应[  ]里的最大单位块。(np.sum()拆掉此层[  ],求和;np.argmax()不拆此层[  ],取对应数组元素最大值的下标)

第二步:对单位块进行计算,这里又分为两种情况:

  • 当单位块是数值时,直接计算
  • 当单位块是数组时,对应下标元素进行计算

https://blog.csdn.net/mahoon411/article/details/114777623

广播

Numpy中不同形状的数组之间进行运算是基于广播的功能。同样不同形状的矩阵之间也可以进行运算。

数组与标量(单一的数字)进行运算,将标量扩展为与数组相同的形式,再进行运算。该功能便是广播

同样地不同形状之间数组运算,也可进行扩展。

神经网络

激活函数

感知机接受多个输入信号,输出一个信号。感知机信号仅有“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(x)=\frac1{1+exp(-x)}                                         h(x)=\left\{\begin{matrix} x& (x>0)& \\ 0& (x\leqslant 0)& \end{matrix}\right.

三层神经网络

                 

隐藏层的激活函数一般用h( )表示,输出层的激活函数用\sigma( )表示。

在编写伸进网络实现的代码中,会出现forward( )函数。一般封装的是出入信号转换为输出信号的处理过程。forward(向前),代表的是从输入到输出方向的传递处理。

backward(向后),代表从输出到输入方向的处理。

输出层的设计

回归问题(根据某个输入预测一个数值的问题)用恒等函数。恒等函数会将输入按原样输出。

分类问题(数据属于哪一个类别的问题)用softmax函数:    y_{k}=\frac{exp(a_{k})}{\sum_{i=1}^{n}exp(a_{k})}

输出层的神经元数量需要根据待解决的问题来决定。对于分类问题,输出层的神经元数量一般设定为类别的数量。

把数据限定到某个范围内的处理称为正规化

对神经网络的输入数据进行某种既定的转换称为预处理

批处理

神经网络的学习

该“学习”是指从训练数据中自动获取最优权重参数的过程。为了使神经网络能进行学习,将导入损失函数这一指标,而学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。

深度学习有时也称为端到端机器学习。即一端到另一端的意思,也就是从原始数据(输入)中获得目标结果(输出)的意思。

将数据分为训练数据(学习,寻找最优参数)和测试数据(评价训练得到的模型的实际能力)两部分来进行学习和实验,分为两部分是为了正确评价模型的泛化能力。泛化能力是指处理未被观察过的数据的能力。

只对某个数据集过度拟合的状态称为过拟合。在深度学习中过拟合一般要尽量避免。

损失函数

神经网络的学习通过某个指标表示现在的状态,然后以这个指标为基准,寻找最优权重参数。神经网络以诺和指标为线索寻找最优权重参数,所用的指标称为损失函数。损失函数可以使用任意函数,一般用均方误差和交叉熵误差等。

均方误差

                y_{k}表示神经网络的输出,  t_{k}表示训练数据(也称监督数据),k表示数据的维度。

one-hot表示:将正确解标签表示为1,其他标签表示为0

交叉熵误差

             log表示以e为底的自然对数(log_{e})。y_{k}表示神经网络的输出,  t_{k}表示正确解标签。t_{k}中只有正确解标签的索引为1,其他均为0。因此交叉熵误差实际上至计算对应正确解标签的输出的自然对数。也就是说,交叉熵误差的值是由正确解标签所对应的输出结果决定的。

如果正确解标签对应的输出较小,则E值较大。

mini-batch学习

使用训练数据进行学习,严格来说就是针对训练数据计算损失函数的值,找出使该值尽可能小的参数。因此,计算损失函数时必须将所有的训练数据作为对象。

所有训练数据的损失函数的总和,以交叉熵误差为例:  E=-\frac{1}{N}\sum_{n}^{}\sum_{k} t_{nk}log y_{nk}

N:数据个数

t_{nk}:第n个数据的第k个元素的值

y_{nk}:神经网络的输出

t_{nk}:训练数据(监督数据)

式子虽然看起来复杂,其实只是把求单个数据的损失函数扩大到了N份数据,然后除以N进行正规化。

但是训练数据一般比较多,计算过程需要花费较长的时间,因此从全部数据中随机选出一部分,作为全部数据的“近似”(mini-batch,小批量)。神经网络的学习也是从训练数据中选出一批数据,然后对每个mini-batch进行学习,这种学习方式称为mini-batch学习

设定损失函数的原因

梯度

函数的梯度会指向各点处的函数值减小最多的方向。其方向并非是函数的最小值或者真正应该前进的方向。

鞍点:从某个方向上看时极大值,从另一个方向上看则是极小值的点。鞍点梯度为0。

函数的极小值、最小值、鞍点的梯度均为0。

梯度法

神经网络在学习时找到最优参数(权重和偏置),最优参数是指损失函数取最小值时的参数。但是寻找其最小值很复杂,巧妙地利用梯度来寻找函数最小值(或者尽可能小的值)的方法就是梯度法。

梯度法是要寻找梯度为0的地方,但不一定就是最小值,也有可能是极小值或者鞍点。虽然如此,但沿着该方向能最大限度地减小函数的值,因此在寻找最小值时要以梯度信息为线索,决定前进的方向。

不断地沿梯度方向前进(前进一定距离后重新求梯度,再前进),逐渐减小函数值的过程就是梯度法。

梯度下降法:寻找最小值的梯度法

梯度上升法:寻找最大值的梯度法

\eta表示更新量,在神经网络的学习中称为学习率。学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。上式表示更新一次的式子,该步骤会反复执行。学习率事先确定为某个值,一般该值过大或过小都无法使函数抵达一个“好的位置”。在神经网络学习中一般会一般改变学习率的值,一边确认学习是否正确进行了。

像学习率这样的参数称为超参数。是人工设定的,一般需要尝试多个值,以便找到一种可以使学习顺利进行的设定。

神经网络的学习也要求梯度,该梯度是指损失函数关于权重参数的梯度

学习算法的实现

神经网络存在合适的权重和偏置,调整权重和偏置以便拟合训练数据的过程称为“学习”。神经网络的学习氛围下面4个步骤:

步骤1(mini-batch)
从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们的目标是减小mini-batch的损失函数的值。
步骤2(计算梯度)
为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
步骤3(更新参数)
将权重参数沿梯度方向进行微小更新
步骤4(重复)
重复步骤1、2、3

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值