当前位置:首页 > 教育 > 正文

机器学习算法原理——矩阵微积分,构建你的“黑客帝国”

你吃了蓝色的药丸,故事就结束了,你在床上醒来,相信你愿意相信的一切。你吃了红色的药丸…你留在仙境,我让你看看兔子洞有多深。

这是《黑客帝国》中墨菲斯对尼奥说的名言。你必须做出同样的选择,你想继续使用像pytorch和tensorflow这样的自动化框架而不知道其背后原理?还是想更深入地研究矩阵计算的世界,了解反向传播算法( backpropagation,BP)的工作原理?

线性代数基础知识

向量和矩阵

这里,我用不加粗的小写字母表示标量,如:

列向量会用加粗的小写字母表示,如:

行向量也用加粗的小写字母表示,但它们有一个T上标。T上标代表转置:

代表矩阵的符号将是加粗的大写字母:

也可以对一个矩阵进行转置,第一列会变成第一行,反之亦然:

一个向量或矩阵的维度是一个元组( 行数, 列数)。

让我们考虑下面的情况。

点积

点积也是为向量和矩阵定义的。但顺序很重要,左边的向量/矩阵的列数必须与右边的向量/矩阵的行数一致。

结果的维度是(左边输入的行数,右边输入的列数)

如果你有兴趣,下面更详细的点积是如何进行的。

为了得到输出的一个元素,我们将左边的一行和右边的一列向量/矩阵相乘并求和。

点积的重要性在于,它可以在许多不同的情况下使用。在力学中,它可以用来表示一个物体的旋转和拉伸。它也可以用来改变坐标系。

分析基础知识

和的导数

当我们想求一个和的导数时,相当于求每个加数的导数。

乘积法则

如果我们想求两个函数的乘积的导数,这两个函数都取决于我们想微分的变量,我们可以使用以下规则。

让我们考虑下面的例子:

那么?相对于?的导数是:

链式法则

我们要对一个函数?进行微分。这个函数取决于?,?取决于?。然后,我们可以应用链式法则:

让我们在这里做一个简单的练习:

矩阵微积分

了解这么多基础知识后,我希望你已经准备好进行矩阵微积分了!

我们可以用两种方式来写矩阵微积分,即所谓的 "分子布局(numerator layout)"和 "分母布局(denominator layout)"。在这篇文章中,我将使用分母布局。

标量与矢量的导数

一个标量函数相对于一个变量向量的导数是一个行向量。这个行向量有一列代表我们想要微分的每个变量。

让我们举个例子:

然后我们可以应用 "和的导数 "规则:

由于一个变量相对于另一个变量的导数是0,我们可以得到:

标量导数向量

如果我们有一个函数?,它输出一个向量,并想求它相对于一个变量的导数,我们得到一个列向量作为结果。

让我们考虑以下我们想要求 导 的向量值函数。

逐个向量求导

当对一个以向量为值的函数进行导数时,我们得到一个矩阵。我使用一个有2个输出值和3个输入变量的函数作为例子。

你可以把它看成是 "标量乘矢量 "和 "矢量乘标量导数 "的结合。我们沿着行改变函数输出的元素,沿着列改变变量的元素。

得到的矩阵的维度为:(输出的大小,输入的大小)

现在我们通过一个例子说明:

总结

矢量链法则

让我们考虑以下情况。向量?是向量?的一个函数。向量?本身是向量?的函数。因此,?(?(?))相对于?的导数可以通过以下方式计算。

我们可以看到,向量链法则与标量链法则看起来几乎一样。点积仍然在公式中,我们必须构造一个一个向量的导数矩阵。

这里有一个小例子。

我们计算偏导数。

现在我们展开点积。

最后进行简化,得到结果。

常数的点积

我们可以把常数矩阵和向量看作是标量常数。允许对它们进行因式分解。但是请记住,对于两个非标量之间的点积来说,顺序很重要。

现在我们可以把矩阵?分解出来,如果它是一个常数并且不依赖于?的话。

我们用向量导数矩阵来构造向量:

对角线上有1,其他地方有0的矩阵被称为单位矩阵。所有与它相乘的东西都保持不变。因此,最终结果是:

有趣的是,尽管整个方程包含了向量和矩阵,但我们得到的结果与我们根据标量微积分所预期的一样。然而,情况并非总是如此,因为并非所有标量微积分的规则都适用于多变量微积分。

最后

我很高兴你服用了红色药丸,加入了我在矩阵微积分领域的深入研究。如果这对你来说比较陌生,那么你应该多加练习,自己去看一些例子。

有话要说...

取消
扫码支持 支付码