扣丁学堂盘点Python深度学习框架PyTorch迎来重大更新
最近比较热门的PyTorch是使用GPU和CPU优化的深度学习框架。Theano、TensorFlow、Torch、MXNet再到近日比较热门的PyTorch等等,深度学习框架之间的比较一直以来都是非常受人关注的热点话题。
2017年初Facebook在机器学习和科学计算工具Torch的基础上,针对Python语言发布了一个全新的机器学习工具包PyTorch。一经发布,这款开源工具包就受到广泛关注和讨论,经过几个月的发展,目前PyTorch已经成为从业者最重要的研发工具之一。
经过将近一年的发展,日前,迎来了PyTorch0.3.0版本。根据官方文档的介绍,此次增加了多个函数和功能,多方面的性能均实现提升。
重大变更
0.3版本中删掉了Variable.reinforce()等随机函数,因为它们的功能有限,并且会影响到性能。设置随机函数的初衷是为了避免采样值的book-keeping,在实际中,由于各种各样的原因,用户的代码中仍然会包括book-keeping。他们引入了torch.distributions包来代替随机函数。
之前的代码如下:
probs=policy_network(state)
action=probs.multinomial()
next_state,reward=env.step(action)
action.reinforce(reward)
action.backward()
现在的代码如下:
probs=policy_network(state)
#NOTE:categoricalisequivalenttowhatusedtobecalledmultinomial
m=torch.distributions.Categorical(probs)
action=m.sample()
next_state,reward=env.step(action)
loss=-m.log_prob(action)*reward
loss.backward()
新的功能
1、目前,有些损失函数能直接计算mini-batch中每个sample的损失值。
2、构建了一个in-builtProfiler,能对模型进行瓶颈分析,这个Profiler同时支持CPU和CUDA模型。
3、增加Higherordergradients模块
支持如下层:
ConvTranspose,AvgPool1d,AvgPool2d,LPPool2d,AvgPool3d,MaxPool1d,MaxPool2d,AdaptiveMaxPool,AdaptiveAvgPool,FractionalMaxPool2d,MaxUnpool1d,MaxUnpool2d,nn.Upsample,ReplicationPad2d,ReplicationPad3d,ReflectionPad2d
PReLU,HardTanh,L1Loss,SoftSign,ELU,RReLU,Hardshrink,Softplus,SoftShrink,LogSigmoid,Softmin,GLU
MSELoss,SmoothL1Loss,KLDivLoss,HingeEmbeddingLoss,SoftMarginLoss,MarginRankingLoss,CrossEntropyLoss
DataParallel
4、优化器
optim.SparseAdam:能实现适用于稀疏张量的简单亚当算法
优化器中增加了add_param_group函数,能在构建好的优化器中增加新的参数组。
除此之外,还增加了新的张量函数和功能,在新版本中,能通过ONNX将模型迁移到其他框架上。另外,在加速方面,重写gpukernel之后,softmax和log_softmax的速度能实现4-256倍的提升;在分布式AllReduce中,能实现2.5-3倍的性能提升;torch.norm函数的backward能实现1.5倍的加速;pack_padded_sequence的性能也有提升。
PyTorch优缺点
优势:
它属于轻量级;
它目前位于Python中;
它使你能够明确地控制计算。没有编译器能自己妄图变聪明来「帮助你」,或是将你的代码加速;事实上大多编译器在调试中会产生大量麻烦;
它使GPU内核调用之上仅有少量(可解释的)抽象层,而这恰恰是高性能的保证;
也许这是个人偏好,但我得到了与抽象有关的特定OCD。每当我要做艰巨的工作时都会很紧张,因为一旦我的未来被泄漏,我便能感觉到它那些无法摆脱且难以忍受的痛苦。相对简单的事情理应在引擎盖之下发生的大多数情况下,这种感觉尤为强烈;
调试更容易,因为特定代码中会是特定行(而不是在距离使用大型或生成的Graph对象的sess.run()很远的地方)失败。你的堆栈跟踪不会填满三个屏幕来让你玩「找找错误在哪里!」的竖版卷轴游戏;
不存在编译时间。我无法理解Theano用户是如何处理的,他们一定更有耐心;
你可以直接操作渐变,显然,做一些事情时可以更容易,也更自然(如在反向传播过程中的渐变剪辑,或各种「破碎的反向传播」的有关想法,就像最近的ShakeShakereg命令一样;的确,我认为你可以用stop_gradient破解一个解决方案);
它对动态图的支持从一开始就是自上而下的设计原则,而非随之而至的事后想法。并且我们会看到更多的动态图表,如做成一大块NLP,或是神经模块网;
它没有缩进或膨胀你的代码的显式会话对象;
它获得的抽象是正确的:rawnumpy->Tensors(但GPU上的rawnumpy可能对深度学习一无所知!)->变量(它们了解深度学习),并且Modules或Optim等等会稍有益处。
动态计算使很多事情更加容易,如seq2seq+attention的神经翻译很难通过keras+tf来实现,但使用PyTorch便会很容易;
更容易调试,因为你可以只使用标准的PyThon工具;
PyTorch让自定义的实现更加容易,所以你得以将更多时间专注于算法中,这样往往能够改进主要性能;
使Multi-gpu简单易懂;
Torch-vision使加载和变换图像变得容易。
PyTorch提供了一个强化功能。增强功能基本上不会在实现中产生过多资源消耗,能有一些内置函数来调用RL的感觉真棒。
我遇到的错误或问题得到PyTorch团队及时的反映,通常会在当天修复,或者得到解决方法或得到问题跟踪。
PyTorch是可以立即使用的,在我当前的项目的单GPU的训练时间比theano+lasagne快100%。我测试过,100%逐字地在CIFAR100上从(在最简单的情况下)5分/历元到2.5分/历元,并且在某些情况下降到2分钟/历元(即,快两倍)
缺点:
PyTorch的API感觉有些粗糙,但对它有一些限定词。如果你只是做一些标准的任务(实现ResNet或者VGG)我认为你不会有问题但我一直都有一些分歧因为我所做的一切都有些奇怪。
对于PyTorch我最大的「抱怨」基本上是在神经网络API方面「事情并未按照我让他们组合的方式进行放置」。具体来说,我非常喜欢Lasagne的「层次(layers)」范式—但是一点点批判性的思维就会让你得出这个结论,这个范式尤其不适合动态图框架。
以上就是关于扣丁学堂盘点Python深度学习框架PyTorch迎来重大更新的详细介绍,最后想要学习Python培训课程的小伙伴快选择扣丁学堂学习或关注扣丁学堂微信公众号,另扣丁学堂不仅有专业的老师还有与时俱进的课程体系和大量的Python视频教程供学员观看学习,想要Python视频教程的小伙伴,想要高薪就业的小伙伴就抓紧时间行动吧。