神经网络在处理不同大小的权重或输入矩阵时,经常出现矩阵的阶不符合矩阵乘法的要求。矩阵的转置通过将矩阵旋转一下以满足矩阵乘法所需要的维度要求。下面,我们可以通过两步完成矩阵的转置。 1. 旋转矩阵 90 度 2. 将每一行的元素都反向写一遍 以下我们将矩阵 M 转置为矩阵 T a = np.array([ [1, 2], [3, 4]]) a.T [[1, 3], [2, 4]] 矩阵乘法 矩阵乘法是由一组乘法法则组成,他们共同作用以乘得一个新矩阵。 规则 并不是所有矩阵都能进行矩阵乘法运算的,如果两个矩阵能相乘,那么它需要满足以下条件: 1. 第一个矩阵列的数量必须等于第二个矩阵行的数量 2. m×n 阶矩阵左乘 n×k 阶矩阵的结果是 m×k 阶矩阵。新得出来矩阵就等于第一个矩阵的行数×第二矩阵的列数。 步骤 矩阵乘法的步骤和向量点积的过程是相似的,它们都是由对应位置的元素进行乘积并相加而得出。第一个矩阵每一行的维度和第二个矩阵每一列的维度相等,所以第一个矩阵第 i 行元素与第二个矩阵第 j 列对应元素的乘积和就等于新矩阵的第 i 行第 j 列的元素值。在下图中,A 矩阵左乘 B 矩阵得到 C 矩阵。A 矩阵行向量与 B 矩阵列向量点积就等于 C 矩阵的元素,开奖,具体可以通过下图 C 矩阵内部元素的构成来了解。 A 矩阵行向量 a1 与 B 矩阵列向量 b1 的点积,即下图所示: 下面是另一个矩阵的乘积: 矩阵乘法是不可交换的(即AB ≠ BA)。因为不可能预期在改变向量的部分后还能得到相同的结果,而且第一个矩阵的列数必须要和第二个矩阵的行数相同,也可以看出为什么矩阵相乘的顺序会影响其结果。虽然矩阵乘法是人为的规则,但它确实大大简化了计算的表达,可以将巨大的计算量很简洁地表达出来,这一点对机器学习算法的开发和使用有重要的作用。 最后你可以用以下案例检测一下是否你已经掌握了矩阵运算的基本原理: 下面矩阵乘法的阶是多少? 下面矩阵乘法的阶是多少? 下面矩阵的乘法是多少? 下面矩阵的乘法是多少? 下面矩阵的乘法是多少? 使用 Numpy 进行矩阵乘法运算 在 Numpy 中,np.dot(a,b) 函数可以进行向量和矩阵点积。并且该函数还有许多有意思的特征,所以我建议你在使用该函数前先看看该函数的用法:https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html a = np.array([ [1, 2] ]) a.shape == (1,2)b = np.array([ [3, 4], [5, 6] ]) b.shape == (2,2)# Multiply mm = np.dot(a,b) mm == [13, 16] mm.shape == (1,2) 深度学习通常会有巨大的计算量。从最开始的特征输入,我们会使用一个个高维向量将特征输入到神经网络中,而每一层的权重作为列向量组成一个权重矩阵。每一层的正向传播都需要使用矩阵乘法进行计算,而反向传播更需要理解矩阵运算才能对其运行原理有一个较为深入的理解。本文是矩阵运算的基础性文章,其不仅对概念的理解很是重要,同时在新手开始学着搭建机器学习系统时更为有用,因为矩阵运算的代码在实际操作中是我们看懂一段代码或写出一段代码的基础。并且采用矩阵运算代码实现也远比采用循环语句或条件语句代码实现的算法要简洁易读得多。 原文链接:https://medium.com/towards-data-science/linear-algebra-cheat-sheet-for-deep-learning-cd67aba4526c (责任编辑:本港台直播) |