一周小结(一)

Conv1d

一维的卷积操作是一种比较常见的处理sequence和timeseries问题的方法,往往在后面跟上一个1维的池化层。卷积或者池化的维度就是timestep的维度,它可以学习到一些local pattern,这主要由其window大小而定。
相比于LSTM,这种计算要快很多。
常用的做法:

  1. 用Conv1d来处理简单的文本分类
  2. 把它和LSTM融合,利用Conv1D轻量级计算快的优点来得到低维度特征,然后再用LSTM进行学习。这对于处理long sequence 非常有用。
    文献:
  3. Convolutional Neural Networks for Sentence Classification
  4. A Convolutional Neural Networks for Modeling Sentences
  5. A Sensitivity Analysis of(and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification

pic1

LSTM hidden state

pic2
LSTM 与Naive RNN在结构上有明显的区别,新增的c可以对记忆的内容进行选择,遗忘不相关的记忆,记住相关记忆。

这里主要讨论一下 LSTM中的hidden state(事实上hidden_state和cell_state在LSTM中是以tuple形式存在的,并且两者的shape一样。(cell_state,hidden_state))

hidden state的维度为[num_layers*num_directions,batch_size,hidden_size]
这里hidden的维度里带着batch_size,这就导致,训练集和测试集的batch_size必须一致,否则与该参数不能匹配上。(这一点与CNN中不同)

解决办法:
如果是tf的话,可以采用tf.nn.dynamic_rnn的方式处理
或着自行进行数据的填充,将其填充为训练时batch_size大小的数据

torch.gather

在做项目的时候需要用到该函数
torch.gather(input, dim, index, out=None) → Tensor
沿给定轴 dim ,将输入索引张量 index 指定位置的值进行聚合.
对一个 3 维张量,输出可以定义为:

1
2
3
out[i][j][k] = input[index[i][j][k]][j][k]  # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k] # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]] # if dim == 2

Parameter:

  • input(Tensor)——源张量
  • dim(int)——索引的轴
  • index(LongTensor)——聚合元素的下标(index需要是torch.longTensor类型)
  • Out(Tensor,optional)——目标张量

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
b = torch.Tensor([[1,2,3],[4,5,6]])
print b
index_1 = torch.LongTensor([[0,1],[2,0]])
index_2 = torch.LongTensor([[0,1,1],[0,0,0]])
print torch.gather(b, dim=1, index=index_1)
print torch.gather(b, dim=0, index=index_2)
-------结果
1 2 3
4 5 6
[torch.FloatTensor of size 2x3]
(b)

1 2
6 4
[torch.FloatTensor of size 2x2]
(b_{ij}=b[i,index[i,j]])

1 5 6
1 2 3
[torch.FloatTensor of size 2x3]
(b_{ij}=b[index[i,j],j])

Pytorch retain_graph

在Pytorch的使用中有时会需要用到retain_graph.retain_graph的作用是在由loss计算出一个一次梯度之后,中间变量参数不被立即释放掉,往往使用retain_graph是在存在两个loss的情况下.

而detach往往用在变量后面,用来标识某个变量不被计入计算图中,可以视为常量(不会对该变量之前的计算图产生任何影响).

CRF批处理

CRF在NER应用中如果不进行批处理的话,速度很慢,一条样本大概需要1.5秒.为了提升速度,需要并行计算,而批处理就是用来实现并行计算的方法

具体的细节可以看
详解条件随机场(CRF)-batch版本

#

-------------本文结束感谢您的阅读-------------