年度归档:2022年

第3章 随机变量及其分布

3.1 从随机事件到随机变量

随机试验中,每一个可能的结果,在试验中发生与否,都带有随机性,所以称为随机事件。而所有可能结果构成的全体,称为样本空间。为了更好分析处理这些随机事件,人们就想到了把随机事件数量化,数量化的载体就是随机变量,随机变量一般用大写字母表示,如X,Y,Z,W等,随机变量的取值一般用小写字母表示,如x,y,x_i等,图3-1说明随机事件与随机变量的对应关系示意图。

图3-1 随机事件\Rightarrow数量化\Rightarrow随机变量过程示意图
随机变量(random variable)表示随机试验各种结果的实值单值函数。随机事件不论与数量是否直接有关,都可以数量化,即都能用数量化的方式表达。 例如投掷硬币的正反面,掷骰子的点数,某一时间内公共汽车站等车乘客人数,灯泡的寿命等等,都可用随机变量表示。
例1:将一枚硬币抛掷三次,观察出现正面和方面的情况,样本空间是
\Omega={正正正,正正反,正反正,反正正,正反反,反正反,反反正,反反反}
以X记三次投掷得到正面的总数,那么,对于样本空间Ω中的每一个样本点\omega,如式(3.1)所示,X都有一个数与之对应,X就是把随机事件数量化的随机变量,X与随机事件的关系为:

随机变量的取值随试验的结果而定,而试验的各个结果出现有一定概率,因而随机变量的取值有一定概率,例如,本例中的X取值为2,记成X=2,对应样本点的集合A={正正反,正反正,反正正},这是一个事件,当且仅当A发生时有X=2。我们称概率p(A)=p{正正反,正反正,反正正}为X=2的概率,记为p(X=2)=\frac{3}{8}。类似地有

对于一个随机变量,不仅要说明它能够取什么值,更需要关心取这些值的概率(分布函数),这也是随机变量与一般变量的本质区别。
引入随机变量,就可利用数学分析的方法对随机试验的结果进行分析研究了。

第2章 随机事件与概率

2.1 随机事件

随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫作随机事件(简称事件)。
随机事件通常用大写英文字母A、B、C等表示。随机试验中的每一个可能出现的试验结果称为这个试验的一个样本点,记作\omega_i。全体样本点组成的集合称为这个试验的样本空间,记作\Omega.即\Omega={\omega_1,\omega_2,\cdots,\omega_n,\cdots}。仅含一个样本点的随机事件称为基本事件,某些样本点组成的集合称为随机事件(random event),简称为事件。
整个样本空间\omega_i也是个事件,它一定会发生,称为必然事件。空集\emptyset也是个事件,它不可能发生,称为不可能事件。
例如,投骰子,记整数i表示“投掷结果为i”这个样本点,那么样本空间\Omega={1,2,3,4,5,6},事件A={1,3,5} 表示“投掷的结果为奇数”

2.2 事件与集合

随机事件是用集合定义的,这里我们不区分事件和集合,对事件可以做集合的各种运算。
事件A和B的交集,表示事件A和B同时发生,由事件A与事件B的公共样本点组成记,记为A\cup B或AB,如图2-2(a)所示。
事件A和B的并集,由事件A与事件B所有样本点组成,记为A\cup B或A+B,如图2-2(b)所示。
差事件,即事件A发生且事件B不发生,是由属于事件A但不属于事件B的样本点组成,记作A-B,如图2-2(c)所示。

图2-2 随机事件之间的关系
互斥事件(互不相容事件)事件A与事件B,事件A与事件B不能同时发生,事件A与事件B没有公共的样本点,记为AB=\emptyset
事件A的对立事件,事件A不发生,事件A的对立事件是由不属于事件A的样本点组成,记作\bar A
事件满足如下运算:
在随机事件中,有许多事件,而这些事件之中又有联系,分析事件之间的关系,可以帮助我们更加深刻地认识随机事件;给出的事件的运算及运算规律,有助于我们分析更复杂事件。
(1)交换律
A\cup B=B\cup A,AB=BA
(2)结合律
(A\cup B)\cup C=A\cup (B\cup C),A(BC)=(AB)C
(3)分配律
A\cup(BC)=(A\cup B)(A\cup C) 如图2-3(a)
A(B\cup C)=(AB)\cup(AC) 如图2-3(b)
图2-3 随机事件的分配律
(4)摩根律
\overline{A\cup B}=\overline A\cap\overline B
\overline{A\cap B}=\overline A\cup\overline B
可推广到n个事件。

2.3 随机事件的概率

既然事件可用集合来表示,那么事件的关系和运算自然应当按照集合论中集合之间的关系和集合的运算来处理。接下来给出这些关系和运算在概率论中的提法,并根据“事件发生”的含义,用概率来度量随机事件发生的可能性。
随机事件A的概率记为p(A),表示此事件发生的可能性,其值满足:
0\le p(A)\le 1
概率值越大则事件越可能发生。概率为0意味着这个事件不可能发生(不可能事件),概率为1意味着这个事件必然发生(必然事件)。
一般情况下,假设样本空间Ω为有限集,其中每个样本点发生的概率是相等的(这也是古典概型的重要假设),因此事件A发生的概率是该集合的基本事件数(或简称为基数)与整个样本空间基数的比值:
p(A)=\frac{|A|}{|\Omega|}\tag{2.1}
例2:在掷骰子试验中,看朝上面的点数,则有样本空间为\Omega={1, 2, 3, 4, 5, 6}
求事件A={点数为奇数},B={点数为小于4的奇数},事件C={点数为偶数}的概率、
解:事件A包括的基本样本点为{1,3,5},B事件包括的基本样本点为{1,3},C事件包括的基本样本点为{2,4,6}
所以|A|=3,|B|=2, |C|=3而|\Omega|=6
从而的:
事件A的概率p(A)=\frac{|A|}{|\Omega|}=\frac{3}{6}=\frac{1}{2}
事件B的概率p(B)=\frac{|B|}{|\Omega|}=\frac{2}{6}=\frac{1}{2}
事件C的概率p(C)=\frac{|C|}{|\Omega|}=\frac{3}{6}=\frac{1}{2}
对应集合的交运算就是两个事件同时发生的概率,记为p(A\cap B)或p(A,B),其概率为:
p(A\cap B)=\frac{|A\cap B|}{|\Omega|}
对应集合的并运算就是两个事件至少有一个发生的概率,其概率为:
p(A\cup B)=\frac{|A\cup B|}{|\Omega|}
因为|A\cup B|=|A|+|B|-|A\cap B|
所以

所以

前面介绍的概率均针对有限或无限可数的样本空间,与之相对的还有无限不可数样本空间,这类概率称为几何型概率。几何型概率定义在无限不可数数据集上,根据测度值(如长度、面积、体积等)的定义。事件A发生的概率为A所在区域的测度值与样本空间\Omega测度值的比值,即

几何概型与古典概型类似,也要求样本空间有一种均匀性。
例3:在区间[-1,1]上随机取一个数x,求使cos \frac{\pi x}{2}的值基于0和\frac{1}{2}之间A事件的概率。
解:由图2-4可知,

图2-4 y=cosx函数曲线
满足条件的x需在以下范围即可:

2.4 条件概率

