深度学习入门
感知机
重要性: 感知机是作为神经网络(深度学习)的起源的算法. 因此学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想.
感知机是什么?
感知机接收多个输入信号,输出一个信号.

如图,是一个接收两个输入信号的感知机的例子. x1 x2是输入信号,y是输出信号,w1,w2是权重. 图中的O称为"神经元"或者"节点". 输入信号被送往神经元时,会被分别乘以固定的权重. 神经元会计算传送过来的信号的总和,只有当这个总和超过 了某个界限值时,才会输出1。这也称为“神经元被激活” 。这里将这个界限值称为阈值,用符号θ表示。
y={0(w1x1+w2x2≤θ)1(w1x1+w2x2>θ)
y =
\begin{cases}
0 (w1x1 + w2x2 \le \theta) \\
1 (w1x1+w2x2 > \theta)
\end{cases}
y={0(w1x1+w2x2≤θ)1(w1x1+w2x2>θ)
感知机的多个输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用. 权重越大, 对应的信号的重要性就越高.
简单逻辑电路
与门
| x1 | x2 | y |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
x1,x2,θ=0.5,0.5,0.9x1,x2,\theta = 0.5,0.5,0.9x1,x2,θ=0.5,0.5,0.9
与非门
| x1 | x2 | y |
|---|---|---|
| 0 | 0 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
x1,x2,θ=−0.5,−0.5,−0.9x1,x2,\theta = -0.5,-0.5,-0.9x1,x2,θ=−0.5,−0.5,−0.9
或门
| x1 | x2 | y |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
x1,x2,θ=0.5,0.5,0.4x1,x2,\theta = 0.5,0.5,0.4x1,x2,θ=0.5,0.5,0.4
综上,使用感知机可以表示与门,与非门,或门的逻辑.并且三种逻辑电路的感知机构造是一样的,区别只有参数不同. 也就是说,相同构造的感知机,只需要通过适当调整参数的值,就可以展现不同的功能.
将式子中的θ\thetaθ设为-b. 原式子就变成
y={0(w1x1+w2x2+b≤01(w1x1+w2x2+b>0)
y =
\begin{cases}
0 (w1x1 + w2x2+b \le 0 \\
1 (w1x1+w2x2+b > 0)
\end{cases}
y={0(w1x1+w2x2+b≤01(w1x1+w2x2+b>0)
在这个式子里,b被称为偏置. w1 w2称为权重.
偏置和权重的作用是不一样的.
权重是控制输入信号的重要性的参数. 而偏置是调整神经元被激活的容易程度的参数.
比如b为-0.1,则只要输入信号的加权和超过0.1神经元就会被激活. 但如果b为-20.则输入信号的加权和必须超过20神经元才会被激活.
感知机的局限性
我们已经知道,使用感知机可以实现与门、与非门、或门三种逻辑电路。现在我们来考虑一下异或门(XOR gate)
异或门
| x1 | x2 | y |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
实际上,前面介绍的感知机是无法实现这个异或门的. 为什么呢?
尝试用画图来思考其中的问题. 先将或门的动作形象化. 当参数(b,w1,w2) = (-0.5,1,1)时,可以满足或门的真值表条件. 此时,感知机可变成:
y={0(x1+x2−0.5≤01(x1+x2−0.5>0)
y =
\begin{cases}
0 (x1 + x2-0.5 \le 0 \\
1 (x1+x2-0.5 > 0)
\end{cases}
y={0(x1+x2−0.5≤01(x1+x2−0.5>0)
这个感知机会生成由直线x1+x2-0.5=0分隔开的两个空间. 其中一个空间输出1,另一个空间输出0.

换成异或门,是无法用一条直线分割出两个空间,一个空间是1,一个空间是0.
线性和非线性
异或门的空间无法用一条直线分开,但是如果将直线这个限制条件去掉,就可以分开两个空间了.
感知机的局限性就在于,它只能表示由一条直线分割的空间. 曲线分割的空间无法用感知机表示. 并且由这样的曲线分割而成的空间称为非线性空间, 由直线分割而成的空间称为线性空间.
严格地讲,应该是“单层感知机无法表示异或门”或者“单层感知机无法分离非线性空间”。接下来,我们将看到通过组合感知机(叠加层)就可以实现异或门。
多层感知机
在讨论多层感知机之前,我们先从其他视角考虑一下异或门的问题.
异或门制作方法有很多,其中一种是组合我们之前做好的与门,与非门,或门.

这里,把 s1作为与非门的输出,把s2作为或门的输出,填入真值表中。结果如图 所示,观察x1、x2、y,可以发现确实符合异或门的输出。

我们试着用感知机的表示方法(明确地显示神经元)来表示这个异或门,结果如图所示。

如图所示,异或门是一种多层结构的神经网络。这里,将最左边的 一列称为第0层,中间的一列称为第1层,最右边的一列称为第2层。这里的感知机与前面介绍的与门、或门的感知机形状不 同。实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机.
综上所述,单层感知机无法表示的东西,通过增加一层就可以解决. 也就是说,通过叠加层,感知机能够进行更加灵活的表示.
从与非门到计算机
多层感知机可以实现比之前见到的电路更复杂的电路. 比如, 可以用感知机实现加法运算的加法器. 感知机也可以表示二进制转换为十进制的编码器, 满足某些条件就输出1的电路. 实际上,使用感知机甚至可以表示计算机.
人们一般认为计算机内部进行的处理非常复杂,但是实际上只需要通过与非门的组合,就能再现计算机进行的处理. 这就说明, 使用感知机也可以表示计算机.
神经网络
上面我们了解了感知机. 关于感知机,我们有好消息,也有坏消息. 好消息是, 即便对于复杂的函数, 感知机也隐含着能够表示它的可能性. 因为即便是计算机进行的复杂处理,感知机理论上也可以将其表示出来. 但是坏消息是, 感知机中对于权重的设定, 也就是确定合适的,能够符合预期的输入与输出的权重,现在还是由人工进行确定的.
神经网络的出现,就是为了解决上面所述的坏消息的. 具体地讲, 神经网络的一个重要性质是,它可以自动地从数据中学习到合适的权重参数.
从感知机到神经网络
神经网络和感知机由很多共同点. 这里我们主要以两者的差异为中心,介绍神经网络的结构.
用图来表示神经网络的话,如图所示.

我们把最左边一列称为输入层,最右边一列称为输出层,中间的一列称为中间层. 中间层有时也称为隐藏层. 隐藏一词的意思是,隐藏层的神经元(和输入层,输出层不同)肉眼看不见. 只看上图, 神经网络的形状类似感知机. 实际上, 就连接方式而言, 神经网络和感知机并没有差异. 那么信号是如何在神经网络中传递的呢?
我们知道,单层感知机的数学表达式为:
y={0,(w1x1+w2x2+b≤01,(w1x1+w2x2+b>0)
y =
\begin{cases}
0 ,(w1x1 + w2x2+b \le 0 \\
1 ,(w1x1+w2x2+b > 0)
\end{cases}
y={0,(w1x1+w2x2+b≤01,(w1x1+w2x2+b>0)
我们现在讲上面式子写成更加简洁的形式. 我们引入一个函数h(x),将上面式子进行简化.
y=h(w1w1+w2x2+b)h(x)={0,x≤01,x>0
y = h(w1w1+w2x2+b) \\
h(x) =
\begin{cases}
0,x \le 0\\
1,x >0
\end{cases}
y=h(w1w1+w2x2+b)h(x)={0,x≤01,x>0
激活函数
上面的h(x)函数,会将输入信号的综合转换为输出信号, 这种函数一般称为激活函数. 激活函数的作用在于决定如何来激活输入信号的总和.
现在令a = w1x1+w2x2+b.则y= h(a).因此,图像可以做成这样.

上面h(x)表示的激活函数以阈值为界,一旦输入超过阈值,就切换输出. 这样的函数称为阶跃函数. 因此可以说,感知机中使用了阶跃函数作为激活函数. 那么,如果感知机使用其他函数作为激活函数,会怎么样呢? 实际上,如果将激活函数从阶跃函数换成其他函数, 就是神经网络的内容了.下面我们就介绍一下神经网络使用的激活函数.
sigmoid函数
神经网络中经常使用的一个激活函数就是sigmoid函数,表达式如下:
h(x)=11+e−x
h(x) = \frac{1}{1+e^{-x}}
h(x)=1+e−x1
实际上,感知机和神经网络的主要区别就在于这个激活函数. 其他方面, 神经网络和感知机基本上是一样的.
我们将sigmoid函数和阶跃函数进行比较.

如图所示,首先是平滑性不同. sigmoid函数是一条平滑的曲线,输出随着输入发生连续的变化. 而阶跃函数以0为界,输出发生急剧变化. sigmoid函数的平滑性对神经网络的学习具有重要意义. 另一个不同点是,阶跃函数只能返回0或1. 而sigmoid函数可以返回实数. 也就是说感知机中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号.
阶跃函数和sigmoid函数的共同性质: 虽然在平滑性上有差异, 但是他们都具有相似的形状. 两者的结构都是输入小时,输出接近0. 输入大时,输出接近1也就是当输入信号为重要信息时,阶跃函数和sigmoid函数都会输出较大值,当输入信号不重要时,都输出较小值. 还有一点就是, 不管输入信号多少, 输出信号都在0到1之间.
阶跃函数和sigmoid函数还有其他共同点,就是二者都是非线性函数. sigmoid函数是一条曲线,而阶跃函数是一条折线.
神经网络的激活函数必须使用非线性函数. 也就是激活函数不能使用线性函数. 因为如果使用线性函数的话, 加深神经网络层就没有意义了.
线性函数的问题在于,不管如何加深层数,总是存在与之等效的无隐藏层的神经网络. 我们考虑将h(x) = cx作为激活函数
把y(x) = h(h(h(x)))作为三层神经网络. 这个运算实际上是进行了y(x)=c×c×c×xy(x) = c\times c \times c \times xy(x)=c×c×c×x的乘法运算. 但是同样的可以由y(x) = ax实现. 这里的 a=c3a = c^3a=c3
ReLU函数
在神经网络发展的历史上sigmoid函数很早就开始使用了. 而最近则主要使用ReLU函数.
ReLU函数在输入大于0时,直接输出该值,输入小于等于0时,输出0.可以用表达式表示
h(x)={x,x>00,x≤0
h(x) =
\begin{cases}
x,x>0 \\
0,x \le 0
\end{cases}
h(x)={x,x>00,x≤0
函数图如下:

3层神经网络的实现

不同于隐藏层的激活函数h(x), 输出层的激活函数用σ(x)\sigma (x)σ(x)
输出层的设计
神经网络可以用在分类问题和回归问题上, 不过需要根据情况改变输出层的激活函数. 输出层所用的激活函数,要根据求解问题的性质决定. 一般情况下, 回归问题可以使用恒等函数, 二分类问题可以使用sigmoid函数, 多元分类问题可以使用softmax函数.
机器学习的问题大致可以分为分类问题和回归问题。分类问题是数据属于哪一个类别的问题。比如,区分图像中的人是男性还是女性的问题就是分类问题。而回归问题是根据某个输入预测一个(连续的) 数值的问题。比如,根据一个人的图像预测这个人的体重的问题就 是回归问题(类似“57.4kg”这样的预测)
恒等函数会将输入按原样输出,对于输入的信息,不加以任何改动,直接输出. 因此,在输出层使用恒等函数时, 输入信号会原封不动地被输出.
分类问题中使用的softmax函数可以用下面的表达式表示
yk=eak∑i=1neai
y_k=\frac{e^{a_k}}{\sum_{i=1}^{n} e^{a_i}}
yk=∑i=1neaieak
这个式子表示,假设输出层共有n个神经元,计算第k个神经元的输出yky_kyk .softmax函数的分子是输入信号aka_kak的指数函数. 分母是所有输入信号的指数函数的和.
上面的式子虽然正确的描述了softmax函数. 但在计算机的运算上有一定的缺陷. 这个缺陷就是溢出问题. softmax函数的实现中要进行指数函数的运算,但是此时指数函数的值非常容易变得很大,造成溢出.
所以可以对softmax函数进行改进
yk=eak∑i=1neai=CeakC∑i=1neai=eak+logC∑i=1neai+logC=eak+C′∑i=1neai+C′
y_k =\frac{e^{a_k}}{\sum_{i=1}^{n} e^{a_i}} = \frac{C e^{a_k}}{C\sum_{i=1}^{n} e^{a_i}} = \frac{e^{a_k+logC}}{\sum_{i=1}^{n} e^{a_i+logC}} = \frac{e^{a_k+C\prime}}{\sum_{i=1}^{n} e^{a_i+C\prime}}
yk=∑i=1neaieak=C∑i=1neaiCeak=∑i=1neai+logCeak+logC=∑i=1neai+C′eak+C′
根据上面的式子说明,在进行softmax运算时,加上或者减去某个常数并不会改变运算结果. 这里的C′C\primeC′可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值.
手写识别
假设我们模型的训练已经全部结束,使用学习到的模型参数,先实现神经网络的推理处理. 这个推理处理也称为神经网络的前向传播(forward propagation)
和求解一般的机器学习问题的步骤一样,使用神经网络解决问题时,也需要首先使用训练数据进行权重参数的学习; 进行推理时, 使用刚才学习到的参数, 对输入数据进行分类.
MNIST数据集
这里使用的数据集是MNIST手写数字图像集. MNIST是机器学习领域最有名的数据集之一, 被应用于从简单的实验到发表的论文研究等各种场合. 实际上,在阅读图像识别或机器学习的论文时,MNIST数据集经常作为实验用的数据出现.
MNIST数据集是由0到9的数字图像构成的(图3-24)。训练图像有6万张, 测试图像有1万张,这些图像可以用于学习和推理。MNIST数据集的一般 使用方法是,先用训练图像进行学习,再用学习到的模型度量能在多大程度 上对测试图像进行正确的分类。
神经网络的推理处理
下面,我们对这个MNIST数据集实现神经网络的推理处理。神经网络 的输入层有784个神经元,输出层有10个神经元。输入层的784这个数字来 源于图像大小的28×28=784,输出层的10这个数字来源于10类别分类(数 字0到9,共10类别)此外这个神经网络还有隐藏层.
我们假设隐藏层有两层,其中第一层有50个神经元,第二层有100个神经元.
我们令x为输入层的数据. w1,w2,w3为权重参数. b1,b2,b3为偏置. y为输出层的数据
那么
z1=sigmoid(w1x+b1)z2=sigmoid(w2z1+b2)z3=sigmoid(w3z1+b3)y=softmax(z3)
z_1 = sigmoid(w_1x+b_1) \\
z_2 = sigmoid(w_2z_1+b_2) \\
z_3 = sigmoid(w_3z_1+b_3) \\
y = softmax(z_3)
z1=sigmoid(w1x+b1)z2=sigmoid(w2z1+b2)z3=sigmoid(w3z1+b3)y=softmax(z3)
把数据限定到某个范围内的处理称为正规化(normalization)。此外,对神经网络的输入数据 进行某种既定的转换称为预处理(pre-processing)
预处理在神经网络(深度学习)中非常实用,其有效性已在提高识别 性能和学习的效率等众多实验中得到证明。在刚才的例子中,作为 一种预处理,我们将各个像素值除以255,进行了简单的正规化。 实际上,很多预处理都会考虑到数据的整体分布。比如,利用数据 整体的均值或标准差,移动数据,使数据整体以0为中心分布,或 者进行正规化,把数据的延展控制在一定范围内。除此之外,还有 将数据整体的分布形状均匀化的方法,即数据白化(whitening)等。
批处理
上面就是MNIST数据集的神经网络的实现,现在我们关注输入数据和权重参数的形状.

如图所示,输入一个由784个元素构成的一维数组后,输出一个有10个元素的一维数组. 这是只输入一张图像数据时的处理流程.如果我们打包输入多张图像呢?假设我们一次性输入100张图像. 因此我们可以把x的形状改为100×784100 \times 784100×784

如图所示,输入数据的形状为100×784,输出数据的形状为 100 ×10。这表示输入的100张图像的结果被一次性输出了.这种打包式的输入数据称为批(batch).
批处理对计算机的运算大有利处,可以大幅缩短每张图像的处理时 间。那么为什么批处理可以缩短处理时间呢?这是因为大多数处理 数值计算的库都进行了能够高效处理大型数组运算的最优化。并且, 在神经网络的运算中,当数据传送成为瓶颈时,批处理可以减轻数 据总线的负荷(严格地讲,相对于数据读入,可以将更多的时间用在 计算上)。也就是说,批处理一次性计算大型数组要比分开逐步计算 各个小型数组速度更快
神经网络的学习
从数据中学习
神经网络的特征就是可以从数据中学习. 所谓从数据中学习, 是指可以由数据自动决定权重参数的值.
在实际的神经网络中,参数的数量成千上万,层数更深的深度学习中,参数的数量甚至上亿,想要人工决定这些参数的值是不可能的.
现在考虑一个具体的问题: 如何实现数字"5"的识别.我们的目标是实现能否区别是否是5的程序.

如果让我们自己来设计一个能将5正确分类的程序,,就会意外地发现这是一个很难的问题. 人可以简单地识别出5,但是很难明确说出是基于何种规律识别出了5.
一种方案是,从图像中提取特征量,再用机器学习技术学习这些特征量的模式. 这里的所说的特征量是指可以从输入数据中准确提取本质数据的转换器. 图像的特征量通常表示为向量的形式. 常用的特征量包括SIFT,SURF和HOG等. 使用这些特征量将图像数据准换为向量,然后对转换后的向量使用机器学习中的SVM.KNN等分类器进行学习.
上面的方法中,能够更高效的解决问题,也能减轻人的负担,但是特征量还是由人设计的. 对于不同的问题需要使用合适的特征量才能得到好的结果. 也就是说,及时使用特征量和机器学习的方法.也需要针对不同的问题人工考虑合适的特征量.
而在神经网络是直接学习图像本身. 也就是图像中包含的重要特征量也都是由机器学习来的.

神经网络的优点是对于所有的问题都可以用同样的流程来解决. 不管求解的问题是什么,神经网络都是通过不断学习所提供的数据,尝试发现求解的问题的模式. 也就是说, 与待处理的问题无关, 神经网络可以将数据直接作为原始数据,进行端到端的学习.
训练数据和测试数据
机器学习中,一般将数据分为训练数据和测试数据两部分. 首先使用训练数据进行学习,寻找最优参数. 然后使用测试数据评价训练得到的模型的实际能力. 为了正确评价模型的泛化能力,必须划分训练数据和测试数据. 训练数据也称为监督数据.
泛化能力是指处理未被观察过的数据的能力. 机器学习的最终目标就是使模型获得泛化能力.
损失函数
损失函数是表示神经网络模型对监督数据不拟合程度的函数. 神经网络以这个为指标寻找最优权重参数. 损失函数的值越小,性能越好. 损失函数可以使用任意函数,但是一般用均方误差和交叉熵误差
均方误差
可以作为损失函数的函数很多,最有名的是均方误差.式子如下
E=12∑k(yk−tk)2
E = \frac{1}{2} \sum_{k}(y_k-t_k)^2
E=21k∑(yk−tk)2
这里的yky_kyk表示神经网络的输出,tkt_ktk表示监督数据,k表示数据的维度数.
比如,yk,tky_k,t_kyk,tk是如下的数据
y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
这里神经网络的输出y是softmax函数的输出. 由于softmax函数的输出可以理解为概率,因此上例表示,0的概率为0.1, 1的概率为0.05等.
t是监督数据,将正确解标签设为1,其他均设为0. 这里标签2为1,表示正确解为2. 将正确解标签表示为1,其他标签表示为0的表示方法称为one-hot表示
带入上面式子计算,得出结果为:0.0975
如果还有一个输出y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] 计算损失函数得:0.5975
由于上面的输出的均方误差小于下面输出的均方误差,因此可以认为,上面输出的结果和监督数据更加吻合.
交叉熵误差
除了均方误差,交叉熵误差也常用作损失函数. 表达式如下
E=−∑ktkln(yk)
E = -\sum_kt_kln(y_k)
E=−k∑tkln(yk)
这里ln表示以e为底数的自然对数.
继续使用上面的例子
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
由于tkt_ktk中只有正确解标签的索引为1,其他均为0. 因此交叉熵误差实际上只计算对应正确解标签的输出的自然对数.
比如y1y_1y1的交叉熵误差等于-ln0.6 = 0.51 而y2y_2y2的交叉熵误差等于-ln0.1 = 2.30.因此根据交叉熵误差,也是y1y_1y1的结果更接近监督数据.
mini-batch学习
机器学习使用训练数据进行学习. 严格来说,就是针对训练数据计算损失函数的值,找出使该值尽可能小的参数. 因此,计算损失函数的时候需要将所有的训练数据作为对象. 前面的例子都是一个数据,如果是多个数据,只需要将所有的损失函数相加然后取平均值.
以交叉熵误差为例,总共有N个数据的话
E=−1N∑n∑ktnkln(ynk)
E = -\frac{1}{N}\sum_n \sum_k t_{nk} ln(y_{nk})
E=−N1n∑k∑tnkln(ynk)
通过除以N,可以求单个数据的’平均损失函数’. 获得和训练数据的数量无关的统一指标.
但是如果训练数据太多, 以全部数据为对象求损失函数的和,计算过程花费时间太长. 因此,我们可以从全部数据中选出一部分,作为全部数据的近似. 神经网络的学习也是从训练数据中选出一批数据,对每个mini-batch进行学习. 这种学习方式称为mini-batch学习.
为何要设定损失函数
为什么我们任务的目的是获得提高识别准确性的参数,不直接使用识别精度作为指标,而是特意导入一个损失函数?
这个问题可以用导数来回答. 在神经网络的学习中,寻找最优参数时,要寻找使损失函数尽可能小的参数. 为了找到使损失函数值尽可能小的地方,需要计算参数的倒数,然后以这个导数为指引,逐步的更新参数的值.
之所以不能使用识别精度作为指标,使因为在绝大多数地方,导数都会是0,导致参数无法更新. 为什么呢? 我们考虑一个具体的例子,某个神经网络正确识别了100笔训练数据的32笔,此时精度为32%. 如果以识别精度为指标,稍微改变权重参数的值,识别精度也仍然保持在32%,不会出现变化. 仅仅微调参数是无法改善识别精度的. 并且哪怕识别精度有所改变, 也是从32%到33%,34%这样不连续,离散的值. 而如果使用损失函数作为指标,稍微改变参数的值,对应的损失函数也会发生连续的变化.
作为激活函数的阶跃函数也是类似的. 出于同样的原因,如果使用阶跃函数作为激活函数,神经网络的学习将无法进行. 因为阶跃函数的导数在大多数地方都为0. 也就是说,如果使用了阶跃函数,即便将损失函数作为指标,参数的微小变化会被阶跃函数隐藏,导致损失函数值不发生变化.
而sigmoid函数,除了输出的值是连续变化的,它的导数也是连续变化的.在任何地方都不为0. 所以sigmoid函数可以作为神经网络的激活函数.
在数学上,sigmoid函数的导数永远不会等于0,但是可以无限接近于0. 这会导致梯度几乎消失,对于浅层网络影响不大,但在深层网络中梯度消失问题严重,几乎无法学习
所以现代深度学习很少用sigmoid,而改用ReLU作为激活函数. 虽然ReLU在一半区域导数为0,但训练时使用非零部分就可以避开.且没有饱和问题.
梯度
假设有个函数f(x,y)=x2+y2f(x,y) = x^2+y^2f(x,y)=x2+y2 我们要求这个函数的导数. 可以注意到,这个函数有两个变量,因此不是简单的直接求导,而是求偏导.
∂f∂x=∂(x2+y2)∂x=2x∂f∂y=∂(x2+y2)∂y=2y∇f=(∂f∂x,∂f∂y)=(2x,2y)
\frac{\partial f}{\partial x} = \frac{\partial (x^2+y^2)}{\partial x} = 2x \\
\frac{\partial f}{\partial y} = \frac{\partial (x^2+y^2)}{\partial y} = 2y \\
\nabla f = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) = (2x,2y)
∂x∂f=∂x∂(x2+y2)=2x∂y∂f=∂y∂(x2+y2)=2y∇f=(∂x∂f,∂y∂f)=(2x,2y)
像(∂f∂x,∂f∂y)(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y})(∂x∂f,∂y∂f) 这样的由全部变量的偏导数汇总而成的向量称为梯度. 用符号∇\nabla∇ 表示.
梯度作为一个向量,就有方向. 那么梯度的方向表示什么呢? 梯度的指示方向,是函数增加最快(下降最快)的方向. 根据这个性质,我们就可以寻找使得损失函数最小的参数.
虽然梯度的方向并不一定指向最小值,但沿着它的方向能够最大限度的减少函数的值. 因此我们只需要从函数的某个点出发,沿着梯度方向前进一定的距离,然后再新的地方重新求梯度,再沿着新梯度方向前进,如此反复. 函数就一直沿着减少最快的方向前进,不断的减少函数值. 从而尽可能找到损失函数的最小值.
比方说求解函数f(x,y)=x2+y2f(x,y) = x^2+y^2f(x,y)=x2+y2 在哪个点是最小值. 我们设定最开始出发的点为(-3,4).我们使用梯度法求解,则需要先求解这个梯度∇f=(∂f∂x,∂f∂y)=(2x,2y)\nabla f = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) = (2x,2y)∇f=(∂x∂f,∂y∂f)=(2x,2y) 我们知道(-6,8)这个方向是函数增加最快的方向,那么相反方向就是减少最快的. 因此我们将出发点沿着这个方向前进一定距离. 将x=-3,y=4带入(x′,y′)=(x,y)−η(∇f)(x\prime,y\prime) = (x,y)-\eta(\nabla f)(x′,y′)=(x,y)−η(∇f) 得到
(x′,y′)=(−3,4)−η(−6,8)(x\prime,y\prime) = (-3,4)-\eta(-6,8)(x′,y′)=(−3,4)−η(−6,8) 这里的η\etaη是学习率. 表示每次前进的距离. 也就是在一次学习中,应该多大程度的更新参数.
学习率需要事先确定为某个值,过大或过小都不行. 因此在神经网络的学习中,一般会一边改变学习率的值,一边确认学习是否正确进行.
像学习率这样的参数称为超参数。这是一种和神经网络的参数(权重 和偏置)性质不同的参数。相对于神经网络的权重参数是通过训练 数据和学习算法自动获得的,学习率这样的超参数则是人工设定的。 一般来说,超参数需要尝试多个值,以便找到一种可以使学习顺利 进行的设定
神经网络的梯度
神经网络学习中的梯度,是指损失函数关于权重参数的梯度.
假设我们现在有一个神经网络,权重参数为W,形状为2×32 \times 32×3,损失函数用L表示. 那么梯度可以表示
W=(w11w12w13w21w22w23)∇L=∂L∂W=(∂L∂w11∂L∂w12∂L∂w13∂L∂w21∂L∂w22∂L∂w23)
W = \begin{pmatrix}
w_{11} & w_{12} & w_{13} \\
w_{21} & w_{22} & w_{23}
\end{pmatrix} \\
\nabla L = \frac{\partial L}{\partial W} = \begin{pmatrix}
\frac{\partial L}{\partial w_{11}} & \frac{\partial L}{\partial w_{12}} & \frac{\partial L}{\partial w_{13}} \\
\frac{\partial L}{\partial w_{21}} & \frac{\partial L}{\partial w_{22}} & \frac{\partial L}{\partial w_{23}}
\end{pmatrix} \\
W=(w11w21w12w22w13w23)∇L=∂W∂L=(∂w11∂L∂w21∂L∂w12∂L∂w22∂L∂w13∂L∂w23∂L)
学习算法的实现
神经网络的学习步骤如下:
- mini-batch
- 从训练数据中随机选出一部分数据,这部分数据称为mini-batch。我们 的目标是减小mini-batch的损失函数的值。
- 计算梯度
- 为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度。 梯度表示损失函数的值减小最多的方向。
- 更新参数
- 将权重参数沿梯度方向进行微小更新。
- 重复
- 重复上面三个步骤
误差反向传播法
理解误差反向传播法有两种方法: 一种是基于数学式,一种是基于计算图. 数学式严密且简洁.而计算图,则更加直观地理解误差反向传播法. 因此这里主要介绍计算图法.
计算图
计算图简单的说就是用图形将计算过程表示出来的方法. 这里说的图形是数据结构图, 通过多个节点和边表示. 这里先用计算图解决一些简单的问题来熟悉计算图.
问题一: 太郎在超市买了2个100日元一个的苹果,消费税是10%,请计 算支付金额。

计算图通过节点和箭头表示计算过程. 其中节点用O表示,O中是计算内容,计算的中间过程写在箭头上方,表示各个节点的计算结果从左向右传递.
如图所示,开始时,苹果的100日元流到“×2”节点,变成200日元, 然后被传递给下一个节点。接着,这个200日元流向“×1.1”节点,变成220 日元。因此,从这个计算图的结果可知,答案为220日元。
虽然图中把“×2” “ ×1.1”等作为一个运算整体用O括起来了,不过 只用O表示乘法运算“×”也是可行的.只需要将2和1.1分别作为变量标在O外面.如图所示

综上,用计算图解题需要按照如下流程进行.
- 构建计算图
- 在计算图上,从左向右进行计算
这里的第二步"从左向右计算"是一种正方向上的传播,简称正向传播. 正向传播是从计算图出发点到结束点的传播. 既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左)的传播. 实际上,这种传播称为反向传播(backward propagation)。反向传播将在接下来的导数计算中发挥重要作用
深度学习技巧
参数的更新
神经网络的学习目的是找到使损失函数的值尽可能小的参数. 这是寻找最优参数的问题, 解决这个问题的过程称为最优化.
之前,为了找到最优参数,我们将参数的梯度(导数)作为了线索. 使用参数的梯度,沿着梯度方向更新参数,并重复这个步骤,从而逐渐靠近最优参数, 这个过程称为随机梯度下降法,简称 SGD. SGD时一个简单的方法. 但是根据不同的问题,也有比SGD更好的方法.
我们将先介绍SGD的缺点,并且介绍其他最优化方法.
SGD
复习下SGD. 用数学式可以将SGD写成如下的式子
W←W−η∂L∂W
W \larr W-\eta \frac{\partial L}{\partial W}
W←W−η∂W∂L
这里的WWW表示权重参数,∂L∂W\frac{\partial L}{\partial W}∂W∂L表示损失函数关于WWW的梯度. η\etaη表示学习率, 在实际运用中会取0.001或0.01这些事先决定好的值. 式子中的←\larr← 表示用右边的值更新左边的值.
SGD是朝着梯度方向前进一定距离的简单方法,并且容易实现,但是在解决某些问题时可能没有效率.
下面我们思考求解这个函数的最小值的问题
f(x,,y)=120x2+y2f(x,,y) = \frac{1}{20}x^2 +y^2f(x,,y)=201x2+y2

如图所示,左边是函数的形状,右边是这个函数的等高线. 呈x轴方向延申的椭圆状.
这个函数的梯度
∇f=(∂f∂x,∂f∂y)=(110x,2y)
\nabla f = (\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}) = (\frac{1}{10}x,2y)
∇f=(∂x∂f,∂y∂f)=(101x,2y)

如图所示,表示函数梯度下降的方向. 这个梯度的特征是,y轴方向上打,x轴方向上小. 并且需要注意,虽然我们知道函数在(0,0)的值最小,但是梯度在很多地方并没有指向(0,0).
如果应用SGD方法,从(x,y) = (-7,2)处开始搜索.结果如图所示.

从上图可以看出,SGD呈"之"字形移动. 这是十分低效的路径. 所以SGD的缺点是, 当函数的形状非均向时,搜索的路径会非常低效. 而SGD低效的根本原因时,梯度方向并没有指向最小值的方向.
下面我们将介绍三种方法来取代SGD,分别是Momentum,AdaGrad和Adam
Momentum
Momentum是动量的意思. 用数学式表示Momentum方法,如下所示.
v←αv−η∂L∂WW←W+v
v \larr \alpha v - \eta \frac{\partial L}{\partial W} \\
W \larr W + v
v←αv−η∂W∂LW←W+v
和SGD相比,这个式子中出现了新变量vvv,对应物理上的速度. 上式表示,物体在梯度方向上受了力,在这个力的作用下,物体的速度增加这一物理法则.
AdaGrad
Adam
中…(img-7gp8ts7R-1778124881447)]
如图所示,表示函数梯度下降的方向. 这个梯度的特征是,y轴方向上打,x轴方向上小. 并且需要注意,虽然我们知道函数在(0,0)的值最小,但是梯度在很多地方并没有指向(0,0).
如果应用SGD方法,从(x,y) = (-7,2)处开始搜索.结果如图所示.
[外链图片转存中…(img-jTdUYFzw-1778124881447)]
从上图可以看出,SGD呈"之"字形移动. 这是十分低效的路径. 所以SGD的缺点是, 当函数的形状非均向时,搜索的路径会非常低效. 而SGD低效的根本原因时,梯度方向并没有指向最小值的方向.
下面我们将介绍三种方法来取代SGD,分别是Momentum,AdaGrad和Adam
Momentum
Momentum是动量的意思. 用数学式表示Momentum方法,如下所示.
v←αv−η∂L∂WW←W+v
v \larr \alpha v - \eta \frac{\partial L}{\partial W} \\
W \larr W + v
v←αv−η∂W∂LW←W+v
和SGD相比,这个式子中出现了新变量vvv,对应物理上的速度. 上式表示,物体在梯度方向上受了力,在这个力的作用下,物体的速度增加这一物理法则.

822

被折叠的 条评论
为什么被折叠?



