关于作者
作者小硕一枚,研究方向为机器学习与自然语言处理,欢迎大家关注我的个人博客https://wangjie-users.github.io/,相互交流,一起学习成长。
前言
As all we know, 线性代数对于机器学习的重要性不言而喻。但纵观国内的教材和课程,大部分线性代数的讲解,一上来就堆满了各种定义和公式,从而导致我们知其然而不知其所以然,不利于我们深入理解机器学习的算法。
因此,希望本篇博文能帮大家从另一个角度理解线性代数。但是注意,阅读本篇博文,最好已经有了线性代数的基础,比如要知道矩阵的形式,矩阵怎么相乘之类的基础知识。然后如果你虽然知道矩阵相乘怎么算,却并不知道它们有什么物理含义,那么相信本篇博文会让您有所收获。本系列博文分为上下两篇,上篇主要讲矩阵的本质,下篇主要讲向量的范数和矩阵分解。
矩阵的本质(一)
1、矩阵本质上就是映射、变换
比如,对于空间A中的一个三维点a(a1,a2,a3),空间B的一个二维点b(b1,b2),那么如何将a点映射成b点呢?只需构造一个维度为3*2的矩阵,利用矩阵乘法便可实现映射。
矩阵的本质就是描述空间的映射。因此它可以看作一个函数,接受一个空间作为输入,输出一个映射后的新空间。
2、各种矩阵运算的本质是什么?
- 加法:矩阵的加法就是映射规则的调整。矩阵A+矩阵B就可以看作,用B中各个元素的值去调整A这个映射规则。
- 乘法:矩阵的乘法表示线性映射的叠加。
比如,我们已经知道矩阵A可以从X空间映射到Z空间,矩阵B可以从Z空间映射到Y空间,那么怎么从X空间映射到Y呢?答案就是矩阵乘法A*B。 - 逆运算:矩阵的逆运算就是映射的逆映射;这里我用一个NLP的例子来解释,比如在一个机器翻译问题中,源语言在X空间,目标语言在Y空间,我们通过训练知道了如何从X空间映射到Y空间,即通过训练得到了映射矩阵A。那么我们如何反向翻译呢?那就是求A的逆矩阵就可以了,完全无需再反向重新训练。
3、特殊矩阵的含义(从映射角度理解)
- 零矩阵就是将任何空间映射成原点的矩阵;
- 单位矩阵就是将任何空间映射成自己的矩阵;
- 对角矩阵就是将原空间的各个坐标轴进行不同尺度的拉伸或挤压后生成新空间的矩阵;
比如任何一个二维空间乘上一个对角矩阵后,这个空间第一个维度(每一列表示一个维度)上的坐标轴会缩短为原来的一半,第二个维度的坐标轴会膨胀成原来的两倍!假设这个二维空间中的点(2,2)经过这个对角矩阵的映射后,会变成(1,4)。
4、矩阵分块的意义
矩阵分块对应的算法思想就是分治,一个最重要的应用就是并行化矩阵运算,这也是深度学习中最离不开的底层运算。
设想一下,一个10000*10000维的超大矩阵再乘以另一个10000*20000维的超大矩阵,如果让一个单核CPU去计算的话,可能CPU会崩溃!我们知道,在深度学习任务中,由于参数非常多,数据维度也很高,因此进行大矩阵运算是家常便饭。同时,我们之所以喜欢用GPU去训练深度学习任务,一个很重要的原因是GPU的“核”很多,经常几百几千,甚至几万核,非常利于并行计算。因此,在深度学习中,通过将大矩阵分块,分成若干个小块,再将这些小块丢进GPU成千上万的核里并行计算,那么转瞬间就可以完成这个大矩阵的计算。
矩阵的本质(二)
1、从存储数据的角度
矩阵A [ 2 2 4 1 1 1 ] \left[ \begin{matrix} 2& 2 \\ 4 & 1 \\ 1 & 1 \end{matrix} \right]