个人网上搜集

杂七杂八

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表示的范围是(6108655046*10^{-8}-65504),Fp32表示的范围是(1.410451.710381.4*10^{-45}-1.7*10^{38}),前者的范围比后者的小很多。当由Fp32计算转化为Fp16的时候,有很大的概率会出现溢出错误。当一个数比61086*10^{-8}还小的时候,Fp16就表示不了了会出现下溢(Underflow);当一个数比65504还要大的时候,就会出现上溢(Overflow)。

一般而言,深度学习模型训练过程中,神经网络的激活函数的梯度比权重的梯度要小,也更容易出现下溢出错误。当出现上下溢出错误的时候,反向传播中误差累积会把梯度变成0或者nans; 这会导致不准确的梯度更新,影响网络收敛。

(2) 舍入误差

FP16的最大舍入误差约为 (2102 ^-10),比FP32的最大舍入误差(2232 ^-23) 要大不少。在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.逻辑回归和线性回归的区别