Task06/07-批量归一化和残差网络;凸优化;梯度下降; 优化算法进阶;word2vec;词嵌入进阶

本文记录学习下面六个任务过程中思考过的问题及大家讨论过程中学习到的知识点,欢迎指正。

  • 批量归一化和残差网络;
  • 凸优化;
  • 梯度下降;
  • 优化算法进阶;
  • word2vec;
  • 词嵌入进阶

基础知识部分直接参考Dive-into-DL-PyTorch

做完batach nornamlization后为何又拉伸/偏移?理论证明

详见论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
小伙伴讨论链接1,链接2

为什么BN层后跟着非线性激活层?非线性激活放BN前面会怎样呢?

详见知乎链接:Batch-normalized 应该放在非线性激活层的前面还是后面?

cnn调参技巧

魏秀参CNN book, 以及cnn trick
NLP 领域主要推荐以下几篇:Regularizing and Optimizing LSTM Language Models(LSTM 的训练技巧)Massive Exploration of Neural Machine Translation Architectures(NMT 里各个超参的影响)Training Tips for the Transformer Model(训练 Transformer 时会发生的各种现象)RoBERTa: A Robustly Optimized BERT Pretraining Approach(BERT 预训练技巧,虽然跟大部分人没啥关系)CV 我不算太熟,不过也可以勉强推荐几篇:Training ImageNet in 1 Hour(大批量训练技巧)Bag of Tricks for Image Classification with Convolutional Neural Networks(各种训练技巧集大成)Bag of Freebies for Training Object Detection Neural Networks(同上)EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(当前对参数利用最有效的 CNN,类似地还有一篇 EfficientDet)

完成训练后有center和context的embedding,应该选用哪个作为 左后的word2vect?为何不能并称一个embedding?

如果用最原始的word2vec模型的话,根据数学表达式,等价变换枚举所有中心词和中心词窗为枚举词的二元组分别作为中心词和背景词,就能发现center和context的embedding在表达式上的地位是相同的,所以使用任何一个都没有关系
但是如果用到了负采样方法或其他的优化算法,center和context的地位就不再相等,实践中通常采用center的词向量,前面同学给出的理由我觉得很有道理
词嵌入进阶那一节里面有提到,word2vec或者glove本质上是想让词向量学会预测 p (w_c=w_i, w_o=w_j) 的概率,这个概率和 p (w_c=w_j, w_o=w_i) 是不等的(想象有的词比较常见比如the,那比较不常见的名词比如dogcatcher出现在它旁边的概率就很低,但the出现在dogcatcher旁边的概率却很高),所以center和context的词向量虽然可以是对称的关系,但不能共用一个embedding,这样model capacity不够

1.之前机器翻译数据预处理是统一的max_len截断+padding,但word2vect部分,不同batch的m的维度还不太一样,Task06/07-批量归一化和残差网络;凸优化;梯度下降; 优化算法进阶;word2vec;词嵌入进阶_第1张图片

batch内会把每个数据按照背景词窗最大的那个数据进行长度补齐,但是由于不同batch间最大的背景词窗长度是不同的,比如有的是24有的是18,就导致不同batch的m不同,这在NLP序列输入中是很常见的现象,而且也不会影响模型的计算,因为NLP的绝大多数模型都是序列长度无关的
从raw data的表征来说按最大长度补齐的信息损失更少,但实际中还需考虑模型处理长依赖的能力以及机器的计算资源等问题,比如RNN在处理长序列时就会很吃力,此时按照一定长度进行截断效果就可能比按最大长度补齐好,因为在很多文章分类的任务中,输入文本长度可以达到上千词,RNN就可能会捕捉到过多的噪声

参数更新部分

只训练部分层

class RESNET_attention(nn.Module):
    def __init__(self, model, pretrained):
        super(RESNET_attetnion, self).__init__()
        self.resnet = model(pretrained)
        for p in self.parameters():
            p.requires_grad = False
        self.f = nn.Conv2d(2048, 512, 1)
        self.g = nn.Conv2d(2048, 512, 1)
        self.h = nn.Conv2d(2048, 2048, 1)
        self.softmax = nn.Softmax(-1)
        self.gamma = nn.Parameter(torch.FloatTensor([0.0]))
        self.avgpool = nn.AvgPool2d(7, stride=1)
        self.resnet.fc = nn.Linear(2048, 10)

这样就将for循环以上的参数固定, 只训练下面的参数。但是注意需要在optimizer中添加上filter(lambda p: p.requires_grad, model.parameters()

optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.0001, betas=(0.9, 0.999), eps=1e-08, weight_decay=1e-5)

固定部分层参数

for k,v in model.named_parameters():
     if k!='XXX':
         v.requires_grad=False#固定参数

检查部分参数是否固定

for k,v in model.named_parameters():
    if k!='xxx.weight' and k!='xxx.bias' :
            print(v.requires_grad)#理想状态下,所有值都是False

查看可训练参数

for name, param in model.named_parameters():
    if param.requires_grad:
        print(name)

查看网络总参数

net = Model()
print('# Model parameters:', sum(param.numel() for param in net.parameters()))

不同层设置不同学习率Task06/07-批量归一化和残差网络;凸优化;梯度下降; 优化算法进阶;word2vec;词嵌入进阶_第2张图片

PyTorch更新部分网络,其他不更新

Task06/07-批量归一化和残差网络;凸优化;梯度下降; 优化算法进阶;word2vec;词嵌入进阶_第3张图片

pack_padded_sequence功能,减弱对padding影响

https://zhuanlan.zhihu.com/p/34418001

你可能感兴趣的:(pytorch)