技术上来说
- 往粗了讲,大家听到的是:RNN,CNN,ATTENTION,Embedding 比较有名的名词。
- 往细了讲:卷积,max/min/avg pooling, self-attention, gated-weight,sigmod weight,softmax weight等这些具体的技术细节可能在你构建graph的时候都会或多或少的使用,万变不离其宗,熟悉使用这些东西,后面在遇到各种模型,业务应用的时候就很容易掌握。
- 还有正则化(regularization),归一化(normalization)是很有用的东西,特别是dropout在模型层面防止过拟合,normalization用来平衡各层级的单元的影响范围这些都有很有用的效果。
什么场景用什么技术
我举几个例子:
- 就图像上面来说,附近的点应该是很相关的,所以一个区域附近的点其实可以做sample,平均,max等,所以这是卷积层能够在图像处理里面获得很好收益的基础。
同样传统nlp里面常用的ngram处理技术,很和卷积层的处理有类似之处,特别是类似电商商品标题,或者网页seo优化过的描述,其实他们算不上真正意义上的句子或者有逻辑的语句,可能更多的是名词形容词的堆砌,邻近的词表达的是类似的意思,这个使用卷积做encoder也可以取得不错的效果。
对于RNN来说,它训练的是一个有逻辑的序列,当处理每个元素的时候,它应该记住什么,忘记什么,最终一个序列在不断的记住和忘记之后,生成最终的内容。RNN比较复杂,它的变形也很多,具体可以参见我以往的微文,可以根据具体的东西来修改RNN结构。
对于Attention的应用,更好直观的解释,我们在处理这个任务的时候是不是要聚焦在某个点上面,比如:在看长颈鹿在吃树叶的时候,当我们生成长颈鹿的时候我们聚焦的是图片中的长颈鹿部分,当我们生成树叶的时候我们聚焦的是树叶区域,其他的诸如天空,草地我们其实是没有关注的,对于attention用到的技术,大家也千万不要觉得有多高大上,就是各种求解权重的技巧,求解权重最终一般会落到sigmod或者softmax,关键词是找到重要性的业务逻辑。
模型
回归我们的image caption的模型,简单描述这个模型就是:
利用CNN网络讲图像encoder成一个固定维度的向量,然后这个向量作为RNN输入序列的第一个元素(后面的元素是描述caption序列)来做迭代生成模型训练。
对于生成模型的每一步(生成到序列中的元素),和encoder-decoder里面的decoder模型基本一致,只是我们这里的第一个输入元素是图片encoder向量I,我们给一个生成概率: