每周碎片知识11

1️⃣[Optimizer]

https://zhuanlan.zhihu.com/p/32262540
https://zhuanlan.zhihu.com/p/32338983

Adam等自适应学习率算法对于稀疏数据具有优势,且收敛速度很快;但精调参数的SGD(+Momentum)往往能够取得更好的最终结果。

建议:
前期用Adam,享受Adam快速收敛的优势;后期切换到SGD,慢慢寻找最优解。
什么时候从Adam切换到SGD?当SGD的相应学习率的移动平均值基本不变的时候。


2️⃣[Pytorch]

LongTensor除以浮点数,会对除数进行取整,再做除法。


3️⃣[Pytorch]

使用Pytorch的DataParallel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
device = torch.device('cuda:' + str(
config.CUDA_VISIBLE_DEVICES[0]) if config.use_cuda else 'cpu') # 指定第一个设备

model = ClassifyModel(
vocab_size=len(vocab), max_seq_len=config.max_sent_len,
embed_dim=config.embed_dim, n_layers=config.n_layers,
n_head=config.n_head, d_k=config.d_k,
d_v=config.d_v,
d_model=config.d_model, d_inner=config.d_inner_hid,
n_label=config.n_label,
dropout=config.dropout
).to(device)

model = DataParallel(model, device_ids=config.CUDA_VISIBLE_DEVICES) # 显式定义device_ids

注意到:device_ids的起始编号要与之前定义的device中的“cuda:0”相一致,不然会报错。

如果不显式在代码中的DataParallel指定设备,那么需要在命令行内指定。如果是在命令行里面运行的,且device不是从0开始,应当显式设置GPU_id,否则会出错‘AssertionError: Invalid device id’,正确的命令:

1
CUDA_VISIBLE_DEVICES=4,5  python -u classify_main.py --gpu_id 0,1