目录
CNN 卷积层:
线性层:
CNN 卷积层:
局部感受野(local receptive fields):图像的空间联系是局部的,就像人通过局部的感受野去感受外界图像一样,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。
LeNet-5网络
模型 大小计算:
C1: 5 x 5 x 20 = 500,5x5卷积核, 20个feature map输出,20个kernel--->
(28-5+1)/1 = 24 pool 2*2 ------ P1 :24 / 2 = 13C2: 20x 5 x 5 x 50 = 25000 ,20维度输入,则20x5x5 kernel,50个feature map输出,即相当于20通道的图像输入,则需要20x5x5的kernel来卷积乘,50个这样的卷积核操作得到50个feature map,50个kernel----> (12-5+1)/1 = 8 P2: 8 / 2 = 4
F1: 50x4x4x500 = 400000,50维度特征图输入,全连接,每个点做卷积乘,则kernel大小为50x4x4,共500个feature map输出,500个kernel
F2 : 500x1x1x10 = 5000,500维度特征图输入,全连接,kernel大小为500x1x1,共10个feature map输出,10个kernel
总参数:500 + 25000 + 400000 + 5000 + (20 + 50 + 500 + 10) = 431080
用4bytes的float类型来存储参数,则总的参数量大小为:
431080 x 4 = 1724320 ≈ 1683.90625kb ≈ 1.64M
对比实际LeNet-5网络基于caffe训练出来的模型大小为:1.64 MB (1,725,025 字节),基本接近,因为模型中可能还带有附加特性参数。
线性层:
LSTM:
这里的 实际上是一个句子的 embedding(不考虑 batch 维度),shape 一般为 [seq_length, embedding_size]
。图中的 就是 cell, 中的词依次进入这个 cell 中进行处理。可以看到其实只有这么一个 cell,所以每次词进去处理的时候,权重是共享的,将这个过程平铺展开,就是下面这张图了:
始终要记住这么多 都是一样的,权重是一样的, 到 是一个个词,每一次的处理都依赖前一个词的处理结果,这也是 RNN 系的网络难以像 CNN 一样并行加速的原因。同时, 这就像一个递归过程,如果把求 的公式展开写, A 里的权重记为
,那么就会发现需要
个
相乘,即
,这是非常恐怖的:
总体来说,假设lstm层的一个时间点上的输入特征长度是n,输出长度是m,那么参数量是4*((n+m)*m+m)。
from keras.layers import LSTM
from keras.models import Sequential
time_step=13
featrue=5
hidenfeatrue=10
model=Sequential()
model.add( LSTM(hidenfeatrue,input_shape=(time_step,featrue)))
model.summary()
输出:
- Layer (type) Output Shape Param #
- =====================================================================
- lstm_8 (LSTM) (None, 10) 640
- =====================================================================
- Total params: 640
- Trainable params: 640
- Non-trainable params: 0
Attention:
仅定义q和k两个够吗?可能也还是不够的。找出来的关系是要用的,不用等于白找。权重a 是要对输入信息做加权,才能体现找到的关系的价值的。那跟输入直接加权行吗?这么做也不是不行,就是显得直接和生硬了点。所以又定义了个v。要知道,v和q、k一样,都是通过系数矩阵对输入a做乘法得到的。所以定义了个v大概等于又对a加了一层可以学习的参数,然后对经过参数调整后的a再去做加权、把通过注意力机制学到的关系给用上。所以,通过a和v的乘法进行加权操作,最终得到输出o。
链接:https://www.zhihu.com/question/325839123/answer/1903376265
假如一个男生B,面对许多个潜在交往对象B1,B2,B3...,他想知道自己谁跟自己最匹配,应该把最多的注意力放在哪一个上。那么他需要这么做:
1、他要把自己的实际条件用某种方法表示出来,这就是Value;
2、他要定一个自己期望对象的标准,就是Query;
3、别人也有期望对象标准的,他要给出一个供别人参考的数据,当然不能直接用自己真实的条件,总要包装一下,这就是Key;
4、他用自己的标准去跟每一个人的Key比对一下(Q*K),当然也可以跟自己比对,然后用softmax求出权重,就知道自己的注意力应该放在谁身上了
单头 head 的attention:
Mask : 理解
1. encoder mask:
首先确定mask的形状是 batch_size*seq_length
对于小于最大长度的句子进行补0操作,对于大于最大长度的句子进行截断操作。
2. decoder端的mask
decoder的mask形状是一个下三角矩阵,解码器在翻译单词时只能看到前面已经翻译的单词,不能看到后面的答案,所以使用一个下三角矩阵进行遮盖,每一次解码只给解码器看前面的单词。
def subsequentmask(size):
"Mask out subsequent positions."
attn_shape = (1, size, size)
subsequent_mask = np.triu(np.ones(attn_shape), k=1).astype('uint8')
return subsequent_mask == 0
print(subsequentmask(5))
>>
[[[ True False False False False]
[ True True False False False]
[ True True True False False]
[ True True True True False]
[ True True True True True]]]