深度学习DeepLearning - 自学笔记01
数学基础与Python库
1.1 Python - python之禅
import this
# 在Ipython中执行以上代码,可得到如下内容。
The Zen of Python, by Tim Peters
Beautiful is better than ugly. Explicit is better than implicit.
Simple is better than complex. Complex is better than complicated.
Flat is better than nested. Sparse is better than dense. Readability
counts. Special cases aren’t special enough to break the rules.
Although practicality beats purity. Errors should never pass silently.
Unless explicitly silenced. In the face of ambiguity, refuse the
temptation to guess. There should be one-- and preferably only one
–obvious way to do it. Although that way may not be obvious at first unless you’re Dutch. Now is better than never. Although never is often
better than right now. If the implementation is hard to explain,
it’s a bad idea. If the implementation is easy to explain, it may be a
good idea. Namespaces are one honking great idea – let’s do more of
those!
1.2 数学基础
1.2.1 线性代数基础
- 向量
向量就是n个实数组成的有序数组,称为n维向量。
如果没有特别说明,一个n维向量一般表示一个列向量,如 a = [a1 a2 a3 … an]
数组中每一个元素被称为一个分量。
多个向量可以组成一个矩阵。
- 矩阵
矩阵是一个2维的概念。一个向量也可视为大小为 m x 1 的矩阵,如 [a11 a21 … am1],既是一个 m x 1矩阵,又是一个m维向量。
单位矩阵是一种特殊的矩阵,其主对角线上的元素为1,其余元素为0。
n阶单位矩阵In是一个 n x n 的方形矩阵,可以记为 In = diag(1,1, … , 1)。
- 向量的运算
常用向量运算:1. 向量的加减法;2. 向量的点积(内积);这两种运算都需要参与运算的向量长度相同。
- 矩阵的运算
最常见的矩阵运算:加;减;乘;转置(不是除!)。
加减运算要求输入的两个矩阵规模相同(两个矩阵都是m行n列),运算结果为同样规模的矩阵。
乘法有2种:点积;元素乘。元素乘常用!
转置:行变列。
- 向量的范数
范数(Norm):机器学习中衡量一个向量大小。可以理解为一个将向量映射到非负实数的函数。通俗来讲,范数表示的是向量的“长度”。
最常用到的两个范数:L1范数和L2范数。
L2范数,也被称为欧几里得范数,表示从原点出发到向量x确定的点的欧几里得距离。向量的L2范数也被称作向量的模。
L1范数,就是向量中各个元素绝对值的和,用来度量向量的大小。针对问题中零和非零元素之间差异非常重要时使用。
1.2.2 微积分基础
- 导数
导数是反映瞬时变化率的量。核心思想是用平均速度,使得时间无限接近0,以逼近瞬时速度。
- 偏导数
简单理解,偏导数就是对多元函数求其中一个未知数的导数。如,在含x和y的函数中对x求导,此时将未知数y堪称是常数,相当于对未知数x求导。
f(x,y) = ax2+by2+cxy
f’x(x,y) = 2ax+cy
- 向量的导数
向量的求导方法:
- 标量对向量求导
- 向量对向量求导
- 导数法则
- 加减法则
- 乘法法则
- 链式法则
- 常见的向量和矩阵的导数
向量对于其本身的导数为单位向量,这一点与标量的计算相类似。
当一个数或者一个向量对其本身求导,所得结果将是1或者单位向量。
反映到深度学习神经网络中神经元的相互影响上,便可以理解为,一个神经元如果受到自身变化的影响,那么其自身变化多少,影响的大小就有多少。
矩阵A与向量x的乘积对x求偏导数,其结果为矩阵A的转置AT。这个规则常用于求解具有Ax关系的神经元之间的相互连接,也就是后一个神经元如果收到前一个神经元x的影响是Ax,那么当直接相连的前一个神经元增加(或减少)一个单位时,后一个神经元将相应的增加(或减少)A的转置AT个单位。
矩阵A与向量x的转置乘积对x求偏导数,其结果为矩阵A本身。这个规则常用于求解具有xTA关系的神经元之间的相互连接,也就是后一个神经元如果收到前一个神经元x的影响是xTA,那么当直接相连的前一个神经元增加(或减少)一个单位时,后一个神经元将相应的增加(或减少)A的转置A个单位。
- 梯度
之前的导数直接考量的是函数变化率,梯度则从另一个角度考虑函数变化最快的方向。
在机器学习和深度学习中梯度下降法用以求解损失函数的最小值。
梯度的本意是一个向量,该向量表示某一函数在某一点处的方向导数沿着向量方向取得最大值,即函数在该点处沿着该方向(梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度作为探测损失函数中最小损失的一个“指南针”,避免了寻找一个最小损失值时低效率的枚举情况发生,这对于机器学习和深度学习模型的优化求解具有很重要的意义。
1.3 Python库的操作
1.3.1 Numpy操作
- 基本模块
- array模块
# array的基本操作
import numpy as np
a=[1,2,3,4] # a是python中的list类型
b=np.array(a) # 数组化之后b的类型变为 ayyay
type(b) # b的类型是<type 'numpy.ndarray'>
b.shape # (4,)
b.argmax() # 取最大索引:3
b.max() # 取最大值:4
b.mean() # 取平均值:2.5
# numpy中实现矩阵转置
import numpy as np
x=np.array(np.arange(12).reshape((3,4)))
x
'''
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8