机器学习算法原理——矩阵微积分,构建你的“黑客帝国”
你吃了蓝色的药丸,故事就结束了,你在床上醒来,相信你愿意相信的一切。你吃了红色的药丸…你留在仙境,我让你看看兔子洞有多深。
这是《黑客帝国》中墨菲斯对尼奥说的名言。你必须做出同样的选择,你想继续使用像pytorch和tensorflow这样的自动化框架而不知道其背后原理?还是想更深入地研究矩阵计算的世界,了解反向传播算法( backpropagation,BP)的工作原理?
线性代数基础知识
向量和矩阵
这里,我用不加粗的小写字母表示标量,如:
列向量会用加粗的小写字母表示,如:
行向量也用加粗的小写字母表示,但它们有一个T上标。T上标代表转置:
代表矩阵的符号将是加粗的大写字母:
也可以对一个矩阵进行转置,第一列会变成第一行,反之亦然:
一个向量或矩阵的维度是一个元组( 行数, 列数)。
让我们考虑下面的情况。
点积
点积也是为向量和矩阵定义的。但顺序很重要,左边的向量/矩阵的列数必须与右边的向量/矩阵的行数一致。
结果的维度是(左边输入的行数,右边输入的列数)
如果你有兴趣,下面更详细的点积是如何进行的。
为了得到输出的一个元素,我们将左边的一行和右边的一列向量/矩阵相乘并求和。
点积的重要性在于,它可以在许多不同的情况下使用。在力学中,它可以用来表示一个物体的旋转和拉伸。它也可以用来改变坐标系。
分析基础知识
和的导数
当我们想求一个和的导数时,相当于求每个加数的导数。
乘积法则
如果我们想求两个函数的乘积的导数,这两个函数都取决于我们想微分的变量,我们可以使用以下规则。
让我们考虑下面的例子:
那么𝑦相对于𝑥的导数是:
链式法则
我们要对一个函数𝑦进行微分。这个函数取决于𝑢,𝑢取决于𝑥。然后,我们可以应用链式法则:
让我们在这里做一个简单的练习:
矩阵微积分
了解这么多基础知识后,我希望你已经准备好进行矩阵微积分了!
我们可以用两种方式来写矩阵微积分,即所谓的 "分子布局(numerator layout)"和 "分母布局(denominator layout)"。在这篇文章中,我将使用分母布局。
标量与矢量的导数
一个标量函数相对于一个变量向量的导数是一个行向量。这个行向量有一列代表我们想要微分的每个变量。
让我们举个例子:
然后我们可以应用 "和的导数 "规则:
由于一个变量相对于另一个变量的导数是0,我们可以得到:
标量导数向量
如果我们有一个函数𝑓,它输出一个向量,并想求它相对于一个变量的导数,我们得到一个列向量作为结果。
让我们考虑以下我们想要求导的向量值函数。
逐个向量求导
当对一个以向量为值的函数进行导数时,我们得到一个矩阵。我使用一个有2个输出值和3个输入变量的函数作为例子。
你可以把它看成是 "标量乘矢量 "和 "矢量乘标量导数 "的结合。我们沿着行改变函数输出的元素,沿着列改变变量的元素。
得到的矩阵的维度为:(输出的大小,输入的大小)
现在我们通过一个例子说明:
总结
矢量链法则
让我们考虑以下情况。向量𝑓是向量𝑔的一个函数。向量𝑔本身是向量𝑥的函数。因此,𝑓(𝑔(𝑥))相对于𝑥的导数可以通过以下方式计算。
我们可以看到,向量链法则与标量链法则看起来几乎一样。点积仍然在公式中,我们必须构造一个一个向量的导数矩阵。
这里有一个小例子。
我们计算偏导数。
现在我们展开点积。
最后进行简化,得到结果。
常数的点积
我们可以把常数矩阵和向量看作是标量常数。允许对它们进行因式分解。但是请记住,对于两个非标量之间的点积来说,顺序很重要。
现在我们可以把矩阵𝑋分解出来,如果它是一个常数并且不依赖于𝑤的话。
我们用向量导数矩阵来构造向量:
对角线上有1,其他地方有0的矩阵被称为单位矩阵。所有与它相乘的东西都保持不变。因此,最终结果是:
有趣的是,尽管整个方程包含了向量和矩阵,但我们得到的结果与我们根据标量微积分所预期的一样。然而,情况并非总是如此,因为并非所有标量微积分的规则都适用于多变量微积分。
最后
我很高兴你服用了红色药丸,加入了我在矩阵微积分领域的深入研究。如果这对你来说比较陌生,那么你应该多加练习,自己去看一些例子。