矩阵运算
神经网络是一种由神经元组成的网络结构,其最核心的计算过程就是矩阵运算。实际上,神经网络的核心数据结构就是一个个带权重的矩阵。
下面是神经网络与矩阵运算的关系:
矩阵乘法:神经网络的每个神经元都有一个权重,这些权重可以表示为一个矩阵。输入数据通过与权重矩阵进行矩阵乘法,得到输出结果,即前向传播过程。
加法:在矩阵相乘后,神经网络中通常还需要进行加法运算。偏置项就存储在这个矩阵中,它是一个偏置矩阵,每一行对应一个神经元的偏置,每次前向传播时都会加上这个偏置矩阵。
激活函数:神经网络的每个神经元还需要进行激活函数的运算。例如,常用的ReLU激活函数就是对矩阵中的每个元素进行非线性操作。
反向传播:反向传播用于求解误差关于权重和偏置的导数(即梯度),利用链式法则和矩阵求导技巧,将误差从输出层传回至输入层。在计算中,反向传播使用的矩阵转置、按位乘法等运算也十分关键。
综上所述,神经网络中的各种运算,都是基于矩阵来实现的。通过矩阵乘法、加法和激活函数的组合,神经网络可以学习输入数据与输出标签之间的映射。同时,通过反向传播算法中的矩阵运算,可以计算各层的梯度以更新权重和偏置,从而改进模型的预测效果。
张量与矩阵的关系
张量和矩阵都是一些特殊的多维数组,它们之间有很紧密的联系和互动。通常,矩阵可以被视为二维张量的一个特殊情况。
下面是张量与矩阵的关系:
矩阵可以视为二维张量,具有行和列两个维度。矩阵的乘法与张量的乘法是同一概念,都是运用元素的乘法和加法运算在一定规律下得到某个结果。
张量比矩阵更高维,可以有任意多个维度,即张量的任意子集都是一个矩阵。例如,一个三维张量可以表示为一个立方体,其中包含了多个二维矩阵。
对于机器学习和深度学习技术,张量是非常重要的数据结构。神经网络的输入和输出通常都是张量,包括经过处理的图片(通常为四维张量)、自然语言处理中的句子(通常为三维张量)等等。
在机器学习任务中,通常会使用矩阵和张量表示数据和参数,用矩阵乘法和矩阵求逆等线性代数运算来计算模型中的各个参数。
综上所述,矩阵是二维的特殊形式的张量,张量比矩阵更高维,而且在机器学习和深度学习的场景中可以表示各种复杂的数据类型。在实际应用中,会使用矩阵和张量来表示不同层次的数据,来实现各种算法和模型。
示例代码:TensorFlow.js中基本的张量与矩阵运算
const tf = require('@tensorflow/tfjs-node-gpu')
//张量定义
const a = tf.tensor([[1, 2], [3, 4]])
console.log('shape', a.shape)
// shape [ 2, 2 ]
a.print()
/*
Tensor
[[1, 2],
[3, 4]]
*/
//shape:张量的维度
const b = tf.tensor([[1, 2], [3, 4], [5, 6]])
console.log('shape', b.shape)
// shape [ 3, 2 ]
b.print()
/**
Tensor
[[1, 2],
[3, 4],
[5, 6]]
*/
//从 shape 创建张量
const shape = [ 2, 4 ]
const c = tf.tensor([ 1, 2, 3, 4, 5, 6, 7, 8 ], shape)
console.log('dtype', c.dtype)
c.print()
/**
dtype float32
Tensor
[[1, 2, 3, 4],
[5, 6, 7, 8]]
*/
//改变张量的 shape, 维度
console.log('c shape:', c.shape)
c.print()
const d = c.reshape([4, 2])
console.log('d shape:', d.shape)
d.print()
/**
c shape: [ 2, 4 ]
Tensor
[[1, 2, 3, 4],
[5, 6, 7, 8]]
d shape: [ 4, 2 ]
Tensor
[[1, 2],
[3, 4],
[5, 6],
[7, 8]]
*/
//打印张量数据
// Returns the multi dimensional array of values.
d.array().then(array => console.log(array));
// Returns the flattened data that backs the tensor.
d.data().then(data => console.log(data));
/**
Float32Array(8) [
1, 2, 3, 4,
5, 6, 7, 8
]
[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ] ]
*/
//求张量的 squre 平方运算
const x = tf.tensor([1, 2, 3, 4]);
x.print();
const y = x.square(); // equivalent to tf.square(x)
y.print();
/**
Tensor
[1, 4, 9, 16]
*/
//求矩阵/张量的和
const a1 = tf.tensor([1, 2, 3, 4]);
const b1 = tf.tensor([10, 20, 30, 40]);
const y1 = a1.add(b1); // equivalent to tf.add(a, b)
y1.print();
/**
Tensor
[11, 22, 33, 44]
*/
//求矩阵/张量的乘积
const a2 = tf.tensor([[1, 2]])
const b2 = a2.mul([[3], [4]])
b2.print()
/**
Tensor
[[3, 6],
[4, 8]]
*/