本文记录学习下面六个任务过程中思考过的问题及大家讨论过程中学习到的知识点,欢迎指正。
基础知识部分直接参考Dive-into-DL-PyTorch
详见论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
小伙伴讨论链接1,链接2
详见知乎链接:Batch-normalized 应该放在非线性激活层的前面还是后面?
魏秀参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)
如果用最原始的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不够
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()))
https://zhuanlan.zhihu.com/p/34418001