生活中很多事件是有因果关系或前后关系,这节介绍的条件概率就是研究随机事件间的前后依赖关系。条件概率是指事件A在另外一个事件B已经发生条件下发生概率。条件概率表示为:P(A|B),读作“在B发生的条件下A发生的概率”。如果P(B)>0,条件概率可按下列公式计算:
p(A|B)=\frac{P(A,B)}{P(B)}\tag{2.2}
在古典概型中,在已知B发生时,认为B集合中的那些样本点数为|B| ,而其中同时也在A集合中的样本点有|A\cap B|个,故p(A|B)=\frac{|A\cap B|}{|B|}=\frac{|A\cap B|/|\Omega|}{|B|/|\Omega|}=\frac{P(A,B)}{(P(B)}
在几何概型中,条件概率的解释则更为直观,如图2-5所示

题图2-5 条件概率模型
已知B发生时,样本空间中只剩下了B中的那些样本点(图中有色区域),此时A发生的概率就是(A,B)的面积(阴影部分)比上B的面积,即
p(A|B)=\frac{P(A,B)}{P(B)}
例3:投掷一次骰子,该骰子一共有6个面,分别为1,2,3,4,5,6。
问:已知向上的点数是偶数,那么该点数大于4的概率是多少?
解:这是一个条件概率问题,设B={向上的点数为偶数}={2,4,6}、A={点数大于4}={5,6}
根据式(2.2)可得:

2.5 事件的独立性

事件的独立性指的就是互不影响事件,或一个事件的发生不影响另一个事件的发生。利用独立性可以简化概率的计算。
如果p(A|B)=p(A),或p(B|A)=p(B),则称随机事件A和B独立。
如果随机事件A和B独立,根据式(2.3)可得:
p(A,B)=p(A)P(B) (2.5)
对式(2.5)推广到n个随机事件,如果A_1,A_2,\cdots,A_n互相独立,则对所有可能组合
1\leq i\leq j\leq k\leq\cdots\leq n,都有
p(A_i,A_j)=p(A_i )p(A_j)
p(A_i,A_j,A_k )=p(A_i)p(A_j)p(A_k)
\vdots
p(A_i,A_j,\cdots,A_n)=\prod_{i=1}^n p(A_i)
【说明】
(1)互相独立非两两独立,相互独立的条件强于两两独立。
(2)两个随机事件独立与两个随机事件不相容的区别,后者是两个事件不可能同时发生,即p(A,B)=0。

2.6 全概率公式

式(2.6)称为全概率公式,图2-6能更直观说明全概率公式的含义。

图2-6 全概率模型示意图
p(A,B_1 )=p(A|B_1)p(B_1)是图2-6阴影部分的概率,对所有的i求和,就得到A的概率。全概率公式的应用之一,如果事件A的概率很难算,可以试着构造完备事件组,如果每个B_i的概率容易算,并且在B_i发生的条件下p(A|B_i)也容易算,那么就可以通过全概率公式计算出A的概率。
例5:假设有10人抽签,其中有且仅有1个人会中签,每个人依次抽签,则事件A={第2个人中签}的概率是多少?
解:直接求第2人中签的概率不是很好求,此时可以使用全概率公式来简化这个问题,很明显,第2人是否中签,与第1人是否中签有一定关系。考虑第1人的中签情况,问题就简单了,思路也更清晰了。
设B={第1个人中签},则\overline B={第1人没中签},事件B和\overline B构成一个完备事件组。根据全概率公式可得:
p(A)=p(A|B)P(B)+P(A|\overline B)P(\overline B)
p(A|B)=0,P(B)=\frac{1}{10},p(A|\overline B)=\frac{1}{9},P(\overline B)=\frac{9}{10}
代入上式可得:
p(A)=0\times\frac{1}{10}+\frac{1}{9}\times\frac{9}{10}=\frac{1}{10}
用类似的方法可推出:所有人的中签概率都是\frac{1}{10},所以从数学上来说,抽签顺序并不会影响中签概率,大家机会均等。

2.7 贝叶斯定理

贝叶斯定理是概率论中的一个定理,它跟随机变量的条件概率以及边缘概率分布有关。在有些关于概率的解释中,贝叶斯定理(贝叶斯公式)能够告知我们如何利用新证据修改已有的看法。这个名称来自于托马斯·贝叶斯。
通常,事件A在事件B(发生)的条件下的概率,与事件B在事件A(发生)的条件下的概率是不一样的;然而,这两者是有确定的关系的,贝叶斯定理就是这种关系的陈述。贝叶斯公式的一个用途在于通过已知的三个概率函数推出第四个。
贝叶斯公式为:


在贝叶斯定理中,每项都有约定俗成的名称:
P(B|A)是已知A发生后B的条件概率,也由于得自A的取值而被称作B的后验概率。
P(B)是B的先验概率(或边缘概率)。之所以称为"先验"是因为它不考虑任何A方面的因素。
P(A|B)是已知B发生后A的条件概率,也称为似然(likelihood)函数,也由于得自B的取值而被称作A的后验概率。
P(A)是A的先验概率或边缘概率。
其中P(A)的计算,通常使用全概率公式,设\Omega=B_1+B_2+\cdots(其中B_i,B_j 两两互斥),则
 A=A \cap \Omega = \sum_i A B_i
从而有:
P(A)=\sum_iP(AB_i) =\sum_iP(A|B_i )P(B_i)
对任意B_j,贝叶斯公式又可表示为:
P(B_j|A)=\frac{P(B_j )P(A|B_j)}{\sum_iP(A|B_i )P(B_i)} \tag{2.8}
例6:利用贝叶斯定理进行分类--简单实例
假设某医院早上收了六个门诊病人,如下表

现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上脑震荡的概率有多大?
4、简单入手
根据式(贝叶斯公式)可得:
P(感冒|(打喷嚏,建筑工人))
= P((打喷嚏,建筑工人)|感冒) x P(感冒)
/ P(打喷嚏,建筑工人)

假定"打喷嚏"和"建筑工人"这两个特征是独立的,因此,上面的等式就变成了:

P(感冒|(打喷嚏,建筑工人))
= P((打喷嚏|感冒)xP(建筑工人)|感冒) x P(感冒)
/ P(打喷嚏) xP(建筑工人)
由此可得:
P(感冒|(打喷嚏,建筑工人))
= \frac{0.66 \times 0.33 \times 0.5}{0.5 \times 0.33}
= 0.66
因此,这个打喷嚏的建筑工人,有66%的概率是得了感冒。同理,可以计算这个病人患上过敏或脑震荡的概率。比较这几个概率,就可以知道他最可能得什么病。
这就是贝叶斯分类器的基本方法:在统计资料的基础上,依据某些特征,计算各个类别的概率,从而实现分类。

5、Python实现

打印结果
第7个人患感冒的概率0.667
第7个人患过敏的概率0.000
第7个人患脑震荡的概率0.000

2.8 条件独立

前面我们介绍了条件概率和事件的独立性,两者结合可以给出条件独立的概念。给定三个随机事件A,B,C,如果满足:
p(A|B,C)=p(A|C)
则称A和B关于C条件独立。与之等价的一个判断条件是:
p(A,B|C)=p(A|C)p(B|C)
该定义可以推广到n个事件的情况:
p(A_1,A_2,\cdots,A_n|B)=\prod_{i=1}^n p(A_i|B)
A和B关于C条件独立,可记为:A\perp B|C这里垂直符表示独立。条件独立的概念在朴素贝叶斯分类器、概率图模型中经常使用。

第1章 概率统计概述

1.1概率与统计的异同

概率(probabilty)和统计(statistics)看似两个相近的概念,其实研究的问题刚好相反。
概率研究的问题是,已知一个模型和参数,怎么去预测这个模型产生的结果的特性(例如均值、方差、协方差等)。
统计研究的问题则相反。统计是,有一堆数据,要利用这堆数据去预测模型和参数。
总之,概率是已知模型和参数,推数据。统计是已知数据,推模型和参数。
显然,本文解释的最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率(Maximum a posteriori estimation, 简称MAP)都是统计领域的问题。它们都是用来推测参数的方法。

1.2概率论的知识体系

图1-1 概率论的知识体系

1.3概率统计在机器学习中的应用

概率研究对象不是预先知道或确定的事情,而是预先不确定或随机的事件,研究这些不确定或随机事件背后的规律或规则。或许有人会说,这些不确定或随机事件有啥好研究?他们本来就不确定或随机的,飘忽不定、不可捉摸。表面上看似如此,有句话说得好:偶然中有必然,必然中有偶然。就拿我们比较熟悉微积分来说吧,如果单看有限的几步,很多问题都显得杂乱无章,毫无规律可言,而且还很难处理,但是一旦加上一个无穷大(∞)这个“照妖镜”,其背后规律立显,原来难处理的也好处理了。如大数定律、各种分布等带给我们这样的认识。
机器学习、深度学习与概率、信息论有哪些内在关联呢?
(1)被建模系统内在的随机性。例如一个假想的纸牌游戏,在这个游戏中我们假设纸牌被真正混洗成了随机顺序。
(2不完全观测。即使是确定的系统,当我们不能观测到所有驱动系统行为的所有变量或因素时,该系统也会呈现随机性。
(3)不完全建模。假设我们制作了一个机器人,它可以准确观察周围每一个对象的位置。在对这些对象将来的位置进行预测时,如果机器人采用的是离散化的空间,那么离散化的方法将使得机器人无法确定对象们的精确位置:因为每个对象都可能处于它被观测到的离散单元的任何一个角落。也就是说,当不完全建模时,我们不能明确的确定结果,这个时候的不确定,就需要借助概率来处理。
由此看来,概率、信息论很重要,机器学习、深度学习确实很需要它们。后续我们可以看到很多实例,见证概率、信息论在机器学习、深度学习中是如何发挥它们作用的。

第7章带约束的优化问题

带约束条件的最优化问题,约束条件一般分为两种,一种是等式约束;另一种是不等式约束。对于第一种等式约束的优化问题,可以直接利用拉格朗日乘子法去获得最优解;对于不等式约束的优化问题,可以转化为Karush–Kuhn–Tucker conditions(KKT条件)下应用拉格朗日乘数法求解。两种情况都应用拉格朗日乘数法,给出优化问题的必要条件。

7.1 拉格朗日乘数法

拉格朗日乘数法(又称为拉格朗日乘子法),就是求函数f(x_1,x_2,\cdots,x_n)在等式约束函数h(x_1,x_2,\cdots,x_n)=0或不等式约束函数g(x_1,x_2,\cdots,x_n)\le 0的约束条件下的极值的方法。其主要思想是引入一个新的参数λ(即拉格朗日乘子),将约束条件函数与原函数联系到一起,配成与变量数量相等的等式方程,从而求出原函数极值的必要条件。
假设向量x= (x_1,x_2,\cdots,x_n),目标函数为f(x),等式约束函数为h(x),不等式约束函数为g(x)
求等式约束条件下的极值问题:
\underset{\rm x}{min}f(\rm{x})
s.t.h(\rm x)
利用拉格朗日乘数法构造拉格朗日乘子函数:
L(\rm x,u)=f(\rm x)+uh(\rm x) \tag{7.1}
其中参数u称为拉格朗日乘子。利用拉格朗日乘数法把有约束的极值问题,转换为无约束的极值问题。对拉格朗日乘子函数的所有自变量(x及参数u)求导,并令其为0,就可得到函数的候选极值点。
\nabla_{\rm x} L(\rm x,u)=\nabla_{\rm x} f(\rm x)+u\nabla_{\rm x} h(\rm x)=0 \tag{7.2}
 \nabla_u L(\rm x,u)=h(\rm x)=0 \tag{7.3}
由式(7.2)可知,在极值点目标函数的梯度是约束函数梯度的倍数,即这两个梯度是平行的关系,如图7-1所示。如果有多个等式约束函数,目标函数的梯度是约束函数梯度的线性组合。

图7-1 f(x)的等高线与约束函数h(x)等高线在切点的梯度互相平行
【说明】f(x)的梯度是等高线的法向量。以二维空间为例,假设而为函数f(x,y)
根据微分定义:
f(x+\Delta x,y+\Delta y)\approx f(x,y)+\frac{\partial f}{\partial x}\Delta x+\frac{\partial f}{\partial y}\Delta y=(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y})\left(\begin{matrix}\Delta x\\ \Delta y\end{matrix}\right)
(\Delta x,\Delta y)表示函数f(x)等高线的方向,当\Delta x \longrightarrow 0,\Delta y \longrightarrow 0时,(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y})\left(\begin{matrix}\Delta x\\ \Delta y\end{matrix}\right)\longrightarrow 0
即等高线的方向与f(x)的梯度互相垂直。
例1:利用拉格朗日乘数法求如下极值问题
\underset{x,y}{min}(x^2+y^2)
s.t. xy-3=0
(1)构建拉格朗日乘子函数
L(x,y,u)=x^2+y^2+u(xy-3)
对自变量及乘子变量求导,并令其为0,可得如下方程组:
\frac{\partial L}{\partial x}=2x+uy=0
\frac{\partial L}{\partial y}=2y+ux=0
\frac{\partial L}{\partial u}=xy-3=0
解得:
u=-2,x=\sqrt 3,y=\sqrt 3x=-\sqrt 3,y=-\sqrt 3
目标函数(x^2+y^2)的海塞矩阵为:
\left(\begin{matrix}{\frac{\partial^2 f}{\partial x^2}}&{\frac{\partial^2 f}{\partial x{\partial y}}}\\{\frac{\partial^2 f}{\partial y{\partial x}}}&{\frac{\partial^2 f}{\partial y^2}}\end{matrix}\right)=\left(\begin{matrix}{2}&0 \\ {0}&2\end{matrix}\right)
为正定矩阵,故目标函数是凸函数,有极小值。极值点与等高线之间的位置见图7-2所示

