A cartoon drawing of a biological neuron (left) and its mathematical model (right).

RNN中为什么要采用tanh而不是ReLu作为激活函数? | 知乎

ReLU

(1)优点: Krizhevsky et al. 发现使用 ReLU 得到的SGD的收敛速度会比 Sigmoid/tanh 快很多(看右图)。有人说这是因为它是linear,而且 non-saturating ,相比于 Sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
(2)缺点: 当然 ReLU 也有缺点,就是训练的时候很”脆弱”,很容易就”die”了。
举个例子:一个非常大的梯度流过ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。 如果这个情况发生了,那么这个神经元的梯度就永远都会是0。
注:实际操作中,设置learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 设置一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。

参考

自动求导

tensorflow

一般机器学习系统可以提供两类接口,命令式(Imperative)和声明式(Declarative)。命令式就是直接把一些op的正向运算和求导运算都直接实现了,例如下面的Python代码。

1
2
3
4
5
6
7
8
def square(x):
return x * x;

def square_grad(x):
return 2 * x

print(square(10))
print(square_grad(10))

参考

https://www.zhihu.com/question/66200879
https://www.zhihu.com/question/56443480

pytorch

问题

tensorflow和pytorch的求导,是在cpu中进行的还是gpu?
pytorch采用命令式编程,是不是很吃内存?

参考

https://pytorch-cn.readthedocs.io/zh/latest/notes/autograd/

哪些是动态图?现实中有哪些例子?

tensorflow是怎样解决动态图问题的?

动态图示例:

-

##

  • In PyTorch, each forward pass defines a new computational graph.
  • A graph contains enough information to compute derivatives

  • 每次forward定义一个graph

  • backward都要重新build graph,

pytorch在什么阶段build的graph?应该是在backward阶段吧,求导阶段意味着graph完成了。a graph contains enough information to compute derivatives.

http://pytorch.org/tutorials/beginner/pytorch_with_examples.html#tensorflow-static-graphs

torch.text

简介

依赖

  • NLTK 因为NLTK自身提供了很多NLP数据库的加载,为了不重复造轮子,torchtext尽可能复用NLTK
  • ss

模块

torchtext主要包含两大模块,

torchtext.dataset依赖torchtext.data,一般两者要配合使用。

如何利用pytorch框架,管理其他数据库

  1. 继承torchtext.data.Dataset。 这里的某些类变量未定义,是不是算接口啊?
  2. 定义类变量 urls、dirname、name

貌似就ok了。有没有文档啊

示例

SNLI的例子

1
2
3
4
5
6
7
8
9
from torchtext import data
from torchtext import datasets

inputs = data.Field(lower=True)
answers = data.Field(sequential=False)
train, dev, test = datasets.SNLI.splits(inputs, answers)

type(train) # torchtext.datasets.snli.SNLI
type(train[0]) # torchtext.data.example.Example

主要涉及的两个类

详解

torchtext.data.Dataset

架构

定义一个类,

class SNLI(data.TabularDataset):

torchtext.data

torchtext.dataset

#

参考

Why cant I see .grad of an intermediate variable?

RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time

credit assignment problem with BP/BPTT,

开头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

