一、实验介绍
1.1 实验内容
虽然在实验一中我想尽量少的引入(会让人放弃继续学习的)数学概念,但我似乎还是失败了。不过这几乎是没有办法的事,要想真正学会深度学习,没有一定的数学基础(高等数学、线性代数、概率论、信息论等),(几乎)是不可能的。学深度学习不学其中的原理你可能能够学会搭建模型,但当模型出了问题或者无法训练出好的结果时,不懂原理是很难调试的。
不过话说回来,要想理解深度学习中的基本概念(而不是想要在深度学习领域做研究),要学的数学知识也不是很难。你应该很快就能掌握这些知识。
所以本次实验课,我们介绍本课程会涉及到的数学知识以及在之后“ 图片英文字母识别”的项目中要用到的python numpy
模块。
警告:本次实验介绍的数学知识只是为了让你更好地理解本课程中的相关概念,有些地方不够严谨,请勿等同于数学教科书参考
1.2 实验知识点
- 导数、偏导、梯度、链式法则
- 矩阵运算基本法则
- numpy基本运算介绍
1.3 实验环境
- python 2.7
- numpy 1.12.1
二、实验步骤
2.1 导数、偏导、梯度、复合函数求导链式法则
2.1.1 函数值随自变量的变化速率--导数
高中数学里面我们已经学过,函数值随自变量的变化速率是导数。导数衡量的,其实是一个变量对函数值影响能力的大小。导数值越大,则该变量每改变一点对最终函数值的影响越大。且导数值为正时,代表自变量增大时函数值增大,反之若导数值为负,则自变量增大时函数值减小。
常见函数的导函数:
原函数f | 导函数f' |
---|---|
任何常数 | 0 |
x | 1 |
e^x | e^x |
x^2 | 2*x |
1/x | -1/x^2 |
ln(x) | 1/x |
2.1.2 从单变量到多变量--偏导
上面我们列举的都是只有一个自变量的函数,如果自变量有多个,如何求导数呢?比如对于函数f=x+y,怎样衡量x和y分别对函数值f的影响快慢呢?
数学上引入了偏导的概念,对一个多变量函数f,求f对其中一个自变量x的偏导很简单,就是将与x无关的其他自变量视为常亮,再使用单变量求导的方法去求导。得到的即为f对x的偏导。比如:
令f=x+2y, 则f对x求偏导的结果为1,对y求偏导的结果为2。
令f=x*y, 则f对x求偏导结果为y,对y求偏导结果为x。
2.1.3 多变量函数变化最快的方向--梯度
2.1.1
中我们提到了,对单变量函数来说,导数值的正负代表自变量对函数值影响的“方向”:变大或变小。那对于多变量函数来说,如何表达这个方向呢?这就引入了梯度的概念:
梯度是一个向量,向量长度与自变量的个数相等,且其中的每一个元素为函数对于对应变量求偏导的值。
比如对于函数f=x*y, 其梯度向量为(y,x)
, 对于具体的自变量的值,比如x=1,y=1
的点,其梯度向量就为(1,1)
, 又比如x=10,y=-20
点,其梯度向量就为(-20,10)
。
梯度作为一个向量,指向的是使函数值增大最快的方向(回想第一次实验中的损失函数图,梯度所指的方向是向上的)。
2.1.4 复合函数求导链式法则
上面我们讲的求导数和求偏导,都是对于“简单函数”,对于“复合函数”,比如下面这样的函数:
f1(x)=1/x
f2(x)=e^x
f=f1(f2(x))
f
函数是一个复合函数,它由f1
和f2
函数“串联”而来。其中f1
的输入是f2
的输出。
对于复合函数求导,一种方法是将复合函数展开,比如对于上面的函数, 得到f=1/(e^x)
,然后再根据简单函数求导法则对自变量求导。过程如下:f' = -1/((e^x)^2)*((e^x)') = -(e^x)/((e^x)^2) = -1/(e^x)
即 f' = -1/(e^x)