在执行线性代数运算时,深度学习如何改变每层神经元的数量并保持正确的代数运算?
此代码生成各种维度的矩阵并计算点积,我试图只专注于通过网络移动值的操作核心。
将 numpy 导入为 NP
def gm(m , n):
return np.random.uniform(1 , 1 , (m , n))
x = gm(4,2)
print('x' , x)
m1 = gm(2,3)
print('m1' , m1)
d1 = np.dot(x , m1)
print('d1' , d1)
指纹:
x [[1. 1.]
[1. 1.]
[1. 1.]
[1. 1.]]
m1 [[1. 1. 1.]
[1. 1. 1.]]
d1 [[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]
[2. 2. 2.]]
如果输出矩阵是 2x1,它是如何产生的?换句话说,如何从矩阵 d1 生成 2x1 矩阵?
诸如此类的框架keras
抽象化这一点,但是抽象是如何发生的呢?
映射相对简单,我将完全关注 MLP(与其他具有复杂结构的神经网络一样,可以做许多其他事情,但核心思想是相同的(。
假设您的输入是大小为 [B x D] 的批次,其中 B - 样本数(可以是 1(,D - 特征数(输入维度(。作为您想要的输出 [B x K],其中 K - 输出数量。
典型的MLP只是一系列仿射变换,然后是一些(逐点(非线性f:
h_{i+1} = f( h_i W_i + B_i)
其中 h_0 = X(输入(,h_N 是输出
假设我想要一个带有 Z 神经元的隐藏层,那么我所要做的就是创建两个矩阵 W 和两个向量 B,一对将用于将输入映射到 Z 维度,另一对用于从 Z 映射到所需的 K:
W_1 is D x Z
B_1 is 1 x Z
W_2 is Z x K
B_2 is 1 x K
因此,我们有
f(X W_1 + B_1) W_2 + B_2
X W_1 is [B x D] [D x Z] = [B x Z]
X W_1 + B_1 is [B x Z] + [1 x Z] = [B x Z] # note that summation
# is overloaded in the sense that it is adding the
# same B to each row of the argument
f(X W_1 + B_1) is [B x Z]
f(X W_1 + B_1) W_2 is [B x Z] [Z x K] = [B x K]
f(X W_1 + B_1) W_2 + B_2 is [B x K] + [1 x K] = [B x K]
与更多隐藏层类似,您只需将右侧的矩阵与大小为 [dimension_of_previous_one x desired_output_dimension] 的矩阵相乘,这只是数学中的常规线性投影运算(偏差使其仿射(