循环神经网络 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 增加内容