对于一个模型,都可以从以下几个方面进行调参:

1. 对weight和bias进行初始化(效果很好,一般都可以提升1-2%)

Point 1 (CNN):

 for conv in self.convs1:
init.xavier_normal(conv.weight, gain=np.sqrt(2.0))  # 对weight进行正态分布初始化
# init.normal(conv.weight, mean=0, std=0.1)
# init.constant(conv.bias, 0.1)              # 对bias初始化为0.1

Point 2 (LSTM):

(1)Bias vectors are initialized to zero, except the bias b f for the forget gate in LSTM , which is initialized to 1.0 .(参见论文End-to-end Sequence Labeling via Bi-directional LSTM-CNNs-CRF)。weight 使用高斯分布或是均匀分布都可以。详细讲解参考博文Deep Learning 之 参数初始化

(2)简单的设置就是,weight设为0.1,bias设为0。

         init.xavier_normal(self.lstm.all_weights[0][0], gain=np.sqrt(2.0))
self.lstm.all_weights[0][3].data[20:40].fill_(1) # forget gate
self.lstm.all_weights[0][3].data[0:20].fill_(0)
self.lstm.all_weights[0][3].data[40:80].fill_(0)

注:对于封装好的lstm,其提供了all_weights接口统一对其参数进行初始化,不能单个定义,forget gate对应的下标是20-39。若是使用lstmcell则可以对单个想要修改的参数进行修改。

2. clip  gradients让权重的梯度更新限制在一定范围内,防止单个节点出现梯度爆炸、梯度消失。

 optimizer.zero_grad()
logit = model(feature)
loss = F.cross_entropy(logit, target)
loss.backward()
# clip gradients
utils.clip_grad_norm(model.parameters(), 5)
optimizer.step()

3. L2 regularization

L2值也叫惩罚值,是为了防止过拟合问题。提供了接口可直接设值,一般设为1e-8。

 optimizer = torch.optim.Adam(model.parameters(), lr=args.lr, weight_decay=0.01)

4. batch normalization批标准化若设置正确,据说会大大加大迭代速度,效果明显。

若是BatchNorm2d(x),input是(batchsize,channel,height,width),x值对应channel,即维度1。所以channel=0时,求一次mean,var,做一次normalize;channel=1时,求一次.......channel=x时,求一次。BatchNorm1d时情况也是一样的,x对应的是维度1的值,若是不对应,则需要进行转置,如下示例。

 m = nn.BatchNorm1d(2)
input = torch.randn(2, 10)
input = Variable(input)
input = Variable(torch.transpose(input.data, 0, 1))
print(input)
output = m(input)
print(output)

Point 1 (CNN):

     def __init__(self, args):
super(CNN, self).__init__()
self.bn = nn.BatchNorm2d(1) def forward(self, x):
for conv in self.convs1:
xx = conv(x) # variable [torch.FloatTensor of size 16x200x35x1]
xx = Variable(torch.transpose(xx.data, 2, 3))
xx = Variable(torch.transpose(xx.data, 1, 2))
xx = self.bn(xx)
xx = F.relu(xx)
xx = xx.squeeze(1)
a.append(xx)

Point 2 (LSTM):

 class BiLSTM(nn.Module):
def __init__(self, args):
super(BiLSTM, self).__init__()
self.bn1 = nn.BatchNorm1d(2*self.hidden_size)   def forward(self, sentence):
out = self.bn1(out)
out = F.tanh(out)
y = self.hidden2label(out)

结果:以上两种设置并没有提高准确率。

Point 3 (BN-LSTM):

参看论文RECURRENT BATCH NORMALIZATION,不使用pytorch框架,自己实现。

调参tips的更多相关文章

  1. 01.CNN调参

    转载:调参是个头疼的事情,Yann LeCun.Yoshua Bengio和Geoffrey Hinton这些大牛为什么能够跳出各种牛逼的网络? 下面一些推荐的书和文章:调参资料总结Neural Ne ...

  2. 【Python机器学习实战】决策树与集成学习(七)——集成学习(5)XGBoost实例及调参

    上一节对XGBoost算法的原理和过程进行了描述,XGBoost在算法优化方面主要在原损失函数中加入了正则项,同时将损失函数的二阶泰勒展开近似展开代替残差(事实上在GBDT中叶子结点的最优值求解也是使 ...

  3. scikit-learn随机森林调参小结

    在Bagging与随机森林算法原理小结中,我们对随机森林(Random Forest, 以下简称RF)的原理做了总结.本文就从实践的角度对RF做一个总结.重点讲述scikit-learn中RF的调参注 ...

  4. scikit-learn 梯度提升树(GBDT)调参小结

    在梯度提升树(GBDT)原理小结中,我们对GBDT的原理做了总结,本文我们就从scikit-learn里GBDT的类库使用方法作一个总结,主要会关注调参中的一些要点. 1. scikit-learn ...

  5. word2vec参数调整 及lda调参

     一.word2vec调参   ./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -neg ...

  6. scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)

    scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...

  7. 基于pytorch的CNN、LSTM神经网络模型调参小结

    (Demo) 这是最近两个月来的一个小总结,实现的demo已经上传github,里面包含了CNN.LSTM.BiLSTM.GRU以及CNN与LSTM.BiLSTM的结合还有多层多通道CNN.LSTM. ...

  8. 漫谈PID——实现与调参

    闲话: 作为一个控制专业的学生,说起PID,真是让我又爱又恨.甚至有时候会觉得我可能这辈子都学不会pid了,但是经过一段时间的反复琢磨,pid也不是很复杂.所以在看懂pid的基础上,写下这篇文章,方便 ...

  9. hyperopt自动调参

    hyperopt自动调参 在传统机器学习和深度学习领域经常需要调参,调参有些是通过通过对数据和算法的理解进行的,这当然是上上策,但还有相当一部分属于"黑盒" hyperopt可以帮 ...

随机推荐

  1. 3282: Tree(LCT)

    3282: Tree Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 2249  Solved: 1042[Submit][Status][Discus ...

  2. 3、CSS基础 part-1

    1.给body设置颜色 <html> <body text="red"> <p> hello world</p> <p> ...

  3. 【Maximum Subarray 】cpp

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  4. Visual C++ 连连看游戏源代码

    点击下载

  5. java基础-容器

    已经写了一段时间JAVA代码了,但仔细想来,却发现对JAVA的很多方面还是一片迷茫. 利用周末补一下基础知识吧. 大致列一下这个周末需要学习的内容 1 容器 (本节内容) 2 线程 3 流 目录 1 ...

  6. SQL Server2012使用导入和导出向导时,用sql语句作为数据源,出现数据源类型会变成202或者203

    用MS SqlServer2012进行数据导出时,使用的查询语句导出,但是出现了错误: “发现 xx个未知的列类型转换您只能保存此包“ 点击列查看详细错误信息时,可以看到: [源信息]源位置: 192 ...

  7. Arcengine 基本操作(待更新)

    /// <summary> /// 删除fieldName属性值为1的弧段 /// </summary> /// <param name="fieldName& ...

  8. centos7 mariadb mysql max_connections=214 无法修改的问题

    centos7 mariadb mysql max_connections=214 无法修改的问题 /etc/my.cnf.d/mariadb-server.cnf [mysqld] max_conn ...

  9. 浅谈 easyui tabs 的href和content属性

    众所周知,jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上的内容:“href远程请求”和“content本地内容”,本文就两种方式的优缺点进行简单分析和思考. 两者特点: ...

  10. CSS3 Flex布局和Grid布局

      1 flex容器的六个属性 flex实现垂直居中: <div class="box"> <span class="item">< ...