def backward(self, gradient=None, retain_graph=None, create_graph=False):
"""Computes the gradient of current variable w.r.t. graph leaves.
The graph is differentiated using the chain rule. If the variable is
non-scalar (i.e. its data has more than one element) and requires
gradient, the function additionally requires specifying ``gradient``.
It should be a tensor of matching type and location, that contains
the gradient of the differentiated function w.r.t. ``self``.
This function accumulates gradients in the leaves - you might need to
zero them before calling it.
Arguments:
gradient (Tensor, Variable or None): Gradient w.r.t. the
variable. If it is a tensor, it will be automatically converted
to a Variable that does not require grad unless ``create_graph`` is True.
None values can be specified for scalar Variables or ones that
don't require grad. If a None value would be acceptable then
this argument is optional.

这里的 current variable 指的是out.backward()中的out,不是input variable/ param

accumulates gradients in the leaves 这句话的意思是?见 http://blog.csdn.net/qq_24401379/article/details/77970049
跟bp的链式法则什么关系,梯度叠加是这个意思吗?

https://sherlockliao.github.io/2017/07/10/backward/

为什么要累积梯度? 为什么要zero-gradient?

This allows us to cumulate gradients over several samples or several batches before using the gradients to update the weights.
Once you have updated the weights you don’t want to keep those gradients around because if you reuse them, then you will push the weights too far.
即 several batches共同更新一次梯度的时候,需要累积梯度。update weights后要马上zero-gradient,不然会影响下次update

gradient有什么作用?

是给out加的一个权重。

给out 加一个gradient权重的意义是什么呢?

严格意义上,gradient是个矩阵,即jacob矩阵。

  1. gradient可以起到selector的作用,选择矩阵中的哪个点,就置为1,其他位置为0。导出整个jacob矩阵,要分别backward n次(n为output的data数目,比如[2,3]的output,n=6)

tensor output做backward的用途?

多数情况下都采用标量作为loss,比如(分类问题中的MSE,回归问题中的..)。
什么情况下会用到tensor output的梯度?

  • 纯数学问题,比如你要得到jacob矩阵
  • ML问题,

多维的output和多维的input,在求梯度的时候,实质上都是等价于flatten成一维向量。最终都是求和。

1
2
3
4
5
6
7
8
9
10
11
import torch
from torch.autograd import Variable

x = Variable(torch.ones(2, 3), requires_grad=True)
a = Variable(torch.ones(3, 4))
out = torch.mm(x,a) # shape: (2,4)

gradient = torch.FloatTensor([[1,2,3,4],[5,6,7,8]]) # shape=(2,4)
#gradient = torch.ones(4, 4)
out.backward(gradient)
print(x.grad)

x

x_11 x_12 x_13
x_21 x_22 x_23

out

x_11+x_12+x_13 x_11+x_12+x_13 x_11+x_12+x_13 x_11+x_12+x_13
x_21+x_22+x_23 x_21+x_22+x_23 x_21+x_22+x_23 x_21+x_22+x_23

d(out)/dx

d(out_11) d(out_12) d(out_13 d(out_14 d(out_21) d(out_22) d(out_23) d(out_24)
d(x_11) 1 1 1 1
d(x_12) 1 1 1 1
d(x_13) 1 1 1 1
d(x_14) 1 1 1 1
d(x_21) 1 1 1 1

gradient*out

x_11+x_12+x_13 2x_11+2x_12+2x_13 3x_11+3x_12+3x_13 4x_11+4x_12+4x_13
5x_21+5x_22+5x_23 6x_21+6x_22+6x_23 7x_21+7x_22+7x_23 8x_21+8x_22+8x_23

x.grad

1
2
3
Variable containing:
10 10 10
26 26 26

10 = 1+2+3+4
26=5+6+7+8

  • x.grad should has the same shape with x.data, for update weight
  • gradient should has the same shape with out (current variable)

The effect of gradient a

ss

#

数据并行

  • worker服务器
  • 参数服务器

kubernates 云计算,管理很多机器,

#

TF-Hub 很多模型,模型间共享,

pipline

tf.data

GPU不再是瓶颈,cpu的输入是瓶颈。充分利用cpu gpu,cpu不断

#

deep&wide在推荐系统上很好。

产业界:TFX逐渐开放中

京东利用tf做的OCR。小米用tf

become GDE

TF发展规划

  • 可用性
    • tf js
    • tflight,移动端
      -
  • 更易用、简捷,降低门槛
    • tf hub
    • tfx
  • autoML 降低重复工作,降低调参

未来的突破

  • 无人驾驶车/出租车
  • 医疗,诊断,医疗图像
  • 对话,google assistant
  • 农业、环境,希望有影响
  • 教育
  • 金融,金融数据比较多
  • 制造业,传统产业相对更难一些

重要的是时间问题、方式问题、切入点问题

工程与研究如何平衡

研究要基于真实的问题,要和产业结合。立足真实的问题。

不要关起门来做科研!!

tf优化

(1)部署在移动终端上的(例如ios、android),场景:图像识别等。用freeze_graph合成pb和ckpt文件,然后用optimize_for_inference、quantize_graph进行优化。再用TensorFlowInferenceInterface调用(这个,不知道ios和android是否相同,入坑中…)。

(2)部署在服务端提供服务使用的,场景:推荐系统等。使用tensorflow serving进行模型服务化。

陈佳分享

file queue
example queue的 batch shuffle
入 queue 会shuffle,出queue不shuffle。
出queue锁死

“ops/gen_data_flow_ops.py”, 是C++中load进来的
ops是operations的简写:
An op takes zero or more Tensors, performs some computation, and produces zero or more Tensors.

http://9.186.106.71/dongx/tensorflow/tree/master/tensorflow/cc/ops 是批量生成的 C++自动生成

http://9.186.106.71/dongx/tensorflow/blob/master/tensorflow/core/kernels/random_shuffle_queue_op.cc C++11的lambda表达式

f.OutOfRangeError. This i

epoc 所有epoc过多少轮,,

reader为什么要一次把文件都读完??

reduce_sum 意思是: reduce类似mapreduce,采用sum的方式进行reduce。

tutorials/mnist/beginners

test和validation为什么不放在tf.placeholder,而是放在tf.constant?这两种数据结构有什么本质区别?
因为placeholder是个符号,容器,开始并不直接存入数值。

tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) 这是什么评价指标?
10个类别,y_=[0.1,0.2,0.5,0.8….] tf.argmax(y,1)指的是向量中最大的index,即4.

##cifar10

activation_summary是什么鬼?

loss层的summary

  • merge summary是什么鬼?

  • op是什么鬼? optimization

losses 是多个显卡,多个loss

control dependency,

wanwan组会

不支持scan,需要定长,
theano加mask,
tensorflow必须定长,,
生成batch,

theano没封装到cell,,

:~$

=====basic rnn cell
为什么返回return output, output

====
input output都可以dropout

多个cell拼在一起, stacked RNN

====
ptb是什么鬼?
一个数据库

=====
baket为了防止白算,聚类,

=====
translate是什么鬼?
翻译模型,数据库貌似很大

linear.linear隐藏了 w+b
=====basic lstm cell
多了几个gate而已

=====rnn.py
可以lstm,可以gru,
sequence_length用于batch model。
并未做mask,什么意思?

if sequence_length:
  (output, state) = control_flow_ops.cond(
      time >= max_sequence_length,
      lambda: zero_output_state, lambda: output_state)

=========seq2seq
encoder,
训练过程,
rnn_decoder

class based word prediction, the more class,

(c|history) p(w|c)
p(w|c)是如何定义的??前者信息损失很大,

郭浩 重安装

  • pip install过程中有时会出现问题
  • 下载的安装文件,跑代码是有时跑挂
  • 因此下载源代码,自己编译 安装