神经网络维度变化说明/batch的意义
假设我们现在又100个样本,每一个样本的特征的向量是1×9999([1,2,…,9999])
首先我们先创建一个2层神经网络模型,只包含的输入层与一个隐藏层。输入层的dim是100,隐藏层是50。接下计算一次前向传播获得的embedding的维度
构建神经网络参数
输入层:
由于输入特征的dim是9999,而input_layer的dim是100。所以这里需要构建用于参数矩阵用于降维,该参数矩阵的维度的(9999,100)。
隐藏层:
input_layer的dim是100,而hid_dim的维度是50,所以这里的参数矩阵的维度是(100,50)
反向传播:
简略记作更新一次权重参数
100个样本一次全部输入神经网络模型:
注:为避免转置带来的混淆,这里默认已经完成转置。
每一个样本,通过一次神经网络之后,都会生成一个embedding,且完成一次反向传播。需要100次才能完成训练
维度变化:
样
本
a
l
l
=
[
[
x
1
]
,
[
x
2
]
,
.
.
.
,
[
x
999
]
100
×
9999
输入层
=
[
W
i
n
p
u
t
_
l
a
y
e
r
]
9999
×
100
隐藏层
=
[
W
h
i
d
_
l
a
y
e
r
]
100
×
50
样
本
i
⋅
输入层
⋅
隐藏层
=
[
E
m
b
e
d
d
i
n
g
]
100
×
50
样本_all = [[x_1],[x2],...,[x_{999}]_{100×9999}\\ 输入层 = [W_{input\_layer}]_{9999×100}\\ 隐藏层 = [W_{hid\_layer}]_{100×50}\\ 样本_i · 输入层 · 隐藏层 = [Embedding]_{100×50}
样本all=[[x1],[x2],...,[x999]100×9999输入层=[Winput_layer]9999×100隐藏层=[Whid_layer]100×50样本i⋅输入层⋅隐藏层=[Embedding]100×50
这里的参数更新了100次
以batch_size=20输入神经网络:
需要训练5个batch才能完成,每一次batch完成之后更新一次参数
维度变化:
样
本
a
l
l
=
[
[
x
1
]
,
[
x
2
]
,
.
.
.
,
[
x
999
]
20
×
9999
输入层
=
[
W
i
n
p
u
t
_
l
a
y
e
r
]
9999
×
100
隐藏层
=
[
W
h
i
d
_
l
a
y
e
r
]
100
×
50
样
本
i
⋅
输入层
⋅
隐藏层
=
[
E
m
b
e
d
d
i
n
g
]
20
×
50
样本_all = [[x_1],[x2],...,[x_{999}]_{20×9999}\\ 输入层 = [W_{input\_layer}]_{9999×100}\\ 隐藏层 = [W_{hid\_layer}]_{100×50}\\ 样本_i · 输入层 · 隐藏层 = [Embedding]_{20×50}
样本all=[[x1],[x2],...,[x999]20×9999输入层=[Winput_layer]9999×100隐藏层=[Whid_layer]100×50样本i⋅输入层⋅隐藏层=[Embedding]20×50
重复5次以上操作,这里的参数更新了5次
意义:
- 提高计算效率:通过将数据划分为批次,可以并行处理每个批次中的样本,从而提高计算效率。相比于一次性处理所有样本,批处理可以更好地利用计算资源,加速训练过程。
- 减小内存占用:对于大规模数据集,一次性加载整个数据集可能会占用较大的内存。通过使用批处理,我们可以逐批次加载和处理数据,减少内存占用。
- 降低梯度估计的方差:在优化算法中,参数更新通常基于梯度的估计值。批处理可以提供对梯度的更稳定估计,因为它是基于一个批次中多个样本的平均梯度计算的。这可以减少梯度估计的方差,提高优化算法的稳定性。
- 增加模型泛化能力:通过随机抽取样本构成不同的批次,批处理可以引入更多的样本多样性,有助于提高模型的泛化能力。这是因为每个批次都是从整个数据集中随机选择的,可以更好地代表整体数据分布。