nlp的实用机器学习
thinc的Python项目详细描述
thinc:python中nlp的实用机器学习
thinc是机器学习库为spacy供电。 它具有一个经过测试的线性模型,设计用于大型稀疏学习 问题和正在开发的柔性神经网络模型 spacy v2.0
thinc是一个实用的工具包,用于实现遵循 "嵌入、编码、参与、预测" 建筑。它的设计是易于安装,高效的CPU使用和 为NLP和文本深度学习优化-特别是分层的 结构化输入和可变长度序列。
在Twitter上关注我们,在Twitter上关注我们,在Twitter上关注我们,在这里,在这里,在这里,在www://warehousecomo.cmh1.psfhosted.org/e8b411f0ab018b67CD318CE6034EE98B7297A87/68747474747470733A322222222F696D676E73686869656C66765656C66767363636363636363636747474747774652F66666F6C6C676565656565656C6676e565656566e5e56565656566e5e5e5e56767676672727272736673f736767676767676f736c676c676cc266c6162656c3d466f6c6f77" />
在哪里(从V7.0.0起)
<表><广告>thinc.v2v.型号
thinc.v2v
thinc.i2v
thinc.t2v
thinc.t2t
thinc.api
这是额外的
thinc.neural.ops
thinc.linear.avgtron
开发状态
thinc的深度学习功能仍在积极开发中:api是 不稳定,我们还没有准备好提供使用支持。但是,如果你 已经很熟悉神经网络了,你可能会发现 很有趣。thinc的概念模型与tensorflow的完全不同。 thinc还实现了一些新颖的特性,例如一个小型dsl 连接模型、嵌入支持预计算的表以及 哈希技巧,动态批处理大小,基于连接的方法 可变长度序列,支持 ADAM解算器(性能非常好)。
没有计算图–只有高阶函数
神经网络实现的核心问题是: 向前传球,你计算的结果将在后面的比赛中有用 通过。如何跟踪这种任意状态,同时确保 层可以干净地组合吗?
大多数库通过声明forward来解决这个问题 计算,然后在幕后的某个地方编译成图形。 Thinc没有"计算图"。相反,我们只使用堆栈, 因为我们把前传球的状态转换成回调。
网络中的所有节点都有一个简单的签名:
f(inputs) -> {outputs, f(d_outputs)->d_inputs}
为了使这一点不那么抽象,这里有一个relu激活,在这个签名之后:
defrelu(inputs):mask=inputs>0defbackprop_relu(d_outputs,optimizer):returnd_outputs*maskreturninputs*mask,backprop_relu
当您调用relu
函数时,会返回一个输出变量,并且
回调。这允许您使用输出计算渐变,然后传递它
进入回调以执行向后传递。
这个特征使得用更小的片段构建复杂的网络变得容易, 使用任意的高阶函数,您可以自己编写。这样做 更清楚的是,我们需要一个权重层的函数。通常情况下 作为一个类实现-但是让我们继续使用闭包来保存 简洁,界面简洁明了。
权重层的主要问题是我们现在有一个副作用 管理:我们想更新重量。有几种方法可以处理 这个。在thinc中,我们现在将一个callable传递给backward pass。(我不是) 确信这是最好的。)
importnumpydefcreate_linear_layer(n_out,n_in):W=numpy.zeros((n_out,n_in))b=numpy.zeros((n_out,1))defforward(X):Y=W@X+bdefbackward(dY,optimizer):dX=W.T@dYdW=numpy.einsum('ik,jk->ij',dY,X)db=dY.sum(axis=0)optimizer(W,dW)optimizer(b,db)returndXreturnY,backwardreturnforward
如果我们调用wb=create_linear_layer(5,4)
,变量wb
将是
forward()
函数,在创建线性层()的主体中实现。
,我们将得到一个新实例,
具有自己的内部状态。w b
实例将访问在其
外部范围。如果我们再次调用create_linear_layer()
wb
实例和relu
函数具有完全相同的签名。这个
使编写高阶函数来组合它们变得容易。最明显的
要做的就是把它们连在一起:
defchain(*layers):defforward(X):backprops=[]Y=Xforlayerinlayers:Y,backprop=layer(Y)backprops.append(backprop)defbackward(dY,optimizer):forbackpropinreversed(backprops):dY=backprop(dY,optimizer)returndYreturnY,backwardreturnforward
我们现在可以将线性层与relu
激活链接到
创建一个简单的前馈网络:
Wb1=create_linear_layer(10,5)Wb2=create_linear_layer(3,10)model=chain(Wb1,relu,Wb2)X=numpy.random.uniform(size=(5,4))y,bp_y=model(X)dY=y-truthdX=bp_y(dY,optimizer)
这个概念模型使thinc非常灵活。取而代之的是 不太方便和高效的工作负载正好适合 Tensorflow等是为设计的。如果你的图表 实际上是静态的,你的输入在大小和形状上都是同质的, keras可能更快、更简单。但如果你想的话 通过网络传递普通的python对象,或者处理序列和 复发无论长度或复杂程度如何,你可能会发现Thinc的设计 更适合您的问题。
快速启动
thinc的安装应该是干净的,同时使用pippip
以及conda的
蟒蛇2.7+和3.5+,在Linux,MacOS/OSX和Windows上。它的
只有系统依赖性是编译器工具链(例如build essential
)和
python开发标题(例如python dev
)。
pip install thinc
对于GPU支持,我们非常感谢使用Chainer的Cupy
模块的工作,
它为gpu阵列提供了一个与numpy兼容的接口。但是,安装
当当前没有可用的GPU时,chainer会导致错误。因此,我们不
列表链接器作为显式依赖项-因此为gpu构建thinc需要
一些额外步骤:
exportCUDA_HOME=/usr/local/cuda-8.0 # Or wherever your CUDA isexportPATH=$PATH:$CUDA_HOME/bin pip install chainer python -c "import cupy; assert cupy"# Check it installed pip install thinc_gpu_ops thinc # Or `thinc[cuda]` python -c "import thinc_gpu_ops"# Check the GPU ops were built
本节的其余部分描述如何从源代码构建thinc。如果你有 结构已安装,您可以使用快捷方式:
git clone https://github.com/explosion/thinc cd thinc fab clean env make test
然后,您可以运行以下示例:
fab eg.mnist fab eg.basic_tagger fab eg.cnn_tagger
否则,您可以使用:
f(inputs) -> {outputs, f(d_outputs)->d_inputs}
0
然后运行以下示例:
f(inputs) -> {outputs, f(d_outputs)->d_inputs}
1
用法
神经网络api仍然会发生变化,即使是小版本。 您可以通过查看示例来了解当前的api。这里是 一些快速的亮点。
<H3>1。形状推断可以创建未指定某些维度的模型。缺少的维度是 推断何时加载预先训练的重量或何时开始训练。这个 消除程序员错误的常见来源:
f(inputs) -> {outputs, f(d_outputs)->d_inputs}
2
<H3>2。运算符重载model.define_operators()类方法允许您绑定任意
python运算符的二进制函数,用于任何模型
实例。这个
方法可以(并且应该)用作上下文管理器,以便
仅限于直接块。这使得模型简洁而富有表现力
定义:
f(inputs) -> {outputs, f(d_outputs)->d_inputs}
3
重载在块的末尾被清除。相当专横的动物园 的函数当前已实现。一些最有用的:
链(模型1,模型2)
:将两个模型f(x)
和g(x)
组合成一个模型计算g(f(x))
克隆(model1,int)
:创建具有不同权重的模型副本,并将它们链接在一起。连接(model1,model2)
:给定两个输出维度为(n,)
和(m,)
的模型,构造一个输出维度为(m+n,)
的模型添加(型号1,型号2)
:添加(f(x),g(x))=f(x)+g(x)
生成元组(model1,model2)
:在批处理级别构造两个模型输出的元组。反向过程期望接收一组渐变,这些渐变通过适当的模型路由并求和。
把这些东西放在一起,这里有一种标签模型,thinc是 设计简单。
f(inputs) -> {outputs, f(d_outputs)->d_inputs}
4
并不是所有这些部分都已经实现,但希望这显示了
我们要走了。memoize
函数将特别重要:在任何
一批文字中,常见的词会很常见。所以这很重要
要对模型求值,例如每个小批量每个字类型一次的charlstm
,
而不是每个令牌一次。
大多数神经网络库使用计算图抽象。这需要
执行远离你,以便梯度可以自动计算。
thinc遵循的样式更像是autograd
库,但是
操作。用法如下:
f(inputs) -> {outputs, f(d_outputs)->d_inputs}
5
将反向传播分为三部分这有很多优点。
所有模型的接口都是完全一致的-没有区别
在用作预测者的顶级模型和
层。我们还通过使begin\u update()
一个纯函数,将梯度的累积和
优化器的操作。
为了保持类层次结构的浅层次性,thinc使用类装饰器来重用代码。 用于图层定义。具体来说,可以使用以下装饰工具:
describe.attributes()
:允许通过关键字参数指定属性。特别用于尺寸和参数。describe.on_init()
:允许指定回调,回调将在.py
的末尾调用。descripe.on_data()
:允许指定回调,该回调将在模型上调用。begin_training()
变更日志
<表><广告>2019-07-11
2019-07-11
2019-07-11
2019-07-10
2019-03-19
thinc\u gpu操作
2019-03-15
2019-02-23
2019-02-16
2019-02-15
2018-11-30
msgpack
pin2018-10-15
2018-07-21
2018-05-21
2018-05-20
2018-03-16
2017-12-06
2017-11-15
2017-10-28
2017-10-03
2017-09-26
gpu操作的打包
2017-08-23
2017-07-25
2017-06-05
2017-06-02
2017-06-02
2017-06-01
2017-05-14
2017-03-20
2017-03-20
2017-03-11
2017-02-15
2017-01-25
2017-01-15
2017-01-10
2017-01-09
2017-01-09
2017-01-09
2016-12-31
thinc.neural
用于面向nlp的深度学习