本文介绍thulac分词,词性标注所使用平均感知机算法。
可以带着一下问题进行阅读:
本文介绍neural style 进行风格传输。先介绍Gatys等人的原始论文,再介绍加速版本基于Perceptual Loss的风格传输。同时介绍另一种加速算法texture net。最后介绍该方法在语音传输上的应用。
lr-schedure 包含在optimizer之内
在init_optimizer的时候,get_updater
def get_updater(optimizer):
states = dict()
def updater(index, grad, weight):
if index not in states:
states[index] = optimizer.create_state(index, weight)
optimizer.update(index, weight, grad, states[index])
return updater
训练的时候:
for nbatch, data_batch in enumerate(train_dataiter):
mod.forward(data_batch)
mod.update_metric(metric, data_batch.label) #计算误差
mod.backward() #计算当前批次的梯度
mod.update() #更新参数,因为当前梯度只是少量样本的梯度,所以不能完全按照梯度更新。需要设置学习率等
每个optimizer需要实现的是__init__, create_state, update。 以SGD为例子:
class SGD(Optimizer):
def __init__(self, momentum=0.0, **kwargs):
super(SGD, self).__init__(**kwargs)
self.momentum = momentum
def create_state(self, index, weight):
if self.momentum == 0.0:
return None
else:
return zeros(weight.shape, weight.context, dtype=weight.dtype)
def update(self, index, weight, grad, state):
assert(isinstance(weight, NDArray))
assert(isinstance(grad, NDArray))
lr = self._get_lr(index)
wd = self._get_wd(index)
self._update_count(index)
grad = grad * self.rescale_grad
if self.clip_gradient is not None:
grad = clip(grad, -self.clip_gradient, self.clip_gradient)
if state:
mom = state #注意,这里并没有复制。更改mom会使得state也产生,变化。达到记录上一次更新的目的。
mom[:] *= self.momentum
mom[:] += -lr * (grad + wd * weight)
weight[:] += mom
else:
assert self.momentum == 0.0
weight[:] += -lr * (grad + wd * weight)
在微博上看到thulac的宣传其评测数据,在速度和准确性上都挺不错1。就看了其参考论文Punctuation as Implicit Annotations for Chinese Word Segmentation,想法倒是挺好的,但是跟代码实现完全没有关系。github仓库没有任何相关的算法说明,词典也是加密的,存在大量复制黏贴状况,应该是多人维护,水平参差不齐导致的。
本文先介绍其引用论文的做法,再介绍怎么破解词典加密。至于代码中的算法,暂时放弃。。
https://github.com/thunlp/THULAC ↩
mxnet通过dataiter加载数据。c++中实现的dataiter都支持预加载,python源码中只有PrefetchingIter支持。当然也可以自己实现。
本文介绍普通的dataiter,已经支持预加载需要做的更改。同时分析预加载的实现机制,最后介绍一种多线程加载方案。
本文根据mxnet speech demo1的python封装来介绍ctypes的使用。更多细节可以参考python ctypes官方文档2。也可以使用swig来进行跨语言绑定。这篇博客介绍了lua swig绑定及具体案例。
本文介绍两篇论文1 2。其中第一篇是ICML2016的最佳论文。第二篇对pixelcnn进行改进,是wavenet的基础。
以下图片是condition pixelcnn生成效果。
生成单类别图像
生成单个人图像
两个人插值(熊孩子机?)
将联合概率转化为链式概率的乘积。当前像素值有所有前面像素值决定。
\[p(image) = p(x_0, x_1, x_2 … x_n)\] \[p(image)=p(x_0)p(x_1\mid x_0)p(x_2\mid x_1, x_0)...\]使用离散值来估计像素值。最后一层网络结构使用256维softmax来表示像素取值的概率。
在转化为链式概率之后,需要特别注意的是,在预测当前点像素值的时候,不能看到后面点的像素值。文中使用mask去除后面区域的影响。
在三通道图像,会将链式规则进一步转化成:
\[p(x_{i,R}\mid X_{<i})p(x_{i,G}\mid X_{<i},{x_{i,R}})p(x_{i,B}\mid X_{<i},{x_{i,R},x_{i,G}})\]本文讲解merlin的基本数据准备,训练流程,参数生成
tmux是非常好用的终端复用工具。对于远程操作linux可以大大提升效率。
单台4块 gtx1080 显卡, 配置清单,系统安装