循环神经网络 RNN

词向量的几种用法

  • 求平均:我喜欢你 = 你喜欢我,北京到广州 = 广州到北京 对语义的损害较大,很多情况下没办法区分不同的语义

  • 卷积 + Pooling

  • 循环神经网络

阅读 一般来说是从左往右阅读一段文字,读完一句话后大脑状态发生了变化,在新的状态下读下一句话;

建模

  • 模型的参数始终是同一组,只是input和state变化
  • 最基本的RNN:new_state = activation(W input + U state + B)

看起来简单,实际上可以代表一个非常强大的处理系统;

处理变长的数据

实际中很难做到句子都是同样长度

可以通过padding来解决,以最长为准,把其它用0补全。存在一些问题

  • RNN进化到一个不对的状态,不是数据给的,而是人强行给的
  • 最长的句子可能很长,影响性能
  • 损失函数没法安排,多了很多假“label”,影响模型效果

解决方式是增加sequence_length参数,该参数是一个一维 Tensor(因此可以随着 batch 数据变化),对每个样本,超过其对应 sequence_length 之后 dynamic_rnn 不会实际去做 state 计算,而是直接复制上一个 state,超长的对应 output 则设置为 0 向量。

损失函数的解决 根据上面的解释我们知道可以让 dynamic_rnn 在超长之后不做实际计算,这时候超长的部分 output 会输出 0。但是这些 output 依然会和 label 进行计算,产生 cost,进而影响模型的变量。

mask = tf.sign(labels) 看元素的符号是不是大于0,如果大于0返回1,否则返回0; 把原来的 cost 和 mask 函数相乘,作为新的 cost 给优化器进行优化,即可忽略这些无用的 labels

Change log

  • 2017.12.22 创建
  • 2017.12.23 增加内容

results matching ""

    No results matching ""