总结一些我被问到的题和常见的题目,答案有不对的欢迎指出。
Batch Norm和Layer Norm的定义及区别?
- BN 批量归一化:以进行学习时的mini-batch为单位,按mini-batch进行正规化。具体而言,就是进行使数据分布的均值为0、方差为1的正规化。
- LN 层归一化是对每个batch(3维)里的每个样本的每行进行标准化,使用layer norm 对应到NLP里就是相当于对每个词向量各自进行标准化
- 总结:BN是对一个中间层的单个神经元进行归一化操作,LN是对一个中间层的所有神经元进行归一化
- batch norm适用于CV,因为计算机视觉喂入的数据都是像素点,可以说数据点与点之间是可以比较的,所以使用batch norm可以有比较好的效果,
- 而NLP里,每个词的词向量是一组向量表示一个词,一个词向量割裂开来看是没有意义的,因此不同词向量里的数据点是不能混为一谈的,所以batch norm之后可能会使得词损失语义,效果就可能不好了,但是使用layer norm只是让各个词向量进行标准化,就能够有比较理想的效果了。
- 立方体直观感受:一个(H,W) * C * N的立方体
-
BN:把一个batch中同一通道的所有特征视为一个分布(有几个通道就有几个分布),并将其标准化
-
-
LN:把一个样本的所有词义向量视为一个分布(有几个句子就有几个分布),并将其标准化
-
-
为什么要normalization层?
- 总:加速训练、稳定梯度下降、减少模型对初始化和输入分布的依赖,以及提升模型的泛化能力,进而提高整体模型的性能和训练效率。
- 分:
- 可以使学习快速进行(减小了输入分布的变化,可以增大学习率)。
- 不那么依赖初始值(对于初始值不用那么神经质)。
- 抑制过拟合(降低Dropout等的必要性)
Python的深浅拷贝
- 都是复制对象,区别在于它们对嵌套对象(例如,列表中的列表或字典中的字典)的处理不同
- 直接赋值: 其实就是对象的引用(别名)。
- 浅拷贝(copy): 拷贝父对象,不会拷贝对象的内部的子对象。
- 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
- 浅拷贝创建一个新的对象,但在新对象中,它只复制了原对象的引用,而不复制嵌套对象本身。如果原对象中包含对其他对象的引用,那么浅拷贝的新对象将引用相同的嵌套对象。
- 深拷贝创建一个新的对象,并递归地复制原对象及其所有嵌套对象。这意味着,深拷贝的新对象与原对象完全独立,不共享任何部分。
import copy
original_list = [1, 2, [3, 4]]
shallow_copy_list = copy.copy(original_list)
deep_copy_list = copy.deepcopy(original_list)
# 修改原列表中的嵌套对象
original_list[2][0] = 'a'
print("Original List:", original_list)
# Original List: [1, 2, ['a', 4]] Shallow Copy List: [1, 2, ['a', 4]]
print("Shallow Copy List:", shallow_copy_list)
# Shallow Copy List: [1, 2, ['a', 4]]
print("Deep Copy List:", deep_copy_list)
# Deep Copy List: [1, 2, [3, 4]]