深度学习背后的核心有标量、向量、矩阵和张量这 4 种数据结构,可以通过使用这些数据结构,以编程的方式解决基本的线性代数问题
x = 6.0
print(type(x)) <class 'float'>
y = 6
print(type(y)) <class 'int'>
一个向量表示一组有序排列,并可以通过索引获取其中对应位置的数值。一般情况下,我们会使用 numpy 对向量进行表示和运算。numpy 是 Python 的一个扩展程序库,能够很好地支持数组、向量、矩阵的运算。官网地址为:https://numpy.org/
标量是一个数字,所以标量在跟向量进行加减乘除运算时,实际上与向量中的每一个数字都同步进行了计算,代码如下:
# 向量和标量的运算
import numpy as np
s1 = np.array([1, 2, 3, 4])
print(s1 * 2) # [2 4 6 8]
s2 = s1 + 6
print(s2) # [ 7 8 9 10]
向量之间的加减操作是各自对应位置的加减操作。因为 Python 中列表相加实现的是两个列表拼接,所以向量的计算不能使用列表,要使用 numpy 的 ndarray 进行加减运算
给定如下图的两个向量,经过加运算之后,得到如下结果:
import numpy as np
s1 = [1, 2, 3]
s2 = [4, 5, 6]
print(s1 + s2) # [1, 2, 3, 4, 5, 6]
# -----------------------------
print(np.add(s1, s2)) # [5 7 9]
print(np.array(s1) + np.array(s2)) # [5 7 9]
print(type(np.add(s1, s2))) # <class 'numpy.ndarray'>
向量之间的乘法操作:点乘(内积)、叉乘(外积)和对应项相乘
点乘、叉乘及对应项相乘的代码如下所示:
import numpy as np
s1 = [1, 2, 3]
s2 = [4, 5, 6]
# 点乘 result:32
print(np.inner(s1, s2))
# ------------------------
print(np.outer(s1, s2))
'''叉乘 result
[[ 4 5 6]
[ 8 10 12]
[12 15 18]]'''
# ------------------------
print(np.multiply(s1,s2))
# 对应项相乘 result:array([ 4 10 18])
矩阵一般是一个 m 行 n 列的矩形阵列,一般的表达方式如下图所示:
矩阵中每个元素都有 m 和 n 两个下标,分别代表行和列的位置,所以矩阵也可以通过索引直接定位元素的值。
矩阵的加减法操作跟向量类似,也是对应位置进行相加减。如图所示,红色和绿色的框分别代表了不同位置数字的计算过程:
代码如下所示:
import numpy as np
m1 = np.mat([[1, 2], [3, 4]])
print(m1)
print('------------------------')
m2 = np.mat([[5, 6], [7, 8]])
print(m2)
print('------------------------')
print(m1 + m2)
print(type(m1 + m2))
矩阵的乘运算也有两种形式:
可以看出:每个新的元素都是由一个行向量和一个列向量做点乘之后生成的
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(a)
print('------------')
print(b)
print('------------')
print(a*b) # 对应相乘
print('------------')
print(a.dot(b)) # 矩阵乘法 每个新的元素都是由一个行向量和一个列向量做点乘之后生成
范数是一种距离的表示,或者说向量的长度。常见的范数有: L0 范数、L1 范数和 L2 范数
L0 范数和 L1 范数都能实现权值稀疏。但 L1 范数是 L0 范数的最优凸近似,它比 L0 范数有着更好的优化求解的特性,所以被更广泛地使用。
为什么要实现权值稀疏呢?
在设计模型的过程中,我们有时会使用到大量的特征(例如在推荐系统中,特征维度都是上亿的),每个特征都会从不同的角度体现问题的不同信息。这些特征经过某些方式的组合、变换、映射之后,会按照不同的权重得到最终的结果。
但有时候,有一部分特征对于最后结果的贡献非常小,甚至近乎零,这些用处不大的特征,我们希望能够将其舍弃,以更方便模型做出决策。这就是权值稀疏的意义。
L2 也代表一种距离,即欧式距离,L0 和 L1 可以起到权值稀疏的作用,L2 也有它的作用,那就是防止过拟合。
L2 是如何解决过拟合的呢?
微积分是现代数学的核心基础知识,深度学习中会用到的知识点,分别是导数、偏导数和梯度
这里有两个需要注意的地方,第一个是 Δx 一定要趋近于 0,第二个是极限 a 要存在。F(x)=2x 作图如下:
一个函数在某一点的导数描述了这个函数在这一点附近的变化率,导数一般记为:
不光函数有导数,导数也有导数。代表函数在 x 处斜率(导数)的变化率我们称之为二阶导数。由此类推,还有高阶导数等
在实际应用中,很多函数都有多个变量。为了方便分析不同变量与函数的关系,为单个变量求导是很有必要的。这个时候,我们需要让其他变量不变,只有某一个变量发生变化,这种情况下的求导我们称之为 “偏导数”。公式如下:
导数就是函数在某个点上的斜率。如果我们把坐标系从二维变成三维,甚至更多维时,偏导数就好理解了:它实际上是函数在不同方向(坐标轴)上的变化率。
假定我们有一个函数 z = f(x,y),我们想要求这个函数在 x 方向的导数,只需要将 y 固定,在 x 上增加一个小的增量Δx;同样的,如果要求 y 方向的导数,则需要固定 x,y 上增加一个增量Δy,例如:
分别表示函数在 x 轴方向和 y 轴方向上的导数
在机器学习中,梯度是一个出现频率极高的词语,模型的设计、训练、优化等过程中,梯度都是一个核心概念。函数的所有偏导数构成的向量就叫作梯度。我们用 ∇f 表示,公式化的形式为:
注意:梯度是一个向量。同时,梯度向量的方向即为函数值增长最快的方向。
熵,也称信息熵。假定我们有一枚标准的硬币,每次投掷,得到正面和反面的概率都是 1/2,不确定性非常大。假如我们在硬币上做点手脚,在正面加点重量,那么每次投掷的概率就发生了变化,正面朝上的概率就比原来大了,比如此时变成了 2/3,这种正反面的不确定性就减少了。
对于每一个事件(情况)的发生,都有一个信息量的度量,它的公式为:
其中 P(x) 是 x 发生的概率
KL 散度,也称为相对熵,它衡量了两个分布之间的差异,它的公式如下:
上面的 p(xi) 为真实事件的概率分布,q(xi) 为理论拟合出来的该事件的概率分布。因此该公式字面上的含义就是真实事件的信息熵,同理论拟合的事件的信息量与真实事件的概率的乘积的差的累加。
交叉熵也衡量了两个分布之间的差异,但是与 KL 散度的区别在于,交叉熵代表用拟合分布来表示实际分布的困难程度,其公式如下:
三种度量方式的公式放在一起看,可以发现其中的关联,如下所示:
作者:叶庭云 CSDN:https://yetingyun.blog.csdn.net/ 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 觉得文章对你有帮助、让你有所收获的话,期待你的点赞呀,不足之处,也可以在评论区多多指正。