八股文-杂七杂八
个人网上搜集
杂七杂八
1.说一下pytorch里面两种浮点类型怎么样混合计算的
二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。1个字节是8个比特,即:1byte = 8bit。而半精度浮点数FP16(FP,Floating Point浮点运算)使用2字节(16位)存储,单精度FP32使用4字节。
半精度Fp16的优势
深度学习系统大都采用的都是Fp32来进行权重参数的存储,随着模型越来越大,加速训练模型的需求就产生了。使用Fp32主要存在2个问题:第一是模型大,训练的时候对显卡的显存要求高;第二是模型训练速度慢。
与FP32相比,FP16仅有16bit,2个字节。使用Fp16可以解决或者缓解使用FP32的两个问题,FP16的优势就是:
(1)显存占用更少:通用的模型 FP16 占用的显存只需原来的一半,训练的时候可以使用更大的batchsize。
(2)计算速度更快:有论文指出半精度的计算吞吐量可以是单精度的 2-8 倍。
但是无脑全部使用FP16也是存在风险的,因为相比FP32,FP16也有自身的一些缺陷。
半精度Fp16存在的问题
(1) 溢出错误
Fp16表示的范围是(),Fp32表示的范围是(),前者的范围比后者的小很多。当由Fp32计算转化为Fp16的时候,有很大的概率会出现溢出错误。当一个数比还小的时候,Fp16就表示不了了会出现下溢(Underflow);当一个数比65504还要大的时候,就会出现上溢(Overflow)。
一般而言,深度学习模型训练过程中,神经网络的激活函数的梯度比权重的梯度要小,也更容易出现下溢出错误。当出现上下溢出错误的时候,反向传播中误差累积会把梯度变成0或者nans; 这会导致不准确的梯度更新,影响网络收敛。
(2) 舍入误差
FP16的最大舍入误差约为 (),比FP32的最大舍入误差() 要大不少。在FP16下,对很小的浮点数执行的任何操作都会将该值四舍五入到零,而事实上在深度学习中很小的数也是有意义的,不能直接舍入为0。
那么如何解决FP16的这些问题,或者说如何综合利用FP32与FP16各自的优点呢?那就是混合精度训练,混合着用嘛!
如何解决
混合精度训练+动态损失放大+梯度缩放
(1)混合精度训练
在内存中用FP16做储存和乘法从而加速计算,用FP32做累加避免舍入误差。这样在权重更新的时候就不会出现舍入误差导致更新失败。
(2)损失放大+梯度缩放
使用了混合精度训练,还是会存在无法收敛的情况。这是因为当梯度值非常小,小到FP16不能表示就会出现下溢出错误。因此需要对损失loss进行放大,然后再对梯度进行缩放。
2.量化出来的模型有误差,你是怎么样减少误差,提高模型预测的准确率的
3.ASR识别到的文本中的错别字怎么做处理的
4.如果我更改了输入数据的量级,比如将输入的数据从长度100改成了1000,增加了10倍,transformer的时间复杂度是会怎么变,参数量会怎么变?
5.transformer和CNN有什么不同
6.你还了解哪些增强数据集的方法
7.你对NLP都有哪些了解
8.transformer中encoder和decoder的区别
9.transformer的decoder是怎么防止信息泄露的呢
10.说一下你项目里的模型结构
11.训练的数据量有多少
12.最终训练的指标怎么样
13.逻辑回归和线性回归的区别