图7-2 极值点的位置示意图
实现图72-的python代码:

求不等式约束条件下的极值问题:
前面介绍了等式约束的极值问题,通常面对更多的是不等式条件约束的情况,对这种情况,其取得极值的必要条件为KKT条件(非充分条件,如果优化问题为优化问题,则是充分条件)。
\underset{\rm x}{min}f(\rm{x})
s.t. g(\rm x)\leq 0
利用拉格朗日乘数法构造拉格朗日乘子函数:
L(\rm x,\lambda)=f(\rm x)+\lambda g(\rm x)
其中参数\lambda称为拉格朗日乘子,g(\rm x)\leq 0
对不等式约束,极值点与不等式构成的区域有2种情况,如图7-3所示。
(1)极值点在g(x)<0区域内,如图7-3(a),这就是没有限制条件下的极值点,不等式约束不起作用,可以直接最小化目标函数,求得极值点x^*,由此可得:
\nabla_{x^*} f(x^*)=0,\lambda=0,g(x^* )<0

图7-3  极值点在约束区域的位置

(2)极值点在g(x)=0上,如图7-3(b)所示。 这种情况,约束条件起作用,所以\lambda \neq 0,g(x)=0。这样问题就相当于等式约束问题,由此可得极值点满足: \nablaf(x^* )=-\lambda\nabla g(x^*) 由图7-1可知,梯度\nabla f(x)与梯度\nabla g(x)平行且方向相反,为此需要\lambda > 0,即有:
g(x^* )=0,\lambda > 0
综合以上两种情况,就得到在不等式约束的条件下,获取极值点的必要条件为:
\lambda \geq 0,\lambda g(x^*)=0,g(x^* )\leq 0
这实际上就是KKT条件的核心内容。
接下来简单介绍KKT条件的完整信息。

例2:求下例问题的极值

目标函数为凸函数,解得最小值为:x=y=1
目标函数最优点的位置如图7-4所示。

图7-4 目标函数与约束函数等高线及最优点位置

7.2 KKT条件

KKT条件是求带等式、不等式约束问题极值的一阶必要条件,是拉格朗日乘数法的推广,对于如下的优化问题:

【说明】KKT条件只是取得极值的必要条件,而非充分条件。如果是一个凸优化问题,KKT条件是取得极值的充分必要条件。

第6章改进梯度下降法

优化器在机器学习、深度学习中往往起着举足轻重的作用,同一个模型,因选择不同的优化器,性能有可能相差很大,甚至导致一些模型无法训练。所以,了解各种优化器的基本原理非常必要。本节重点介绍各种优化器或算法的主要原理,及各自的优点或不足。
梯度下降法的最大优点就是沿下降最快的方向迭代。但不足之处也不少。梯度下降法对学习率表敏感,而且迭代过程中始终不变,这是一个可以改进的地方;另外,梯度越到极值点就越小,或在比较平滑的地方梯度也很小,以至于趋近于0,这是可改进的另一个地点。接下来就这些改进进行说明。这些改进涉及一个重要概念指数加权平均,所以,先介绍这个概念的来源及其优点等。

6.1 指数加权平均法

表1常用平均法比较

【说明】

①F_(t-1)表示前期预测值
②F_t表示当前预测值
③x_t当前实际值
④α权重参数

指数加权平均法可参考:
https://zhuanlan.zhihu.com/p/32335746

6.2传统梯度优化的不足

