- https://github.com/B-C-WANG/AI-Storage
理解attention的image to caption(图片的文字描述)
一、一个简单模型
- Encoder:使用预训练的CNN进行fine tuning,结束后截取出输入Image到一个 feature map flatten成的向量或者直接得到的特征向量的输出, 例如HeightWidth3的图片到20481414的向量
- Decoder:decoder在第一次时会输入Encoder给出的图片特征以及
和
词向量一起concat过后的向量,输入到LSTM预测下一个词, 第一次过后每次LSTM就输入上一次得到的词的embedding, 输出下一个预测的词的向量,通过LSTM的输出然后softmax, 得到输出词的概率,转变成词语,直到到达end标记。 在此过程中,LSTM自己的隐藏层每次输出下一个h向量,然后下一步将上一步输出的h向量作为输入(RNN的特性)
二、增加Attention
Decoder发生变化:
- 原来LSTM每次输入上一个词的embedding,变为输入上一个词的embedding拼接上encoder给出的图片向量
- 但是每次拼接的encoder向量都是一样的,没有意义,于是使用Attention来修改这个向量,使其在一部分中有重点
于是Attention出现
Attention是给encoder结果加权重的,输入encoder结果以及LSTM的decoder输出的上一个结果,输出加了权重的encoder结果
Encoder的输入(图片),以及Decoder的输出(词的onehot)都是明确的,而Attention如何优化,如何给出Image decode过后的权重,是需要关注的
详细过程:
- 输入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,或者初始
的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得到词,直到得到