大家好啊,我是董董灿。
很多与深度学习算法相关的面试,面试官可能都会问一个问题,那就是你是如何理解矩阵乘算法的。
更有甚者,会让你当场手写矩阵乘算法,然后问细节,问如何优化,面试现场,残忍至极。
那矩阵乘法的本质到底是什么呢?为什么在神经网络中,甚至如今的大模型中,有那么多矩阵乘法出现呢?
1、矩阵乘法的本质
我查了很多资料,得出一个结论:矩阵乘法的本质,是资源的整合和再创。
举个例子。
你是一个鸡尾酒调酒师,家里储存了很多鸡尾酒的原料,有金酒、利口酒、柠檬汁和可乐等等。
今天家里来了 3 位客人,他们分别喜欢喝“自由古巴”、“长岛冰茶”以及“龙舌兰日出”这 3 款鸡尾酒,并向你下了单。
希望你给他们调配出来各自喜欢的鸡尾酒。
巧的是,这 3 款鸡尾酒的原料都是金酒、利口酒、柠檬汁和可乐。
你作为一个调酒师,分分钟就把客人的爱好的鸡尾酒给调出来了。
怎么做的呢?你知道配方:
-
自由古巴: 20%金酒 + 45% 利口酒 + 10%柠檬汁 + 25%可乐
-
长岛冰茶: 60%金酒+ 30%利口酒 + 5% 柠檬汁 + 5% 可乐
-
龙舌兰日出:30%金酒 + 10%利口酒 + 30%柠檬汁 + 30%可乐
你在调配鸡尾酒的过程中,是按照这个配方来调配的。
这里的原料,比如利口酒和可乐,就是输入资源,配比(比如可乐的 25% )就是赋予该资源的权重。
将相同的原料按照不同的配比混合起来,就得到了不同口味的鸡尾酒。
这种做法,可以抽象一下,写成一个公式:
-
自由古巴 = 0.2 x 金酒 + 0.45 x 利口酒 + 0.1 x 柠檬汁 + 0.25 x 可乐
-
长岛冰茶 = 0.6 x 金酒 + 0.3 x 利口酒 + 0.05 x 柠檬汁 + 0.05 x 可乐
-
龙舌兰日出 = 0.3 x 金酒 + 0.1 x 利口酒 + 0.3 x 柠檬汁 + 0.3 x 可乐
我们知道矩阵乘法的规则是,左矩阵的第一行乘以右矩阵的第一列,得到第一个值,第一行乘以第二列得到第二个值,...,以此类推
上面这种连乘的操作,就可以用矩阵乘法来表示。
左矩阵是一行四列,代表原料。
右矩阵是四行三列,每一列代表对应原料的配比。
按照矩阵乘法的规则,他们的结果应该是一个一行三列的矩阵,分别代表调配出来的三种鸡尾酒。
看到这是不是有点熟悉了。
矩阵乘法,通过相乘累加的操作,实际上是对资源(鸡尾酒的原料)的整合和再创(创造出了新的口味,如自由古巴)。
2、深度学习中的矩阵乘法
回到深度学习算法中,矩阵乘法的右矩阵通常是权值矩阵,是作为模型的参数被训练出来的。
一个模型,在对多种数据集训练之后,模型就学习到了一个权值矩阵,实际上一个模型中会学到很多个权值矩阵,这里用一个举例子说明。
这个权值矩阵可以很好的匹配多种输入数据,并对输入数据进行整合和再创。
卷积和全连接算法,或多或少都是一种矩阵乘法,将其转换为矩阵乘法之后,那么和权值矩阵对应的另一个矩阵,就是输入数据。
假设输入的数据是一张图片,那么图片中一个通道维度代表图片的一个特征,通过矩阵乘法对通道进行乘累加操作,便可以实现特征之间的整合和再创。
也就是所谓的特征融合,跟调酒是不是很像?
更显而易见的例子体现在全连接层上,全连接层通过矩阵乘法的运算,把所有的特征全部进行了融合,最终可能就会得到某一个类别。