传统梯度更新算法为最常见、最简单的一种参数更新策略。其基本思想是:先设定一个学习率λ,参数沿梯度的反方向移动。假设基于损失函数L(f(x,θ),y),其中θ需更新的参数,梯度为g,则其更新策略的伪代码如下所示:
这种梯度更新算法简洁,当学习率取值恰当时,可以收敛到全面最优点(凸函数)或局部最优点(非凸函数)。
但其不足也很明显,对超参数学习率比较敏感(过小导致收敛速度过慢,过大又越过极值点),如图6-1的右图所示。在比较平坦的区域,因梯度接近于0,易导致提前终止训练,如图6-1的左图所示,要选中一个恰当的学习速率往往要花费不少时间。
图6-1学习速率对梯度的影响
学习率除了敏感,有时还会因其在迭代过程中保持不变,很容易造成算法被卡在鞍点的位置,如图6-2所示。

图6-2算法卡在鞍点示意图
另外,在较平坦的区域,因梯度接近于0,优化算法往往因误判,还未到达极值点,就提前结束迭代,如图6-3所示。

图6-3在较平坦区域,梯度接近于0,优化算法因误判而提前终止迭代
传统梯度优化方面的这些不足,在深度学习中会更加明显。为此,人们自然想到如何克服这些不足的问题。从本小节前文更新策略的伪代码可知,影响优化的主要因素有:
•优化梯度方向
•优化学习率
•参数的初始值
•优化训练数据集的大小
所以很多优化方法大多从这些方面入手,数据集优化方面采用批量随机梯度下降方法,从梯度方向优化方面有动量更新策略;有些从学习率入手,这涉及自适应问题;还有从两方面同时入手等方法,接下来将介绍这些方法。

6.3 动量算法

动量(momentum)是模拟物理里动量的概念,具有物理上惯性的含义,一个物体在运动时具有惯性,把这个思想运用到梯度下降计算中,可以增加算法的收敛速度和稳定性,具体实现如图6-4所示。
图6-4动量算法示意图
由图6-4所示,可知动量算法每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成。
含动量的随机梯度下降法,其算法伪代码如下:
其中parameters是模型参数,假设模型为model,则parameters指model. parameters()。
具体使用动量算法时,动量项的计算公式如下:
v_k=\alpha v_{k-1}-\lambda \hat g(\theta_k)\tag{6.1}
其中\lambda为学习率,\alpha为动态因子(一般取值为0.9)。如果按时间展开,则第k次迭代使用了从1到k次迭代的所有负梯度值,且负梯度按动量系数\alpha指数级衰减,相当于使用了移动指数加权平均,具体展开过程如下:
由此可知,当在比较平缓处,但\alpha=0.5,0.9 时,将是分别是梯度下降法的2倍、10倍。
使用动量算法,不但可加速迭代速度,还可能跨过局部最优找到全局最优,如图6-5所示。
图6-5 使用动量算法的潜在优势
每个参数的实际更新差值取决于最近一段时间内梯度的指数加权平均值。
当某个参数在最近一段时间内的梯度方向振幅较大时,其真实的参数更新幅度变小,增加稳定性;相反,当在最近一段时间内的梯度方向都一致时,其真实的参数更新幅度变
大,起到加速作用。
我们以求解函数f(x_1,x_2)=0.05x_1^2+2x_1^2极值为例,使用梯度下降法和动量算法分别进行迭代求解,具体迭代过程如图6-6、图6-7所示(图实现代码请参考本书第5章代码部分)。
图6-6 梯度下降法的迭代轨迹 图6-7 使用动量项的迭代轨迹
从图6-6 可以看出,不使用动量算法的SGD学习速度比较慢,振幅比较大;图6-7 可以看出,使用动量算法的SGD,振幅较小,而且较快到达极值点。
批量随机梯度下降法PyTorch代码实现:

6.4 Nesterov动量算法

既然每一步都要将两个梯度方向(历史梯度、当前梯度)做一个合并再下降,那为什么不先按照历史梯度往前走那么一小步,按照前面一小步位置的“超前梯度”来做梯度合并呢?如此一来,可以先往前走一步,在靠前一点的位置(如图6-8中的C点)看到梯度,然后按照那个位置再来修正这一步的梯度方向,如图6-8所示。

图6-8 Nesterov下降法示意图
这就得到动量算法的一种改进算法,称为NAG(Nesterov Accelerated Gradient)算法,也称Nesterov动量算法。这种预更新方法能防止大幅振荡,不会错过最小值,并对参数更新更加敏感。如图6-9所示。
图6-9 Nesterov加速梯度下降法
NAG下降法的算法伪代码如下:
NAG算法的PyTorch实现如下:

NAG动量法和经典动量法的差别就在B点和C点梯度的不同。动量法,更多关注梯度下降方法的优化,如果能从方向和学习率同时优化,效果或许更理想。事实也确实如此,而且这些优化在深度学习中显得尤为重要。接下来我们介绍几种自适应优化算法,这些算法同时从梯度方向及学习率进行优化,效果非常好。

6.5 AdaGrad算法

传统梯度下降算法对学习率这个超参数非常敏感,难以驾驭;对参数空间的某些方向也没有很好的方法。这些不足在深度学习中,因高维空间、多层神经网络等因素,常会出现平坦、鞍点、悬崖等问题,因此,传统梯度下降法在深度学习中显得力不从心。还好现在已有很多解决这些问题的有效方法。上节介绍的动量算法在一定程度缓解对参数空间某些方向的问题,但需要新增一个参数,而且对学习率的控制还不很理想。为了更好驾驭这个超参数,人们想出来多种自适应优化算法,使用自适应优化算法,学习率不再是一个固定不变值,它会根据不同情况自动调整来适用情况。这些算法使深度学习向前迈出一大步!这节我们将介绍几种自适应优化算法。
AdaGrad算法是通过参数来调整合适的学习率λ,能独立地自动调整模型参数的学习率,对稀疏参数进行大幅更新和对频繁参数进行小幅更新,如图6-10所示。因此,Adagrad方法非常适合处理稀疏数据。AdaGrad算法在某些深度学习模型上效果不错。但还有些不足,可能因其累积梯度平方导致学习率过早或过量的减少所致。
图6-10 AdaGrad 算法迭代过程示意图
AdaGrad算法伪代码如下:
由上面算法的伪代码可知:
•随着迭代时间越长,累积梯度r越大,从而学习速率\frac{\lambda}{\delta+\sqrt{r}}随着时间就减小,在接近 目标值时,不会因为学习速率过大而越过极值点。
•不同参数之间学习速率不同,因此,与前面固定学习速率相比,不容易在鞍点卡住。
•如果梯度累积参数r比较小,则学习速率会比较大,所以参数迭代的步长就会比较大。相反,如果梯度累积参数比较大,则学习速率会比较小,所以迭代的步长会比较小。
AdaGrad算法的PyTorch实现代码:

6.6 RMSProp算法

RMSProp算法修改AdaGrad,为的是在非凸背景下的效果更好,在凸函数可能振幅较大,如图6-11所示。对梯度平方和累计越来越大的问题,RMSProp指数加权的移动平均代替梯度平方和。RMSProp为使用移动平均,引入了一个新的超参数ρ,用来控制移动平均的长度范围。
图6-11 RMSProp迭代过程示意图
RMSProp算法伪代码如下:
RMSProp算法在实践中已被证明是一种有效且实用的深度神经网络优化算法,在深度学习中得到广泛应用。
RMSProp算法PyTorch实现代码如下:

6.7 Adam算法

Adam(Adaptive Moment Estimation,自适应矩估计)算法本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳,如图6-12所示。
图6-12 Adam算法迭代过程示意图
Adam算法是另一种学习速率自适应的深度神经网络方法,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习速率。Adam算法伪代码如下:

Adam算法的PyTorch实现如下。

6.8 Yogi算法

