调参tips
对于一个模型,都可以从以下几个方面进行调参:
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的更多相关文章
- 01.CNN调参
转载:调参是个头疼的事情,Yann LeCun.Yoshua Bengio和Geoffrey Hinton这些大牛为什么能够跳出各种牛逼的网络? 下面一些推荐的书和文章:调参资料总结Neural Ne ...
- 【Python机器学习实战】决策树与集成学习(七)——集成学习(5)XGBoost实例及调参
上一节对XGBoost算法的原理和过程进行了描述,XGBoost在算法优化方面主要在原损失函数中加入了正则项,同时将损失函数的二阶泰勒展开近似展开代替残差(事实上在GBDT中叶子结点的最优值求解也是使 ...
- scikit-learn随机森林调参小结
在Bagging与随机森林算法原理小结中,我们对随机森林(Random Forest, 以下简称RF)的原理做了总结.本文就从实践的角度对RF做一个总结.重点讲述scikit-learn中RF的调参注 ...
- scikit-learn 梯度提升树(GBDT)调参小结
在梯度提升树(GBDT)原理小结中,我们对GBDT的原理做了总结,本文我们就从scikit-learn里GBDT的类库使用方法作一个总结,主要会关注调参中的一些要点. 1. scikit-learn ...
- word2vec参数调整 及lda调参
一.word2vec调参 ./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -neg ...
- scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类 (python代码)
scikit learn 模块 调参 pipeline+girdsearch 数据举例:文档分类数据集 fetch_20newsgroups #-*- coding: UTF-8 -*- import ...
- 基于pytorch的CNN、LSTM神经网络模型调参小结
(Demo) 这是最近两个月来的一个小总结,实现的demo已经上传github,里面包含了CNN.LSTM.BiLSTM.GRU以及CNN与LSTM.BiLSTM的结合还有多层多通道CNN.LSTM. ...
- 漫谈PID——实现与调参
闲话: 作为一个控制专业的学生,说起PID,真是让我又爱又恨.甚至有时候会觉得我可能这辈子都学不会pid了,但是经过一段时间的反复琢磨,pid也不是很复杂.所以在看懂pid的基础上,写下这篇文章,方便 ...
- hyperopt自动调参
hyperopt自动调参 在传统机器学习和深度学习领域经常需要调参,调参有些是通过通过对数据和算法的理解进行的,这当然是上上策,但还有相当一部分属于"黑盒" hyperopt可以帮 ...
随机推荐
- 3282: Tree(LCT)
3282: Tree Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 2249 Solved: 1042[Submit][Status][Discus ...
- 3、CSS基础 part-1
1.给body设置颜色 <html> <body text="red"> <p> hello world</p> <p> ...
- 【Maximum Subarray 】cpp
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...
- Visual C++ 连连看游戏源代码
点击下载
- java基础-容器
已经写了一段时间JAVA代码了,但仔细想来,却发现对JAVA的很多方面还是一片迷茫. 利用周末补一下基础知识吧. 大致列一下这个周末需要学习的内容 1 容器 (本节内容) 2 线程 3 流 目录 1 ...
- SQL Server2012使用导入和导出向导时,用sql语句作为数据源,出现数据源类型会变成202或者203
用MS SqlServer2012进行数据导出时,使用的查询语句导出,但是出现了错误: “发现 xx个未知的列类型转换您只能保存此包“ 点击列查看详细错误信息时,可以看到: [源信息]源位置: 192 ...
- Arcengine 基本操作(待更新)
/// <summary> /// 删除fieldName属性值为1的弧段 /// </summary> /// <param name="fieldName& ...
- centos7 mariadb mysql max_connections=214 无法修改的问题
centos7 mariadb mysql max_connections=214 无法修改的问题 /etc/my.cnf.d/mariadb-server.cnf [mysqld] max_conn ...
- 浅谈 easyui tabs 的href和content属性
众所周知,jQuery Easyui 的tabs插件有两种方式加载某个tab(标签页)上的内容:“href远程请求”和“content本地内容”,本文就两种方式的优缺点进行简单分析和思考. 两者特点: ...
- CSS3 Flex布局和Grid布局
1 flex容器的六个属性 flex实现垂直居中: <div class="box"> <span class="item">< ...