更多查看:https://github.com/B-C-WANG/AI-Storage
4.1. 理解attention的image to caption(图片的文字描述)
4.1.1. 一、一个简单模型
- Encoder:使用预训练的CNN进行fine tuning,结束后截取出输入Image到一个
feature map flatten成的向量或者直接得到的特征向量的输出,
例如Height*Width*3的图片到2048*14*14的向量 - Decoder:decoder在第一次时会输入Encoder给出的图片特征以及
和<start>词向量一起concat过后的向量,输入到LSTM预测下一个词,
第一次过后每次LSTM就输入上一次得到的词的embedding,
输出下一个预测的词的向量,通过LSTM的输出然后softmax,
得到输出词的概率,转变成词语,直到到达end标记。
在此过程中,LSTM自己的隐藏层每次输出下一个h向量,然后下一步将上一步输出的h向量作为输入(RNN的特性)
4.1.2. 二、增加Attention
Decoder发生变化:
- 原来LSTM每次输入上一个词的embedding,变为输入上一个词的embedding拼接上encoder给出的图片向量
- 但是每次拼接的encoder向量都是一样的,没有意义,于是使用Attention来修改这个向量,使其在一部分中有重点
于是Attention出现
Attention是给encoder结果加权重的,输入encoder结果以及LSTM的decoder输出的上一个结果,输出加了权重的encoder结果
Encoder的输入(图片),以及Decoder的输出(词的onehot)都是明确的,而Attention如何优化,如何给出Image decode过后的权重,是需要关注的
4.1.3. 详细过程:
- 输入Image,经过预训练的CNN得到feature map,作为encoder out,这个过程可能需要先通过迁移分类任务fine tuning后面几层
- encoder out将作为LSTM的内部权重h的初始(由于feature map是2维的,通过mean转成向量传入LSTM)
- LSTM的输出的decoder向量,将会经过softmax到vocab的大的维度,给出每一个词的概率(dim就是词库中词的数目)
- LSTM的输入是词向量(来自于上一个LSTM预测的词的embedding,或者初始<start>的embedding)再拼接经过attention的feature map
- LSTM输出的decoder除了用于3中预测词,还用于给feature map加上attention,(用于LSTM的下一次显式输入)
- 给feature map加上的attention是和feature map同样长宽的,但是只有1个通道,里面的每个值都是softmax的结果
- 为了得到这个softmax,首先feature map的n通道通过Dense变为attention dim通道的特征,然后将这个特征与decoder向量经过Dense得到的attention dim长度向量的特征相加,最后Dense到1,然后softmax输出
- 最终输入Image,每次输出词的softmax,经过argmax得到词,直到得到<end>