Adam算法综合了动量算法及自适应算法的优点,是深度学习常用的算法,但也存在一些问题:即使在凸环境下,当 r的第二力矩估计值爆炸时,它可能无法收敛。为此可通过改进r和优化参数初始化等方法来解决。 其中通过改进r是一种有效方法,即把r\longleftarrow \rho_2 r +(1-\rho_2) \hat g^2(等价于r\longleftarrow r +(1-\rho_2)(\hat g^2-r)\hat g^2-r改为\hat g^2\odot sgn(\hat g^2-r),这就是Yogi更新。
Yogi算法的PyTorch代码如下:

前文介绍了深度学习的正则化方法,它是深度学习核心之一;优化算法也是深度学习的核心之一。优化算法很多,如随机梯度下降法、自适应优化算法等,那么具体使用时该如何选择呢?
RMSprop、Nesterov、Adadelta和Adam被认为是自适应优化算法,因为它们会自动更新学习率。而使用SGD时,必须手动选择学习率和动量参数,通常会随着时间的推移而降低学习率,下图是这些优化算法之间的关系:
图6-13 改进梯度下降法之间的关系
有时可以考虑综合使用这些优化算法,如采用先用Adam,然后用SGD优化方法,这个想法,实际上由于在训练的早期阶段SGD对参数调整和初始化非常敏感。因此,我们可以通过先使用Adam优化算法进行训练,这将大大节省训练时间,且不必担心初始化和参数调整,一旦用Adam训练获得较好的参数后,我们可以切换到SGD +动量优化,以达到最佳性能。采用这种方法有时能达到很好效果,如图6-14所示,迭代次数超过150后,用SGD效果好于Adam。

图6-14迭代次数与测试误差间的对应关系
注意算法比较:
图6-15 多种改进算法运行效果比较
从图6-15可知,SGD迭代一定次数后,收敛很慢;Momentum要好于SGD,但Adma下降最快,而且性能也最好。

6.9 权重初始化

在机器学习中,如何初始化权重非常重要,如果初始化不当,将直接导致无法收敛。比例如果把权重初始化为0或全为一样的值,多一个多维矩阵,如一个mxn的权重参数w,在误差反向传播时,所以的权重都会进行相同的更新,通过多次迭代后,可能更新为相同的值,这就严重偏离了源数据分布。所以为防止权重均一化,必须随机生成初始值(一般使随机初始化的数据满足正态分布)。
是否我们就一概为把权重参数都随机生成就成了呢?在实际操作时,我们还需要进一步分析,权重参数的正向传播和反向传播过程中,还受激活函数的影响。一般来说,对对称型的激活函数,如果sigmoid、softmax、tanh等,对随机生成的满足正态分布的数据,还需要考虑前一层的网络节点数(假设前一层的网络层输出节点数为n),如下图所示。使正态分布的标准差除以√(n+m) ,以使数据呈现更稳定和更有代表性,这种初始化方法称为Xavier初始化。
图6-16 权重初始化的输入节点、输出节点数
对于非对称的激活函数(如ReLU、Leak-ReLU等),因这些激活函数本身偏置(如ReLU激活函数把小于0的都置为0),为使数据更有广度、还需要对标准差惩罚力度减少一点,一般使参数初始化的范围比原来扩大一倍,这种初始化方法称为Kaiming_He初始化。以下是各种初始化小结:
【说明】其中m、n分别表示权重矩阵W的输入、输出节点数,详细含义请参考上图。
如果对卷积核参数的初始化,PyTorch中缺省采用Kaiming_He初始化中均匀分布。大家可从conv.py源码中找到:
init.kaiming_uniform_(self.weight, a=math.sqrt(5))
偏置的初始化源码为:
bound = 1 / math.sqrt(fan_in)
init.uniform_(self.bias, -bound, bound)
(1)PyTorch代码实现:
•Xavier初始化:
torch.nn.init.xavier_normal_(tensor, gain=1)
torch.nn.init.xavier_uniform_(tensor, gain=1)
•Kaiming_He初始化:
torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
(2)NumPy实现
np.random.uniform(-r,r)
np.random.randn(n,m)*σ

第5章 梯度下降法

机器学习中一项重要任务就是求目标函数(或称为损失函数)的极小值或极大值。通过求目标函数的极值来确定相关权重参数,从而确定模型。如何求目标函数(注,这里的目标函数如果没有特别说明,一般指凸函数)的极值?最常用的一种方法就是梯度下降法。接下来我们将介绍梯度下降法及几种变种方法。

5.1.梯度下降法

梯度不仅是走向极值的方向,而且是下降最快的方向。
假设函数f(x)的有最小值,如图5-4所示。梯度下降法的数学表达式为:
x_1=x_0-\lambda\nabla f(x_0)
其中
1、参数λ称为步长或学习率,
图5-1 学习率对寻找最优点过程的影响
2、这里为何取梯度的负值?
从图5-2可知,无论从左到右还是从右到左,沿梯度的负方向都是指向极小值(如果梯度正方向将指向函数的极大值)。

图5-2 梯度下降法示意图
如何理解沿梯度是函数值下降最快的方向呢?下面进行简单说明。
根据导数的定义及泰勒公式,可得函数梯度与函数增量、自变量增量之间的关系。
f(x+\nabla x)-f(x)=(\nabla f(x))^T \nabla x+o(||\nabla x||)
如果\nabla x足够小,则可以忽略高阶无穷小项,从而得到:
f(x+\nabla x)-f(x)\approx(\nabla f(x))^T \nabla x
由于(\nabla f(x))^T \nabla x=||\nabla f(x)||?||\nabla x||cos\theta
其中\theta\nabla f(x)\nabla x之间的夹角,由于-1\leq cos\theta\leq 1,因此,
如果\nabla x=-\nabla f(x),cos\theta=-1,此时,当||\nabla f(x)||||\nabla x||一定时,沿梯度的反方向下降最快。
【说明】为何取负梯度?
求极小值,梯度的方向实际就是函数在此点下降最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号。
如果求极大值,则取梯度的正方向即可。

5.2 单变量函数的梯度下降法

假设函数f(x)=x^2+3,
使用梯度下降法,得到极值点。具体采用迭代法,沿梯度方向(或梯度负方向)逐步靠近极值点,如下图所示:

具体实现方法:

用迭代法求函数f(x)=x^2+3的最优点。

用python代码实现:

运行结果:
x1:0.4000
x2:0.0800
x3:0.0160
x4:0.0032
x5:0.0006
x6:0.0001
x7:0.0000
练习:用梯度下降法求函数f(x)=(x-1)^2+2的极值点(迭代3次或以上),并用python实现这个过程。

5.3 多变量函数的梯度下降法

如何用梯度下降方法求极值?以下通过一个简单示例来说明。
假设f(X)=x_1^2+x_2^2,该函数的最小值点为(0,0),用梯度下降法来一步步逼近这个最小值点。
假设从点(1,3)开始,学习率设为\eta=0.1,函数f(X)的梯度为:
\nabla f(X)=(2x_1,2x_2)
梯度方向是下降最快的方向,如下图所示:

实现上图的python代码:


用Python实现代码以上过程:

运行结果
x1:0.1074,x2:0.3221
x1:0.0115,x2:0.0346
x1:0.0012,x2:0.0037
x1:0.0001,x2:0.0004
x1:0.0000,x2:0.0000
练习:
用梯度下降法求函数f(x_1,x_2)=(x_1-1)^2+(x_2-1)^2的最优点,并用python实现并可视化。

5.4 梯度下降法的应用

梯度可以通过迭代的方法来求极值点,但更重要的作用是通过这个过程,来求梯度中的权重参数,从而确定模型。
例如,
求梯度时,往往涉及很多样本,根据这些样本更新参数。每次更新时,如何选择样本是有讲究的。
如果样本总数不大,我们每次更新梯度时,可以使用所有样本。但如果样本比较大,如果每次都用所有样本更新,在性能上不是一个好的方法,这时我们可以采用其它方案,这样既保证效果,又不影响性能。训练时根据样本选择方案不同,大致可分为:
(1)随机梯度下降法
每次求梯度时,不是使用所有样本的数据,而是每次随机选取一个样本来求梯度。这种方法每次更新梯度较快,但这种方法更新梯度振幅较大,如果样本较大,这样方法也非常耗时,效果也不很理想。
(2)批量梯度下降法
针对随机梯度下降法的不足,人们又想到一个两全其美的方法,即批量随机梯度下降法,这种方法每次更新梯度时,随机选择一个批量来更新梯度。这种方法有更好稳定性,同时性能方面也不错,尤其适合与样本比较大时,优势更加明显。
用梯度下降法拟合一条直线:
h_{\theta} (x)={\theta}_1 x+{\theta}_0
其中:\theta_0 ,\theta_1为参数。
假设y为真实值,根据不同的样本x,代入h_{\theta}(x)便可得到预测值。
我们的目标是尽量使真实值y与预测值h_{\theta}(x)尽可能接近,换句话,就是使它们之间的距离,通过不断学习样本,不断更新参数\theta=[\theta_0,{\theta}_1],使以下目标函数的值最小。
L(\theta_0,\theta_1)=\frac{2}{m}\sum_{i=1}^m(y^i-h_{\theta}(x^i))^2
即:\underset{\theta_0,\theta_1}{lim}L(\theta_0,\theta_1)
使用批量梯度下降法处理以上这个回归问题,具体算法如下:
\theta_i=\theta_i-\lambda\frac{\partial}{\partial\theta_i}L(\theta_0,\theta_1),i=0,1
写成矩阵的形式:
h_{\theta}(x)=\theta_0+\theta_1 x_1+\cdots+\theta_n x_n
用X表示m个样本:X=\left(\begin{matrix}1&x_1^1&\cdots&x_n^1 \\ \vdots&\vdots&\ddots&\vdots \\ 1&x_1^m&\cdots&x_n^m\end{matrix}\right),这是一个m\times(n+1)矩阵
\theta=\left(\begin{matrix}\theta_0 \\ \theta_1\\ \vdots \\ \theta_n\end{matrix}\right) 这是一个(n+1)\times1矩阵
X\theta内积的形状为:m\times1
Y=\left(\begin{matrix}y_1 \\ y_2\\ \vdots \\ y_m\end{matrix}\right)这是一贯mx1向量,
使用矩阵向量方式定义损失值:

5.5 用Python实现批量梯度下降法

批量梯度下降法用Python实现:

训练模型并可视化运行结果

运行结果如下:
最终j_history值:
[0.10784944]
最终theta值:
[[-0.27223179]
[ 0.6187312 ]]
可视化结果如下:

【说明】

5.6np.array与np.mat的区别

1.生成数组所需数据格式不同
np.mat可以从string或list中生成;而np.array只能从list中生成。
2.生成的数组计算方式不同
np.array生成数组,用np.dot()表示内积,(*)号或np.multiply()表示对应元素相乘。
np.mat生成数组,(*)和np.dot()相同,都表示内积,对应元素相乘只能用np.multiply()。
3.生成维度不同
np.mat只生成2维,np.array可生成n维。
建议使用array格式,因很多numpy函数返回值都是array格式。

5.7 用Python实现随机梯度下降法

1.定义损失函数、梯度函数

2.运行梯度函数及可视化运行结果

3.运行结果
最终j_history值:
[0.07909981]
最终theta值:
[-0.25281579 0.60842649]

【练习】
把数据集改为:
m = 100000
x1 = np.random.normal(size = m)
X = x1.reshape(-1,1)
y = 4. * x1 + 3. +np.random.normal(0,3,size = m)
x= np.hstack([np.ones((len(x1),1)), X])

第4章 梯度

偏导数是对一个变量求导,它只反应函数与一个自变量之间的关系,无法反应所有自变量与函数的关系。梯度则连接函数所有自变量的导数,综合了对所有自变量的关系,对单变量而言,梯度就是微分;对多变量函数而言,它是多元函数对多个自变量偏导数形成的向量。

4.1 单变量函数的梯度

对单变量函数(如f(x)=3x^2+4),其微分就是梯度,梯度通常用倒三角(\nabla)表示:
如函数f(x)在点x处的梯度,可表示为
\nabla f(x)=D(f(x))=\frac{df}{dx}=6x
函数f(x)在点x的梯度就是函数在该点的切线斜率。

4.2 多变量函数的梯度

多变量函数(如f(x,y)=3x^2+xy+y^2+1)的梯度
对多变量函数,如y=f(x_1,x_2,\cdots,x_n),则函数y的梯度是对所有自变量的偏导数构成的向量,表示如下:
\nabla f(x)=[\frac{\partial f}{\partial x_1},\frac{\partial f}{\partial x_2},\cdots,\frac{\partial f}{\partial x_n}]^T
梯度的方向就是函数给定点上升最快的方向,梯度的反方向是函数在给定点下降最快的方向。
梯度有什么作用呢?它是寻找函数极值的重要依据,下节将详细介绍。

4.3梯度与梯度直方图(HOG)

图像的梯度(x和y导数)非常有用,因为边缘和拐角(强度突变的区域)周围的梯度幅度很大,并且边缘和拐角比平坦区域包含更多关于物体形状的信息。
方向梯度直方图(Histogram of Oriented Gradient,HOG)

4.3.1图像梯度

梯度的方向是函数 f(x,y) 变化最快的方向,当图像中存在边缘时,有一些相邻像素的灰度值变化比较大,即一定有较大的梯度值。所以可以求图像的梯度来确定图像的边缘。
图像梯度是指图像某像素在x和y两个方向上的变化率(与相邻像素比较),是一个二维向量,由2个分量组成,X轴的变化、Y轴的变化 。
其中X轴的变化是指当前像素右侧(X加1)的像素值减去当前像素左侧(X减1)的像素值,如下图所示:

同理,Y轴的变化是当前像素下方(Y加1)的像素值减去当前像素上方(Y减1)的像素值。
计算出来这2个分量,形成一个二维向量,就得到了该像素的图像梯度。
分别对图像按照x方向和y方向进行求偏导,得到x梯度图和y梯度图。
导数的含义就是计算像素灰度值的变化率,对于离散图像而言,在图像上使用一阶差分来计算相邻像素之间的差值,从而得到图像的梯度。
下面这个公式表示了图像的梯度:
\begin{aligned}\nabla f &=\left(\begin{matrix}f_x \\ f_y\end{matrix}\right)\\ &=\left(\begin{matrix}\frac{\partial f(x,y)}{\partial x}\\ \frac{\partial f(x,y)}{\partial y}\end{matrix}\right) \\&=\left(\begin{matrix}{f(x+1,y)-f(x-1,y)} \\ {f(x,y+1)-f(x,y-1)}\end{matrix}\right)\\&=\left(\begin{matrix}{55-105} \\ {90-40}\end{matrix}\right) \\&=\left(\begin{matrix}{-50} \\ {50}\end{matrix}\right)\end{aligned}
梯度是矢量,存在幅值和方向。
梯度的幅值(magnitude)为:
g=\sqrt{f_x^2+f_y^2}=\sqrt{(-50)^2+(50)^2}=70.71
如果g大于某阈值,则认为该点(x,y)为边缘点。
梯度的方向(direction)为:
tanh^{-1}(\frac{f_x}{f_y})=(\frac{-50}{50})=-45^0
也可以使用二阶差分求梯度:
\frac{\partial^2 f(x,y)}{\partial x^2}=f(x+1,y)+f(x-1,y)-2f(x,y)
\frac{\partial^2 f(x,y)}{\partial y^2}=f(x,y+1)+f(x,y-1)-2f(x,y)
下面为一个有关边缘求导的示意图:

图片中的大部分边缘都不是突变的而是渐变的,对于斜坡区域,一阶导数将斜坡变成了平坦区域即变成了粗线,二阶导数将斜坡变成了两条中间存在平台区域的细线。

4.3.2边缘提取

在图像上除使用一阶差分来计算相邻像素之间的变化率外,我们还可以利用卷积和特定的算子来计算相邻像素的变化率。prewitt算子和sobel算子可以计算相邻三个点之间的变化率。它们用于一阶算子的边缘检测,利用像素点上下、左右相邻点的灰度差求取边缘。
求梯度有三种卷积核(robert,prewitt,sobel算子),每种卷积核有两个,对图像分别做两次卷积,一个代表水平梯度,一个代表垂直梯度。
1、Prewitt算子
Prewitt的两个算子
计算水平梯度,检测垂直边缘。
\left(\begin{matrix}-1&0&1 \\ -1&0&1 \\ -1&0&1\end{matrix}\right)
计算垂直梯度,检测水平边缘。
\left(\begin{matrix}-1&-1&11 \\ 0&0&0 \\ 1&1&1\end{matrix}\right)
2.sobel算子
Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑作用,能很好的消除噪声的影响。Sobel算子在Prewitt算子的基础上进行了改进,增强了中间位置的权重。与Prewitt算子、Roberts算子相比效果更好。
计算水平梯度,检测垂直边缘。
\left(\begin{matrix}-1&0&1 \\ -2&0&2 \\ -1&0&1\end{matrix}\right)
计算垂直梯度,检测水平边缘。
\left(\begin{matrix}-1&-2&-1 \\ 0&0&0 \\ 1&2&1\end{matrix}\right)
Sobel更强调了和边缘相邻的像素点对边缘的影响。相比较Prewitt算子,Sobel算子能够较好的抑制噪声效果。
假设原图像矩阵为A
则有:
f_x=\left(\begin{matrix}-1&0&1 \\ -2&0&2 \\ -1&0&1\end{matrix}\right)*A
f_y=\left(\begin{matrix}-1&-2&-1 \\ 0&0&0 \\ 1&2&1\end{matrix}\right)*A

4.3.3 sobel算子实例

运行结果:

执行sobel算子

运行结果

4.3.4 sobel算子与卷积核

sobel算子与卷积神经网络中的卷积核功能类似。这是卷积核有一个不足:就是提取概要信息,随着层数的增加将不可避免丢失很多信息,为避免这个问题,人们提出残差网络等方法弥补其不足。
【延伸思考】算子不同方向的偏导与卷积核的不同通道的作用有何异同?

第3章 偏导数与矩阵

3.1.黑塞矩阵

费马定理给出了多元函数极值的必要条件,黑塞矩阵的正定性是极值的充分条件。此外,黑塞矩阵与多元函数的极值、凹凸性有密切的关系。
黑塞矩阵是由多元函数的二阶偏导数组成的矩阵,假设函数f(x_1,x_2,\cdots,x_n)二阶可导,黑塞矩阵由所有二阶偏导数构成,函数f(x_1,x_2,\cdots,x_n)的黑塞矩阵定义为:
\nabla(\nabla f(x))=\nabla^2f(x)=\left(\begin{matrix}{\frac{\partial^2 f}{\partial x_1^2}}&\cdots& {\frac{\partial^2 f}{\partial x_1{\partial x_n}}}\\ {\vdots}&\cdots&\vdots \\ \frac{\partial^2 f}{{\partial x_n}{\partial x_1}}&\cdots&{\frac{\partial^2 f}{\partial x_n^2}}\end{matrix}\right)
这是一个n阶矩阵,一般情况下,多元函数的混合二阶偏导数与次序无关,即:
\frac{\partial^2 f}{\partial x_i\partial x_j}=\frac{\partial^2 f}{\partial x_j\partial x_i}
因此,黑塞矩阵是一个对称矩阵。
费马引理给出了多元函数极值的必要条件,极值的充分条件由黑塞矩阵的正定性决定。
例1:求函数f(x,y,z)=2x^2-xy+y^2-3z^2的黑塞矩阵。
函数f的黑塞矩阵为:
\left(\begin{matrix}{\frac{\partial^2 f}{\partial x^2}}&{\frac{\partial^2 f}{\partial x{\partial y}}}& {\frac{\partial^2 f}{\partial x{\partial z}}}\\ {\frac{\partial^2 f}{\partial y{\partial x}}}&{\frac{\partial^2 f}{\partial y^2}}&{\frac{\partial^2 f}{\partial y{\partial z}}}\\ \frac{\partial^2 f}{{\partial z}{\partial x}}&{\frac{\partial^2 f}{\partial z{\partial y}}}&{\frac{\partial^2 f}{\partial z^2}}\end{matrix}\right)=\left(\begin{matrix}4&-1&0 \\ -1&2&0 \\ 0&0&-6\end{matrix}\right)
练习:
求函数f(x,y)=x^2 y-xy^2对应的黑塞矩阵。

3.2 凹凸性判别法则

一元函数的凹凸性定义可以推广到多元函数,即:对于函数f(x),在其定义域内的任意两点x和y,及任意实数0\leq\theta\leq 1,都有:
f(\theta x+(1-\theta)y)\leq\theta f(x)+(1-\theta)f(y)
则函数f(x)为凸函数,反之,为凹函数。
函数f(x,y)=x^2+y^2是凸函数,f(x,y)=-x^2-y^2为凹函数。它们对应图像如下:

一元函数的凹凸性可根据二阶导数判断,多元函数可根据对应的黑塞矩阵的判断:
即:假设多元函数f(x)二阶可导,如果对应的黑塞矩阵半正定,则函数f(x)是凸函数;
如果对应的黑塞矩阵负正定,则函数f(x)是凹函数。

3.3 极值判别法则

一元函数的极值点的必要条件是该点为驻点,充分条件通过二阶导数来判断。这些规则可以推广到多元函数。多元函数的极值点的必要条件是该点为驻点,充分条件通过对应黑塞矩阵
来判断。具体规则如下:
(1)黑塞矩阵正定,函数在该点有极小值;
(2)黑塞矩阵负定,函数在该点有极大值;
(3)黑塞矩阵不定,则该点不是极值点,或是鞍点。

3.4雅可比矩阵

雅可比矩阵是由多个多元函数的所有偏导数构成的矩阵。假设:
y_1=f_1 (x_1,x_2,\cdots,x_n ),y_2=f_2 (x_1,x_2,\cdots,x_n ),\cdots,y_m=f_m (x_1,x_2,\cdots,x_n )
由这些函数构成的雅可比矩阵为:
\frac{\partial y}{\partial x}=\frac{\partial (y_1,y_2,\cdots,y_m)}{\partial (x_1,x_2,\cdots,x_n)}=\left(\begin{matrix}{\frac{\partial^2 f_1}{\partial x_1^2}}&\cdots& {\frac{\partial^2 f_1}{\partial x_1{\partial x_n}}}\\ {\vdots}&\cdots&\vdots \\ \frac{\partial^2 f_m}{{\partial x_n}{\partial x_1}}&\cdots&{\frac{\partial^2 f_m}{\partial x_n^2}}\end{matrix}\right)
这是一个m\times n的矩阵,每一行为一个多元函数的梯度(或所有偏导数)。

例2:求下列函数的雅可比矩阵:
u=x^2+2xy+z
v=3x-xy^2+z^2
这些函数的雅可比矩阵为:
\frac{\partial (u,v)}{\partial (x,y,z)}=\left(\begin{matrix}{\frac{\partial u}{\partial x}}&{\frac{\partial u}{\partial y}}& {\frac{\partial u}{\partial z}}\\ {\frac{\partial v}{\partial x}}&{\frac{\partial v}{\partial y}}&{\frac{\partial v}{\partial z}}\end{matrix}\right)=\left(\begin{matrix}{2x+2y} & 2x & 1 \\ {3-x^2} & {-2xy} & 2z\end{matrix}\right)
神经网络中通常包括多个多元函数的情况,如下图所示:

X=\left(\begin{matrix}x_1\\x_2\\ x_3\end{matrix}\right),w=\left(\begin{matrix}w_{11}&w_{12}\\w_{21}&w_{22}\\ w_{31}&w_{32}\end{matrix}\right),y=\left(\begin{matrix}y_1 \\ y_2 \end{matrix}\right)
上图可用如下表达式表示:
Y=W^TX=y=\left(\begin{matrix}w_{11}x_1+w_{12}x_2+w_{13}x_3 \\ w_{21}x_1+w_{22}x_2+w_{23}x_3 \end{matrix}\right)
由此可得:
\frac{\partial Y}{\partial X}=\frac{\partial (y_1,y_2)}{\partial (x_1,x_2,x_3)}=W^T
【延伸思考】对W^T X加上激活函数(如sigmoid函数),此时\frac{\partial Y}{\partial X}=?

3.5 链式法则的矩阵形式

前面我们介绍了雅可比矩阵,它是涉及多元复合函数求导,这里雅可比矩阵可以简化链式法则的表达形式。
假设z=g(y_1,y_2,\cdots,y_m),y_i=f_i (x_1,x_2,\cdots,x_n)
根据链式法则,z对x的偏导可以通过z对y_i求导,x_j对x求导来实现。具体计算过程如下:
\frac{\partial z}{\partial x_i}=\sum_{j=1}^m\frac{\partial z}{\partial y_j} \frac{\partial y_j}{\partial x_i}
写成矩阵的形式就是:

其中\frac{\partial Y}{\partial X}矩阵就是雅可比矩阵。

3.6 对向量和矩阵求导

在神经网络中我们常见如下表达式:
y=Wx
其中W为mxn矩阵,x是n维向量,y是m维向量。假设f为一个激活函数,y通过激活函数后为f(y)函数,现在对f(y)求导,激活函数不改变y的维度,所以f(y)也是m维向量。
根据链式法则,有:

用矩阵和向量表示,上式可简写为:
\nabla_w f=(\nabla_y f)x^T

3.7 应用:最小二乘法

最小二乘法(二乘”就是平方,所以又称最小平方法)是一种数学优化技术。 它通过最小化误差的平方(即通常我们称之为损失函数)和寻找数据的最佳函数匹配。 利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。为解决过拟合问题可以在损失函数后加上正则项。
对多元函数的最小二乘法,可以用矩阵或向量表示,如对线性回归的函数y=w^T x+b,其中w和b为参数。如果用向量或矩阵来表示,可先作如下处理:
W=[w,b],X=[x,1]
则wx+b可表示为:W^T X,目标函数可表示为:
L(w)=\frac{1}{2}\sum_{k=1}^N(W^T X_k -y_k)^2
其中N表示样本总数,y_i表示第i个样本对应的标签值(或实际值)。L(w)
是一个凸函数,可用最小二乘法求其最小值:
(1)对函数L(w)求一阶偏导
\frac{\partial L}{\partial x_i}=\frac{1}{2}\sum_{k=1}^N(W^T X_k -y_k)x_{ki} \tag{3.1}
其中x_{ki}表示第k个样本的第i个分量。
(2)求二阶偏导,得到黑塞矩阵
\frac{\partial^2 L}{\partial w_i\partial w_j}=\sum_{k=1}^N x_{ki}x_{kj}
由此可得,目标函数的黑塞矩阵为:
其中n表示向量W的维度(或长度)。
(3)证明黑塞矩阵的正定性
对任意非0向量x有:
x^T Hx=x^T X^T Xx=(Xx)^T Xx\geq 0
故目标函数的黑塞矩阵为正定矩阵,由此可知,目标函数为凸函数,故存在极小值。驻点就是极值点。
(4)求解参数w
目标函数对参数w求导,并令导数为0,解得极值点。
由式(3.1)可得:
\sum_{k=1}^N(W^T X_k -y_k)x_{ki}=0
W^T X_k展开为:\sum_j^n w_j x_{kj},从而有:
\sum_{k=1}^N(\sum_{j=1}^n w_j x_{kj} -y_k)x_{ki}=0
对上式进行整理可得:
\sum_{k=1}^N\sum_{j=1}^n w_j x_{kj}x_{ki}=\sum_{k=1}^n y_k x_{ki}
写成矩阵的形式可得:
X^T Xw=X^T y
如果W的系数矩阵X^T X可逆,则可解得方程组的解w为:
W=(X^T X)^T X^T y
如果w的维度和样本数较大,这种计算非常好资源,尤其当X^T X不可逆,该如何求呢?
对这些情况,我们可以采用梯度下降,通过不断迭代,最后收敛于极值点来实现。

第2章 多元函数微积分

2.1一阶偏导数

前面主要介绍了一元函数,在机器学习中,要处理的函数大多是多元函数(如函数y=f(x_1,x_2,\cdots,x_n))。因此,我们需要把导数、微分拓展到多元函数上。
对多元函数如何求导呢?最简单有效的方法就是把多元微分转换为一元微分,具体实现方法就是每次只改变一个变量,其他变量的值固定不变,由此得到偏导数。
偏导数是多元函数对每个自变量的求导,对于多元函数y=f(x_1,x_2,\cdots,x_n),它在(x_1,x_2,\cdots,x_n)点处对x_i的偏导数定义为下式的极限。
\frac{\partial y}{\partial x}=\underset{\Delta x_i \to 0}{lim}\frac{f(x_1,\cdots,x_i+\Delta x_i,\cdots,x_n)-f(x_1,\cdots,x_i,\cdots,x_n)}{\Delta x_i} \tag{2.1}
这与导数的定义相同,其中\partial为偏导数符合。为计算\frac{\partial y}{\partial x_i},我们可以简单把变量x_i外的变量x_1,\cdots,x_{i-1},x_{i+1}\cdots,x_n作为常量,并计算y关于x_i的导数。对于偏导数的表示,以下几个表示方式是等价的:
\frac{\partial y}{\partial x_i}=\frac{\partial f}{\partial x_i}=f_{x_i}=f_i=D_i f
偏导数的几何意义,如图2-1所示,这里以一个二元函数为例,假设z=f(x,y),
则偏导\frac{\partial}{\partial x}f(x,y_0) 在点(x_0,y_0)值就是曲线z=f(x,y_0)在点(x_0,y_0)的切线斜率。

图2-1 偏导数的几何意义
例1 求函数z=x^2+3xy+y-1,求\frac{\partial z}{\partial x}\frac{\partial z}{\partial y}在点(4,-5)的值。
解:求\frac{\partial z}{\partial x},把y看作常量,然后对x求导。
\frac{\partial z}{\partial x}=\frac{\partial}{\partial x} (x^2+3xy+y-1)=2x+3y
\frac{\partial z}{\partial x}在点(4,-5)的值为:2\times4+3\times(-5)=-7
同理可得,\frac{\partial z}{\partial y}在点(4,-5)的值为:13

2.2 高阶偏导数

对偏导数继续求偏导数可以得到高阶偏导数,比一元函数的高阶导数复杂,每次求导时可以对多个变量进行求导,因此有多种组合。对多元函数y=f(x_1,x_2,\cdots,x_n)的二阶导数,可以先对x_i求偏导数,得到\frac{\partial y}{\partial x_i},然后将此一阶偏导数对x_j继续求偏导数。
\frac{\partial^2 y}{\partial x_j\partial x_i}=\frac{\partial}{\partial x_j}(\frac{\partial y}{\partial x_i})
如果二阶混合偏导数连续,则与求导顺序无关,即有:
\frac{\partial^2 y}{\partial x_j\partial x_i}=\frac{\partial^2 y}{\partial x_i\partial x_j}
例2:求函数f(x,y)=x^2+xy-y^2
(1)一阶偏导
(2)二阶偏导
解:(1)一阶偏导有:
\frac{\partial f}{\partial x}=2x+y
\frac{\partial f}{\partial y}=x-2y
(2)二阶偏导有:
\frac{\partial^2 f}{\partial x^2}=\frac{\partial}{\partial x}(2x+y)=2
\frac{\partial^2 f}{\partial x\partial y}=\frac{\partial}{\partial y}(2x+y)=1
\frac{\partial^2 f}{\partial y\partial x}=\frac{\partial}{\partial x}(x-2y)=1
\frac{\partial^2 f}{\partial y^2}=\frac{\partial}{\partial y}(x-2y)=-2
如果二阶混合偏导数连续,则与求导次序无关,即有:
\frac{\partial^2 f}{\partial x\partial y}=\frac{\partial^2 f}{\partial y\partial x}

2.3多元复合函数的链式法则

多元复合函数求导的链式法则是一元函数链式法则的推广。首先,我们看二元函数的情况,注意需要对相关的全部中间变量(如下例中u和v)应用链式法则。假设z=f(u,v),u=g(x,y),v=h(x,y),则z对x,y的偏导导数为:
\frac{\partial z}{\partial x}=\frac{\partial z}{\partial u} \frac{\partial u}{\partial x} +\frac{\partial z}{\partial v} \frac{\partial v}{\partial x}
同理
\frac{\partial z}{\partial y}=\frac{\partial z}{\partial u} \frac{\partial u}{\partial y} +\frac{\partial z}{\partial v} \frac{\partial v}{\partial y}
\frac{\partial z}{\partial x}的求导过程如图2-2所示。

图2-2 多元复合函数的链式法则
练习: